diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..9958c1dded419dd506940b38021eb759cfd658ac
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,75 @@
+# OS generated files #
+######################
+.DS_Store*
+*~
+classes
+target
+.classpath
+.project
+.wtpmodules
+.settings
+esf/runner/equinox/*
+esf/runner/bundles/*
+kura/target-definition/*/plugins/*
+kura/target-definition/repository/artifacts.xml
+kura/target-definition/repository/content.xml
+kura/target-definition/repository/plugins/*
+kura/target-definition/*/repository/artifacts.xml
+kura/target-definition/*/repository/content.xml
+kura/target-definition/*/repository/plugins/*
+target-platform/*/META-INF/MANIFEST.MF
+gwt-unitCache
+.launch
+www-test
+.gwt
+*.cache.*
+manifests
+esf/com.eurotech.framework.web/src/main/webapp/WEB-INF/lib
+esf/com.eurotech.framework.web/src/main/webapp/denali/denali.nocache.js
+esf/com.eurotech.framework.web/src/main/webapp/denali/gwt-log-triangle-10x10.png
+esf/com.eurotech.framework.web/src/main/webapp/denali/gwt/standard/*
+esf/com.eurotech.framework.web/src/main/webapp/denali/.junit*
+esf/com.eurotech.framework.web/src/main/webapp/denali/*.gwt.rpc
+esf/com.eurotech.framework.web/src/main/webapp/WEB-INF/deploy/denali/rpcPolicyManifest/manifest.txt
+esf/com.eurotech.framework.web/denali/*
+esf/com.eurotech.framework.web/src/main/webapp/com.eurotech.framework.web.denaliJUnit/*
+esf/com.eurotech.framework.web/src/main/webapp/WEB-INF/deploy/*
+esf/com.eurotech.example.project/bin/
+esf/com.eurotech.framework.api/bin/
+esf/com.eurotech.framework.core/bin/
+esf/com.eurotech.framework.core.crypto/bin/
+esf/com.eurotech.framework.core.test/bin/
+esf/com.eurotech.framework.emulator/bin/
+esf/com.eurotech.framework.diagnostics/bin/
+esf/com.eurotech.framework.diagnostics/lib/
+esf/com.eurotech.framework.linux.test/bin/
+esf/com.eurotech.framework.linux.wrl.catalyst.test/bin/
+esf/com.eurotech.framework.linux.wrl.catalyst/bin/
+esf/com.eurotech.framework.linux.wrl.test/bin/
+esf/com.eurotech.framework.linux.wrl/bin/
+esf/com.eurotech.framework.linux/bin/
+esf/com.eurotech.framework.protocol.test/bin/
+esf/com.eurotech.framework.protocol.modbus.test/bin/
+esf/com.eurotech.framework.protocol.pcn.test/bin/
+esf/com.eurotech.framework.test/bin/
+esf/target-definition/esf-equinox_3.8.1.target
+esf/com.eurotech.example.dp.app/bin/
+esf/com.eurotech.example.dp.customizer/bin/
+esf/com.eurotech.example.publisher/bin/
+esf/com.eurotech.framework.deployment.agent/bin/
+esf/com.eurotech.framework.deployment.customizer/bin/
+esf/com.eurotech.framework.protocol.modbus/bin/
+esf/com.eurotech.framework.protocol.pcn/bin/
+esf/com.eurotech.framework.protocol.pcn2/bin/
+esf/com.eurotech.framework.qa/bin/
+esf/com.eurotech.framework.web/bin/
+esf/com.eurotech.demo.heater/bin/
+esf/com.eurotech.demo.power.system/bin/
+esf/com.eurotech.demo.tbm/bin/
+esf/com.eurotech.demo.pcn2/bin/
+esf/com.eurotech.framework.net.admin/bin/
+esf/com.eurotech.framework.net.modem/bin/
+esf/distrib/bin/
+esf/distrib/build.properties
+esf/com.eurotech.framework.diagnostics.dp.customizer/lib/sigar-1.6.4.jar
+com.eurotech.demo.awas/bin/
diff --git a/README.md b/README.md
index e0bc12efe69af9b25ffbe3499f3680c5af07f8f9..eac441cd3b0fbc431b66648d6b965217de1b3a0e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,29 @@
-kura
+Kura
 ====
+An OSGi-based Application Framework for M2M Service Gateways
 
-Kura project
+
+Background
+----------
+Until recently, machine-to-machine projects have been approached as embedded systems designed around custom hardware, custom software, and custom network connectivity. The challenge of developing such projects was given by the large customization and integration costs and the small re-usability across similar engagements. The results were often proprietary systems leveraging proprietary protocols.
+
+The emergence of the service gateway model, which operates on the edge of an M2M deployment as an aggregator and controller, has opened up new possibilities. Cost effective service gateways are now capable of running modern software stacks opening the world of M2M to enterprise technologies and programming languages. Advanced software frameworks, which isolate the developer from the complexity of the hardware and the networking sub-systems, can now be offered to complement the service gateway hardware into an integrated hardware and software solution.
+
+
+Description
+-----------
+Kura aims at offering a Java/OSGi-based container for M2M applications running in service gateways. Kura provides or, when available, aggregates open source implementations for the most common services needed by M2M applications. Kura components are designed as configurable OSGi Declarative Service exposing service API and raising events. While several Kura components are in pure Java, others are invoked through JNI and have a dependency on the Linux operating system.
+
+For more information, see the [Eclipse project proposal](http://www.eclipse.org/proposals/technology.kura/).
+
+
+Development Model
+-----------------
+Development on Kura follows the [gitflow model](http://nvie.com/posts/a-successful-git-branching-model/).  Thus, the working copy is in the develop branch, and the master branch is used for releases.
+
+
+Getting Started
+-----------------
+If you are new to Kura, please visit the [getting started page](https://wiki.eclipse.org/Kura/Getting_Started).
+
+To raise an issue, please report a bug on [Eclipse bugzilla](https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&classification=Technology&list_id=4625660&order=Bug%20Number&product=Kura&query_format=advanced).
diff --git a/kura/distrib/.gitignore b/kura/distrib/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..56fb545fa67e381468a44b7c3aae66c7de39f60e
--- /dev/null
+++ b/kura/distrib/.gitignore
@@ -0,0 +1 @@
+build.properties
diff --git a/kura/distrib/RELEASE_INFO/0.0.0/kura-raspberry-pi_0.0.0.versions b/kura/distrib/RELEASE_INFO/0.0.0/kura-raspberry-pi_0.0.0.versions
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/kura/distrib/RELEASE_INFO/version.properties b/kura/distrib/RELEASE_INFO/version.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0a261b995d145dbc1f0d4a7870b7a0aede1d1cbd
--- /dev/null
+++ b/kura/distrib/RELEASE_INFO/version.properties
@@ -0,0 +1 @@
+project.version.previous=0.0.0
diff --git a/kura/distrib/RELEASE_NOTES.txt b/kura/distrib/RELEASE_NOTES.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6db14943afee4217259c9dc3fadc010167ce1dc5
--- /dev/null
+++ b/kura/distrib/RELEASE_NOTES.txt
@@ -0,0 +1,26 @@
+Eclipse Kura - Initial Version
+-------------------------------------------------------------------------
+
+Features:
+   * Runs on Java SE 7 Embedded and OpenJDK 7
+   * Core OSGi runtime using Eclipse Equinox v3.8.1
+   * API support including:
+	* Clock (both system clock syncing via NTP and hardware clock sync)
+	* Cloud connections (MQTT) with local store and forward capabilities to handle disconnected states as well as Google Protobuf message packing
+	* Service configuration locally and remotely via OSGi ConfigAdmin with Metatype support
+	* Network status including IP address, netmask, DNS, gateway, and hardware types
+	* Network administration: modifying network configuration including IP address, netmask, DNS, gateway, DHPC servers, Nat/Masq, 
+				  firewall, wifi AP, wifi station, SSID, wifi security types, wifi channel, and cellular modems, and 
+				  routing tables.
+	* GPS configuration
+	* USB devices including dynamic detection
+   * OSGi Deployment Package support
+   * Local configuration web UI
+   * Eclipse based emulator for local host PC development/testing including support for OSX and Linux
+   * Remote configuration and device management capabilities when connected to Eurotech's Everyware Cloud
+   * Support for remote OSGi console and bundle deployment from Eclipse
+
+Known Issues:
+   * Hardware watchdog: not implemented on all platforms
+   * Reliagate 50-21: Using eth1 and Windows 7 to access the webui does not work over some network topologies - OSX or Linux are recommended to access the webui in this rare case
+   * Only one WAN interface is currently supported.  Make sure you never have multiple WAN interfaces defined or it could result in network connectivity issues
diff --git a/kura/distrib/eclipse_license.txt b/kura/distrib/eclipse_license.txt
new file mode 100644
index 0000000000000000000000000000000000000000..468dbc50db2804e7fc7a8484f5b57b932caed542
--- /dev/null
+++ b/kura/distrib/eclipse_license.txt
@@ -0,0 +1,9 @@
+Copyright (c) ${dates} ${owner}
+ 
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+  
+Contributors:
+  ${contributor}
diff --git a/kura/distrib/epl-v10.html b/kura/distrib/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/distrib/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/distrib/notice.html b/kura/distrib/notice.html
new file mode 100644
index 0000000000000000000000000000000000000000..f19c483b9c83e6f03baaf06c819a810c9a28cbcb
--- /dev/null
+++ b/kura/distrib/notice.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/kura/distrib/pom.xml b/kura/distrib/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..25655ca626ba8a1e32017c00e928bf480e8dc2c8
--- /dev/null
+++ b/kura/distrib/pom.xml
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>kura</artifactId>
+		<groupId>org.eclipse.kura</groupId>
+		<version>0.7.0</version>
+		<relativePath>../pom_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>distrib</artifactId>
+
+	<name>distrib</name>
+	<url>http://maven.apache.org</url>
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<zip_workspace.prefix>user_workspace_archive_${project.version}</zip_workspace.prefix>
+	</properties>
+
+	<build>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-ssh</artifactId>
+				<version>1.0-beta-6</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>properties-maven-plugin</artifactId>
+				<version>1.0-alpha-1</version>
+				<executions>
+					<execution>
+						<phase>initialize</phase>
+						<goals>
+							<goal>read-project-properties</goal>
+						</goals>
+						<configuration>
+							<files>
+								<file>${basedir}/build.properties</file>
+							</files>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings 
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.codehaus.mojo
+										</groupId>
+										<artifactId>
+											properties-maven-plugin
+										</artifactId>
+										<versionRange>
+											[1.0-alpha-1,)
+										</versionRange>
+										<goals>
+											<goal>
+												read-project-properties
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.codehaus.mojo
+										</groupId>
+										<artifactId>
+											buildnumber-maven-plugin
+										</artifactId>
+										<versionRange>
+											[1.0,)
+										</versionRange>
+										<goals>
+											<goal>
+												create-timestamp
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+	<dependencies>
+		<!-- <dependency> <groupId>org.eclipse.kura</groupId> <artifactId>org.eclipse.kura.api</artifactId> 
+			<version>${project.version}</version> <scope>system</scope> <systemPath>${basedir}/../org.eclipse.kura.api/target/org.eclipse.kura.api-${project.version}.jar</systemPath> 
+			</dependency> <dependency> <groupId>org.eclipse.kura</groupId> <artifactId>org.eclipse.kura.core</artifactId> 
+			<version>${project.version}</version> <scope>system</scope> <systemPath>${basedir}/../org.eclipse.kura.core/target/org.eclipse.kura.core-${project.version}.jar</systemPath> 
+			</dependency> <dependency> <groupId>org.eclipse.kura</groupId> <artifactId>org.eclipse.kura.protocol.modbus</artifactId> 
+			<version>${project.version}</version> <scope>system</scope> <systemPath>${basedir}/../org.eclipse.kura.protocol.modbus/target/org.eclipse.kura.protocol.modbus-${project.version}.jar</systemPath> 
+			</dependency> <dependency> <groupId>org.eclipse.kura</groupId> <artifactId>org.eclipse.kura.emulator</artifactId> 
+			<version>${project.version}</version> <scope>system</scope> <systemPath>${basedir}/../org.eclipse.kura.emulator/target/org.eclipse.kura.emulator-${project.version}.jar</systemPath> 
+			</dependency> <dependency> <groupId>org.eclipse.kura</groupId> <artifactId>org.eclipse.kura.linux</artifactId> 
+			<version>${project.version}</version> <scope>system</scope> <systemPath>${basedir}/../org.eclipse.kura.linux/target/org.eclipse.kura.linux-${project.version}.jar</systemPath> 
+			</dependency> -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<profiles>
+		<profile>
+			<id>beaglebone</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<build>
+				<resources>
+					<resource>
+						<directory>src/main/resources</directory>
+						<filtering>true</filtering>
+					</resource>
+				</resources>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>properties-maven-plugin</artifactId>
+						<version>1.0-alpha-1</version>
+						<executions>
+							<execution>
+								<phase>initialize</phase>
+								<goals>
+									<goal>read-project-properties</goal>
+								</goals>
+								<configuration>
+									<files>
+										<file>${basedir}/build.properties</file>
+									</files>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>buildnumber-maven-plugin</artifactId>
+						<version>1.0</version>
+						<executions>
+							<execution>
+								<phase>validate</phase>
+								<goals>
+									<goal>create-timestamp</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-antrun-plugin</artifactId>
+						<version>1.7</version>
+						<executions>
+							<execution>
+								<id>beaglebone-jars</id>
+								<phase>install</phase>
+								<goals>
+									<goal>run</goal>
+								</goals>
+								<configuration>
+									<target>
+										<property name="buildNumber" value="buildNumber" />
+										<property name="project.version" value="${project.version}" />
+										<property name="project.build.profile" value="${project.build.profile}" />
+										<property name="project.build.directory" value="${project.build.directory}" />
+										<property name="build.name" value="beaglebone" />
+										<property name="kura.os.version"
+											value="090538fcb81c38c1fa445cfb00755a94bc0131f2" />
+										<property name="kura.arch" value="armv7_hf" />
+										<property name="kura.mem.size" value="256m" />
+										<ant antfile="${basedir}/src/main/ant/build_equinox_distrib.xml"
+											target="dist-linux" />
+									</target>
+								</configuration>
+							</execution>
+							<!-- <execution> <id>beaglebone-test</id> <phase>install</phase> <goals> 
+								<goal>run</goal> </goals> <configuration> <target> <property name="buildNumber" 
+								value="buildNumber" /> <property name="deployment.package.version" value="${deployment.package.version}" 
+								/> <property name="project.version" value="${project.version}" /> <property 
+								name="project.build.profile" value="${project.build.profile}" /> <property 
+								name="project.build.directory" value="${project.build.directory}" /> <property 
+								name="build.name" value="beaglebone" /> <property name="kura.os.version" 
+								value="090538fcb81c38c1fa445cfb00755a94bc0131f2" /> <property name="kura.arch" 
+								value="armv7_hf" /> <property name="kura.mem.size" value="256m" /> <ant antfile="${basedir}/src/main/ant/build_equinox_distrib_test.xml" 
+								target="dist-linux" /> </target> </configuration> </execution> -->
+							<!-- <execution> <id>beaglebone-nn-dp</id> <phase>install</phase> 
+								<goals> <goal>run</goal> </goals> <configuration> <target> <property name="buildNumber" 
+								value="buildNumber" /> <property name="deployment.package.version" value="${deployment.package.version}" 
+								/> <property name="project.version" value="${project.version}" /> <property 
+								name="project.build.profile" value="${project.build.profile}" /> <property 
+								name="project.build.directory" value="${project.build.directory}" /> <property 
+								name="build.name" value="beaglebone-nn" /> <property name="kura.os.version" 
+								value="090538fcb81c38c1fa445cfb00755a94bc0131f2" /> <property name="kura.arch" 
+								value="armv7_hf" /> <property name="kura.mem.size" value="256m" /> <ant antfile="${basedir}/src/main/ant/build_equinox_distrib_dp.xml" 
+								target="dist-linux" /> </target> </configuration> </execution> -->
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<id>raspberry-pi</id>
+			<properties>
+				<project.raspbian.dependencies>hostapd, isc-dhcp-server, iw,
+					dos2unix, bind9</project.raspbian.dependencies>
+			</properties>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<build>
+				<resources>
+					<resource>
+						<directory>src/main/resources</directory>
+						<filtering>true</filtering>
+					</resource>
+				</resources>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>properties-maven-plugin</artifactId>
+						<version>1.0-alpha-1</version>
+						<executions>
+							<execution>
+								<phase>initialize</phase>
+								<goals>
+									<goal>read-project-properties</goal>
+								</goals>
+								<configuration>
+									<files>
+										<file>${basedir}/build.properties</file>
+									</files>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>buildnumber-maven-plugin</artifactId>
+						<version>1.0</version>
+						<executions>
+							<execution>
+								<phase>validate</phase>
+								<goals>
+									<goal>create-timestamp</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-antrun-plugin</artifactId>
+						<version>1.7</version>
+						<executions>
+							<execution>
+								<id>raspberry-pi-jars</id>
+								<phase>install</phase>
+								<goals>
+									<goal>run</goal>
+								</goals>
+								<configuration>
+									<target>
+										<property name="buildNumber" value="buildNumber" />
+										<property name="project.version" value="${project.version}" />
+										<property name="project.build.profile" value="${project.build.profile}" />
+										<property name="project.build.directory" value="${project.build.directory}" />
+										<property name="build.name" value="raspberry-pi" />
+										<property name="kura.os.version" value="raspbian" />
+										<property name="kura.arch" value="armv6_hf" />
+										<property name="kura.mem.size" value="256m" />
+										<ant antfile="${basedir}/src/main/ant/build_equinox_distrib.xml"
+											target="dist-linux" />
+									</target>
+								</configuration>
+							</execution>
+							<!-- <execution> <id>raspberry-pi-test</id> <phase>install</phase> 
+								<goals> <goal>run</goal> </goals> <configuration> <target> <property name="buildNumber" 
+								value="buildNumber" /> <property name="deployment.package.version" value="${deployment.package.version}" 
+								/> <property name="project.version" value="${project.version}" /> <property 
+								name="project.build.profile" value="${project.build.profile}" /> <property 
+								name="project.build.directory" value="${project.build.directory}" /> <property 
+								name="build.name" value="raspberry-pi" /> <property name="kura.os.version" 
+								value="raspbian" /> <property name="kura.arch" value="armv6_hf" /> <property 
+								name="kura.mem.size" value="256m" /> <ant antfile="${basedir}/src/main/ant/build_equinox_distrib_test.xml" 
+								target="dist-linux" /> </target> </configuration> </execution> -->
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.vafer</groupId>
+						<artifactId>jdeb</artifactId>
+						<version>1.0</version>
+						<executions>
+							<execution>
+								<id>raspberry-pi-deb</id>
+								<phase>install</phase>
+								<goals>
+									<goal>jdeb</goal>
+								</goals>
+								<configuration>
+									<verbose>true</verbose>
+									<deb>${basedir}/target/kura-raspberry-pi_${project.version}.deb</deb>
+									<controlDir>${basedir}/src/main/deb/control</controlDir>
+									<dataSet>
+										<data>
+											<src>${basedir}/target/kura-raspberry-pi-jars_${project.version}.zip</src>
+											<type>file</type>
+											<mapper>
+												<type>perm</type>
+												<prefix>/tmp</prefix>
+											</mapper>
+										</data>
+									</dataSet>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<!-- <profile> <id>raspberry-pi-nn</id> <properties> <project.raspbian.dependencies>dos2unix</project.raspbian.dependencies> 
+			</properties> <activation> <activeByDefault>true</activeByDefault> </activation> 
+			<build> <resources> <resource> <directory>src/main/resources</directory> 
+			<filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> 
+			<artifactId>properties-maven-plugin</artifactId> <version>1.0-alpha-1</version> 
+			<executions> <execution> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> 
+			</goals> <configuration> <files> <file>${basedir}/build.properties</file> 
+			</files> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> 
+			<artifactId>buildnumber-maven-plugin</artifactId> <version>1.0</version> 
+			<executions> <execution> <phase>validate</phase> <goals> <goal>create-timestamp</goal> 
+			</goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> 
+			<artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> 
+			<execution> <id>raspberry-pi-nn-dp</id> <phase>install</phase> <goals> <goal>run</goal> 
+			</goals> <configuration> <target> <property name="buildNumber" value="buildNumber" 
+			/> <property name="deployment.package.version" value="${deployment.package.version}" 
+			/> <property name="project.version" value="${project.version}" /> <property 
+			name="project.build.profile" value="${project.build.profile}" /> <property 
+			name="project.build.directory" value="${project.build.directory}" /> <property 
+			name="build.name" value="raspberry-pi-nn" /> <property name="kura.os.version" 
+			value="raspbian" /> <property name="kura.arch" value="armv6_hf" /> <property 
+			name="kura.mem.size" value="256m" /> <ant antfile="${basedir}/src/main/ant/build_equinox_distrib_dp.xml" 
+			target="dist-linux" /> </target> </configuration> </execution> </executions> 
+			</plugin> <plugin> <groupId>org.vafer</groupId> <artifactId>jdeb</artifactId> 
+			<version>1.0</version> <executions> <execution> <id>raspberry-pi-nn-deb</id> 
+			<phase>install</phase> <goals> <goal>jdeb</goal> </goals> <configuration> 
+			<verbose>true</verbose> <deb>${basedir}/target/kura-raspberry-pi-nn-jars_${project.version}.deb</deb> 
+			<controlDir>${basedir}/src/main/deb/control_nn</controlDir> <dataSet> <data> 
+			<src>${basedir}/target/kura-raspberry-pi-nn-jars_${project.version}.zip</src> 
+			<type>file</type> <mapper> <type>perm</type> <prefix>/tmp</prefix> </mapper> 
+			</data> </dataSet> </configuration> </execution> </executions> </plugin> 
+			</plugins> </build> </profile> -->
+		<profile>
+			<id>dev-env</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<build>
+				<resources>
+					<resource>
+						<directory>src/main/resources</directory>
+						<filtering>true</filtering>
+					</resource>
+				</resources>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>properties-maven-plugin</artifactId>
+						<version>1.0-alpha-1</version>
+						<executions>
+							<execution>
+								<phase>initialize</phase>
+								<goals>
+									<goal>read-project-properties</goal>
+								</goals>
+								<configuration>
+									<files>
+										<file>${basedir}/build.properties</file>
+									</files>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>buildnumber-maven-plugin</artifactId>
+						<version>1.0</version>
+						<executions>
+							<execution>
+								<phase>validate</phase>
+								<goals>
+									<goal>create-timestamp</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-antrun-plugin</artifactId>
+						<version>1.7</version>
+						<executions>
+							<execution>
+								<id>prep-tp</id>
+								<phase>prepare-package</phase>
+								<goals>
+									<goal>run</goal>
+								</goals>
+								<configuration>
+									<target>
+										<!-- Kura User Workspace -->
+										<echo message="Preparing target platform..." />
+
+										<!-- Copy the mtoolkit plugin to the target directory -->
+										<copy
+											file="src/main/resources/common/org.tigris.mtoolkit.sdk-3.1.8-20110411-0918.zip"
+											todir="${project.build.directory}" />
+
+										<!-- Add the deployment agent and core packages to the target platform 
+											which is required for the emulator -->
+										<copy todir="${project.build.directory}/staging/target-definition">
+											<fileset dir="../target-definition" />
+										</copy>
+										<delete
+											file="${project.build.directory}/staging/target-definition/pom.xml" />
+										<delete
+											file="${project.build.directory}/staging/target-definition/kura-equinox_3.8.1.target" />
+										<delete
+											file="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/artifacts.xml" />
+										<delete
+											file="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/content.xml" />
+										<copy
+											file="src/main/resources/common/projects/target_definition.project"
+											tofile="${project.build.directory}/staging/target-definition/.project" />
+										<copy file="src/main/resources/common/kura-equinox_3.8.1.target"
+											todir="${project.build.directory}/staging/target-definition" />
+										<copy
+											file="../org.eclipse.kura.core.configuration/target/org.eclipse.kura.core.configuration_${org.eclipse.kura.core.configuration.version}.v${kura.build.version}.jar"
+											todir="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/plugins" />
+										<copy
+											file="../org.eclipse.kura.core/target/org.eclipse.kura.core_${org.eclipse.kura.core.version}.v${kura.build.version}.jar"
+											todir="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/plugins" />
+										<copy
+											file="../org.eclipse.kura.deployment.agent/target/org.eclipse.kura.deployment.agent_${org.eclipse.kura.deployment.agent.version}.v${kura.build.version}.jar"
+											todir="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/plugins" />
+										<copy
+											file="../org.eclipse.kura.core.crypto/target/org.eclipse.kura.core.crypto_${org.eclipse.kura.core.crypto.version}.v${kura.build.version}.jar"
+											todir="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/plugins" />
+										<copy
+											file="../org.eclipse.kura.core.net/target/org.eclipse.kura.core.net_${org.eclipse.kura.core.net.version}.v${kura.build.version}.jar"
+											todir="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/plugins" />
+										<copy
+											file="../org.eclipse.kura.web/target/org.eclipse.kura.web_${org.eclipse.kura.web.version}.v${kura.build.version}.jar"
+											todir="${project.build.directory}/staging/target-definition/equinox_3.8.1/repository/plugins"
+											failonerror="false" />
+									</target>
+								</configuration>
+							</execution>
+							<execution>
+								<id>dev-env</id>
+								<phase>install</phase>
+								<goals>
+									<goal>run</goal>
+								</goals>
+								<configuration>
+									<target>
+										<!-- Stage the emulator -->
+										<copy todir="${project.build.directory}/staging/emulator">
+											<fileset dir="../org.eclipse.kura.emulator" />
+										</copy>
+										<delete file="${project.build.directory}/staging/emulator/pom.xml" />
+										<delete dir="${project.build.directory}/staging/emulator/bin" />
+										<delete dir="${project.build.directory}/staging/emulator/target" />
+										<delete
+											file="${project.build.directory}/staging/emulator/emulator-assembly.xml" />
+										<delete
+											file="${project.build.directory}/staging/emulator/src/main/resources/Kura_Core_Test.launch" />
+										<delete
+											file="${project.build.directory}/staging/emulator/src/main/resources/Kura_Emulator_Linux.launch" />
+										<delete
+											file="${project.build.directory}/staging/emulator/src/main/resources/Kura_Emulator_OSX.launch" />
+										<copy file="RELEASE_NOTES.txt"
+											todir="${project.build.directory}/staging/emulator/src/main/resources" />
+										<copy file="src/main/resources/common/Kura_Emulator_Linux.launch"
+											todir="${project.build.directory}/staging/emulator/src/main/resources" />
+										<copy file="src/main/resources/common/Kura_Emulator_OSX.launch"
+											todir="${project.build.directory}/staging/emulator/src/main/resources" />
+										<copy
+											file="src/main/resources/common/classpaths/emulator.classpath"
+											tofile="${project.build.directory}/staging/emulator/emulator.classpath" />
+										<copy file="src/main/resources/common/projects/emulator.project"
+											tofile="${project.build.directory}/staging/emulator/.project" />
+										<move
+											file="${project.build.directory}/staging/emulator/emulator.classpath"
+											tofile="${project.build.directory}/staging/emulator/.classpath" />
+
+										<!-- Stage the API -->
+										<copy todir="${project.build.directory}/staging/api">
+											<fileset dir="../org.eclipse.kura.api" />
+										</copy>
+										<delete file="${project.build.directory}/staging/api/pom.xml" />
+										<delete dir="${project.build.directory}/staging/api/bin" />
+										<delete dir="${project.build.directory}/staging/api/target" />
+										<delete
+											file="${project.build.directory}/staging/api/api-assembly.xml" />
+										<copy file="src/main/resources/common/classpaths/api.classpath"
+											tofile="${project.build.directory}/staging/api/api.classpath" />
+										<copy file="src/main/resources/common/projects/api.project"
+											tofile="${project.build.directory}/staging/api/.project" />
+										<move file="${project.build.directory}/staging/api/api.classpath"
+											tofile="${project.build.directory}/staging/api/.classpath" />
+
+										<!-- Stage the Demo Heater Project -->
+										<copy todir="${project.build.directory}/staging/demo_heater">
+											<fileset dir="../examples/org.eclipse.kura.demo.heater" />
+										</copy>
+										<delete
+											file="${project.build.directory}/staging/demo_heater/pom.xml" />
+										<delete dir="${project.build.directory}/staging/demo_heater/bin" />
+										<delete
+											dir="${project.build.directory}/staging/demo_heater/target" />
+										<copy
+											file="src/main/resources/common/classpaths/demo_heater.classpath"
+											tofile="${project.build.directory}/staging/demo_heater/demo_heater.classpath" />
+										<copy file="src/main/resources/common/projects/demo_heater.project"
+											tofile="${project.build.directory}/staging/demo_heater/.project" />
+										<move
+											file="${project.build.directory}/staging/demo_heater/demo_heater.classpath"
+											tofile="${project.build.directory}/staging/demo_heater/.classpath" />
+
+										<!-- Create the archive file with the components -->
+										<zip destfile="${project.build.directory}/${zip_workspace.prefix}.zip">
+											<zipfileset
+												dir="${project.build.directory}/staging/target-definition/"
+												prefix="target-definition/" />
+											<zipfileset dir="${project.build.directory}/staging/emulator/"
+												prefix="org.eclipse.kura.emulator/" />
+											<zipfileset dir="${project.build.directory}/staging/api/"
+												prefix="org.eclipse.kura.api/" />
+											<zipfileset dir="${project.build.directory}/staging/demo_heater/"
+												prefix="org.eclipse.kura.demo.heater/" />
+										</zip>
+									</target>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.sonatype.tycho</groupId>
+						<artifactId>tycho-p2-extras-plugin</artifactId>
+						<version>0.11.0</version>
+						<executions>
+							<execution>
+								<phase>package</phase>
+								<goals>
+									<goal>publish-features-and-bundles</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<compress>false</compress>
+							<sourceLocation>${project.build.directory}/staging/target-definition/equinox_3.8.1/repository</sourceLocation>
+							<artifactRepositoryLocation>${project.build.directory}/staging/target-definition/equinox_3.8.1/repository</artifactRepositoryLocation>
+							<metadataRepositoryLocation>${project.build.directory}/staging/target-definition/equinox_3.8.1/repository</metadataRepositoryLocation>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<id>extra-dps</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-antrun-plugin</artifactId>
+						<version>1.7</version>
+						<executions>
+							<execution>
+								<id>modbus-dp</id>
+								<phase>install</phase>
+								<goals>
+									<goal>run</goal>
+								</goals>
+								<configuration>
+									<target>
+										<property name="deployment.package.version" value="${deployment.package.version}" />
+										<ant antfile="${basedir}/src/main/ant/build_modbus_dp.xml"
+											target="build-dp" />
+									</target>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+</project>
diff --git a/kura/distrib/src/main/ant/build_equinox_distrib.xml b/kura/distrib/src/main/ant/build_equinox_distrib.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d8e2bb7e26180781cc7250c4bdecde31a403eb7f
--- /dev/null
+++ b/kura/distrib/src/main/ant/build_equinox_distrib.xml
@@ -0,0 +1,417 @@
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project name="build_equinox_distrib" default="dist-linux" basedir="../../../">
+
+    <target name="dist-linux"> 
+        <echo message="Building Kura Distribution profile based on ${kura.osgi} for ${build.name}-jars..." />
+
+        <copy file="src/main/resources/${build.name}/kura.properties"
+              tofile="${project.build.directory}/kura-${build.name}-jars_${project.version}/kura.properties" />
+        <propertyfile file="${project.build.directory}/kura-${build.name}-jars_${project.version}/kura.properties">
+            <entry key="kura.version"   value="KURA_${kura.version}" />
+            <entry key="kura.home"   value="/opt/eclipse/kura/kura" />
+            <entry key="kura.plugins"   value="/opt/eclipse/kura/kura/plugins" />
+            <entry key="kura.packages"   value="/opt/eclipse/kura/kura/packages" />
+            <entry key="version"       value="${kura.version}" />
+            <entry key="build.version" value="${buildNumber}" />
+            <entry key="build.number"  value="${build.name}-${buildNumber}" />
+        </propertyfile>
+    	
+    	<condition property="kura.osgi.repo" value="../target-definition/equinox_3.8.1/repository">
+    		<or>
+    			<not>
+    				<isset property="kura.osgi"/>
+    			</not>
+    			<equals arg1="${kura.osgi}" arg2="equinox"/>
+    		</or>
+    	</condition>
+    	
+        <copy file="src/main/resources/${build.name}/snapshot_0.xml"
+              tofile="${project.build.directory}/kura-${build.name}-jars_${project.version}/snapshot_0.xml" />
+        <copy    file="src/main/osgi/equinox_3.8.1/configuration/config.ini"
+                 tofile="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini" />
+
+        <!-- Populate config.ini with correct versions -->
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{kura.build.version}" value="${kura.build.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.api.version}" value="${org.eclipse.kura.api.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.version}" value="${org.eclipse.kura.core.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.cloud.version}" value="${org.eclipse.kura.core.cloud.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.comm.version}" value="${org.eclipse.kura.core.comm.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.configuration.version}" value="${org.eclipse.kura.core.configuration.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.crypto.version}" value="${org.eclipse.kura.core.crypto.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.deployment.version}" value="${org.eclipse.kura.core.deployment.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.core.net.version}" value="${org.eclipse.kura.core.net.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.deployment.agent.version}" value="${org.eclipse.kura.deployment.agent.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.deployment.customizer.version}" value="${org.eclipse.kura.deployment.customizer.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.deployment.update.version}" value="${org.eclipse.kura.deployment.update.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.linux.clock.version}" value="${org.eclipse.kura.linux.clock.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.linux.command.version}" value="${org.eclipse.kura.linux.command.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.linux.net.version}" value="${org.eclipse.kura.linux.net.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.linux.position.version}" value="${org.eclipse.kura.linux.position.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.linux.usb.version}" value="${org.eclipse.kura.linux.usb.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                 token="{org.eclipse.kura.linux.watchdog.version}" value="${org.eclipse.kura.linux.watchdog.version}"/>
+        <propertyfile file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini">
+            <entry key="osgi.bundles" operation="+"
+                   value=", reference:file:/opt/eclipse/kura/kura/plugins/org.eclipse.kura.net.admin_${org.eclipse.kura.net.admin.version}.v${kura.build.version}.jar@4:start" />
+        </propertyfile>
+        <propertyfile file="${project.build.directory}/kura-${build.name}-jars_${project.version}/dpa.properties"> 
+            <entry key="kura"
+                   value="file:/opt/eclipse/kura/kura/packages/kura-${build.name}-jars_${project.version}.dp" />
+        </propertyfile>
+		<available file="../org.eclipse.kura.web/target/org.eclipse.kura.web_${org.eclipse.kura.web.version}.v${kura.build.version}.jar" property="web.jar.present" />
+		<antcall target="web-config" />
+	<!-- Create the Kura start scripts -->
+	<echo file="${project.build.directory}/kura-${build.name}-jars_${project.version}/start_kura.sh" append="false">#!/bin/sh
+
+export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/jvm/bin:/usr/java/bin
+
+cd $(dirname $0)/..
+
+# set up the configuration area
+mkdir -p /tmp/.kura/configuration
+cp /opt/eclipse/kura/kura/config.ini /tmp/.kura/configuration/
+
+java -Xms${kura.mem.size} -Xmx${kura.mem.size} -XX:MaxPermSize=${kura.mem.size} -Dkura.os.version=${kura.os.version} \
+	-Dkura.arch=${kura.arch} \
+	-Declipse.ignoreApp=true \
+	-Dkura.home=/opt/eclipse/kura/kura \
+	-Dkura.configuration=file:/opt/eclipse/kura/kura/kura.properties \
+	-Dkura.custom.configuration=file:/opt/eclipse/kura/kura/kura_custom.properties \
+	-Ddpa.configuration=/opt/eclipse/kura/kura/dpa.properties \
+	-Dlog4j.configuration=file:/opt/eclipse/kura/kura/log4j.properties \
+	-jar /opt/eclipse/kura/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar \
+	-configuration  /tmp/.kura/configuration \
+	-console \
+	-consoleLog
+	</echo>    
+	<echo file="${project.build.directory}/kura-${build.name}-jars_${project.version}/start_kura_debug.sh" append="false">#!/bin/sh
+
+export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/jvm/bin:/usr/java/bin
+
+cd $(dirname $0)/..
+
+# set up the configuration area
+mkdir -p /tmp/.kura/configuration
+cp /opt/eclipse/kura/kura/config.ini /tmp/.kura/configuration/
+
+java -Xms${kura.mem.size} -Xmx${kura.mem.size} -XX:MaxPermSize=${kura.mem.size} -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
+	-Dkura.os.version=${kura.os.version} \
+	-Dkura.arch=${kura.arch} \
+	-Declipse.ignoreApp=true \
+	-Dkura.home=/opt/eclipse/kura/kura \
+	-Dkura.configuration=file:/opt/eclipse/kura/kura/kura.properties \
+	-Dkura.custom.configuration=file:/opt/eclipse/kura/kura/kura_custom.properties \
+	-Ddpa.configuration=/opt/eclipse/kura/kura/dpa.properties \
+	-Dlog4j.configuration=file:/opt/eclipse/kura/kura/log4j.properties \
+	-jar /opt/eclipse/kura/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar \
+	-configuration  /tmp/.kura/configuration \
+	-console \
+	-consoleLog
+	</echo>    
+	<echo file="${project.build.directory}/kura-${build.name}-jars_${project.version}/start_kura_background.sh" append="false">#!/bin/sh
+
+# Kura should be installed to the /opt/eclipse directory.
+export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/jvm/bin:/usr/java/bin
+
+cd /opt/eclipse/kura
+
+# set up the configuration area
+mkdir -p /tmp/.kura/configuration
+cp /opt/eclipse/kura/kura/config.ini /tmp/.kura/configuration/
+
+nohup java -Xms${kura.mem.size} -Xmx${kura.mem.size} -XX:MaxPermSize=${kura.mem.size} -Dkura.os.version=${kura.os.version} \
+	-Dkura.arch=${kura.arch} \
+	-Declipse.ignoreApp=true \
+	-Dkura.home=/opt/eclipse/kura/kura \
+	-Dkura.configuration=file:/opt/eclipse/kura/kura/kura.properties \
+	-Dkura.custom.configuration=file:/opt/eclipse/kura/kura/kura_custom.properties \
+	-Ddpa.configuration=/opt/eclipse/kura/kura/dpa.properties \
+	-Dlog4j.configuration=file:/opt/eclipse/kura/kura/log4j.properties \
+	-jar /opt/eclipse/kura/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar \
+	-configuration  /tmp/.kura/configuration \
+	-console 5002 \
+	-consoleLog >> /var/log/kura-console.log 2>> /var/log/kura-console.log &amp;
+
+#Save the PID
+KURA_PID=$!
+echo $KURA_PID > /var/run/kura.pid
+	</echo>
+        
+        <zip destfile="${project.build.directory}/kura-${build.name}-jars_${project.version}.zip">
+    
+            <zipfileset file="${project.build.directory}/kura-${build.name}-jars_${project.version}/snapshot_0.xml"
+                        prefix="kura-${build.name}-jars_${project.version}/data/snapshots/" />
+
+            <zipfileset file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/" />
+
+            <zipfileset file="src/main/resources/common/kura_custom.properties"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/" />
+
+            <zipfileset file="src/main/resources/${build.name}/kura_install.sh"
+                        prefix="kura-${build.name}-jars_${project.version}/install/" />
+
+	    <zipfileset file="src/main/resources/${build.name}/recover_dflt_kura_config.sh"
+                        prefix="kura-${build.name}-jars_${project.version}/install/" />
+
+            <zipfileset file="src/main/resources/${build.name}/kuranet.conf"
+                        prefix="kura-${build.name}-jars_${project.version}/install/" />
+
+            <zipfileset file="src/main/resources/common/kura.init.wrl"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/kura.init.yocto"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/kura.init.raspbian"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/${build.name}/firewall.init"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monit.init.wrl"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monit.init.yocto"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monit.init.raspbian"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monitrc.wrl"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monitrc.yocto"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monitrc.raspbian"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+
+            <zipfileset file="src/main/resources/common/logrotate.conf"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/kura.logrotate"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/hostapd.conf"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/dhcpd-eth0.conf"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/dhcpd-wlan0.conf"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/named/named.conf"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/named/named.ca"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/named/named.rfc1912.zones"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+        	<zipfileset file="src/main/resources/common/named/usr.sbin.named"
+        	        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/ifcfg-eth0"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifcfg-eth1"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifcfg-wlan0"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/network.interfaces"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/network.interfaces.raspbian"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/ifdown-local"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifup-local"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifup-local.debian"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifup-local.raspbian"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/ip-down.local"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ip-up.local"
+                        prefix="kura-${build.name}-jars_${project.version}/install" />
+
+            <zipfileset file="${project.build.directory}/kura-${build.name}-jars_${project.version}/start_kura.sh"
+                        fullpath="kura-${build.name}-jars_${project.version}/bin/start_kura.sh" filemode="777" />
+            <zipfileset file="${project.build.directory}/kura-${build.name}-jars_${project.version}/start_kura_debug.sh"
+                        fullpath="kura-${build.name}-jars_${project.version}/bin/start_kura_debug.sh" filemode="777" />
+            <zipfileset file="${project.build.directory}/kura-${build.name}-jars_${project.version}/start_kura_background.sh"
+                        fullpath="kura-${build.name}-jars_${project.version}/bin/start_kura_background.sh" filemode="777" />
+
+            <zipfileset file="RELEASE_NOTES.txt"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/" />
+            <zipfileset file="notice.html"
+                        prefix="kura-${build.name}-jars_${project.version}/" />
+            <zipfileset file="epl-v10.html"
+                        prefix="kura-${build.name}-jars_${project.version}/" />
+            <zipfileset file="src/main/resources/${build.name}/log4j.properties"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/" />
+            <zipfileset file="${project.build.directory}/kura-${build.name}-jars_${project.version}/kura.properties"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/" />
+    
+            <zipfileset dir="${kura.osgi.repo}/plugins/"
+                        prefix="kura-${build.name}-jars_${project.version}/plugins"/>
+            <zipfileset dir="../target-definition/common/repository/plugins"
+                        prefix="kura-${build.name}-jars_${project.version}/plugins"/>
+
+
+            <zipfileset file="../org.eclipse.kura.deployment.agent/target/org.eclipse.kura.deployment.agent_${org.eclipse.kura.deployment.agent.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.api/target/org.eclipse.kura.api_${org.eclipse.kura.api.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core/target/org.eclipse.kura.core_${org.eclipse.kura.core.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core.cloud/target/org.eclipse.kura.core.cloud_${org.eclipse.kura.core.cloud.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core.comm/target/org.eclipse.kura.core.comm_${org.eclipse.kura.core.comm.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core.configuration/target/org.eclipse.kura.core.configuration_${org.eclipse.kura.core.configuration.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core.crypto/target/org.eclipse.kura.core.crypto_${org.eclipse.kura.core.crypto.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core.deployment/target/org.eclipse.kura.core.deployment_${org.eclipse.kura.core.deployment.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.core.net/target/org.eclipse.kura.core.net_${org.eclipse.kura.core.net.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.clock/target/org.eclipse.kura.linux.clock_${org.eclipse.kura.linux.clock.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.command/target/org.eclipse.kura.linux.command_${org.eclipse.kura.linux.command.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.net/target/org.eclipse.kura.linux.net_${org.eclipse.kura.linux.net.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.position/target/org.eclipse.kura.linux.position_${org.eclipse.kura.linux.position.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.usb/target/org.eclipse.kura.linux.usb_${org.eclipse.kura.linux.usb.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.watchdog/target/org.eclipse.kura.linux.watchdog_${org.eclipse.kura.linux.watchdog.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.emulator/target/org.eclipse.kura.linux_${org.eclipse.kura.linux.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.net.admin/target/org.eclipse.kura.net.admin_${org.eclipse.kura.net.admin.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+        </zip>
+		<antcall target="web-jar" />
+        <echo message="Building Kura Distribution for ${build.name}-jars..." />
+        
+		<!-- Create installer script -->
+        <echo message="Creating Installer for ${build.name}" />
+        <exec executable="${project.build.directory}/../src/main/sh/create_installer.sh">
+                <arg value="${project.build.directory}" />
+                <arg value="kura-${build.name}-jars_${project.version}.zip" />
+                <arg value="kura-${build.name}_${project.version}_jars_installer.sh" />
+                <arg value="${build.name}" />
+        </exec>
+
+
+		<!-- Get version information for the bundles/files in this build -->
+        <echo message="Gathering version information for the bundles/files in ${build.name}" />
+        <exec executable="src/main/sh/get_build_versions.sh">
+                <arg value="${project.build.directory}" />
+                <arg value="kura-${build.name}-jars_${project.version}.zip" />
+                <arg value="kura-${build.name}_${project.version}.versions" />
+                <arg value="${build.name}" />
+        </exec>
+
+
+		<!-- Diff with the previous version -->
+        <property file="RELEASE_INFO/version.properties" />
+        <echo message="Diff version information with ${build.name} version ${project.version.previous}" />
+        <exec executable="src/main/sh/diff_build_versions.sh">
+                <arg value="RELEASE_INFO/${project.version.previous}/kura-${build.name}_${project.version.previous}.versions" />
+                <arg value="${project.build.directory}/kura-${build.name}_${project.version}.versions" />
+                <arg value="${project.build.directory}/kura-${build.name}_${project.version.previous}_to_${project.version}" />
+                <arg value="${build.name}" />
+        </exec>
+
+
+        <!-- Create upgrader -->
+        <echo message="Creating Upgrader for ${build.name}" />
+        <exec executable="${project.build.directory}/../src/main/sh/create_upgrader.sh">
+                <arg value="${project.build.directory}" />
+                <arg value="${project.build.directory}/kura-${build.name}-jars_${project.version}.zip" />
+                <arg value="kura-${build.name}-jars-upgrade_${project.version}.zip" />
+                <arg value="${project.version.previous}" />
+                <arg value="kura-${build.name}-jars_${project.version}" />
+                <arg value="kura-${build.name}_${project.version.previous}_to_${project.version}.removed" />
+                <arg value="kura-${build.name}_${project.version.previous}_to_${project.version}.keep" />
+                <arg value="kura-${build.name}_${project.version}_upgrader.sh" />
+                <arg value="${build.name}" />
+        </exec>
+
+        <!-- Zip the upgrader -->
+        <zip destfile="${project.build.directory}/kura-update-${build.name}_${project.version}.zip">
+                <zipfileset file="${project.build.directory}/kura-${build.name}_${project.version}_upgrader.sh" />
+                <zipfileset file="src/main/sh/upgrade_wrapper.sh" />
+        </zip>
+    	
+    	
+    	
+    	<!-- Build the upgrade deployment package -->
+    	<echo message="Building the upgrade DP" />
+
+        <!-- Create the manifest -->
+        <echo file="${project.build.directory}/kura-${build.name}-jars_${project.version}/dp_upgrade_stage/META-INF/MANIFEST.MF" append="false">Manifest-Version: 1.0
+DeploymentPackage-SymbolicName: kura-upgrade
+DeploymentPackage-Version: ${deployment.package.version}
+
+Name: org.eclipse.kura.deployment.customizer.upgrade_${org.eclipse.kura.deployment.customizer.upgrade.version}.v${kura.build.version}.jar
+Bundle-SymbolicName: org.eclipse.kura.deployment.customizer.upgrade
+Bundle-Version: 0.7.0.${kura.build.version}
+DeploymentPackage-Customizer: true
+
+Name: z_kura_dp_upgrader.sh
+Resource-Processor: org.eclipse.kura.deployment.customizer.upgrade.rp.UpgradeScriptResourceProcessor
+</echo>
+
+
+        <!-- move everything into place -->
+        <copy    file="${project.build.directory}/kura-${build.name}_${project.version}_upgrader.sh"
+                 tofile="${project.build.directory}/kura-${build.name}-jars_${project.version}/dp_upgrade_stage/z_kura_dp_upgrader.sh" />
+		<copy    file="../org.eclipse.kura.deployment.customizer.upgrade/target/org.eclipse.kura.deployment.customizer.upgrade_${org.eclipse.kura.deployment.customizer.upgrade.version}.v${kura.build.version}.jar"
+                 todir="${project.build.directory}/kura-${build.name}-jars_${project.version}/dp_upgrade_stage" />
+
+        <jar destfile="${project.build.directory}/kura-${build.name}_${project.version}_upgrader.dp"
+                manifest="${project.build.directory}/kura-${build.name}-jars_${project.version}/dp_upgrade_stage/META-INF/MANIFEST.MF"
+                basedir="${project.build.directory}/kura-${build.name}-jars_${project.version}/dp_upgrade_stage" />	
+    </target>
+
+	
+	
+	<target name="web-config" if="web.jar.present">
+		<propertyfile file="${project.build.directory}/kura-${build.name}-jars_${project.version}/config.ini">
+            	<entry key="osgi.bundles" operation="+"
+                   value=", reference:file:/opt/eclipse/kura/kura/plugins/org.eclipse.kura.web_${org.eclipse.kura.web.version}.v${kura.build.version}.jar@4:start" />
+        </propertyfile>
+	</target>
+
+	<target name="web-jar" if="web.jar.present">
+		<zip destfile="${project.build.directory}/kura-${build.name}-jars_${project.version}.zip" update="true">
+			<zipfileset file="../org.eclipse.kura.web/target/org.eclipse.kura.web_${org.eclipse.kura.web.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-jars_${project.version}/kura/plugins" />
+		</zip>
+	</target>
+</project>
+
diff --git a/kura/distrib/src/main/ant/build_equinox_distrib_test.xml b/kura/distrib/src/main/ant/build_equinox_distrib_test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4b840ccc77149ca2709da182b6e12fc860d159a4
--- /dev/null
+++ b/kura/distrib/src/main/ant/build_equinox_distrib_test.xml
@@ -0,0 +1,251 @@
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project name="build_equinox_distrib" default="dist-linux" basedir="../../../">
+
+    <target name="dist-linux"> <!-- depends="replace-core-configs,replace-linux-configs" -->
+		<!-- props in ant are immutable - so if they got set before - it's fine and they will not be overridden -->
+		<property name="core.location" value="../org.eclipse.kura.core/target/org.eclipse.kura.core_${project.version}.v${kura.build.version}.jar"/>
+		<property name="linux.location" value="../org.eclipse.kura.linux/target/org.eclipse.kura.linux_${project.version}.v${kura.build.version}.jar"/>
+	        <property name="core.crypto.location" value="../org.eclipse.kura.core.crypto/target/org.eclipse.kura.core.crypto_${project.version}.v${kura.build.version}.jar"/>
+
+        <echo message="Building Kura Distribution for ${build.name}-test..." />
+        
+        <copy file="src/main/resources/${build.name}/kura.properties"
+              tofile="${project.build.directory}/kura-${build.name}-test_${project.version}/kura.properties" />
+        <propertyfile file="${project.build.directory}/kura-${build.name}-test_${project.version}/kura.properties">
+            <entry key="kura.version"   value="${kura.bundle.versions}" />
+            <entry key="kura.home"   value="kura" />
+            <entry key="kura.plugins"   value="/opt/eclipse/kura/kura/plugins" />
+            <entry key="kura.packages"   value="/opt/eclipse/kura/kura/packages" />
+            <entry key="version"       value="${kura.bundle.versions}" />
+            <entry key="build.version" value="${buildNumber}" />
+            <entry key="build.number"  value="${build.name}-${buildNumber}" />
+        </propertyfile>
+
+        <copy file="src/main/resources/${build.name}/snapshot_0.xml"
+              tofile="${project.build.directory}/kura-${build.name}-test_${project.version}/snapshot_0.xml" />
+    
+        <copy    file="src/main/osgi/equinox_3.8.1/configuration/config-test.ini"
+                 tofile="${project.build.directory}/kura-${build.name}-test_${project.version}/config.ini" />
+        <replace file="${project.build.directory}/kura-${build.name}-test_${project.version}/config.ini"
+                 token="{project.version}" value="${project.version}"/>
+        <replace file="${project.build.directory}/kura-${build.name}-test_${project.version}/config.ini"
+                 token="{kura.build.version}" value="${kura.build.version}"/>
+
+        <propertyfile file="${project.build.directory}/kura-${build.name}-test_${project.version}/config.ini">
+            <entry key="osgi.bundles" operation="+"
+                   value=", reference:file:/opt/eclipse/kura/kura/plugins/org.eclipse.kura.linux_${project.version}.v${kura.build.version}.jar@4:start" />
+            <entry key="osgi.bundles" operation="+"
+                   value=", reference:file:/opt/eclipse/kura/kura/plugins/org.eclipse.kura.linux.test_${project.version}.v${kura.build.version}.jar@4" />
+            <entry key="osgi.bundles" operation="+"
+                   value=", reference:file:/opt/eclipse/kura/kura/plugins/org.eclipse.kura.net.admin_${project.version}.v${kura.build.version}.jar@4:start" />
+        </propertyfile>
+
+        <propertyfile file="${project.build.directory}/kura-${build.name}-test_${project.version}/dpa.properties"> 
+            <!--
+            <entry key="kura"
+                   value="file:/opt/eclipse/kura/kura/packages/kura-${build.name}-test_${project.version}.dp" />
+            -->
+        </propertyfile>
+
+	<!-- Create the Kura start scripts -->
+	<echo file="${project.build.directory}/kura-${build.name}_${project.version}/start_kura.sh" append="false">#!/bin/sh
+
+export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/jvm/bin:/usr/java/bin
+
+cd $(dirname $0)/..
+
+java -Xms${kura.mem.size} -Xmx${kura.mem.size} -XX:MaxPermSize=${kura.mem.size} -Dkura.os.version=${kura.os.version} \
+	-Declipse.ignoreApp=true \
+	-Dkura.configuration=file:/opt/eclipse/kura/kura/kura.properties \
+        -Ddpa.configuration=/opt/eclipse/kura/kura/dpa.properties \
+	-Dlog4j.configuration=file:/opt/eclipse/kura/kura/log4j.properties \
+	-jar plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar \
+	-configuration configuration \
+	-console \
+	-consoleLog
+	</echo>    
+	<echo file="${project.build.directory}/kura-${build.name}_${project.version}/start_kura_debug.sh" append="false">#!/bin/sh
+
+export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/jvm/bin:/usr/java/bin
+
+cd $(dirname $0)/..
+
+java -Xms${kura.mem.size} -Xmx${kura.mem.size} -XX:MaxPermSize=${kura.mem.size} -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
+	-Dkura.os.version=${kura.os.version} \
+	-Declipse.ignoreApp=true \
+	-Dkura.configuration=file:/opt/eclipse/kura/kura/kura.properties \
+        -Ddpa.configuration=/opt/eclipse/kura/kura/dpa.properties \
+	-Dlog4j.configuration=file:/opt/eclipse/kura/kura/log4j.properties \
+	-jar plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar \
+	-configuration configuration \
+	-console \
+	-consoleLog
+	</echo>    
+	<echo file="${project.build.directory}/kura-${build.name}_${project.version}/start_kura_background.sh" append="false"># Kura should be installed to the /opt/eclipse directory.
+
+#!/bin/sh
+
+export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/jvm/bin:/usr/java/bin
+
+cd /opt/eclipse/kura
+
+nohup java -Xms${kura.mem.size} -Xmx${kura.mem.size} -XX:MaxPermSize=${kura.mem.size} -Dkura.os.version=${kura.os.version} \
+        -Declipse.ignoreApp=true \
+        -Dkura.configuration=file:/opt/eclipse/kura/kura/kura.properties \
+        -Ddpa.configuration=/opt/eclipse/kura/kura/dpa.properties \
+        -Dlog4j.configuration=file:/opt/eclipse/kura/kura/log4j.properties \
+        -jar plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar \
+        -configuration configuration/ \
+        -console 5002 \
+        -consoleLog >> /var/log/kura-console.log 2>> /var/log/kura-console.log &amp;
+
+#Save the PID
+KURA_PID=$!
+echo $KURA_PID > /var/run/kura.pid
+	</echo>
+        
+        <zip destfile="${project.build.directory}/kura-${build.name}-test_${project.version}.zip">
+    
+            <zipfileset file="${project.build.directory}/kura-${build.name}_${project.version}/snapshot_0.xml"
+                        prefix="data/snapshots/" />
+
+            <zipfileset file="${project.build.directory}/kura-${build.name}-test_${project.version}/config.ini"
+                        prefix="kura-${build.name}-test_${project.version}/configuration/" />
+
+            <zipfileset file="src/main/resources/${build.name}/kura_install.sh"
+                        prefix="kura-${build.name}-test_${project.version}/install/" />
+
+            <zipfileset file="src/main/resources/${build.name}/kuranet.conf"
+                        prefix="kura-${build.name}-test_${project.version}/install/" />
+
+	    <zipfileset file="src/main/resources/${build.name}/recover_dflt_kura_config.sh"
+                        prefix="kura-${build.name}-test_${project.version}/install/" />
+
+            <zipfileset file="src/main/resources/common/kura.init.wrl"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/kura.init.yocto"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/${build.name}/firewall.init"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monit.init.wrl"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monit.init.yocto"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monitrc.wrl"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/monitrc.yocto"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/hostapd.conf"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/dhcpd-eth0.conf"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/dhcpd-wlan0.conf"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/named/named.conf"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/named/named.ca"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/named/named.rfc1912.zones"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+
+            <zipfileset file="src/main/resources/common/ifcfg-eth0"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifcfg-eth1"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifcfg-wlan0"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/network.interfaces"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifdown-local"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifup-local"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ifup-local.debian"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ip-down.local"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+            <zipfileset file="src/main/resources/common/ip-up.local"
+                        prefix="kura-${build.name}-test_${project.version}/install" />
+
+            <zipfileset file="${project.build.directory}/kura-${build.name}_${project.version}/start_kura.sh"
+                        fullpath="kura-${build.name}-test_${project.version}/bin/start_kura.sh" filemode="777" />
+            <zipfileset file="${project.build.directory}/kura-${build.name}_${project.version}/start_kura_debug.sh"
+                        fullpath="kura-${build.name}-test_${project.version}/bin/start_kura_debug.sh" filemode="777" />
+            <zipfileset file="${project.build.directory}/kura-${build.name}_${project.version}/start_kura_background.sh"
+                        fullpath="kura-${build.name}-test_${project.version}/bin/start_kura_background.sh" filemode="777" />
+
+            <zipfileset file="RELEASE_NOTES.txt"
+                        prefix="kura-${build.name}-test_${project.version}/kura/" />
+            <zipfileset file="notice.html"
+                        prefix="kura-${build.name}-test_${project.version}/" />
+            <zipfileset file="epl-v10.html"
+                        prefix="kura-${build.name}-test_${project.version}/" />
+            <zipfileset file="src/main/resources/${build.name}/log4j.properties"
+                        prefix="kura-${build.name}-test_${project.version}/kura/" />
+            <zipfileset file="${project.build.directory}/kura-${build.name}-test_${project.version}/kura.properties"
+                        prefix="kura-${build.name}-test_${project.version}/kura/" />
+    
+            <zipfileset dir="../target-definition/equinox_3.8.1/repository/plugins"
+                        prefix="kura-${build.name}-test_${project.version}/plugins"/>
+    
+            <zipfileset file="../org.eclipse.kura.deployment.agent/target/org.eclipse.kura.deployment.agent_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.api/target/org.eclipse.kura.api_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="${core.location}"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="${core.crypto.location}"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="${linux.location}"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.protocol.modbus/target/org.eclipse.kura.protocol.modbus_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.emulator/target/org.eclipse.kura.linux_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.net.admin/target/org.eclipse.kura.net.admin_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+<!--
+            <zipfileset file="../org.eclipse.kura.web/target/org.eclipse.kura.web_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+-->
+
+	    <!-- Test Specific Core Bundles -->
+            <zipfileset file="src/main/resources/common/org.hamcrest.core-1.1.0.v20090501071000.jar"
+                        prefix="kura-${build.name}-test_${project.version}/plugins" />
+            <zipfileset file="src/main/resources/common/org.junit-4.10.0.v4_10_0_v20120426-0900.jar"
+                        prefix="kura-${build.name}-test_${project.version}/plugins" />
+            <zipfileset file="src/main/resources/common/org.junit4-4.8.1.v20120523-1257.jar"
+                        prefix="kura-${build.name}-test_${project.version}/plugins" />
+            <zipfileset file="../org.eclipse.kura.test/target/org.eclipse.kura.test_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+
+	    <!-- Test Bundles -->
+            <zipfileset file="../org.eclipse.kura.core.test/target/org.eclipse.kura.core.test_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+            <zipfileset file="../org.eclipse.kura.linux.test/target/org.eclipse.kura.linux.test_${project.version}.v${kura.build.version}.jar"
+                        prefix="kura-${build.name}-test_${project.version}/kura/plugins" />
+
+            <zipfileset file="${project.build.directory}/kura-${build.name}-test_${project.version}/dpa.properties"
+                        prefix="kura-${build.name}-test_${project.version}/kura/" />
+
+        </zip>
+
+        <echo message="Building Kura Distribution for ${build.name}-test... Done." />             
+    </target>
+
+</project>
+
diff --git a/kura/distrib/src/main/ant/build_modbus_dp.xml b/kura/distrib/src/main/ant/build_modbus_dp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1930de70285dbb13d6d50ca7f6f9bf6376147ca1
--- /dev/null
+++ b/kura/distrib/src/main/ant/build_modbus_dp.xml
@@ -0,0 +1,25 @@
+<project name="build_modbus_dp" default="build-dp" basedir="../../../">
+
+	<target name="build-dp">
+    	<echo message="Building the DP for modbus" />
+
+		<!-- Create the manifest -->
+		<echo file="${project.build.directory}/org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}/dp_stage/META-INF/MANIFEST.MF" append="false">Manifest-Version: 1.0
+DeploymentPackage-SymbolicName: org.eclipse.kura.protocol.modbus
+DeploymentPackage-Version: ${deployment.package.version}
+
+Name: org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}.v${kura.build.version}.jar
+Bundle-SymbolicName: org.eclipse.kura.protocol.modbus
+Bundle-Version: ${org.eclipse.kura.protocol.modbus.version}</echo>
+
+	<!-- move everything into place -->
+        <copy    file="${project.basedir}/../../org.eclipse.kura.protocol.modbus/target/org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}.v${kura.build.version}.jar"
+                 todir="${project.build.directory}/org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}/dp_stage" />
+	
+
+        <jar destfile="${project.build.directory}/org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}.dp"
+		manifest="${project.build.directory}/org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}/dp_stage/META-INF/MANIFEST.MF"
+                basedir="${project.build.directory}/org.eclipse.kura.protocol.modbus_${org.eclipse.kura.protocol.modbus.version}/dp_stage" />	
+    </target>
+    
+</project>
diff --git a/kura/distrib/src/main/deb/control/control b/kura/distrib/src/main/deb/control/control
new file mode 100644
index 0000000000000000000000000000000000000000..5739c975c59739a0dc95f9fe15b7ecebd77c0a2f
--- /dev/null
+++ b/kura/distrib/src/main/deb/control/control
@@ -0,0 +1,12 @@
+Package: KURA
+Version: [[project.version]]
+Section: misc
+Priority: low
+Depends: [[project.raspbian.dependencies]]
+Architecture: all
+Maintainer: support@eurotech.com
+Description: Kura is an inclusive software framework that puts a layer
+  between the operating system and the customer application, with industry
+  standard interfaces that shorten custom development time, simplified coding
+  and software that can be easily ported from one hardware platform
+  to another.
diff --git a/kura/distrib/src/main/deb/control/postinst b/kura/distrib/src/main/deb/control/postinst
new file mode 100755
index 0000000000000000000000000000000000000000..bb11e69aa9ab0e1551dd4af8da923b554f93c274
--- /dev/null
+++ b/kura/distrib/src/main/deb/control/postinst
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+##############################################
+# POST INSTALL SCRIPT
+##############################################
+mkdir -p /opt/eclipse >> /tmp/kura_install.log 2>&1
+unzip /tmp/kura-*.zip -d /opt/eclipse >> /tmp/kura_install.log 2>&1
+
+#install KURA files
+sh /opt/eclipse/kura-*/install/kura_install.sh >> /tmp/kura_install.log 2>&1
+
+#clean up
+rm -rf /opt/eclipse/kura/install >> /tmp/kura_install.log 2>&1
+rm /tmp/kura-*.zip >> /tmp/kura_install.log 2>&1
+
+#move the log file
+mv /tmp/kura_install.log /opt/eclipse/kura/kura/
+
+#flush all cached filesystem to disk
+sync
+
+echo ""
+echo "Finished. KURA has been installed to /opt/eclipse/kura and will start automatically after a reboot"
+exit 0
+#############################################
+# END POST INSTALL SCRIPT
+##############################################
+
diff --git a/kura/distrib/src/main/deb/control/preinst b/kura/distrib/src/main/deb/control/preinst
new file mode 100755
index 0000000000000000000000000000000000000000..21b5b7ad0bc174cf48d71c4d515c1fe9891d1485
--- /dev/null
+++ b/kura/distrib/src/main/deb/control/preinst
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+##############################################
+# PRE-INSTALL SCRIPT
+##############################################
+PIDS=`pgrep java`
+
+echo ""
+echo "Installing Kura..."
+echo "Installing Kura..." > /tmp/kura_install.log 2>&1
+
+#Kill JVM and monit for installation
+if [ -f "/var/run/kura.pid" ] ; then
+  KURA_PID=`cat /var/run/kura.pid`
+
+  for pid in "${PIDS[@]}"
+  do
+    if [ "$KURA_PID" == "$pid" ] ; then
+      `kill $pid` >> /tmp/kura_install.log 2>&1
+    fi
+  done
+fi
+
+#clean up old installation if present
+rm -fr /opt/eclipse/* >> /tmp/kura_install.log 2>&1
+rm -fr /tmp/.kura/ >> /tmp/kura_install.log 2>&1
+rm /etc/init.d/firewall >> /tmp/kura_install.log 2>&1
+rm /etc/dhcpd-*.conf >> /tmp/kura_install.log 2>&1
+rm /etc/named.conf >> /tmp/kura_install.log 2>&1
+rm /etc/wpa_supplicant.conf >> /tmp/kura_install.log 2>&1
+rm /etc/hostapd.conf >> /tmp/kura_install.log 2>&1
+rm /tmp/coninfo-* >> /tmp/kura_install.log 2>&1
+rm /var/log/kura.log >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/chat >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/peers >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/scripts >> /tmp/kura_install.log 2>&1
+rm /etc/ppp/*ap-secrets >> /tmp/kura_install.log 2>&1
+rm kura-*.zip >> /tmp/kura_install.log 2>&1
+
+echo ""
+##############################################
+# END PRE-INSTALL SCRIPT
+##############################################
+
diff --git a/kura/distrib/src/main/deb/control/prerm b/kura/distrib/src/main/deb/control/prerm
new file mode 100644
index 0000000000000000000000000000000000000000..4978cc795b7af76ddb86b3cdc150e41d2b16b2c2
--- /dev/null
+++ b/kura/distrib/src/main/deb/control/prerm
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+##############################################
+# PRE-REMOVE SCRIPT
+##############################################
+PIDS=`pgrep java`
+
+echo ""
+echo "Uninstalling KURA..."
+
+#Kill JVM and monit for installation
+if [ -f "/var/run/kura.pid" ] ; then
+  KURA_PID=`cat /var/run/kura.pid`
+
+  for pid in "${PIDS[@]}"
+  do
+    if [ "$KURA_PID" == "$pid" ] ; then
+      `kill $pid` >> /tmp/kura_install.log 2>&1
+    fi
+  done
+fi
+
+#Remove INIT scripts
+rm /etc/init.d/firewall
+rm /etc/init.d/kura
+update-rc.d firewall remove
+update-rc.d kura remove
+
+#Delete Eclipse directory if present
+if [ -d "/opt/eclipse/kura/data" ] ; then
+  rm -rf /opt/eclipse/kura/data
+fi
+
+if [ -d "/opt/eclipse/kura" ] ; then
+  rm -rf /opt/eclipse/kura
+fi
+
diff --git a/kura/distrib/src/main/deb/control_nn/control b/kura/distrib/src/main/deb/control_nn/control
new file mode 100644
index 0000000000000000000000000000000000000000..81b8fd0cebb67338eb7fc620293b145c7e0c76c0
--- /dev/null
+++ b/kura/distrib/src/main/deb/control_nn/control
@@ -0,0 +1,12 @@
+Package: KURA
+Version: [[project.version]]
+Section: misc
+Priority: low
+Depends: [[project.raspbian_nn.dependencies]]
+Architecture: all
+Maintainer: support@eurotech.com
+Description: Kura is an inclusive software framework that puts a layer
+  between the operating system and the customer application, with industry
+  standard interfaces that shorten custom development time, simplified coding
+  and software that can be easily ported from one hardware platform
+  to another.
diff --git a/kura/distrib/src/main/deb/control_nn/postinst b/kura/distrib/src/main/deb/control_nn/postinst
new file mode 100755
index 0000000000000000000000000000000000000000..bb11e69aa9ab0e1551dd4af8da923b554f93c274
--- /dev/null
+++ b/kura/distrib/src/main/deb/control_nn/postinst
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+##############################################
+# POST INSTALL SCRIPT
+##############################################
+mkdir -p /opt/eclipse >> /tmp/kura_install.log 2>&1
+unzip /tmp/kura-*.zip -d /opt/eclipse >> /tmp/kura_install.log 2>&1
+
+#install KURA files
+sh /opt/eclipse/kura-*/install/kura_install.sh >> /tmp/kura_install.log 2>&1
+
+#clean up
+rm -rf /opt/eclipse/kura/install >> /tmp/kura_install.log 2>&1
+rm /tmp/kura-*.zip >> /tmp/kura_install.log 2>&1
+
+#move the log file
+mv /tmp/kura_install.log /opt/eclipse/kura/kura/
+
+#flush all cached filesystem to disk
+sync
+
+echo ""
+echo "Finished. KURA has been installed to /opt/eclipse/kura and will start automatically after a reboot"
+exit 0
+#############################################
+# END POST INSTALL SCRIPT
+##############################################
+
diff --git a/kura/distrib/src/main/deb/control_nn/preinst b/kura/distrib/src/main/deb/control_nn/preinst
new file mode 100755
index 0000000000000000000000000000000000000000..21b5b7ad0bc174cf48d71c4d515c1fe9891d1485
--- /dev/null
+++ b/kura/distrib/src/main/deb/control_nn/preinst
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+##############################################
+# PRE-INSTALL SCRIPT
+##############################################
+PIDS=`pgrep java`
+
+echo ""
+echo "Installing Kura..."
+echo "Installing Kura..." > /tmp/kura_install.log 2>&1
+
+#Kill JVM and monit for installation
+if [ -f "/var/run/kura.pid" ] ; then
+  KURA_PID=`cat /var/run/kura.pid`
+
+  for pid in "${PIDS[@]}"
+  do
+    if [ "$KURA_PID" == "$pid" ] ; then
+      `kill $pid` >> /tmp/kura_install.log 2>&1
+    fi
+  done
+fi
+
+#clean up old installation if present
+rm -fr /opt/eclipse/* >> /tmp/kura_install.log 2>&1
+rm -fr /tmp/.kura/ >> /tmp/kura_install.log 2>&1
+rm /etc/init.d/firewall >> /tmp/kura_install.log 2>&1
+rm /etc/dhcpd-*.conf >> /tmp/kura_install.log 2>&1
+rm /etc/named.conf >> /tmp/kura_install.log 2>&1
+rm /etc/wpa_supplicant.conf >> /tmp/kura_install.log 2>&1
+rm /etc/hostapd.conf >> /tmp/kura_install.log 2>&1
+rm /tmp/coninfo-* >> /tmp/kura_install.log 2>&1
+rm /var/log/kura.log >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/chat >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/peers >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/scripts >> /tmp/kura_install.log 2>&1
+rm /etc/ppp/*ap-secrets >> /tmp/kura_install.log 2>&1
+rm kura-*.zip >> /tmp/kura_install.log 2>&1
+
+echo ""
+##############################################
+# END PRE-INSTALL SCRIPT
+##############################################
+
diff --git a/kura/distrib/src/main/deb/control_nn/prerm b/kura/distrib/src/main/deb/control_nn/prerm
new file mode 100644
index 0000000000000000000000000000000000000000..4978cc795b7af76ddb86b3cdc150e41d2b16b2c2
--- /dev/null
+++ b/kura/distrib/src/main/deb/control_nn/prerm
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+##############################################
+# PRE-REMOVE SCRIPT
+##############################################
+PIDS=`pgrep java`
+
+echo ""
+echo "Uninstalling KURA..."
+
+#Kill JVM and monit for installation
+if [ -f "/var/run/kura.pid" ] ; then
+  KURA_PID=`cat /var/run/kura.pid`
+
+  for pid in "${PIDS[@]}"
+  do
+    if [ "$KURA_PID" == "$pid" ] ; then
+      `kill $pid` >> /tmp/kura_install.log 2>&1
+    fi
+  done
+fi
+
+#Remove INIT scripts
+rm /etc/init.d/firewall
+rm /etc/init.d/kura
+update-rc.d firewall remove
+update-rc.d kura remove
+
+#Delete Eclipse directory if present
+if [ -d "/opt/eclipse/kura/data" ] ; then
+  rm -rf /opt/eclipse/kura/data
+fi
+
+if [ -d "/opt/eclipse/kura" ] ; then
+  rm -rf /opt/eclipse/kura
+fi
+
diff --git a/kura/distrib/src/main/osgi/equinox_3.8.1/configuration/config-test.ini b/kura/distrib/src/main/osgi/equinox_3.8.1/configuration/config-test.ini
new file mode 100644
index 0000000000000000000000000000000000000000..26b95ea56704a0a96830c8c660b144de91270bba
--- /dev/null
+++ b/kura/distrib/src/main/osgi/equinox_3.8.1/configuration/config-test.ini
@@ -0,0 +1,75 @@
+#Configuration File
+#Wed Nov 21 18:24:04 CET 2012
+osgi.framework=file\:plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar
+equinox.use.ds=true
+osgi.bundles= \
+ reference\:file\:../plugins/org.eclipse.equinox.cm_1.0.400.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.common_3.6.100.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.registry_3.5.200.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.http.registry_1.1.200.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.console_1.0.0.v20120522-1841.jar@1, \
+ reference\:file\:../plugins/org.eclipse.equinox.ds_1.4.0.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.event_1.2.200.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.io_1.0.400.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.metatype_1.2.0.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.util_1.0.400.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.osgi.services_3.3.100.v20120522-1822.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.osgi.util_3.2.300.v20120522-1822.jar@4:start, \
+ reference\:file\:../plugins/org.apache.felix.gogo.command_0.8.0.v201108120515.jar@4, \
+ reference\:file\:../plugins/org.apache.felix.gogo.runtime_0.8.0.v201108120515.jar@4, \
+ reference\:file\:../plugins/org.apache.felix.gogo.shell_0.8.0.v201110170705.jar@4, \
+ reference\:file\:../plugins/org.knowhowlab.osgi.monitoradmin_1.0.2.jar@:4:start, \
+ reference\:file\:../plugins/org.apache.felix.dependencymanager_3.0.0.jar@4:start, \
+ reference\:file\:../plugins/org.apache.felix.deploymentadmin_0.9.5.jar@4:start, \
+ reference\:file\:../plugins/osgi.cmpn_4.3.0.201111022214.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.http.jetty_3.0.0.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.continuation_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.http_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.io_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.security_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.server_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.servlet_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.util_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/javax.servlet_3.0.0.v201112011016.jar@4:start, \
+ reference\:file\:../plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar@4:start, \
+ reference\:file\:../plugins/org.apache.commons.io_2.4.0.jar@4:start, \
+ reference\:file\:../plugins/slf4j.api_1.6.4.jar@4:start, \
+ reference\:file\:../plugins/slf4j.log4j12_1.6.0.jar@4, \
+ reference\:file\:../plugins/log4j_1.2.17.jar@4, \
+ reference\:file\:../plugins/log4j.apache-log4j-extras_1.1.0.jar@4, \
+ reference\:file\:../plugins/org.json_1.0.0.v201011060100.jar@4:start, \
+ reference\:file\:../plugins/mqtt-client_0.4.0.jar@4:start, \
+ reference\:file\:../plugins/org.hsqldb.hsqldb_2.3.0.jar@4:start, \
+ reference\:file\:../plugins/org.apache.servicemix.bundles.protobuf-java_2.4.1.1.jar@4:start, \
+ reference\:file\:../plugins/com.codeminders.hidapi_1.1.0.jar@4:start, \
+ reference\:file\:../plugins/javax.bluetooth_2.1.1.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.soda.dk.comm_1.2.0.jar@4:start, \
+ reference\:file\:../plugins/javax.usb.api_1.0.2.jar@4:start, \
+ reference\:file\:../plugins/javax.usb.common_1.0.2.jar@4:start, \
+ reference\:file\:../plugins/org.apache.commons.net_3.1.0.v201205071737.jar@4:start, \
+ reference\:file\:../plugins/org.tigris.mtoolkit.iagent.rpc_3.0.0.20110411-0918.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.deployment.agent_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.api_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.crypto_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.protocol.modbus_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.protocol.pcn_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.web_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../plugins/org.hamcrest.core-1.1.0.v20090501071000.jar@4:start, \
+ reference\:file\:../plugins/org.junit-4.10.0.v4_10_0_v20120426-0900.jar@4:start, \
+ reference\:file\:../plugins/org.junit4-4.8.1.v20120523-1257.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.test_{project.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.test_{project.version}.v{kura.build.version}.jar@4
+osgi.nl=en_us
+osgi.clean=true
+osgi.noShutdown=true
+osgi.bundles.defaultStartLevel=4
+osgi.framework.extensions=
+osgi.instance.area=/tmp/kura/data
+org.osgi.framework.storage=/tmp/kura/data
+org.osgi.service.http.port=80
+osgi.configuration.cascaded=false
+eclipse.ignoreApp=true
+iagent.controller=false
+equinox.ds.block_timeout=60000
diff --git a/kura/distrib/src/main/osgi/equinox_3.8.1/configuration/config.ini b/kura/distrib/src/main/osgi/equinox_3.8.1/configuration/config.ini
new file mode 100644
index 0000000000000000000000000000000000000000..0e63e66f735aa8195e1bf12dc171717a4006dcf4
--- /dev/null
+++ b/kura/distrib/src/main/osgi/equinox_3.8.1/configuration/config.ini
@@ -0,0 +1,78 @@
+#Configuration File
+#Wed Nov 21 18:24:04 CET 2012
+osgi.framework=file\:plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar
+equinox.use.ds=true
+osgi.bundles= \
+ reference\:file\:../plugins/org.eclipse.equinox.cm_1.0.400.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.common_3.6.100.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.registry_3.5.200.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.http.registry_1.1.200.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.console_1.0.0.v20120522-1841.jar@1, \
+ reference\:file\:../plugins/org.eclipse.equinox.ds_1.4.0.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.event_1.2.200.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.io_1.0.400.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.metatype_1.2.0.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.util_1.0.400.v20120522-2049.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.osgi.services_3.3.100.v20120522-1822.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.osgi.util_3.2.300.v20120522-1822.jar@4:start, \
+ reference\:file\:../plugins/org.apache.felix.gogo.command_0.8.0.v201108120515.jar@4, \
+ reference\:file\:../plugins/org.apache.felix.gogo.runtime_0.8.0.v201108120515.jar@4, \
+ reference\:file\:../plugins/org.apache.felix.gogo.shell_0.8.0.v201110170705.jar@4, \
+ reference\:file\:../plugins/org.knowhowlab.osgi.monitoradmin_1.0.2.jar@:4:start, \
+ reference\:file\:../plugins/org.apache.felix.dependencymanager_3.0.0.jar@4:start, \
+ reference\:file\:../plugins/org.apache.felix.deploymentadmin_0.9.5.jar@4:start, \
+ reference\:file\:../plugins/osgi.cmpn_4.3.0.201111022214.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.http.jetty_3.0.0.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.continuation_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.http_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.io_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.security_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.server_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.servlet_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.jetty.util_8.1.3.v20120522.jar@4:start, \
+ reference\:file\:../plugins/javax.servlet_3.0.0.v201112011016.jar@4:start, \
+ reference\:file\:../plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar@4:start, \
+ reference\:file\:../plugins/org.apache.commons.io_2.4.0.jar@4:start, \
+ reference\:file\:../plugins/slf4j.api_1.6.4.jar@4:start, \
+ reference\:file\:../plugins/slf4j.log4j12_1.6.0.jar@4, \
+ reference\:file\:../plugins/log4j_1.2.17.jar@4, \
+ reference\:file\:../plugins/log4j.apache-log4j-extras_1.1.0.jar@4, \
+ reference\:file\:../plugins/org.json_1.0.0.v201011060100.jar@4:start, \
+ reference\:file\:../plugins/mqtt-client_0.4.0.jar@4:start, \
+ reference\:file\:../plugins/org.hsqldb.hsqldb_2.3.0.jar@4:start, \
+ reference\:file\:../plugins/org.apache.servicemix.bundles.protobuf-java_2.4.1.1.jar@4:start, \
+ reference\:file\:../plugins/com.codeminders.hidapi_1.1.0.jar@4:start, \
+ reference\:file\:../plugins/org.eclipse.soda.dk.comm_1.2.0.jar@4:start, \
+ reference\:file\:../plugins/javax.usb.api_1.0.2.jar@4:start, \
+ reference\:file\:../plugins/javax.usb.common_1.0.2.jar@4:start, \
+ reference\:file\:../plugins/org.apache.commons.net_3.1.0.v201205071737.jar@4:start, \
+ reference\:file\:../plugins/org.tigris.mtoolkit.iagent.rpc_3.0.0.20110411-0918.jar@4:start, \
+ reference\:file\:../plugins/com.gwt.user_0.2.0.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.deployment.agent_{org.eclipse.kura.deployment.agent.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.api_{org.eclipse.kura.api.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core_{org.eclipse.kura.core.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.cloud_{org.eclipse.kura.core.cloud.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.comm_{org.eclipse.kura.core.comm.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.configuration_{org.eclipse.kura.core.configuration.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.crypto_{org.eclipse.kura.core.crypto.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.deployment_{org.eclipse.kura.core.deployment.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.core.net_{org.eclipse.kura.core.net.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.linux.clock_{org.eclipse.kura.linux.clock.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.linux.command_{org.eclipse.kura.linux.command.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.linux.net_{org.eclipse.kura.linux.net.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.linux.position_{org.eclipse.kura.linux.position.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.linux.usb_{org.eclipse.kura.linux.usb.version}.v{kura.build.version}.jar@4:start, \
+ reference\:file\:../kura/plugins/org.eclipse.kura.linux.watchdog_{org.eclipse.kura.linux.watchdog.version}.v{kura.build.version}.jar@4:start
+osgi.nl=en_us
+osgi.clean=true
+osgi.noShutdown=true
+osgi.bundles.defaultStartLevel=4
+osgi.framework.extensions=
+osgi.instance.area=/tmp/kura/data
+org.osgi.framework.storage=/tmp/kura/data
+org.osgi.service.http.port=80
+osgi.configuration.cascaded=false
+eclipse.ignoreApp=true
+iagent.controller=false
+equinox.ds.block_timeout=60000
diff --git a/kura/distrib/src/main/resources/beaglebone-nn/kura.properties b/kura/distrib/src/main/resources/beaglebone-nn/kura.properties
new file mode 100644
index 0000000000000000000000000000000000000000..aa956952660a81fba4a19068bf744faea3aa14ba
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone-nn/kura.properties
@@ -0,0 +1,136 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+## -----------------------------------------------------------------------------
+##  Kura Properties
+## -----------------------------------------------------------------------------
+kura.name=Kura
+kura.version=
+kura.company=ECLIPSE
+kura.project=beaglebone-nn
+kura.platform=beaglebone-nn
+kura.device.name=beaglebone-nn
+kura.model.id=beaglebone-nn
+kura.model.name=beaglebone-nn
+kura.partNumber=beaglebone-nn
+kura.serialNumber=beaglebone-nn
+kura.bios.version=N/A
+kura.firmware.version=N/A
+kura.primary.network.interface=eth0
+# kura.mac.address= Fetch from Java
+kura.home=/opt/eclipse/kura/kura
+kura.plugins=/opt/eclipse/kura/kura/plugins
+kura.packages=/opt/eclipse/kura/kura/packages
+kura.data=/opt/eclipse/kura/data
+kura.tmp=/tmp/.kura
+kura.snapshots=/opt/eclipse/kura/data/snapshots
+kura.style.dir=/opt/eclipse/kura/console/skin
+kura.have.net.admin=true
+kura.wifi.top.channel=11
+# os.arch= Fetch from Java
+# os.name= Fetch from Java
+# os.version= Fetch from Java
+os.distribution=Linux
+os.distribution.version=N/A
+# java.version= Fetch from Java
+# java.vendor= Fetch from Java
+# java.vm.name= Fetch from Java
+# java.vm.version= Fetch from Java
+# java.home= Fetch from Java
+# file.separator= Fetch from Java
+
+
+## -----------------------------------------------------------------------------
+## Java Key Store Settings
+## -----------------------------------------------------------------------------
+kura.ssl.keyStorePassword=everyware
+kura.ssl.trustStorePassword=everyware
+
+
+## -----------------------------------------------------------------------------
+## HSQLDB Service Properties
+## -----------------------------------------------------------------------------
+# The following configurations represent different trade-offs between data durability
+# and wearing of the physical storage. This aspect is particularly important for
+# embedded devices where the storage is tipically a flash based device (NAND, SD etc.)
+# with a limited number of write/erase cycles.
+
+## 1. In-memory configuration.
+## This configuration is suggested for high publish rates.
+## DB survives to network/connection drops but all messages are lost
+## in case of a crash or power failure.
+## see http://hsqldb.org/doc/guide/ch04.html
+db.service.hsqldb.url=jdbc:hsqldb:mem:kuradb
+
+## 2. Mostly persistent.
+## This configuration is suggested for medium publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## all the messages stored since the last checkpoint will be lost.
+## A checkpoint should be run periodically to control the desired consistency of the database.
+## As data logging is disabled, the defragmentation is operated periodically by the ESF Housekeeper task.
+## This will flush the .data and perform a defragmentation.
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## Applications can call manual \u201Ccheckpoint\u201D if they need further durability.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=false
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=Does not apply
+# db.service.hsqldb.write_delay_millis=Does not apply
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+## 3. Most persistent.
+## This configuration is suggested for slow publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## most of the data can be recovered from the data.log file.
+## A periodic checkpoint is not needed in this case.
+## An automatic defragmentation is operated by HSQLDB as set in the db.service.hsqldb.defrag_limit which should NOT be set to 0.
+## In this configuration with logging enabled, the Housekeeper task will NOT perform any defragmentation.  
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## The configuration parameter db.service.hsqldb.write_delay_millis controls the delay with which the data is flushed to disk.
+## The default is 500ms. In the case of power interruption you would loose the last X millies of data.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=true
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=50
+# db.service.hsqldb.write_delay_millis=Rely on defaults if not set
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+
+## -----------------------------------------------------------------------------
+##  Remote Configuration Properties
+## -----------------------------------------------------------------------------
+console.device.management.service.ignore=org.eclipse.kura.net.admin.NetworkConfigurationService
+
+
+## -----------------------------------------------------------------------------
+## File upload settings
+## -----------------------------------------------------------------------------
+# default 10240
+file.upload.in.memory.size.threshold=10240
+# -1: unlimited (default)
+file.upload.size.max=-1
+
+
+## -----------------------------------------------------------------------------
+## Deployment Agent settings
+## -----------------------------------------------------------------------------
+# see copyURLToFile() http://commons.apache.org/proper/commons-io/javadocs/api-2.4/index.html
+dpa.connection.timeout = 60000
+dpa.read.timeout = 60000
diff --git a/kura/distrib/src/main/resources/beaglebone-nn/kura_install.sh b/kura/distrib/src/main/resources/beaglebone-nn/kura_install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f4940575654488ba6d72efe7cdb9cd1ff018c483
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone-nn/kura_install.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up Kura init
+cp /opt/eclipse/kura/install/kura.init.raspbian /etc/init.d/kura
+chmod +x /etc/init.d/kura
+chmod +x /opt/eclipse/kura/bin/*.sh
+
+# set up /opt/eclipse/kura/recover_dflt_kura_config.sh
+cp /opt/eclipse/kura/install/recover_dflt_kura_config.sh /opt/eclipse/kura/recover_dflt_kura_config.sh
+chmod +x /opt/eclipse/kura/recover_dflt_kura_config.sh
+if [ ! -d /opt/eclipse/kura/.data ]; then
+    mkdir /opt/eclipse/kura/.data
+fi
+# for md5.info should keep the same order as in the /opt/eclipse/kura/recover_dflt_kura_config.sh
+echo `md5sum /opt/eclipse/kura/data/snapshots/snapshot_0.xml` > /opt/eclipse/kura/.data/md5.info
+tar czf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz /opt/eclipse/kura/data/snapshots/snapshot_0.xml
+
+#set up runlevels to start/stop Kura by default
+update-rc.d kura defaults
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/beaglebone-nn/kura_upgrade.sh b/kura/distrib/src/main/resources/beaglebone-nn/kura_upgrade.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e26ffa62606f8f05b1b1b9a98b68f0f12d8dbdf9
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone-nn/kura_upgrade.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up Kura init
+cp /opt/eclipse/kura/install/kura.init.raspbian /etc/init.d/kura
+chmod +x /etc/init.d/kura
+chmod +x /opt/eclipse/kura/bin/*.sh
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/beaglebone-nn/log4j.properties b/kura/distrib/src/main/resources/beaglebone-nn/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3d17185ab015eff407cf74cdb42745023d6b943c
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone-nn/log4j.properties
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+### direct log messages to kura.log ###
+log4j.appender.kura=org.apache.log4j.rolling.RollingFileAppender
+log4j.appender.kura.File=/var/log/kura.log
+log4j.appender.kura.RollingPolicy=org.apache.log4j.rolling.FixedWindowRollingPolicy
+log4j.appender.kura.RollingPolicy.ActiveFileName=/var/log/kura.log
+log4j.appender.kura.RollingPolicy.FileNamePattern=/var/log/kura-%i.log.gz
+log4j.appender.kura.RollingPolicy.MaxIndex=10
+log4j.appender.kura.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
+log4j.appender.kura.TriggeringPolicy.MaxFileSize=20000000
+log4j.appender.kura.layout = org.apache.log4j.EnhancedPatternLayout
+log4j.appender.kura.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{1.} - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+log4j.rootLogger=DEBUG,kura
+
+## eclipse
+log4j.logger.org.eclipse=DEBUG
diff --git a/kura/distrib/src/main/resources/beaglebone-nn/recover_dflt_kura_config.sh b/kura/distrib/src/main/resources/beaglebone-nn/recover_dflt_kura_config.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d82f727326af3eee1493a3b1dc365185f8b10894
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone-nn/recover_dflt_kura_config.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+cd /tmp
+tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+sum=`md5sum /tmp/opt/eclipse/kura/data/kuranet.conf`
+echo ${sum/\/tmp\//\/} > /tmp/opt/eclipse/kura/data/md5.info
+sum=`md5sum /tmp/opt/eclipse/kura/data/snapshots/snapshot_0.xml`
+echo ${sum/\/tmp\//\/} >> /tmp/opt/eclipse/kura/data/md5.info
+
+MD5_1=`md5sum /tmp/opt/eclipse/kura/data/md5.info | cut -d ' ' -f 1`
+MD5_2=`md5sum /opt/eclipse/kura/.data/md5.info | cut -d ' ' -f 1`
+if [ $MD5_1 == $MD5_2 ]; then
+    cd /
+    tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+    # clean up
+    cd /tmp
+    rm -rf opt
+    echo "Default Kura configuration has been recovered."
+else
+    echo "MD5 sum doesn't match, Kura configuration recovery failed."
+fi
diff --git a/kura/distrib/src/main/resources/beaglebone-nn/snapshot_0.xml b/kura/distrib/src/main/resources/beaglebone-nn/snapshot_0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..56b5f219d58863e5eb3a1d53c48c150dd3aabdd0
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone-nn/snapshot_0.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<esf:configurations xmlns:ocd="http://www.osgi.org/xmlns/metatype/v1.2.0" xmlns:esf="http://eurotech.com/esf/2.0">
+    <esf:configuration pid="org.eclipse.kura.watchdog.WatchdogService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.watchdog.WatchdogService</esf:value>
+            </esf:property>
+            <esf:property name="pingInterval" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.clock.ClockService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.port" array="false" encrypted="false" type="Integer">
+                <esf:value>123</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.refresh-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>3600</esf:value>
+            </esf:property>
+            <esf:property name="clock.provider" array="false" encrypted="false" type="String">
+                <esf:value>java-ntp</esf:value>
+            </esf:property>
+            <esf:property name="clock.set.hwclock" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.host" array="false" encrypted="false" type="String">
+                <esf:value>0.pool.ntp.org</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.clock.ClockService</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport">
+        <esf:properties>
+            <esf:property name="clean-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="username" array="false" encrypted="false" type="String">
+                <esf:value>username</esf:value>
+            </esf:property>
+            <esf:property name="topic.context.account-name" array="false" encrypted="false" type="String">
+                <esf:value>account-name</esf:value>
+            </esf:property>
+            <esf:property name="broker-url" array="false" encrypted="false" type="String">
+                <esf:value>mqtt://broker-url:1883/</esf:value>
+            </esf:property>
+            <esf:property name="lwt.retain" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="in-flight.persistence" array="false" encrypted="false" type="String">
+                <esf:value>file</esf:value>
+            </esf:property>
+            <esf:property name="lwt.topic" array="false" encrypted="false" type="String">
+                <esf:value>$EDC/#account-name/#client-id/MQTT/LWT</esf:value>
+            </esf:property>
+            <esf:property name="keep-alive" array="false" encrypted="false" type="Integer">
+                <esf:value>30</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport</esf:value>
+            </esf:property>
+            <esf:property name="password" array="false" encrypted="false" type="Password">
+                <esf:value>password</esf:value>
+            </esf:property>
+            <esf:property name="timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>20</esf:value>
+            </esf:property>
+            <esf:property name="lwt.qos" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.data.DataService">
+        <esf:properties>
+            <esf:property name="in-flight-messages.congestion-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="store.purge-age" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.republish-on-new-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="store.capacity" array="false" encrypted="false" type="Integer">
+                <esf:value>1000</esf:value>
+            </esf:property>
+            <esf:property name="disconnect.quiesce-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10</esf:value>
+            </esf:property>
+            <esf:property name="connect.auto-on-startup" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="connect.retry-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.data.DataService</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.max-number" array="false" encrypted="false" type="Integer">
+                <esf:value>9</esf:value>
+            </esf:property>
+            <esf:property name="store.housekeeper-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>900</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.position.PositionService">
+        <esf:properties>
+            <esf:property name="port" array="false" encrypted="false" type="String">
+                <esf:value>1-3.2</esf:value>
+            </esf:property>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="parity" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="stopBits" array="false" encrypted="false" type="Integer">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="baudRate" array="false" encrypted="false" type="Integer">
+                <esf:value>115200</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.position.PositionService</esf:value>
+            </esf:property>
+            <esf:property name="bitsPerWord" array="false" encrypted="false" type="Integer">
+                <esf:value>8</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.cloud.CloudService">
+        <esf:properties>
+            <esf:property name="encode.gzip" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="device.display-name" array="false" encrypted="false" type="String">
+                <esf:value>Beaglebone</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+</esf:configurations>
diff --git a/kura/distrib/src/main/resources/beaglebone/firewall.init b/kura/distrib/src/main/resources/beaglebone/firewall.init
new file mode 100644
index 0000000000000000000000000000000000000000..116207e8655ffbfc03c045063e834278c03feac0
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/firewall.init
@@ -0,0 +1,66 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          firewall
+# Required-Start:    
+# Required-Stop:     
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Firewall init 
+# Description:       Start linux firewall
+### END INIT INFO
+
+# IPTables Firewall script
+
+
+#Clear all Built-in Chains
+iptables -F INPUT
+iptables -F OUTPUT
+iptables -F FORWARD
+iptables -t nat -F
+
+
+#Block all ports for input traffic
+iptables -P INPUT DROP
+#block Output Traffic
+iptables -P OUTPUT ACCEPT
+#block forward Traffic
+iptables -P FORWARD DROP
+
+#Allow all traffic to loop back interface, SSH, and HTTP
+iptables -A INPUT -i lo -j ACCEPT
+
+#Allow Only incoming connection related to Outgoing connection
+iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+
+#allow inbound ICMP requests
+iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+iptables -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
+
+#custom local service rules
+iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth0 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth1 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i wlan0 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 10.234.0.0/16 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth0 --dport 1450 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth1 --dport 1450 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i wlan0 --dport 1450 -j ACCEPT
+iptables -I INPUT -p tcp -s 127.0.0.1/32 --dport 5002 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth0 --dport 53 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth1 --dport 53 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i wlan0 --dport 53 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth0 --dport 67 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth1 --dport 67 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i wlan0 --dport 67 -j ACCEPT
+
+#custom port forward service rules
+
+#custom nat service rules
+
+#custom rules
+
+#allow fowarding if any masquerade is defined
+echo 1 > /proc/sys/net/ipv4/ip_forward
+
+#source a custom firewall script
+source /etc/init.d/firewall_cust 2> /dev/null
diff --git a/kura/distrib/src/main/resources/beaglebone/kura.properties b/kura/distrib/src/main/resources/beaglebone/kura.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3b4a2cf38dc4aa13c3f5f4d7bd0ab0077a365515
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/kura.properties
@@ -0,0 +1,136 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+## -----------------------------------------------------------------------------
+##  Kura Properties
+## -----------------------------------------------------------------------------
+kura.name=Kura
+kura.version=
+kura.company=ECLIPSE
+kura.project=beaglebone
+kura.platform=beaglebone
+kura.device.name=beaglebone
+kura.model.id=beaglebone
+kura.model.name=beaglebone
+kura.partNumber=beaglebone
+kura.serialNumber=beaglebone
+kura.bios.version=N/A
+kura.firmware.version=N/A
+kura.primary.network.interface=eth0
+# kura.mac.address= Fetch from Java
+kura.home=/opt/eclipse/kura/kura
+kura.plugins=/opt/eclipse/kura/kura/plugins
+kura.packages=/opt/eclipse/kura/kura/packages
+kura.data=/opt/eclipse/kura/data
+kura.tmp=/tmp/.kura
+kura.snapshots=/opt/eclipse/kura/data/snapshots
+kura.style.dir=/opt/eclipse/kura/console/skin
+kura.have.net.admin=true
+kura.wifi.top.channel=11
+# os.arch= Fetch from Java
+# os.name= Fetch from Java
+# os.version= Fetch from Java
+os.distribution=Linux
+os.distribution.version=N/A
+# java.version= Fetch from Java
+# java.vendor= Fetch from Java
+# java.vm.name= Fetch from Java
+# java.vm.version= Fetch from Java
+# java.home= Fetch from Java
+# file.separator= Fetch from Java
+
+
+## -----------------------------------------------------------------------------
+## Java Key Store Settings
+## -----------------------------------------------------------------------------
+kura.ssl.keyStorePassword=everyware
+kura.ssl.trustStorePassword=everyware
+
+
+## -----------------------------------------------------------------------------
+## HSQLDB Service Properties
+## -----------------------------------------------------------------------------
+# The following configurations represent different trade-offs between data durability
+# and wearing of the physical storage. This aspect is particularly important for
+# embedded devices where the storage is tipically a flash based device (NAND, SD etc.)
+# with a limited number of write/erase cycles.
+
+## 1. In-memory configuration.
+## This configuration is suggested for high publish rates.
+## DB survives to network/connection drops but all messages are lost
+## in case of a crash or power failure.
+## see http://hsqldb.org/doc/guide/ch04.html
+db.service.hsqldb.url=jdbc:hsqldb:mem:kuradb
+
+## 2. Mostly persistent.
+## This configuration is suggested for medium publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## all the messages stored since the last checkpoint will be lost.
+## A checkpoint should be run periodically to control the desired consistency of the database.
+## As data logging is disabled, the defragmentation is operated periodically by the ESF Housekeeper task.
+## This will flush the .data and perform a defragmentation.
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## Applications can call manual \u201Ccheckpoint\u201D if they need further durability.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=false
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=Does not apply
+# db.service.hsqldb.write_delay_millis=Does not apply
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+## 3. Most persistent.
+## This configuration is suggested for slow publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## most of the data can be recovered from the data.log file.
+## A periodic checkpoint is not needed in this case.
+## An automatic defragmentation is operated by HSQLDB as set in the db.service.hsqldb.defrag_limit which should NOT be set to 0.
+## In this configuration with logging enabled, the Housekeeper task will NOT perform any defragmentation.  
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## The configuration parameter db.service.hsqldb.write_delay_millis controls the delay with which the data is flushed to disk.
+## The default is 500ms. In the case of power interruption you would loose the last X millies of data.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=true
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=50
+# db.service.hsqldb.write_delay_millis=Rely on defaults if not set
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+
+## -----------------------------------------------------------------------------
+##  Remote Configuration Properties
+## -----------------------------------------------------------------------------
+console.device.management.service.ignore=org.eclipse.kura.net.admin.NetworkConfigurationService
+
+
+## -----------------------------------------------------------------------------
+## File upload settings
+## -----------------------------------------------------------------------------
+# default 10240
+file.upload.in.memory.size.threshold=10240
+# -1: unlimited (default)
+file.upload.size.max=-1
+
+
+## -----------------------------------------------------------------------------
+## Deployment Agent settings
+## -----------------------------------------------------------------------------
+# see copyURLToFile() http://commons.apache.org/proper/commons-io/javadocs/api-2.4/index.html
+dpa.connection.timeout = 60000
+dpa.read.timeout = 60000
diff --git a/kura/distrib/src/main/resources/beaglebone/kura_install.sh b/kura/distrib/src/main/resources/beaglebone/kura_install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e4fc47b77a5c391f50508c54c617b28c3049139f
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/kura_install.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up Kura init
+cp /opt/eclipse/kura/install/kura.init.raspbian /etc/init.d/kura
+chmod +x /etc/init.d/kura
+chmod +x /opt/eclipse/kura/bin/*.sh
+
+#set up default networking file
+cp /opt/eclipse/kura/install/network.interfaces.raspbian /etc/network/interfaces
+
+#set up network helper scripts
+cp /opt/eclipse/kura/install/ifup-local.raspbian /etc/network/if-up.d/ifup-local
+cp /opt/eclipse/kura/install/ifdown-local /etc/network/if-down.d/ifdown-local
+chmod +x /etc/network/if-up.d/ifup-local
+chmod +x /etc/network/if-down.d/ifdown-local
+
+#set up default firewall configuration
+cp /opt/eclipse/kura/install/firewall.init /etc/init.d/firewall
+chmod +x /etc/init.d/firewall
+
+#set up networking configuration
+mac_addr=$(head -1 /sys/class/net/eth0/address | tr '[:lower:]' '[:upper:]')
+sed "s/^ssid=kura_gateway.*/ssid=kura_gateway_${mac_addr}/" < /opt/eclipse/kura/install/hostapd.conf > /etc/hostapd.conf
+cp /opt/eclipse/kura/install/dhcpd-eth0.conf /etc/dhcpd-eth0.conf
+
+#set up kuranet.conf
+cp /opt/eclipse/kura/install/kuranet.conf /opt/eclipse/data/kuranet.conf
+
+#set up bind/named
+cp /opt/eclipse/kura/install/named.conf /etc/bind/named.conf
+cp /opt/eclipse/kura/install/named.ca /var/named/
+cp /opt/eclipse/kura/install/named.rfc1912.zones /etc/
+if [ ! -f "/etc/bind/rndc.key" ] ; then
+	rndc-confgen -r /dev/urandom -a
+fi
+
+#set up monit
+cp /opt/eclipse/kura/install/monit.init.raspbian /etc/init.d/monit
+chmod +x /etc/init.d/monit
+cp /opt/eclipse/kura/install/monitrc.raspbian /etc/monitrc
+chmod 700 /etc/monitrc
+
+# set up /opt/eclipse/kura/recover_dflt_kura_config.sh
+cp /opt/eclipse/kura/install/recover_dflt_kura_config.sh /opt/eclipse/kura/recover_dflt_kura_config.sh
+chmod +x /opt/eclipse/kura/recover_dflt_kura_config.sh
+if [ ! -d /opt/eclipse/kura/.data ]; then
+    mkdir /opt/eclipse/kura/.data
+fi
+# for md5.info should keep the same order as in the /opt/eclipse/recover_dflt_kura_config.sh
+echo `md5sum /opt/eclipse/kura/data/kuranet.conf` > /opt/eclipse/kura/.data/md5.info
+echo `md5sum /opt/eclipse/kura/data/snapshots/snapshot_0.xml` >> /opt/eclipse/kura/.data/md5.info
+tar czf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz /opt/eclipse/kura/data/kuranet.conf /opt/eclipse/kura/data/snapshots/snapshot_0.xml
+
+#set up runlevels to start/stop Kura by default
+update-rc.d firewall defaults
+update-rc.d kura defaults
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/beaglebone/kura_upgrade.sh b/kura/distrib/src/main/resources/beaglebone/kura_upgrade.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9564e88b79d748e87cde814d6e4c9741295b048f
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/kura_upgrade.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up network helper scripts
+cp /opt/eclipse/kura/install/ifup-local.raspbian /etc/network/if-up.d/ifup-local
+cp /opt/eclipse/kura/install/ifdown-local /etc/network/if-down.d/ifdown-local
+chmod +x /etc/network/if-up.d/ifup-local
+chmod +x /etc/network/if-down.d/ifdown-local
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/beaglebone/kuranet.conf b/kura/distrib/src/main/resources/beaglebone/kuranet.conf
new file mode 100644
index 0000000000000000000000000000000000000000..58f789a27a4a8b423eb663ed10b4bc605fbefcd3
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/kuranet.conf
@@ -0,0 +1,15 @@
+#Tue Sep 10 17:49:05 GMT 2013
+net.interface.eth0.config.ip4.status=netIPv4StatusEnabledWAN
+net.interface.eth0.config.dhcpServer4.enabled=false
+net.interface.eth0.config.nat.dst.interface=unknown
+net.interface.eth0.config.dhcpServer4.passDns=false
+net.interface.eth0.config.nat.enabled=false
+net.interface.lo.config.ip4.status=netIPv4StatusEnabledLAN
+net.interface.wlan0.config.nat.masquerade=true
+net.interface.wlan0.config.wifi.mode=MASTER
+net.interface.wlan0.config.dhcpServer4.passDns=true
+net.interface.wlan0.config.dhcpServer4.enabled=true
+net.interface.wlan0.config.ip4.status=netIPv4StatusEnabledLAN
+net.interface.wlan0.config.wifi.infra.driver=nl80211
+net.interface.wlan0.config.nat.enabled=true
+net.interface.wlan0.config.nat.dst.interface=unknown
diff --git a/kura/distrib/src/main/resources/beaglebone/log4j.properties b/kura/distrib/src/main/resources/beaglebone/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3d17185ab015eff407cf74cdb42745023d6b943c
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/log4j.properties
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+### direct log messages to kura.log ###
+log4j.appender.kura=org.apache.log4j.rolling.RollingFileAppender
+log4j.appender.kura.File=/var/log/kura.log
+log4j.appender.kura.RollingPolicy=org.apache.log4j.rolling.FixedWindowRollingPolicy
+log4j.appender.kura.RollingPolicy.ActiveFileName=/var/log/kura.log
+log4j.appender.kura.RollingPolicy.FileNamePattern=/var/log/kura-%i.log.gz
+log4j.appender.kura.RollingPolicy.MaxIndex=10
+log4j.appender.kura.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
+log4j.appender.kura.TriggeringPolicy.MaxFileSize=20000000
+log4j.appender.kura.layout = org.apache.log4j.EnhancedPatternLayout
+log4j.appender.kura.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{1.} - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+log4j.rootLogger=DEBUG,kura
+
+## eclipse
+log4j.logger.org.eclipse=DEBUG
diff --git a/kura/distrib/src/main/resources/beaglebone/recover_dflt_kura_config.sh b/kura/distrib/src/main/resources/beaglebone/recover_dflt_kura_config.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d82f727326af3eee1493a3b1dc365185f8b10894
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/recover_dflt_kura_config.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+cd /tmp
+tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+sum=`md5sum /tmp/opt/eclipse/kura/data/kuranet.conf`
+echo ${sum/\/tmp\//\/} > /tmp/opt/eclipse/kura/data/md5.info
+sum=`md5sum /tmp/opt/eclipse/kura/data/snapshots/snapshot_0.xml`
+echo ${sum/\/tmp\//\/} >> /tmp/opt/eclipse/kura/data/md5.info
+
+MD5_1=`md5sum /tmp/opt/eclipse/kura/data/md5.info | cut -d ' ' -f 1`
+MD5_2=`md5sum /opt/eclipse/kura/.data/md5.info | cut -d ' ' -f 1`
+if [ $MD5_1 == $MD5_2 ]; then
+    cd /
+    tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+    # clean up
+    cd /tmp
+    rm -rf opt
+    echo "Default Kura configuration has been recovered."
+else
+    echo "MD5 sum doesn't match, Kura configuration recovery failed."
+fi
diff --git a/kura/distrib/src/main/resources/beaglebone/snapshot_0.xml b/kura/distrib/src/main/resources/beaglebone/snapshot_0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f2747036bbc2f2d11606f819f61315b1bcbeee55
--- /dev/null
+++ b/kura/distrib/src/main/resources/beaglebone/snapshot_0.xml
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<esf:configurations xmlns:ocd="http://www.osgi.org/xmlns/metatype/v1.2.0" xmlns:esf="http://eurotech.com/esf/2.0">
+    <esf:configuration pid="org.eclipse.kura.net.admin.NetworkConfigurationService">
+        <esf:properties>
+            <esf:property name="net.interface.eth0.config.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.autoconnect" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.driver" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.driver.version" array="false" encrypted="false" type="String">
+                <esf:value>unkown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.mac" array="false" encrypted="false" type="String">
+                <esf:value>00:00:00:00:00:00</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.virtual" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.loopback" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.type" array="false" encrypted="false" type="String">
+                <esf:value>ETHERNET</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.type" array="false" encrypted="false" type="String">
+                <esf:value>LOOPBACK</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.product.id" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.virtual" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ptp" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.firmware.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.name" array="false" encrypted="false" type="String">
+                <esf:value>lo</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.mac" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.state" array="false" encrypted="false" type="String">
+                <esf:value>ACTIVATED</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.driver.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>8</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.driver" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.winsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ptp" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="modified.interface.names" array="false" encrypted="false" type="String">
+                <esf:value>eth0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.mtu" array="false" encrypted="false" type="Integer">
+                <esf:value>16436</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ip4.broadcast" array="false" encrypted="false" type="String">
+                <esf:value>255.0.0.0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpClient4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.ip4.status" array="false" encrypted="false" type="String">
+                <esf:value>netIPv4StatusEnabledWAN</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.name" array="false" encrypted="false" type="String">
+                <esf:value>eth0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.state" array="false" encrypted="false" type="String">
+                <esf:value>ACTIVATED</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.busNumber" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.eth.link.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.mtu" array="false" encrypted="false" type="Integer">
+                <esf:value>1500</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.devicePath" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.dhcpClient4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.gateway" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ip4.broadcast" array="false" encrypted="false" type="String">
+                <esf:value>255.255.255.0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.status" array="false" encrypted="false" type="String">
+                <esf:value>netIPv4StatusEnabledLAN</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.autoconnect" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.product.name" array="false" encrypted="false"/>
+            <esf:property name="net.interface.lo.config.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.vendor.name" array="false" encrypted="false"/>
+            <esf:property name="net.interface.eth0.loopback" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.vendor.id" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interfaces" array="false" encrypted="false" type="String">
+                <esf:value>lo,eth0,wlan0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.domains" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.firmware.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.broadcast" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.wifi.bitrate" array="false" encrypted="false" type="Long">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.channel" array="false" encrypted="false" type="String">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.virtual" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.hardwareMode" array="false" encrypted="false" type="String">
+                <esf:value>g</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.passDns" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.nat.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ptp" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.rangeStart" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.100</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.mode" array="false" encrypted="false" type="String">
+                <esf:value>MASTER</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.type" array="false" encrypted="false" type="String">
+                <esf:value>WIFI</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ip4.netmask" array="false" encrypted="false" type="String">
+                <esf:value>255.255.255.0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.mac" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ip4.broadcast" array="false" encrypted="false" type="String">
+                <esf:value>172.16.255.255</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.radioMode" array="false" encrypted="false" type="String">
+                <esf:value>RADIO_MODE_80211g</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.rangeEnd" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.110</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.mtu" array="false" encrypted="false" type="Integer">
+                <esf:value>1500</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.channel" array="false" encrypted="false" type="String">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>24</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.passphrase" array="false" encrypted="false" type="String">
+                <esf:value>testKEYS</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.autoconnect" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.mode" array="false" encrypted="false" type="String">
+                <esf:value>INFRA</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ip4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>24</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.securityType" array="false" encrypted="false" type="String">
+                <esf:value>SECURITY_WPA2</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.firmware.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.loopback" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.wifi.capabilities" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.broadcast" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.winsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.driver" array="false" encrypted="false" type="String">
+                <esf:value>nl80211</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.driver" array="false" encrypted="false" type="String">
+                <esf:value>nl80211</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.securityType" array="false" encrypted="false" type="String">
+                <esf:value>SECURITY_NONE</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.gateway" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.state" array="false" encrypted="false" type="String">
+                <esf:value>ACTIVATED</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.name" array="false" encrypted="false" type="String">
+                <esf:value>wlan0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ip4.gateway" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.driver" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.mode" array="false" encrypted="false" type="String">
+                <esf:value>MASTER</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.maxLeaseTime" array="false" encrypted="false" type="Integer">
+                <esf:value>7200</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.ssid" array="false" encrypted="false" type="String">
+                <esf:value>kura_gateway</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>24</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.passphrase" array="false" encrypted="false" type="String">
+                <esf:value>testKEYS</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.domains" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpClient4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.ssid" array="false" encrypted="false" type="String">
+                <esf:value>kura_minigateway</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.hardwareMode" array="false" encrypted="false" type="String">
+                <esf:value>g</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.defaultLeaseTime" array="false" encrypted="false" type="Integer">
+                <esf:value>7200</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.status" array="false" encrypted="false" type="String">
+                <esf:value>netIPv4StatusEnabledLAN</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.driver.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.watchdog.WatchdogService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.watchdog.WatchdogService</esf:value>
+            </esf:property>
+            <esf:property name="pingInterval" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.clock.ClockService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.port" array="false" encrypted="false" type="Integer">
+                <esf:value>123</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.refresh-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>3600</esf:value>
+            </esf:property>
+            <esf:property name="clock.provider" array="false" encrypted="false" type="String">
+                <esf:value>java-ntp</esf:value>
+            </esf:property>
+            <esf:property name="clock.set.hwclock" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.host" array="false" encrypted="false" type="String">
+                <esf:value>0.pool.ntp.org</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.clock.ClockService</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport">
+        <esf:properties>
+            <esf:property name="clean-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="username" array="false" encrypted="false" type="String">
+                <esf:value>username</esf:value>
+            </esf:property>
+            <esf:property name="topic.context.account-name" array="false" encrypted="false" type="String">
+                <esf:value>account-name</esf:value>
+            </esf:property>
+            <esf:property name="broker-url" array="false" encrypted="false" type="String">
+                <esf:value>mqtt://broker-url:1883/</esf:value>
+            </esf:property>
+            <esf:property name="lwt.retain" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="in-flight.persistence" array="false" encrypted="false" type="String">
+                <esf:value>file</esf:value>
+            </esf:property>
+            <esf:property name="lwt.topic" array="false" encrypted="false" type="String">
+                <esf:value>$EDC/#account-name/#client-id/MQTT/LWT</esf:value>
+            </esf:property>
+            <esf:property name="keep-alive" array="false" encrypted="false" type="Integer">
+                <esf:value>30</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport</esf:value>
+            </esf:property>
+            <esf:property name="password" array="false" encrypted="false" type="Password">
+                <esf:value>password</esf:value>
+            </esf:property>
+            <esf:property name="timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>20</esf:value>
+            </esf:property>
+            <esf:property name="lwt.qos" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.data.DataService">
+        <esf:properties>
+            <esf:property name="in-flight-messages.congestion-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="store.purge-age" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.republish-on-new-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="store.capacity" array="false" encrypted="false" type="Integer">
+                <esf:value>1000</esf:value>
+            </esf:property>
+            <esf:property name="disconnect.quiesce-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10</esf:value>
+            </esf:property>
+            <esf:property name="connect.auto-on-startup" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="connect.retry-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.data.DataService</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.max-number" array="false" encrypted="false" type="Integer">
+                <esf:value>9</esf:value>
+            </esf:property>
+            <esf:property name="store.housekeeper-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>900</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.position.PositionService">
+        <esf:properties>
+            <esf:property name="port" array="false" encrypted="false" type="String">
+                <esf:value>1-3.2</esf:value>
+            </esf:property>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="parity" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="stopBits" array="false" encrypted="false" type="Integer">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="baudRate" array="false" encrypted="false" type="Integer">
+                <esf:value>115200</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.position.PositionService</esf:value>
+            </esf:property>
+            <esf:property name="bitsPerWord" array="false" encrypted="false" type="Integer">
+                <esf:value>8</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.cloud.CloudService">
+        <esf:properties>
+            <esf:property name="encode.gzip" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="device.display-name" array="false" encrypted="false" type="String">
+                <esf:value>Beaglebone</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+</esf:configurations>
diff --git a/kura/distrib/src/main/resources/common/Kura_Emulator_Linux.launch b/kura/distrib/src/main/resources/common/Kura_Emulator_Linux.launch
new file mode 100644
index 0000000000000000000000000000000000000000..4772d23a39607b3bd5f1ccca9ac475bb9f88b865
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/Kura_Emulator_Linux.launch
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Kura_Emulator_Linux"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="deselected_workspace_plugins" value="org.eclipse.kura.demo.heater"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8080 -Dkura.have.net.admin=false -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dosgi.noShutdown=true -Declipse.ignoreApp=true  -Dorg.eclipse.kura.mode=emulator -Dkura.configuration=file:${workspace_loc}/org.eclipse.kura.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties -Dlog4j.configuration=file:${workspace_loc}/org.eclipse.kura.emulator/src/main/resources/log4j.properties"/>
+<booleanAttribute key="pde.generated.config" value="true"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="com.gwt.user@default:default,javax.servlet@default:default,javax.usb.api@default:default,javax.usb.common@default:default,log4j.apache-log4j-extras@default:default,log4j@default:default,mqtt-client@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.net@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.kura.core.configuration@default:default,org.eclipse.kura.core.crypto@default:default,org.eclipse.kura.core.net@default:default,org.eclipse.kura.core@default:default,org.eclipse.kura.deployment.agent@default:default,org.eclipse.kura.web@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.soda.dk.comm@default:default,org.hsqldb.hsqldb@default:default,org.json@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="timestamp" value="1355734261731"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.kura.api@default:true,org.eclipse.kura.emulator@default:true"/>
+</launchConfiguration>
diff --git a/kura/distrib/src/main/resources/common/Kura_Emulator_OSX.launch b/kura/distrib/src/main/resources/common/Kura_Emulator_OSX.launch
new file mode 100644
index 0000000000000000000000000000000000000000..a4b0294502268c600593e0f2db4b2e60d9462d59
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/Kura_Emulator_OSX.launch
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Kura_Emulator_OSX"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="deselected_workspace_plugins" value="org.eclipse.kura.demo.heater"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8080 -Dkura.have.net.admin=false -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dosgi.noShutdown=true -Declipse.ignoreApp=true  -Dorg.eclipse.kura.mode=emulator -Dkura.configuration=file:${workspace_loc}/org.eclipse.kura.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties -Dlog4j.configuration=file:${workspace_loc}/org.eclipse.kura.emulator/src/main/resources/log4j.properties -Djavax.net.debug=ssl,handshake"/>
+<booleanAttribute key="pde.generated.config" value="true"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="com.gwt.user@default:default,javax.servlet@default:default,javax.usb.api@default:default,javax.usb.common@default:default,log4j.apache-log4j-extras@default:false,log4j@default:default,mqtt-client@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.net@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.kura.core.configuration@default:default,org.eclipse.kura.core.crypto@default:default,org.eclipse.kura.core.net@default:default,org.eclipse.kura.core@default:default,org.eclipse.kura.deployment.agent@default:default,org.eclipse.kura.web@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.soda.dk.comm@default:default,org.hsqldb.hsqldb@default:default,org.json@default:default,org.knowhowlab.osgi.monitoradmin@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="timestamp" value="1360341874060"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.kura.api@default:true,org.eclipse.kura.emulator@default:true"/>
+</launchConfiguration>
diff --git a/kura/distrib/src/main/resources/common/classpaths/api.classpath b/kura/distrib/src/main/resources/common/classpaths/api.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..9e755fb9bdda7b85117a1df5b28704967e795c82
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/classpaths/api.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/resources"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+</classpath>
diff --git a/kura/distrib/src/main/resources/common/classpaths/demo_heater.classpath b/kura/distrib/src/main/resources/common/classpaths/demo_heater.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..bb2294603ebe45962ca36018864da0f62a13d815
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/classpaths/demo_heater.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+</classpath>
diff --git a/kura/distrib/src/main/resources/common/classpaths/emulator.classpath b/kura/distrib/src/main/resources/common/classpaths/emulator.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..9e755fb9bdda7b85117a1df5b28704967e795c82
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/classpaths/emulator.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/resources"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+</classpath>
diff --git a/kura/distrib/src/main/resources/common/dhcpd-eth0.conf b/kura/distrib/src/main/resources/common/dhcpd-eth0.conf
new file mode 100644
index 0000000000000000000000000000000000000000..3af2e593189b5982ac844b4ef5604f5dda79eb3e
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/dhcpd-eth0.conf
@@ -0,0 +1,15 @@
+# enabled? true
+# prefix: 24
+# pass DNS? true
+
+subnet 172.16.0.0 netmask 255.255.255.0 {
+    option domain-name-servers 172.16.0.1;
+
+    interface eth0;
+    option routers 172.16.0.1;
+    default-lease-time 7200;
+    max-lease-time 7200;
+    pool {
+        range 172.16.0.100 172.16.0.110;
+    }
+}
diff --git a/kura/distrib/src/main/resources/common/dhcpd-wlan0.conf b/kura/distrib/src/main/resources/common/dhcpd-wlan0.conf
new file mode 100644
index 0000000000000000000000000000000000000000..919fbf68fb6e017cd70321d7acb1f796f44ea6c1
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/dhcpd-wlan0.conf
@@ -0,0 +1,15 @@
+# enabled? true
+# prefix: 24
+# pass DNS? true
+
+subnet 172.16.1.0 netmask 255.255.255.0 {
+    option domain-name-servers 172.16.1.1;
+
+    interface wlan0;
+    option routers 172.16.1.1;
+    default-lease-time 7200;
+    max-lease-time 7200;
+    pool {
+        range 172.16.1.100 172.16.1.110;
+    }
+}
diff --git a/kura/distrib/src/main/resources/common/hostapd.conf b/kura/distrib/src/main/resources/common/hostapd.conf
new file mode 100644
index 0000000000000000000000000000000000000000..78efcf03af89e79802a7d2bde5cb87db06532228
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/hostapd.conf
@@ -0,0 +1,53 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=wlan0
+#example: nl80211
+driver=nl80211
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=kura_gateway
+
+# basic operational settings
+#example: g
+hw_mode=g
+
+wme_enabled=0
+ieee80211n=0
+
+#example: 1
+channel=1
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WPA settings. We'll use stronger WPA2
+# bit0 = WPA
+# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
+wpa=2
+
+# Preshared key of between 8-63 ASCII characters.
+# If you define the key in here, make sure that the file is not readable
+# by anyone but root. Alternatively you can use a separate file for the
+# key; see original hostapd.conf for more information.
+#example TheKeyMyCatalystUSES!1
+wpa_passphrase=testKEYS
+
+# Key management algorithm. In this case, a simple pre-shared key (PSK)
+wpa_key_mgmt=WPA-PSK
+
+# The cipher suite to use. We want to use stronger CCMP cipher.
+wpa_pairwise=CCMP
+
+# Change the broadcasted/multicasted keys after this many seconds.
+wpa_group_rekey=600
+
+# Change the master key after this many seconds. Master key is used as a basis
+# (source) for the encryption keys.
+wpa_gmk_rekey=86400
+
diff --git a/kura/distrib/src/main/resources/common/ifcfg-eth0 b/kura/distrib/src/main/resources/common/ifcfg-eth0
new file mode 100644
index 0000000000000000000000000000000000000000..e6a9ebbeb0093f30990a373feea3dc6713eb2656
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifcfg-eth0
@@ -0,0 +1,10 @@
+# Networking Interface
+DEVICE=eth0
+NAME=eth0
+TYPE=ETHERNET
+ONBOOT=yes
+BOOTPROTO=static
+IPADDR=172.16.0.1
+PREFIX=24
+DEFROUTE=no
+
diff --git a/kura/distrib/src/main/resources/common/ifcfg-eth1 b/kura/distrib/src/main/resources/common/ifcfg-eth1
new file mode 100644
index 0000000000000000000000000000000000000000..95fede101b9d807b38964a000b87554b5100d87d
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifcfg-eth1
@@ -0,0 +1,8 @@
+# Networking Interface
+DEVICE=eth1
+NAME=eth1
+TYPE=ETHERNET
+ONBOOT=yes
+BOOTPROTO=dhcp
+DEFROUTE=yes
+
diff --git a/kura/distrib/src/main/resources/common/ifcfg-wlan0 b/kura/distrib/src/main/resources/common/ifcfg-wlan0
new file mode 100644
index 0000000000000000000000000000000000000000..a241099102391d273626ef68706552322ea9952a
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifcfg-wlan0
@@ -0,0 +1,12 @@
+# Networking Interface
+DEVICE=wlan0
+NAME=wlan0
+TYPE=WIFI
+ONBOOT=yes
+BOOTPROTO=static
+IPADDR=172.16.1.1
+PREFIX=24
+DEFROUTE=no
+
+#Wireless configuration
+MODE=Master
diff --git a/kura/distrib/src/main/resources/common/ifdown-local b/kura/distrib/src/main/resources/common/ifdown-local
new file mode 100644
index 0000000000000000000000000000000000000000..e5d71217eb2586d22f0a7776085e3b32ba56f2ce
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifdown-local
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+DEVICE=$1
+FILENAME="/tmp/.kura/coninfo-"$DEVICE
+rm -f $FILENAME
diff --git a/kura/distrib/src/main/resources/common/ifup-local b/kura/distrib/src/main/resources/common/ifup-local
new file mode 100644
index 0000000000000000000000000000000000000000..102a3ceb12588efa6f951ac7c492e2b1f727cbdb
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifup-local
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+if [ $1 == "lo" ] ; then
+        exit
+fi
+
+DEVICE=$1
+FILENAME="/tmp/.kura/coninfo-"$DEVICE
+
+if [ ! -d "/tmp/.kura" ] ; then
+	mkdir /tmp/.kura
+fi
+
+mkdir /tmp/.kura >> /dev/null 2>> /dev/null
+echo "IFACE="$DEVICE > $FILENAME
+
+
+ipaddr=`ip address show dev $DEVICE | grep 'inet '`
+
+if [[ -n "$ipaddr" ]] ; then
+	find=`expr index "$ipaddr" "inet"`
+	ipaddr=${ipaddr:$find}
+	find=`expr index "$ipaddr" ' '`
+	lind=`expr index "$ipaddr" '/'`
+	echo "IPADDR="${ipaddr:$find:`expr $lind-$find-1`} >> $FILENAME
+	ipgw=`ip route show dev $DEVICE | grep default`
+	echo "GATEWAY="${ipgw:12} >> $FILENAME
+	#ip route del $ipgw
+
+	# Only add DNS if this is a gateway - this also implies /etc/resolv.conf was overwritten
+	if [ "x${ipgw:12}" != "x" ] ; then
+		DnsInd=0
+		while read line
+		do
+		   ind=`expr index "$line" ' '`
+		   if [[ $line == nameserver* ]]; then
+		        #echo ${line:$ind}
+		        DnsInd=`expr $DnsInd + 1`
+		        echo "DNS"$DnsInd"="${line:$ind} >> $FILENAME
+		   fi
+		done < "/etc/resolv.conf"
+	fi
+fi
diff --git a/kura/distrib/src/main/resources/common/ifup-local.debian b/kura/distrib/src/main/resources/common/ifup-local.debian
new file mode 100644
index 0000000000000000000000000000000000000000..85b10c14f23e4024dad2811393fde7d42d58f898
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifup-local.debian
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+if [ $IFACE == "lo" ] ; then
+	exit
+fi
+
+DEVICE=$IFACE
+FILENAME="/tmp/.kura/coninfo-"$DEVICE
+FLAG=0
+HASDNS=0
+DnsInd=0
+
+if [ ! -d "/tmp/.kura" ] ; then
+        mkdir /tmp/.kura
+fi
+
+while read line
+do
+   ind=`expr index "$line" ' '`
+   if [[ $line == nameserver* ]]; then
+        DnsInd=`expr $DnsInd + 1`
+        echo "DNS"$DnsInd"="${line:$ind} > $FILENAME
+   fi
+done < "/etc/resolv.conf"
+
+# Write DNS entries to resolv.conf
+while read line
+do
+   ind=`expr index "$line" ' '`
+   # No DNS entries for loopback interface
+   if [[ $DEVICE == lo ]]; then
+        break
+   fi                                     
+   # Flag when the desired interface is found
+   if [[ $line == iface\ $DEVICE* ]]; then
+        FLAG=1                                           
+   fi                                                    
+   if [[ $line == dns-nameservers* && $FLAG == 1 ]]; then
+        HASDNS=1                  
+        DnsInd=`expr $DnsInd + 1`               
+        IFS=' ' read -ra  Dns <<< "${line:$ind}"   
+        for i in "${Dns[@]}"; do                   
+           echo "nameserver $i" >> /etc/resolv.conf
+        done 
+        break                   
+   fi                           
+done < "/etc/network/interfaces"       
+                                       
+# Create config file for each interface
+mkdir /tmp/.kura >> /dev/null 2>> /dev/null
+echo "IFACE="$DEVICE >> $FILENAME                   
+                                                   
+ipaddr=`ip address show dev $DEVICE | grep 'inet '`
+
+if [[ -n "$ipaddr" ]] ; then
+	find=`expr index "$ipaddr" "inet"`
+	ipaddr=${ipaddr:$find}         
+	find=`expr index "$ipaddr" ' '`                                
+	lind=`expr index "$ipaddr" '/'`                                
+	echo "IPADDR="${ipaddr:$find:`expr $lind-$find-1`} >> $FILENAME
+	ipgw=`ip route show dev $DEVICE | grep default`
+	echo "GATEWAY="${ipgw:12} >> $FILENAME
+	#ip route del $ipgw        
+	if [[ $HASDNS == 1 ]]; then
+	        for j in "${Dns[@]}"; do
+	           DnsInd=`expr $DnsInd + 1`
+	           echo "DNS$DnsInd=$j" >> $FILENAME
+	        done
+	fi
+fi
diff --git a/kura/distrib/src/main/resources/common/ifup-local.raspbian b/kura/distrib/src/main/resources/common/ifup-local.raspbian
new file mode 100644
index 0000000000000000000000000000000000000000..63f8a37097da2a74c2fb13fa95b9530cb57d81d0
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ifup-local.raspbian
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+if [ $IFACE == "lo" ] ; then
+	exit
+fi
+
+DEVICE=$IFACE
+FILENAME="/tmp/.kura/coninfo-"$DEVICE
+FLAG=0
+HASDNS=0
+DnsInd=0
+
+if [ ! -d "/tmp/.kura" ] ; then
+        mkdir /tmp/.kura
+fi
+
+while read line
+do
+   ind=`expr index "$line" ' '`
+   if [[ $line == nameserver* ]]; then
+        DnsInd=`expr $DnsInd + 1`
+        echo "DNS"$DnsInd"="${line:$ind} > $FILENAME
+   fi
+done < "/etc/resolv.conf"
+
+# Write DNS entries to resolv.conf
+while read line
+do
+   ind=`expr index "$line" ' '`
+   # No DNS entries for loopback interface
+   if [[ $DEVICE == lo ]]; then
+        break
+   fi                                     
+   # Flag when the desired interface is found
+   if [[ $line == iface\ $DEVICE* ]]; then
+        FLAG=1                                           
+   fi                                                    
+   if [[ $line == dns-nameservers* && $FLAG == 1 ]]; then
+        HASDNS=1                  
+        DnsInd=`expr $DnsInd + 1`               
+        IFS=' ' read -ra  Dns <<< "${line:$ind}"   
+        for i in "${Dns[@]}"; do                   
+           echo "nameserver $i" >> /etc/resolv.conf
+        done 
+        break                   
+   fi                           
+done < "/etc/network/interfaces"       
+                                       
+# Create config file for each interface
+mkdir /tmp/.kura >> /dev/null 2>> /dev/null
+echo "IFACE="$DEVICE >> $FILENAME                   
+                                                   
+ipaddr=`ip address show dev $DEVICE | grep 'inet '`
+
+if [[ -n "$ipaddr" ]] ; then
+	find=`expr index "$ipaddr" "inet"`
+	ipaddr=${ipaddr:$find}         
+	find=`expr index "$ipaddr" ' '`                                
+	lind=`expr index "$ipaddr" '/'`                                
+	echo "IPADDR="${ipaddr:$find:`expr $lind-$find-1`} >> $FILENAME
+	ipgw=`ip route show dev $DEVICE | grep default`
+	echo "GATEWAY="${ipgw:12} >> $FILENAME
+	#ip route del $ipgw        
+	if [[ $HASDNS == 1 ]]; then
+	        for j in "${Dns[@]}"; do
+	           DnsInd=`expr $DnsInd + 1`
+	           echo "DNS$DnsInd=$j" >> $FILENAME
+	        done
+	fi
+fi
diff --git a/kura/distrib/src/main/resources/common/ip-down.local b/kura/distrib/src/main/resources/common/ip-down.local
new file mode 100644
index 0000000000000000000000000000000000000000..e20f5fd9689034cadccdc782705645fce1bb8ece
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ip-down.local
@@ -0,0 +1,3 @@
+#!/bin/sh
+FILENAME="/tmp/.kura/coninfo-"$PPP_IFACE
+rm -f $FILENAME
diff --git a/kura/distrib/src/main/resources/common/ip-up.local b/kura/distrib/src/main/resources/common/ip-up.local
new file mode 100644
index 0000000000000000000000000000000000000000..8be506f28babc990c4ec3d0b820eb33a127928e9
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/ip-up.local
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+FILENAME="/tmp/.kura/coninfo-"$PPP_IFACE
+mkdir /tmp/.kura >> /dev/null 2>> /dev/null
+echo "IFACE="$PPP_IFACE > $FILENAME
+echo "IPADDR="$PPP_LOCAL >> $FILENAME
+echo "GATEWAY="$PPP_REMOTE >> $FILENAME
+
+DNS1=`awk '{if(NR==1) print $2}' /var/run/ppp/resolv.conf`
+DNS2=`awk '{if(NR==2) print $2}' /var/run/ppp/resolv.conf`
+
+echo "DNS1="$DNS1 >> $FILENAME
+echo "DNS2="$DNS2 >> $FILENAME
diff --git a/kura/distrib/src/main/resources/common/javax.comm.rxtx.properties b/kura/distrib/src/main/resources/common/javax.comm.rxtx.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c83f618731936d17ccc358b969b98f18f9a213c5
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/javax.comm.rxtx.properties
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+# These ARE INCLUDED by default in RXTX
+# "ttyS", // linux Serial Ports
+# "ttySA", // for the IPAQs
+# "ttyUSB", // for USB frobs
+# "rfcomm",       // bluetooth serial device
+# "ttyircomm", // linux IrCommdevices (IrDA serial emu)
+
+# These ARE NOT INCLUDED by default
+# "comx",      // linux COMMX synchronous serial card
+# "holter",    // custom card for heart monitoring
+# "modem",     // linux symbolic link to modem.
+# "ttycosa0c", // linux COSA/SRP synchronous serial card
+# "ttycosa1c", // linux COSA/SRP synchronous serial card
+# "ttyACM",// linux CDC ACM devices
+# "ttyC", // linux cyclades cards
+# "ttyCH",// linux Chase Research AT/PCI-Fast serial card
+# "ttyD", // linux Digiboard serial card
+# "ttyE", // linux Stallion serial card
+# "ttyF", // linux Computone IntelliPort serial card
+# "ttyH", // linux Chase serial card
+# "ttyI", // linux virtual modems
+# "ttyL", // linux SDL RISCom serial card
+# "ttyM", // linux PAM Software's multimodem boards
+#         // linux ISI serial card
+# "ttyMX",// linux Moxa Smart IO cards
+# "ttyP", // linux Hayes ESP serial card
+# "ttyR", // linux comtrol cards
+# "ttySA",// linux Serial Ports
+#         // linux Specialix RIO serial card
+# "ttySI",// linux SmartIO serial card
+# "ttySR",// linux Specialix RIO serial card 257+
+# "ttyT", // linux Technology Concepts serial card
+# "ttyV", // linux Comtrol VS-1000 serial controller
+# "ttyW", // linux specialix cards
+# "ttyX"  // linux SpecialX serial card
+
+javax.comm.rxtx.SerialPorts=/dev/ttyS0:/dev/ttyS1:/dev/ttyS2:/dev/ttyS3:/dev/ttyS4:/dev/ttyS5:/dev/ttyS6:/dev/ttyS7:/dev/ttyS8:/dev/ttyS9:/dev/ttyO5:\
+/dev/modem:\
+/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2:/dev/ttyACM3:/dev/ttyACM4:/dev/ttyACM5:/dev/ttyACM6:/dev/ttyACM7:/dev/ttyACM8:/dev/ttyACM9:\
+/dev/ttyUSB0:/dev/ttyUSB1:/dev/ttyUSB2:/dev/ttyUSB3:/dev/ttyUSB4:/dev/ttyUSB5:/dev/ttyUSB6:/dev/ttyUSB7:/dev/ttyUSB8:/dev/ttyUSB9:\
+/dev/ttyUSB10:/dev/ttyUSB11:/dev/ttyUSB12:/dev/ttyUSB13:/dev/ttyUSB14:/dev/ttyUSB15:/dev/ttyUSB16:/dev/ttyUSB17:/dev/ttyUSB18:/dev/ttyUSB19
diff --git a/kura/distrib/src/main/resources/common/kura-equinox_3.8.1.target b/kura/distrib/src/main/resources/common/kura-equinox_3.8.1.target
new file mode 100644
index 0000000000000000000000000000000000000000..e7255199543dfd81b39ad3e7559503786b25aa67
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/kura-equinox_3.8.1.target
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+
+<target name="Kura Target Platform Equinox 3.8.1" sequenceNumber="43">
+  <locations>
+    <location path="${workspace_loc}/target-definition/equinox_3.8.1/repository/plugins" type="Profile"/>
+	<location path="${workspace_loc}/target-definition/common/repository/plugins" type="Profile"/>
+  </locations>
+</target>
diff --git a/kura/distrib/src/main/resources/common/kura.init.raspbian b/kura/distrib/src/main/resources/common/kura.init.raspbian
new file mode 100755
index 0000000000000000000000000000000000000000..22eeb1cb3fea94aad94d1828b8398d7bbf445659
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/kura.init.raspbian
@@ -0,0 +1,49 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides:          kura
+# Required-Start:    $all
+# Required-Stop:     $all
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Kura initscript
+# Description:
+### END INIT INFO
+
+kura=/opt/eclipse/kura/bin/start_kura_background.sh
+pidfile=/var/run/kura.pid
+kura_args=""
+
+export PATH=$PATH:/usr/java/bin
+
+test -x "$kura" || exit 0
+
+case "$1" in
+  start)
+    echo -n "Starting Kura"
+    start-stop-daemon --start --quiet --exec $kura -- $kura_args
+    RETVAL=$?
+    echo "."
+    ;;
+  stop)
+    echo -n "Stopping Kura"
+    ((echo "stop 0"; sleep 10) | telnet localhost 5002) > /dev/null 2>&1
+    start-stop-daemon --stop --quiet --pidfile $pidfile
+    RETVAL=$?
+    echo "."
+    ;;
+  restart)
+    $0 stop
+    $0 start
+    RETVAL=$?
+    ;;
+  status)
+    $kura $kura_args status
+    RETVAL=$?
+    echo "."
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|restart|status}"
+    exit 1
+esac
+
+exit $RETVAL
diff --git a/kura/distrib/src/main/resources/common/kura.logrotate b/kura/distrib/src/main/resources/common/kura.logrotate
new file mode 100644
index 0000000000000000000000000000000000000000..c84030f7423bc056ad2094682c1343c779bf6e8f
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/kura.logrotate
@@ -0,0 +1,11 @@
+# Logrotate file for Kura
+
+/var/log/kura-console.log {
+        missingok
+        notifempty
+        copytruncate
+        rotate 5
+        size 30k
+        daily
+        create 0600 root root
+}
diff --git a/kura/distrib/src/main/resources/common/kura_custom.properties b/kura/distrib/src/main/resources/common/kura_custom.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6e7624d92cff1f5787319b4ba74b09cecadb273e
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/kura_custom.properties
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+#  Do not edit the kura.properties file directly, as any changes there may be
+#  lost in subsequent Kura upgrades.  Instead, place those changes in this
+#  file to override the value in kura.properties, and they will be carried
+#  across any upgrades.
+
+## -----------------------------------------------------------------------------
+##  Kura Custom Properties
+## -----------------------------------------------------------------------------
+
diff --git a/kura/distrib/src/main/resources/common/logrotate.conf b/kura/distrib/src/main/resources/common/logrotate.conf
new file mode 100644
index 0000000000000000000000000000000000000000..838f2faf206d5d05c6bf907411c02f4a89ef0ab7
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/logrotate.conf
@@ -0,0 +1,41 @@
+# see "man logrotate" for details
+# rotate log files daily
+daily
+
+# keep 4 weeks worth of backlogs
+rotate 4
+
+# create new (empty) log files after rotating old ones
+create
+
+# use date as a suffix of the rotated file
+dateext
+
+# uncomment this if you want your log files compressed
+compress
+
+# ignore miss file
+missingok
+
+#copytruncate for Kura since we are doing a stdout/stderr redirect
+copytruncate
+
+# RPM packages drop log rotation information into this directory
+include /etc/logrotate.d
+
+# no packages own wtmp and btmp -- we'll rotate them here
+/var/log/wtmp {
+    monthly
+    create 0664 root utmp
+        minsize 1M
+    rotate 1
+}
+
+/var/log/btmp {
+    missingok
+    monthly
+    create 0600 root utmp
+    rotate 1
+}
+
+# system-specific logs may be also be configured here.
diff --git a/kura/distrib/src/main/resources/common/monit.init.raspbian b/kura/distrib/src/main/resources/common/monit.init.raspbian
new file mode 100644
index 0000000000000000000000000000000000000000..f08e1c13c798f337fc6a80eb8ac509b7337123a9
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/monit.init.raspbian
@@ -0,0 +1,46 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides:          monit
+# Required-Start:    $all
+# Required-Stop:     $all
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: monit initscript
+# Description:
+### END INIT INFO
+
+monit=/usr/bin/monit
+pidfile=/var/run/monit.pid
+monit_args="-c /etc/monitrc"
+
+test -x "$monit" || exit 0
+
+case "$1" in
+  start)
+    echo -n "Starting Monit"
+    start-stop-daemon --start --quiet --exec $monit -- $monit_args
+    RETVAL=$?
+    echo "."
+    ;;
+  stop)
+    echo -n "Stopping Monit"
+    start-stop-daemon --stop --quiet --pidfile $pidfile
+    RETVAL=$?
+    echo "."
+    ;;
+  restart)
+    $0 stop
+    $0 start
+    RETVAL=$?
+    ;;
+  status)
+    $monit $monit_args status
+    RETVAL=$?
+    echo "."
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|restart|status}"
+    exit 1
+esac
+
+exit $RETVAL
diff --git a/kura/distrib/src/main/resources/common/monit.init.yocto b/kura/distrib/src/main/resources/common/monit.init.yocto
new file mode 100644
index 0000000000000000000000000000000000000000..d804cc6bd84cc2c355ac685ce93659745038b46d
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/monit.init.yocto
@@ -0,0 +1,41 @@
+#! /bin/sh
+#
+# This is an init script for openembedded
+# Copy it to /etc/init.d/monit and type
+# > update-rc.d monit defaults 99
+#
+monit=/usr/bin/monit
+pidfile=/var/run/monit.pid
+monit_args="-c /etc/monitrc"
+
+test -x "$monit" || exit 0
+
+case "$1" in
+  start)
+    echo -n "Starting Monit"
+    start-stop-daemon --start --quiet --exec $monit -- $monit_args
+    RETVAL=$?
+    echo "."
+    ;;
+  stop)
+    echo -n "Stopping Monit"
+    start-stop-daemon --stop --quiet --pidfile $pidfile
+    RETVAL=$?
+    echo "."
+    ;;
+  restart)
+    $0 stop
+    $0 start
+    RETVAL=$?
+    ;;
+  status)
+    $monit $monit_args status
+    RETVAL=$?
+    echo "."
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|restart|status}"
+    exit 1
+esac
+
+exit $RETVAL
diff --git a/kura/distrib/src/main/resources/common/monitrc.raspbian b/kura/distrib/src/main/resources/common/monitrc.raspbian
new file mode 100644
index 0000000000000000000000000000000000000000..12010fa84ba687bc78fa4eb98a0f7102cfead374
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/monitrc.raspbian
@@ -0,0 +1,14 @@
+set daemon 5
+set logfile syslog facility log_daemon
+set statefile /var/.monit.state
+check system localhost
+        if memory usage > 75% then alert
+        if cpu usage (user) > 80% for 1 cycles then alert
+        if cpu usage (system) > 80% for 1 cycles then alert
+        if cpu usage (user) > 90% for 30 cycles then unmonitor
+        if cpu usage (system) > 90% for 30 cycles then unmonitor
+        if loadavg(15min) greater than 4 for 5 cycle then alert
+check process kura with pidfile "/var/run/kura.pid"
+   start program = "/etc/init.d/kura start"
+   stop  program = "/etc/init.d/kura stop"
+   if cpu usage > 80% for 5 cycles then alert
diff --git a/kura/distrib/src/main/resources/common/monitrc.yocto b/kura/distrib/src/main/resources/common/monitrc.yocto
new file mode 100644
index 0000000000000000000000000000000000000000..cb366405faf29c3d929e082b31acbcd8912c7a9d
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/monitrc.yocto
@@ -0,0 +1,14 @@
+set daemon 5
+set logfile syslog facility log_daemon
+set statefile /var/.monit.state
+check system localhost
+        if memory usage > 75% then alert
+        if cpu usage (user) > 80% for 1 cycles then alert
+        if cpu usage (system) > 80% for 1 cycles then alert
+        if cpu usage (user) > 90% for 30 cycles then unmonitor
+        if cpu usage (system) > 90% for 30 cycles then unmonitor
+        if loadavg(15min) greater than 4 for 5 cycle then alert
+check process kura with pidfile "/var/run/kura.pid"
+   start program = "/etc/init.d/kura start"
+   stop  program = "/etc/init.d/kura stop"
+   if cpu usage > 40% for 5 cycles then alert
diff --git a/kura/distrib/src/main/resources/common/named/named.ca b/kura/distrib/src/main/resources/common/named/named.ca
new file mode 100644
index 0000000000000000000000000000000000000000..92350e18e0eeb8d731989478227cfd547f715a6a
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/named/named.ca
@@ -0,0 +1,52 @@
+; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net
+;; global options:  printcmd
+;; Got answer:
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420
+;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20
+
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 4096
+;; QUESTION SECTION:
+;.                              IN	NS
+
+;; ANSWER SECTION:
+.                       518400  IN	NS	M.ROOT-SERVERS.NET.
+.                       518400  IN	NS	A.ROOT-SERVERS.NET.
+.                       518400  IN	NS	B.ROOT-SERVERS.NET.
+.                       518400  IN	NS	C.ROOT-SERVERS.NET.
+.                       518400  IN	NS	D.ROOT-SERVERS.NET.
+.                       518400  IN	NS	E.ROOT-SERVERS.NET.
+.                       518400  IN	NS	F.ROOT-SERVERS.NET.
+.                       518400  IN	NS	G.ROOT-SERVERS.NET.
+.                       518400  IN	NS	H.ROOT-SERVERS.NET.
+.                       518400  IN	NS	I.ROOT-SERVERS.NET.
+.                       518400  IN	NS	J.ROOT-SERVERS.NET.
+.                       518400  IN	NS	K.ROOT-SERVERS.NET.
+.                       518400  IN	NS	L.ROOT-SERVERS.NET.
+
+;; ADDITIONAL SECTION:
+A.ROOT-SERVERS.NET.     3600000 IN	A	198.41.0.4
+A.ROOT-SERVERS.NET.     3600000 IN	AAAA    2001:503:ba3e::2:30
+B.ROOT-SERVERS.NET.     3600000 IN	A	192.228.79.201
+C.ROOT-SERVERS.NET.     3600000 IN	A	192.33.4.12
+D.ROOT-SERVERS.NET.     3600000 IN	A	128.8.10.90
+E.ROOT-SERVERS.NET.     3600000 IN	A	192.203.230.10
+F.ROOT-SERVERS.NET.     3600000 IN	A	192.5.5.241
+F.ROOT-SERVERS.NET.     3600000 IN	AAAA    2001:500:2f::f
+G.ROOT-SERVERS.NET.     3600000 IN	A	192.112.36.4
+H.ROOT-SERVERS.NET.     3600000 IN	A	128.63.2.53
+H.ROOT-SERVERS.NET.     3600000 IN	AAAA    2001:500:1::803f:235
+I.ROOT-SERVERS.NET.     3600000 IN	A	192.36.148.17
+J.ROOT-SERVERS.NET.     3600000 IN	A	192.58.128.30
+J.ROOT-SERVERS.NET.     3600000 IN	AAAA    2001:503:c27::2:30
+K.ROOT-SERVERS.NET.     3600000 IN	A	193.0.14.129
+K.ROOT-SERVERS.NET.     3600000 IN	AAAA    2001:7fd::1
+L.ROOT-SERVERS.NET.     3600000 IN	A	199.7.83.42
+M.ROOT-SERVERS.NET.     3600000 IN	A	202.12.27.33
+M.ROOT-SERVERS.NET.     3600000 IN	AAAA    2001:dc3::35
+
+;; Query time: 147 msec
+;; SERVER: 198.41.0.4#53(198.41.0.4)
+;; WHEN: Mon Feb 18 13:29:18 2008
+;; MSG SIZE  rcvd: 615
+
diff --git a/kura/distrib/src/main/resources/common/named/named.conf b/kura/distrib/src/main/resources/common/named/named.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e9048ac0dcc1b91a2354c082b0bc5aef79cadc65
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/named/named.conf
@@ -0,0 +1,28 @@
+// Forwarding and Caching Name Server Configuration
+options {
+        directory "/var/named";
+        version "not currently available";
+        forwarders {192.168.1.1;};
+        forward only;
+        allow-transfer{"none";};
+        allow-query {172.16.1.1/24;172.16.0.1/24;};
+	max-cache-ttl 30;
+	max-ncache-ttl 30;
+};
+logging{
+        channel named_log {
+                file "/var/log/named.log" versions 3;
+                severity info;
+                print-severity yes;
+                print-time yes;
+                print-category yes;
+        };
+        category default{
+                named_log;
+        };
+};
+zone "." IN {
+	type hint;
+        file "named.ca";
+};
+include "/etc/named.rfc1912.zones";
diff --git a/kura/distrib/src/main/resources/common/named/named.rfc1912.zones b/kura/distrib/src/main/resources/common/named/named.rfc1912.zones
new file mode 100644
index 0000000000000000000000000000000000000000..dc6eb76c27b192808456c2ba7317c02d518448bb
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/named/named.rfc1912.zones
@@ -0,0 +1,42 @@
+// named.rfc1912.zones:
+//
+// Provided by Red Hat caching-nameserver package
+//
+// ISC BIND named zone configuration for zones recommended by
+// RFC 1912 section 4.1 : localhost TLDs and address zones
+// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
+// (c)2007 R W Franks
+//
+// See /usr/share/doc/bind*/sample/ for example named configuration files.
+//
+
+zone "localhost.localdomain" IN {
+        type master;
+        file "named.localhost";
+        allow-update { none; };
+};
+
+zone "localhost" IN {
+        type master;
+        file "named.localhost";
+        allow-update { none; };
+};
+
+zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
+        type master;
+        file "named.loopback";
+        allow-update { none; };
+};
+
+zone "1.0.0.127.in-addr.arpa" IN {
+        type master;
+        file "named.loopback";
+        allow-update { none; };
+};
+
+zone "0.in-addr.arpa" IN {
+        type master;
+        file "named.empty";
+        allow-update { none; };
+};
+
diff --git a/kura/distrib/src/main/resources/common/named/usr.sbin.named b/kura/distrib/src/main/resources/common/named/usr.sbin.named
new file mode 100644
index 0000000000000000000000000000000000000000..280de3e3f48fd3937f5a193f26a8bb26247b8126
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/named/usr.sbin.named
@@ -0,0 +1,55 @@
+# vim:syntax=apparmor
+# Last Modified: Fri Jun  1 16:43:22 2007
+#include <tunables/global>
+
+/usr/sbin/named {
+  #include <abstractions/base>
+  #include <abstractions/nameservice>
+
+  capability net_bind_service,
+  capability setgid,
+  capability setuid,
+  capability sys_chroot,
+  capability sys_resource,
+
+  # /etc/bind should be read-only for bind
+  # /var/lib/bind is for dynamically updated zone (and journal) files.
+  # /var/cache/bind is for slave/stub data, since we're not the origin of it.
+  # See /usr/share/doc/bind9/README.Debian.gz
+  /etc/bind/** r,
+  /var/lib/bind/** rw,
+  /var/lib/bind/ rw,
+  /var/cache/bind/** rw,
+  /var/cache/bind/ rw,
+
+  # gssapi
+  /etc/krb5.keytab kr,
+  /etc/bind/krb5.keytab kr,
+
+  # ssl
+  /etc/ssl/openssl.cnf r,
+
+  # dnscvsutil package
+  /var/lib/dnscvsutil/compiled/** rw,
+
+  /proc/net/if_inet6 r,
+  /proc/*/net/if_inet6 r,
+  /usr/sbin/named mr,
+  /{,var/}run/named/named.pid w,
+  /{,var/}run/named/session.key w,
+  # support for resolvconf
+  /{,var/}run/named/named.options r,
+
+  /var/named/** rw,
+  /var/named/ rw,
+
+  # some people like to put logs in /var/log/named/ instead of having
+  # syslog do the heavy lifting.
+  /var/log/named/** rw,
+  /var/log/named/ rw,
+  /var/log/** rw,
+  /varlog/named.log rw,
+
+  # Site-specific additions and overrides. See local/README for details.
+  #include <local/usr.sbin.named>
+}
diff --git a/kura/distrib/src/main/resources/common/network.interfaces b/kura/distrib/src/main/resources/common/network.interfaces
new file mode 100644
index 0000000000000000000000000000000000000000..7acb65b46922c44ff24242dfa6525a1c4a452f0d
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/network.interfaces
@@ -0,0 +1,35 @@
+# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
+ 
+# The loopback interface
+auto lo
+iface lo inet static
+	address 127.0.0.1
+	netmask 255.0.0.0
+
+# Wireless interfaces
+auto wlan0
+iface wlan0 inet static
+	address 172.16.1.1
+	netmask 255.255.255.0
+
+iface atml0 inet dhcp
+
+# Wired or wireless interfaces
+auto eth0
+iface eth0 inet static
+	address 172.16.0.1
+	netmask 255.255.255.0
+
+# Ethernet/RNDIS gadget (g_ether)
+# ... or on host side, usbnet and random hwaddr
+iface usb0 inet static
+	address 192.168.7.2
+	netmask 255.255.255.0
+	network 192.168.7.0
+	gateway 192.168.7.1
+
+# Bluetooth networking
+iface bnep0 inet dhcp
+
+auto eth1
+iface eth1 inet dhcp
diff --git a/kura/distrib/src/main/resources/common/network.interfaces.raspbian b/kura/distrib/src/main/resources/common/network.interfaces.raspbian
new file mode 100644
index 0000000000000000000000000000000000000000..a372170386e9f8536519081117e76e883c491938
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/network.interfaces.raspbian
@@ -0,0 +1,17 @@
+# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
+ 
+# The loopback interface
+auto lo
+iface lo inet static
+	address 127.0.0.1
+	netmask 255.0.0.0
+
+# Wired or wireless interfaces
+auto eth0
+iface eth0 inet dhcp
+
+auto wlan0
+iface wlan0 inet static
+    address 172.16.1.1
+    netmask 255.255.255.0
+
diff --git a/kura/distrib/src/main/resources/common/org.hamcrest.core-1.1.0.v20090501071000.jar b/kura/distrib/src/main/resources/common/org.hamcrest.core-1.1.0.v20090501071000.jar
new file mode 100644
index 0000000000000000000000000000000000000000..dea61dec184202c5b4ca651ba5d23f79795eb5d8
Binary files /dev/null and b/kura/distrib/src/main/resources/common/org.hamcrest.core-1.1.0.v20090501071000.jar differ
diff --git a/kura/distrib/src/main/resources/common/org.junit-4.10.0.v4_10_0_v20120426-0900.jar b/kura/distrib/src/main/resources/common/org.junit-4.10.0.v4_10_0_v20120426-0900.jar
new file mode 100644
index 0000000000000000000000000000000000000000..28d6045d8df24bc049dd4eb03c76f3063b551a46
Binary files /dev/null and b/kura/distrib/src/main/resources/common/org.junit-4.10.0.v4_10_0_v20120426-0900.jar differ
diff --git a/kura/distrib/src/main/resources/common/org.junit4-4.8.1.v20120523-1257.jar b/kura/distrib/src/main/resources/common/org.junit4-4.8.1.v20120523-1257.jar
new file mode 100644
index 0000000000000000000000000000000000000000..b08bc2152c2b2b73ad96bf812c5231799aeee993
Binary files /dev/null and b/kura/distrib/src/main/resources/common/org.junit4-4.8.1.v20120523-1257.jar differ
diff --git a/kura/distrib/src/main/resources/common/org.tigris.mtoolkit.sdk-3.1.8-20110411-0918.zip b/kura/distrib/src/main/resources/common/org.tigris.mtoolkit.sdk-3.1.8-20110411-0918.zip
new file mode 100644
index 0000000000000000000000000000000000000000..09f72b4243bcf99af09c6e1e9d25b04968f500df
Binary files /dev/null and b/kura/distrib/src/main/resources/common/org.tigris.mtoolkit.sdk-3.1.8-20110411-0918.zip differ
diff --git a/kura/distrib/src/main/resources/common/projects/api.project b/kura/distrib/src/main/resources/common/projects/api.project
new file mode 100644
index 0000000000000000000000000000000000000000..d32927f8cea3008fc3785cebd2b4a0841c0998d9
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/projects/api.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.kura.api</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/kura/distrib/src/main/resources/common/projects/demo_heater.project b/kura/distrib/src/main/resources/common/projects/demo_heater.project
new file mode 100644
index 0000000000000000000000000000000000000000..5c864fdc2cf4f59eb259cd21b2ef2c6a8becee3a
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/projects/demo_heater.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.kura.demo.heater</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/kura/distrib/src/main/resources/common/projects/emulator.project b/kura/distrib/src/main/resources/common/projects/emulator.project
new file mode 100644
index 0000000000000000000000000000000000000000..7a2280a039bdd76d66763760d1276f86a0d8cdff
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/projects/emulator.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.kura.emulator</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/kura/distrib/src/main/resources/common/projects/target_definition.project b/kura/distrib/src/main/resources/common/projects/target_definition.project
new file mode 100644
index 0000000000000000000000000000000000000000..f71369fe6f17593b8a37b5a8ec7acf95337e6885
--- /dev/null
+++ b/kura/distrib/src/main/resources/common/projects/target_definition.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>target-definition</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/kura/distrib/src/main/resources/raspberry-pi-nn/kura.properties b/kura/distrib/src/main/resources/raspberry-pi-nn/kura.properties
new file mode 100644
index 0000000000000000000000000000000000000000..469a7a9dce2a580c57957b64d2d8ad3c6b4b20ba
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi-nn/kura.properties
@@ -0,0 +1,136 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+## -----------------------------------------------------------------------------
+##  Kura Properties
+## -----------------------------------------------------------------------------
+kura.name=Everyware Software Framework
+kura.version=
+kura.company=ECLIPSE
+kura.project=raspberry-pi-nn
+kura.platform=Raspberry-Pi
+kura.device.name=Raspberry-Pi
+kura.model.id=Raspberry-Pi
+kura.model.name=Raspberry-Pi
+kura.partNumber=Raspberry-Pi
+kura.serialNumber=Raspberry-Pi
+kura.bios.version=N/A
+kura.firmware.version=N/A
+kura.primary.network.interface=eth0
+# kura.mac.address= Fetch from Java
+kura.home=/opt/eclipse/kura/kura
+kura.plugins=/opt/eclipse/kura/kura/plugins
+kura.packages=/opt/eclipse/kura/kura/packages
+kura.data=/opt/eclipse/kura/data
+kura.tmp=/tmp/.kura
+kura.snapshots=/opt/eclipse/kura/data/snapshots
+kura.style.dir=/opt/eclipse/kura/console/skin
+kura.have.net.admin=false
+kura.wifi.top.channel=11
+# os.arch= Fetch from Java
+# os.name= Fetch from Java
+# os.version= Fetch from Java
+os.distribution=Linux
+os.distribution.version=N/A
+# java.version= Fetch from Java
+# java.vendor= Fetch from Java
+# java.vm.name= Fetch from Java
+# java.vm.version= Fetch from Java
+# java.home= Fetch from Java
+# file.separator= Fetch from Java
+
+
+## -----------------------------------------------------------------------------
+## Java Key Store Settings
+## -----------------------------------------------------------------------------
+kura.ssl.keyStorePassword=everyware
+kura.ssl.trustStorePassword=everyware
+
+
+## -----------------------------------------------------------------------------
+## HSQLDB Service Properties
+## -----------------------------------------------------------------------------
+# The following configurations represent different trade-offs between data durability
+# and wearing of the physical storage. This aspect is particularly important for
+# embedded devices where the storage is tipically a flash based device (NAND, SD etc.)
+# with a limited number of write/erase cycles.
+
+## 1. In-memory configuration.
+## This configuration is suggested for high publish rates.
+## DB survives to network/connection drops but all messages are lost
+## in case of a crash or power failure.
+## see http://hsqldb.org/doc/guide/ch04.html
+db.service.hsqldb.url=jdbc:hsqldb:mem:kuradb
+
+## 2. Mostly persistent.
+## This configuration is suggested for medium publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## all the messages stored since the last checkpoint will be lost.
+## A checkpoint should be run periodically to control the desired consistency of the database.
+## As data logging is disabled, the defragmentation is operated periodically by the ESF Housekeeper task.
+## This will flush the .data and perform a defragmentation.
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## Applications can call manual \u201Ccheckpoint\u201D if they need further durability.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.defrag_limit=Does not apply
+# db.service.hsqldb.log_data=false
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.write_delay_millis=Does not apply
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+## 3. Most persistent.
+## This configuration is suggested for slow publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## most of the data can be recovered from the data.log file.
+## A periodic checkpoint is not needed in this case.
+## An automatic defragmentation is operated by HSQLDB as set in the db.service.hsqldb.defrag_limit which should NOT be set to 0.
+## In this configuration with logging enabled, the Housekeeper task will NOT perform any defragmentation.  
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## The configuration parameter db.service.hsqldb.write_delay_millis controls the delay with which the data is flushed to disk.
+## The default is 500ms. In the case of power interruption you would loose the last X millies of data.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.defrag_limit=50
+# db.service.hsqldb.log_data=true
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.write_delay_millis=Rely on defaults if not set
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+
+## -----------------------------------------------------------------------------
+##  Remote Configuration Properties
+## -----------------------------------------------------------------------------
+console.device.management.service.ignore=org.eclipse.kura.net.admin.NetworkConfigurationService
+
+
+## -----------------------------------------------------------------------------
+## File upload settings
+## -----------------------------------------------------------------------------
+# default 10240
+file.upload.in.memory.size.threshold=10240
+# -1: unlimited (default)
+file.upload.size.max=-1
+
+
+## -----------------------------------------------------------------------------
+## Deployment Agent settings
+## -----------------------------------------------------------------------------
+# see copyURLToFile() http://commons.apache.org/proper/commons-io/javadocs/api-2.4/index.html
+dpa.connection.timeout = 60000
+dpa.read.timeout = 60000
diff --git a/kura/distrib/src/main/resources/raspberry-pi-nn/kura_install.sh b/kura/distrib/src/main/resources/raspberry-pi-nn/kura_install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f4940575654488ba6d72efe7cdb9cd1ff018c483
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi-nn/kura_install.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up Kura init
+cp /opt/eclipse/kura/install/kura.init.raspbian /etc/init.d/kura
+chmod +x /etc/init.d/kura
+chmod +x /opt/eclipse/kura/bin/*.sh
+
+# set up /opt/eclipse/kura/recover_dflt_kura_config.sh
+cp /opt/eclipse/kura/install/recover_dflt_kura_config.sh /opt/eclipse/kura/recover_dflt_kura_config.sh
+chmod +x /opt/eclipse/kura/recover_dflt_kura_config.sh
+if [ ! -d /opt/eclipse/kura/.data ]; then
+    mkdir /opt/eclipse/kura/.data
+fi
+# for md5.info should keep the same order as in the /opt/eclipse/kura/recover_dflt_kura_config.sh
+echo `md5sum /opt/eclipse/kura/data/snapshots/snapshot_0.xml` > /opt/eclipse/kura/.data/md5.info
+tar czf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz /opt/eclipse/kura/data/snapshots/snapshot_0.xml
+
+#set up runlevels to start/stop Kura by default
+update-rc.d kura defaults
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/raspberry-pi-nn/kura_upgrade.sh b/kura/distrib/src/main/resources/raspberry-pi-nn/kura_upgrade.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c7306d57b4d17a5dd8acf3ed381670d2633b1a7f
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi-nn/kura_upgrade.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/raspberry-pi-nn/log4j.properties b/kura/distrib/src/main/resources/raspberry-pi-nn/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6c2fe2c095f3c574dab93b2f3c7c775c1f230e2a
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi-nn/log4j.properties
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+### direct log messages to kura.log ###
+log4j.appender.kura=org.apache.log4j.rolling.RollingFileAppender
+log4j.appender.kura.File=/var/log/kura.log
+log4j.appender.kura.RollingPolicy=org.apache.log4j.rolling.FixedWindowRollingPolicy
+log4j.appender.kura.RollingPolicy.ActiveFileName=/var/log/kura.log
+log4j.appender.kura.RollingPolicy.FileNamePattern=/var/log/kura-%i.log.gz
+log4j.appender.kura.RollingPolicy.MaxIndex=10
+log4j.appender.kura.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
+log4j.appender.kura.TriggeringPolicy.MaxFileSize=20000000
+log4j.appender.kura.layout = org.apache.log4j.EnhancedPatternLayout
+log4j.appender.kura.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{1.} - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+log4j.rootLogger=INFO,kura
+
+## eclipse
+log4j.logger.org.eclipse=INFO
diff --git a/kura/distrib/src/main/resources/raspberry-pi-nn/recover_dflt_kura_config.sh b/kura/distrib/src/main/resources/raspberry-pi-nn/recover_dflt_kura_config.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d82f727326af3eee1493a3b1dc365185f8b10894
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi-nn/recover_dflt_kura_config.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+cd /tmp
+tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+sum=`md5sum /tmp/opt/eclipse/kura/data/kuranet.conf`
+echo ${sum/\/tmp\//\/} > /tmp/opt/eclipse/kura/data/md5.info
+sum=`md5sum /tmp/opt/eclipse/kura/data/snapshots/snapshot_0.xml`
+echo ${sum/\/tmp\//\/} >> /tmp/opt/eclipse/kura/data/md5.info
+
+MD5_1=`md5sum /tmp/opt/eclipse/kura/data/md5.info | cut -d ' ' -f 1`
+MD5_2=`md5sum /opt/eclipse/kura/.data/md5.info | cut -d ' ' -f 1`
+if [ $MD5_1 == $MD5_2 ]; then
+    cd /
+    tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+    # clean up
+    cd /tmp
+    rm -rf opt
+    echo "Default Kura configuration has been recovered."
+else
+    echo "MD5 sum doesn't match, Kura configuration recovery failed."
+fi
diff --git a/kura/distrib/src/main/resources/raspberry-pi-nn/snapshot_0.xml b/kura/distrib/src/main/resources/raspberry-pi-nn/snapshot_0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4227b56cfd08d4e0ad6f875811074e0ab3436b2a
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi-nn/snapshot_0.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<esf:configurations xmlns:ocd="http://www.osgi.org/xmlns/metatype/v1.2.0" xmlns:esf="http://eurotech.com/esf/2.0">
+    <esf:configuration pid="org.eclipse.kura.watchdog.WatchdogService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.watchdog.WatchdogService</esf:value>
+            </esf:property>
+            <esf:property name="pingInterval" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.clock.ClockService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.port" array="false" encrypted="false" type="Integer">
+                <esf:value>123</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.refresh-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>3600</esf:value>
+            </esf:property>
+            <esf:property name="clock.provider" array="false" encrypted="false" type="String">
+                <esf:value>java-ntp</esf:value>
+            </esf:property>
+            <esf:property name="clock.set.hwclock" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.host" array="false" encrypted="false" type="String">
+                <esf:value>0.pool.ntp.org</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.clock.ClockService</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport">
+        <esf:properties>
+            <esf:property name="clean-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="username" array="false" encrypted="false" type="String">
+                <esf:value>username</esf:value>
+            </esf:property>
+            <esf:property name="topic.context.account-name" array="false" encrypted="false" type="String">
+                <esf:value>account-name</esf:value>
+            </esf:property>
+            <esf:property name="broker-url" array="false" encrypted="false" type="String">
+                <esf:value>mqtt://broker-url:1883/</esf:value>
+            </esf:property>
+            <esf:property name="lwt.retain" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="in-flight.persistence" array="false" encrypted="false" type="String">
+                <esf:value>file</esf:value>
+            </esf:property>
+            <esf:property name="lwt.topic" array="false" encrypted="false" type="String">
+                <esf:value>$EDC/#account-name/#client-id/MQTT/LWT</esf:value>
+            </esf:property>
+            <esf:property name="keep-alive" array="false" encrypted="false" type="Integer">
+                <esf:value>30</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport</esf:value>
+            </esf:property>
+            <esf:property name="password" array="false" encrypted="false" type="Password">
+                <esf:value>password</esf:value>
+            </esf:property>
+            <esf:property name="timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>20</esf:value>
+            </esf:property>
+            <esf:property name="lwt.qos" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.data.DataService">
+        <esf:properties>
+            <esf:property name="in-flight-messages.congestion-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="store.purge-age" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.republish-on-new-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="store.capacity" array="false" encrypted="false" type="Integer">
+                <esf:value>1000</esf:value>
+            </esf:property>
+            <esf:property name="disconnect.quiesce-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10</esf:value>
+            </esf:property>
+            <esf:property name="connect.auto-on-startup" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="connect.retry-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.data.DataService</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.max-number" array="false" encrypted="false" type="Integer">
+                <esf:value>9</esf:value>
+            </esf:property>
+            <esf:property name="store.housekeeper-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>900</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.position.PositionService">
+        <esf:properties>
+            <esf:property name="port" array="false" encrypted="false" type="String">
+                <esf:value>1-3.2</esf:value>
+            </esf:property>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="parity" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="stopBits" array="false" encrypted="false" type="Integer">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="baudRate" array="false" encrypted="false" type="Integer">
+                <esf:value>115200</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.position.PositionService</esf:value>
+            </esf:property>
+            <esf:property name="bitsPerWord" array="false" encrypted="false" type="Integer">
+                <esf:value>8</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.cloud.CloudService">
+        <esf:properties>
+            <esf:property name="encode.gzip" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="device.display-name" array="false" encrypted="false" type="String">
+                <esf:value>Raspberry Pi</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+</esf:configurations>
diff --git a/kura/distrib/src/main/resources/raspberry-pi/firewall.init b/kura/distrib/src/main/resources/raspberry-pi/firewall.init
new file mode 100644
index 0000000000000000000000000000000000000000..116207e8655ffbfc03c045063e834278c03feac0
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/firewall.init
@@ -0,0 +1,66 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          firewall
+# Required-Start:    
+# Required-Stop:     
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Firewall init 
+# Description:       Start linux firewall
+### END INIT INFO
+
+# IPTables Firewall script
+
+
+#Clear all Built-in Chains
+iptables -F INPUT
+iptables -F OUTPUT
+iptables -F FORWARD
+iptables -t nat -F
+
+
+#Block all ports for input traffic
+iptables -P INPUT DROP
+#block Output Traffic
+iptables -P OUTPUT ACCEPT
+#block forward Traffic
+iptables -P FORWARD DROP
+
+#Allow all traffic to loop back interface, SSH, and HTTP
+iptables -A INPUT -i lo -j ACCEPT
+
+#Allow Only incoming connection related to Outgoing connection
+iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+
+#allow inbound ICMP requests
+iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+iptables -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
+
+#custom local service rules
+iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth0 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth1 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i wlan0 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 10.234.0.0/16 --dport 80 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth0 --dport 1450 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i eth1 --dport 1450 -j ACCEPT
+iptables -I INPUT -p tcp -s 0.0.0.0/0 -i wlan0 --dport 1450 -j ACCEPT
+iptables -I INPUT -p tcp -s 127.0.0.1/32 --dport 5002 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth0 --dport 53 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth1 --dport 53 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i wlan0 --dport 53 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth0 --dport 67 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i eth1 --dport 67 -j ACCEPT
+iptables -I INPUT -p udp -s 0.0.0.0/0 -i wlan0 --dport 67 -j ACCEPT
+
+#custom port forward service rules
+
+#custom nat service rules
+
+#custom rules
+
+#allow fowarding if any masquerade is defined
+echo 1 > /proc/sys/net/ipv4/ip_forward
+
+#source a custom firewall script
+source /etc/init.d/firewall_cust 2> /dev/null
diff --git a/kura/distrib/src/main/resources/raspberry-pi/kura.properties b/kura/distrib/src/main/resources/raspberry-pi/kura.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5df794d090c2bb9c88393429f82efc375d25a3db
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/kura.properties
@@ -0,0 +1,136 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+## -----------------------------------------------------------------------------
+##  Kura Properties
+## -----------------------------------------------------------------------------
+kura.name=Everyware Software Framework
+kura.version=
+kura.company=ECLIPSE
+kura.project=raspberry-pi
+kura.platform=Raspberry-Pi
+kura.device.name=Raspberry-Pi
+kura.model.id=Raspberry-Pi
+kura.model.name=Raspberry-Pi
+kura.partNumber=Raspberry-Pi
+kura.serialNumber=Raspberry-Pi
+kura.bios.version=N/A
+kura.firmware.version=N/A
+kura.primary.network.interface=eth0
+# kura.mac.address= Fetch from Java
+kura.home=/opt/eclipse/kura/kura
+kura.plugins=/opt/eclipse/kura/kura/plugins
+kura.packages=/opt/eclipse/kura/kura/packages
+kura.data=/opt/eclipse/kura/data
+kura.tmp=/tmp/.kura
+kura.snapshots=/opt/eclipse/kura/data/snapshots
+kura.style.dir=/opt/eclipse/kura/console/skin
+kura.have.net.admin=true
+kura.wifi.top.channel=11
+# os.arch= Fetch from Java
+# os.name= Fetch from Java
+# os.version= Fetch from Java
+os.distribution=Linux
+os.distribution.version=N/A
+# java.version= Fetch from Java
+# java.vendor= Fetch from Java
+# java.vm.name= Fetch from Java
+# java.vm.version= Fetch from Java
+# java.home= Fetch from Java
+# file.separator= Fetch from Java
+
+
+## -----------------------------------------------------------------------------
+## Java Key Store Settings
+## -----------------------------------------------------------------------------
+kura.ssl.keyStorePassword=everyware
+kura.ssl.trustStorePassword=everyware
+
+
+## -----------------------------------------------------------------------------
+## HSQLDB Service Properties
+## -----------------------------------------------------------------------------
+# The following configurations represent different trade-offs between data durability
+# and wearing of the physical storage. This aspect is particularly important for
+# embedded devices where the storage is tipically a flash based device (NAND, SD etc.)
+# with a limited number of write/erase cycles.
+
+## 1. In-memory configuration.
+## This configuration is suggested for high publish rates.
+## DB survives to network/connection drops but all messages are lost
+## in case of a crash or power failure.
+## see http://hsqldb.org/doc/guide/ch04.html
+db.service.hsqldb.url=jdbc:hsqldb:mem:kuradb
+
+## 2. Mostly persistent.
+## This configuration is suggested for medium publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## all the messages stored since the last checkpoint will be lost.
+## A checkpoint should be run periodically to control the desired consistency of the database.
+## As data logging is disabled, the defragmentation is operated periodically by the ESF Housekeeper task.
+## This will flush the .data and perform a defragmentation.
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## Applications can call manual \u201Ccheckpoint\u201D if they need further durability.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=false
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=Does not apply
+# db.service.hsqldb.write_delay_millis=Does not apply
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+## 3. Most persistent.
+## This configuration is suggested for slow publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## most of the data can be recovered from the data.log file.
+## A periodic checkpoint is not needed in this case.
+## An automatic defragmentation is operated by HSQLDB as set in the db.service.hsqldb.defrag_limit which should NOT be set to 0.
+## In this configuration with logging enabled, the Housekeeper task will NOT perform any defragmentation.  
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## The configuration parameter db.service.hsqldb.write_delay_millis controls the delay with which the data is flushed to disk.
+## The default is 500ms. In the case of power interruption you would loose the last X millies of data.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/opt/eclipse/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=true
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=50
+# db.service.hsqldb.write_delay_millis=Rely on defaults if not set
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+
+## -----------------------------------------------------------------------------
+##  Remote Configuration Properties
+## -----------------------------------------------------------------------------
+console.device.management.service.ignore=org.eclipse.kura.net.admin.NetworkConfigurationService
+
+
+## -----------------------------------------------------------------------------
+## File upload settings
+## -----------------------------------------------------------------------------
+# default 10240
+file.upload.in.memory.size.threshold=10240
+# -1: unlimited (default)
+file.upload.size.max=-1
+
+
+## -----------------------------------------------------------------------------
+## Deployment Agent settings
+## -----------------------------------------------------------------------------
+# see copyURLToFile() http://commons.apache.org/proper/commons-io/javadocs/api-2.4/index.html
+dpa.connection.timeout = 60000
+dpa.read.timeout = 60000
diff --git a/kura/distrib/src/main/resources/raspberry-pi/kura_install.sh b/kura/distrib/src/main/resources/raspberry-pi/kura_install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2d2fb3a0239e88610b141555c447ab6c021fb298
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/kura_install.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up Kura init
+cp /opt/eclipse/kura/install/kura.init.raspbian /etc/init.d/kura
+chmod +x /etc/init.d/kura
+chmod +x /opt/eclipse/kura/bin/*.sh
+
+#set up default networking file
+cp /opt/eclipse/kura/install/network.interfaces.raspbian /etc/network/interfaces
+
+#set up network helper scripts
+cp /opt/eclipse/kura/install/ifup-local.raspbian /etc/network/if-up.d/ifup-local
+cp /opt/eclipse/kura/install/ifdown-local /etc/network/if-down.d/ifdown-local
+chmod +x /etc/network/if-up.d/ifup-local
+chmod +x /etc/network/if-down.d/ifdown-local
+
+#set up default firewall configuration
+cp /opt/eclipse/kura/install/firewall.init /etc/init.d/firewall
+chmod +x /etc/init.d/firewall
+
+#set up networking configuration
+mac_addr=$(head -1 /sys/class/net/eth0/address | tr '[:lower:]' '[:upper:]')
+sed "s/^ssid=kura_gateway.*/ssid=kura_gateway_${mac_addr}/" < /opt/eclipse/kura/install/hostapd.conf > /etc/hostapd.conf
+cp /opt/eclipse/kura/install/dhcpd-eth0.conf /etc/dhcpd-eth0.conf
+cp /opt/eclipse/kura/install/dhcpd-wlan0.conf /etc/dhcpd-wlan0.conf
+
+#set up kuranet.conf
+mkdir -p /opt/eclipse/kura/data
+cp /opt/eclipse/kura/install/kuranet.conf /opt/eclipse/kura/data/kuranet.conf
+
+#set up bind/named
+cp /opt/eclipse/kura/install/named.conf /etc/bind/named.conf
+mkdir -p /var/named
+chown -R bind /var/named
+touch /var/log/named.log
+chown -R bind /var/log/named.log
+cp /opt/eclipse/kura/install/named.ca /var/named/
+cp /opt/eclipse/kura/install/named.rfc1912.zones /etc/
+cp /opt/eclipse/kura/install/usr.sbin.named /etc/apparmor.d/
+if [ ! -f "/etc/bind/rndc.key" ] ; then
+	rndc-confgen -r /dev/urandom -a
+fi
+
+#set up monit
+if [ -d "/etc/monit/conf.d" ] ; then
+    cp /opt/eclipse/kura/install/monitrc.raspbian /etc/monit/conf.d/
+fi
+
+# set up /opt/eclipse/recover_dflt_kura_config.sh
+cp /opt/eclipse/kura/install/recover_dflt_kura_config.sh /opt/eclipse/kura/recover_dflt_kura_config.sh
+chmod +x /opt/eclipse/kura/recover_dflt_kura_config.sh
+if [ ! -d /opt/eclipse/kura/.data ]; then
+    mkdir /opt/eclipse/kura/.data
+fi
+# for md5.info should keep the same order as in the /opt/eclipse/kura/recover_dflt_kura_config.sh
+echo `md5sum /opt/eclipse/kura/data/kuranet.conf` > /opt/eclipse/kura/.data/md5.info
+echo `md5sum /opt/eclipse/kura/data/snapshots/snapshot_0.xml` >> /opt/eclipse/kura/.data/md5.info
+tar czf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz /opt/eclipse/kura/data/kuranet.conf /opt/eclipse/kura/data/snapshots/snapshot_0.xml
+
+#set up runlevels to start/stop Kura by default
+update-rc.d firewall defaults
+update-rc.d kura defaults
+#update-rc.d monit defaults
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/raspberry-pi/kura_upgrade.sh b/kura/distrib/src/main/resources/raspberry-pi/kura_upgrade.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9564e88b79d748e87cde814d6e4c9741295b048f
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/kura_upgrade.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#create known kura install location
+ln -sf /opt/eclipse/kura-* /opt/eclipse/kura
+
+#set up network helper scripts
+cp /opt/eclipse/kura/install/ifup-local.raspbian /etc/network/if-up.d/ifup-local
+cp /opt/eclipse/kura/install/ifdown-local /etc/network/if-down.d/ifdown-local
+chmod +x /etc/network/if-up.d/ifup-local
+chmod +x /etc/network/if-down.d/ifdown-local
+
+#set up logrotate - no need to restart as it is a cronjob
+cp /opt/eclipse/kura/install/logrotate.conf /etc/logrotate.conf
+cp /opt/eclipse/kura/install/kura.logrotate /etc/logrotate.d/kura
diff --git a/kura/distrib/src/main/resources/raspberry-pi/kuranet.conf b/kura/distrib/src/main/resources/raspberry-pi/kuranet.conf
new file mode 100644
index 0000000000000000000000000000000000000000..58f789a27a4a8b423eb663ed10b4bc605fbefcd3
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/kuranet.conf
@@ -0,0 +1,15 @@
+#Tue Sep 10 17:49:05 GMT 2013
+net.interface.eth0.config.ip4.status=netIPv4StatusEnabledWAN
+net.interface.eth0.config.dhcpServer4.enabled=false
+net.interface.eth0.config.nat.dst.interface=unknown
+net.interface.eth0.config.dhcpServer4.passDns=false
+net.interface.eth0.config.nat.enabled=false
+net.interface.lo.config.ip4.status=netIPv4StatusEnabledLAN
+net.interface.wlan0.config.nat.masquerade=true
+net.interface.wlan0.config.wifi.mode=MASTER
+net.interface.wlan0.config.dhcpServer4.passDns=true
+net.interface.wlan0.config.dhcpServer4.enabled=true
+net.interface.wlan0.config.ip4.status=netIPv4StatusEnabledLAN
+net.interface.wlan0.config.wifi.infra.driver=nl80211
+net.interface.wlan0.config.nat.enabled=true
+net.interface.wlan0.config.nat.dst.interface=unknown
diff --git a/kura/distrib/src/main/resources/raspberry-pi/log4j.properties b/kura/distrib/src/main/resources/raspberry-pi/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6c2fe2c095f3c574dab93b2f3c7c775c1f230e2a
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/log4j.properties
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+### direct log messages to kura.log ###
+log4j.appender.kura=org.apache.log4j.rolling.RollingFileAppender
+log4j.appender.kura.File=/var/log/kura.log
+log4j.appender.kura.RollingPolicy=org.apache.log4j.rolling.FixedWindowRollingPolicy
+log4j.appender.kura.RollingPolicy.ActiveFileName=/var/log/kura.log
+log4j.appender.kura.RollingPolicy.FileNamePattern=/var/log/kura-%i.log.gz
+log4j.appender.kura.RollingPolicy.MaxIndex=10
+log4j.appender.kura.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
+log4j.appender.kura.TriggeringPolicy.MaxFileSize=20000000
+log4j.appender.kura.layout = org.apache.log4j.EnhancedPatternLayout
+log4j.appender.kura.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{1.} - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+log4j.rootLogger=INFO,kura
+
+## eclipse
+log4j.logger.org.eclipse=INFO
diff --git a/kura/distrib/src/main/resources/raspberry-pi/recover_dflt_kura_config.sh b/kura/distrib/src/main/resources/raspberry-pi/recover_dflt_kura_config.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d82f727326af3eee1493a3b1dc365185f8b10894
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/recover_dflt_kura_config.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+cd /tmp
+tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+sum=`md5sum /tmp/opt/eclipse/kura/data/kuranet.conf`
+echo ${sum/\/tmp\//\/} > /tmp/opt/eclipse/kura/data/md5.info
+sum=`md5sum /tmp/opt/eclipse/kura/data/snapshots/snapshot_0.xml`
+echo ${sum/\/tmp\//\/} >> /tmp/opt/eclipse/kura/data/md5.info
+
+MD5_1=`md5sum /tmp/opt/eclipse/kura/data/md5.info | cut -d ' ' -f 1`
+MD5_2=`md5sum /opt/eclipse/kura/.data/md5.info | cut -d ' ' -f 1`
+if [ $MD5_1 == $MD5_2 ]; then
+    cd /
+    tar xzvf /opt/eclipse/kura/.data/recover_dflt_kura_config.tgz
+    # clean up
+    cd /tmp
+    rm -rf opt
+    echo "Default Kura configuration has been recovered."
+else
+    echo "MD5 sum doesn't match, Kura configuration recovery failed."
+fi
diff --git a/kura/distrib/src/main/resources/raspberry-pi/snapshot_0.xml b/kura/distrib/src/main/resources/raspberry-pi/snapshot_0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1a7491649e237eb221a43acf5c20e8dd02902263
--- /dev/null
+++ b/kura/distrib/src/main/resources/raspberry-pi/snapshot_0.xml
@@ -0,0 +1,490 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<esf:configurations xmlns:ocd="http://www.osgi.org/xmlns/metatype/v1.2.0" xmlns:esf="http://eurotech.com/esf/2.0">
+    <esf:configuration pid="org.eclipse.kura.net.admin.NetworkConfigurationService">
+        <esf:properties>
+            <esf:property name="net.interface.wlan0.config.wifi.master.broadcast" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.passDns" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.passphrase" array="false" encrypted="false" type="String">
+                <esf:value>testKEYS</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.driver" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.autoconnect" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.driver.version" array="false" encrypted="false" type="String">
+                <esf:value>unkown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.virtual" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.mode" array="false" encrypted="false" type="String">
+                <esf:value>INFRA</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.wifi.bitrate" array="false" encrypted="false" type="Long">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.channel" array="false" encrypted="false" type="String">
+                <esf:value>1 2 3 4 5 6 7 8 9 10 11</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.type" array="false" encrypted="false" type="String">
+                <esf:value>ETHERNET</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.type" array="false" encrypted="false" type="String">
+                <esf:value>LOOPBACK</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.virtual" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.virtual" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ptp" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.hardwareMode" array="false" encrypted="false" type="String">
+                <esf:value>g</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.securityType" array="false" encrypted="false" type="String">
+                <esf:value>SECURITY_WPA2</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>8</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.firmware.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.winsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.mtu" array="false" encrypted="false" type="Integer">
+                <esf:value>16436</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ip4.broadcast" array="false" encrypted="false" type="String">
+                <esf:value>255.0.0.0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.ip4.status" array="false" encrypted="false" type="String">
+                <esf:value>netIPv4StatusEnabledWAN</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.loopback" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.name" array="false" encrypted="false" type="String">
+                <esf:value>eth0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.wifi.capabilities" array="false" encrypted="false" type="String">
+                <esf:value>CIPHER_TKIP CIPHER_CCMP WPA RSN </esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.broadcast" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.passDns" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.nat.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.eth.link.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.ptp" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>24</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.winsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.mtu" array="false" encrypted="false" type="Integer">
+                <esf:value>1500</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.devicePath" array="false" encrypted="false" type="String">
+                <esf:value>1.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ip4.broadcast" array="false" encrypted="false" type="String">
+                <esf:value>255.255.255.0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.rangeStart" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.100</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.mode" array="false" encrypted="false" type="String">
+                <esf:value>MASTER</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.driver" array="false" encrypted="false" type="String">
+                <esf:value>nl80211</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.type" array="false" encrypted="false" type="String">
+                <esf:value>WIFI</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.driver" array="false" encrypted="false" type="String">
+                <esf:value>nl80211</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.mac" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.vendor.id" array="false" encrypted="false" type="String">
+                <esf:value>0424</esf:value>
+            </esf:property>
+            <esf:property name="net.interfaces" array="false" encrypted="false" type="String">
+                <esf:value>lo,wlan0,eth0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.securityType" array="false" encrypted="false" type="String">
+                <esf:value>NONE</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.domains" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.autoconnect" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.mac" array="false" encrypted="false" type="String">
+                <esf:value>00:00:00:00:00:00</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.loopback" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.maxLeaseTime" array="false" encrypted="false" type="Integer">
+                <esf:value>7200</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.gateway" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.product.id" array="false" encrypted="false" type="String">
+                <esf:value>ec00</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.rangeStart" array="false" encrypted="false" type="String">
+                <esf:value>172.16.0.100</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.state" array="false" encrypted="false" type="String">
+                <esf:value>DISCONNECTED</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.firmware.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.name" array="false" encrypted="false" type="String">
+                <esf:value>lo</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.mac" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.name" array="false" encrypted="false" type="String">
+                <esf:value>wlan0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.driver.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.state" array="false" encrypted="false" type="String">
+                <esf:value>ACTIVATED</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.defaultLeaseTime" array="false" encrypted="false" type="Integer">
+                <esf:value>7200</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.driver" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.ptp" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="modified.interface.names" array="false" encrypted="false" type="String">
+                <esf:value>wlan0</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.address" array="false" encrypted="false" type="String">
+                <esf:value>127.0.0.1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpClient4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.dhcpServer4.rangeEnd" array="false" encrypted="false" type="String">
+                <esf:value>172.16.0.110</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.state" array="false" encrypted="false" type="String">
+                <esf:value>ACTIVATED</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.busNumber" array="false" encrypted="false" type="String">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.mode" array="false" encrypted="false" type="String">
+                <esf:value>MASTER</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.driver" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.radioMode" array="false" encrypted="false" type="String">
+                <esf:value>RADIO_MODE_80211g</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.rangeEnd" array="false" encrypted="false" type="String">
+                <esf:value>172.16.1.110</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.dhcpClient4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.mtu" array="false" encrypted="false" type="Integer">
+                <esf:value>1500</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.gateway" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.status" array="false" encrypted="false" type="String">
+                <esf:value>netIPv4StatusEnabledLAN</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.maxLeaseTime" array="false" encrypted="false" type="Integer">
+                <esf:value>7200</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.ssid" array="false" encrypted="false" type="String">
+                <esf:value>kura_gateway_B8:27:EB:2B:4E:35</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.config.autoconnect" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.product.name" array="false" encrypted="false"/>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>24</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.master.channel" array="false" encrypted="false" type="String">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.lo.config.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.usb.vendor.name" array="false" encrypted="false"/>
+            <esf:property name="net.interface.eth0.loopback" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.prefix" array="false" encrypted="false" type="Short">
+                <esf:value>24</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.passphrase" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.dnsServers" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.domains" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpClient4.enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.ssid" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.wifi.infra.hardwareMode" array="false" encrypted="false" type="String">
+                <esf:value></esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.dhcpServer4.defaultLeaseTime" array="false" encrypted="false" type="Integer">
+                <esf:value>7200</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.config.ip4.status" array="false" encrypted="false" type="String">
+                <esf:value>netIPv4StatusEnabledLAN</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.firmware.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.eth0.up" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="net.interface.wlan0.driver.version" array="false" encrypted="false" type="String">
+                <esf:value>unknown</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.watchdog.WatchdogService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.watchdog.WatchdogService</esf:value>
+            </esf:property>
+            <esf:property name="pingInterval" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.clock.ClockService">
+        <esf:properties>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.port" array="false" encrypted="false" type="Integer">
+                <esf:value>123</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.refresh-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>3600</esf:value>
+            </esf:property>
+            <esf:property name="clock.provider" array="false" encrypted="false" type="String">
+                <esf:value>java-ntp</esf:value>
+            </esf:property>
+            <esf:property name="clock.set.hwclock" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10000</esf:value>
+            </esf:property>
+            <esf:property name="clock.ntp.host" array="false" encrypted="false" type="String">
+                <esf:value>0.pool.ntp.org</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.clock.ClockService</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport">
+        <esf:properties>
+            <esf:property name="clean-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="username" array="false" encrypted="false" type="String">
+                <esf:value>username</esf:value>
+            </esf:property>
+            <esf:property name="topic.context.account-name" array="false" encrypted="false" type="String">
+                <esf:value>account-name</esf:value>
+            </esf:property>
+            <esf:property name="broker-url" array="false" encrypted="false" type="String">
+                <esf:value>mqtt://broker-url:1883/</esf:value>
+            </esf:property>
+            <esf:property name="lwt.retain" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="in-flight.persistence" array="false" encrypted="false" type="String">
+                <esf:value>file</esf:value>
+            </esf:property>
+            <esf:property name="lwt.topic" array="false" encrypted="false" type="String">
+                <esf:value>$EDC/#account-name/#client-id/MQTT/LWT</esf:value>
+            </esf:property>
+            <esf:property name="keep-alive" array="false" encrypted="false" type="Integer">
+                <esf:value>30</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport</esf:value>
+            </esf:property>
+            <esf:property name="password" array="false" encrypted="false" type="Password">
+                <esf:value>password</esf:value>
+            </esf:property>
+            <esf:property name="timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>20</esf:value>
+            </esf:property>
+            <esf:property name="lwt.qos" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.data.DataService">
+        <esf:properties>
+            <esf:property name="in-flight-messages.congestion-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="store.purge-age" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.republish-on-new-session" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="store.capacity" array="false" encrypted="false" type="Integer">
+                <esf:value>1000</esf:value>
+            </esf:property>
+            <esf:property name="disconnect.quiesce-timeout" array="false" encrypted="false" type="Integer">
+                <esf:value>10</esf:value>
+            </esf:property>
+            <esf:property name="connect.auto-on-startup" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="connect.retry-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>60</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.data.DataService</esf:value>
+            </esf:property>
+            <esf:property name="in-flight-messages.max-number" array="false" encrypted="false" type="Integer">
+                <esf:value>9</esf:value>
+            </esf:property>
+            <esf:property name="store.housekeeper-interval" array="false" encrypted="false" type="Integer">
+                <esf:value>900</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.position.PositionService">
+        <esf:properties>
+            <esf:property name="port" array="false" encrypted="false" type="String">
+                <esf:value>1-3.2</esf:value>
+            </esf:property>
+            <esf:property name="enabled" array="false" encrypted="false" type="Boolean">
+                <esf:value>false</esf:value>
+            </esf:property>
+            <esf:property name="parity" array="false" encrypted="false" type="Integer">
+                <esf:value>0</esf:value>
+            </esf:property>
+            <esf:property name="stopBits" array="false" encrypted="false" type="Integer">
+                <esf:value>1</esf:value>
+            </esf:property>
+            <esf:property name="baudRate" array="false" encrypted="false" type="Integer">
+                <esf:value>115200</esf:value>
+            </esf:property>
+            <esf:property name="service.pid" array="false" encrypted="false" type="String">
+                <esf:value>org.eclipse.kura.position.PositionService</esf:value>
+            </esf:property>
+            <esf:property name="bitsPerWord" array="false" encrypted="false" type="Integer">
+                <esf:value>8</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+    <esf:configuration pid="org.eclipse.kura.cloud.CloudService">
+        <esf:properties>
+            <esf:property name="encode.gzip" array="false" encrypted="false" type="Boolean">
+                <esf:value>true</esf:value>
+            </esf:property>
+            <esf:property name="device.display-name" array="false" encrypted="false" type="String">
+                <esf:value>Raspberry Pi</esf:value>
+            </esf:property>
+        </esf:properties>
+    </esf:configuration>
+</esf:configurations>
diff --git a/kura/distrib/src/main/sh/create_installer.sh b/kura/distrib/src/main/sh/create_installer.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e5ffa26ab5e143fd6c00a684ef375ab740e25e84
--- /dev/null
+++ b/kura/distrib/src/main/sh/create_installer.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+TARGET_DIR=$1
+KURA_ZIP_FILE_NAME=$2
+OUTPUT_NAME=$3
+BUILD_NAME=$4
+
+if [ $BUILD_NAME != "raspberry-pi" ]
+then
+	#tar the zip...
+	cd $TARGET_DIR
+	tar czvf $KURA_ZIP_FILE_NAME.tar.gz $KURA_ZIP_FILE_NAME
+	
+	cat $TARGET_DIR/../src/main/sh/extract.sh $KURA_ZIP_FILE_NAME.tar.gz > $OUTPUT_NAME
+	chmod +x $OUTPUT_NAME
+	
+	#clean up
+	rm $TARGET_DIR/$KURA_ZIP_FILE_NAME.tar.gz
+fi
diff --git a/kura/distrib/src/main/sh/create_upgrader.sh b/kura/distrib/src/main/sh/create_upgrader.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c496d3267f50cd8912aa7c9931ad9c7ac04d7817
--- /dev/null
+++ b/kura/distrib/src/main/sh/create_upgrader.sh
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+TARGET_DIR=$1
+INSTALL_ZIP=$2
+UPGRADE_ZIP=$3
+OLD_VERSION=$4
+INSTALL_DIR=$5
+REMOVE_LIST=$6
+KEEP_LIST=$7
+OUTPUT_NAME=$8
+BUILD_NAME=$9
+
+# Files that should NOT be included in an upgrade
+EXCLUDE_FILES=("kura/kura_custom.properties" "kura/dpa.properties" "data/kuranet.conf")  
+
+cd $TARGET_DIR
+
+# Create an upgrade zip that does not include files that are unchanged
+# from the previous version (files to "keep")
+cp $INSTALL_ZIP $TARGET_DIR/$UPGRADE_ZIP
+
+REMOVE="$(printf "*/%s " ${EXCLUDE_FILES[@]})"
+REMOVE+=$(
+while read line
+do
+	# Skip comments and blank lines
+	if [[ $line == "#"* || -z $line ]] ; then
+		continue
+	fi
+	printf "*/$line "
+done < $KEEP_LIST)
+
+# Remove files from zip
+zip -d $UPGRADE_ZIP $REMOVE
+
+# Remove excluded files from remove list
+UPGRADE_REMOVE="upgrade_${REMOVE_LIST}"
+# escape slash
+EXCLUDE_ESC=(${EXCLUDE_FILES[@]/\//\\/})
+EXCLUDE_SED="$(printf "/%s/d;" "${EXCLUDE_ESC[@]}")"
+sed "$EXCLUDE_SED" $REMOVE_LIST > $UPGRADE_REMOVE
+
+
+#tar the zip...
+tar czvf $UPGRADE_ZIP.tar.gz $UPGRADE_ZIP $UPGRADE_REMOVE
+
+# Populate variables in extract script
+sed "s/^OLD_VERSION=$/OLD_VERSION=$OLD_VERSION/;s/^INSTALL_DIR=$/INSTALL_DIR=$INSTALL_DIR/;s/^REMOVE_LIST=$/REMOVE_LIST=$UPGRADE_REMOVE/" ../src/main/sh/extract_upgrade.sh > $TARGET_DIR/extract_upgrade.sh
+
+cat extract_upgrade.sh $UPGRADE_ZIP.tar.gz > $OUTPUT_NAME
+chmod +x $OUTPUT_NAME
+
+#clean up
+rm $TARGET_DIR/$UPGRADE_ZIP.tar.gz
diff --git a/kura/distrib/src/main/sh/diff_build_versions.sh b/kura/distrib/src/main/sh/diff_build_versions.sh
new file mode 100755
index 0000000000000000000000000000000000000000..704e549e8691c7152c8b6ae6e0563cf644cf7f63
--- /dev/null
+++ b/kura/distrib/src/main/sh/diff_build_versions.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+OLD_FILES=$1
+NEW_FILES=$2
+REMOVED_NAME="${3}.removed"
+KEEP_NAME="${3}.keep"
+ADDED_NAME="${3}.added"
+BUILD_NAME=$4
+
+# filenames without path or extension
+OLD=${OLD_FILES##*/}
+OLD=${OLD%.versions}
+NEW=${NEW_FILES##*/}
+NEW=${NEW%.versions}
+
+
+
+# Make a list of files that were in the old version but not the new
+# and files whose versions have changed
+
+echo "# Files that were removed or changed from $OLD to $NEW" > $REMOVED_NAME
+
+while read line
+do
+	# Skip comments
+	if [[ $line == "#"* ]] ; then
+		continue
+	fi
+
+	# remove version from line
+	filename=${line%%	*}
+
+	if ! grep -q "$line" $NEW_FILES ; then
+		echo $filename >> $REMOVED_NAME
+	fi
+done < $OLD_FILES
+
+
+# Make a list of files in the new version that are unchanged, and a list
+# of files that were not in the old version
+
+echo "# Files that were unchanged from $OLD to $NEW" > $KEEP_NAME
+echo "# Files that were added or changed from $OLD to $NEW" > $ADDED_NAME
+
+while read line
+do
+	# Skip comments
+	if [[ $line == "#"* ]] ; then
+		continue
+	fi
+
+	# remove version from line
+	filename=${line%%	*}
+
+	if grep -q "$line" $OLD_FILES ; then
+		echo $filename >> $KEEP_NAME
+	else
+		echo $filename >> $ADDED_NAME
+	fi
+done < $NEW_FILES
+
+
+#clean up
diff --git a/kura/distrib/src/main/sh/extract.sh b/kura/distrib/src/main/sh/extract.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9bfa77b89c91832cff8c5a40902d114822cc2f0e
--- /dev/null
+++ b/kura/distrib/src/main/sh/extract.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+##############################################
+# PRE-INSTALL SCRIPT
+##############################################
+echo ""
+echo "Installing Kura..."
+echo "Installing Kura..." > /tmp/kura_install.log 2>&1
+
+#Kill JVM and monit for installation
+killall monit java >> /tmp/kura_install.log 2>&1
+
+#remove old ESFv1 if present
+(rpm -ev `rpm -qa | grep -i -e esf -e denali -e eurotech -e dynacor -e reliagate -e helios -e duracor | grep -v atom | grep -v jvm`) >> /tmp/kura_install.log 2>&1
+
+#clean up old installation if present
+rm -fr /opt/eclipse/data >> /tmp/kura_install.log 2>&1
+rm -fr /opt/eclipse/esf* >> /tmp/kura_install.log 2>&1
+rm -fr /opt/eclipse/kura* >> /tmp/kura_install.log 2>&1
+rm -fr /tmp/.esf/ >> /tmp/kura_install.log 2>&1
+rm -fr /tmp/.kura/ >> /tmp/kura_install.log 2>&1
+rm /etc/init.d/firewall >> /tmp/kura_install.log 2>&1
+rm /etc/dhcpd-*.conf >> /tmp/kura_install.log 2>&1
+rm /etc/named.conf >> /tmp/kura_install.log 2>&1
+rm /etc/wpa_supplicant.conf >> /tmp/kura_install.log 2>&1
+rm /etc/hostapd.conf >> /tmp/kura_install.log 2>&1
+rm /tmp/coninfo-* >> /tmp/kura_install.log 2>&1
+rm /var/log/esf.log >> /tmp/kura_install.log 2>&1
+rm /var/log/kura.log >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/chat >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/peers >> /tmp/kura_install.log 2>&1
+rm -fr /etc/ppp/scripts >> /tmp/kura_install.log 2>&1
+rm /etc/ppp/*ap-secrets >> /tmp/kura_install.log 2>&1
+rm /etc/rc*.d/S*esf >> /tmp/kura_install.log 2>&1
+rm /etc/rc*.d/S*kura >> /tmp/kura_install.log 2>&1
+rm esf-*.zip >> /tmp/kura_install.log 2>&1
+rm kura-*.zip >> /tmp/kura_install.log 2>&1
+
+#clean up and/or install OS specific stuff
+HOSTNAME=`hostname`
+if [ ${HOSTNAME} == "mini-gateway" ] ; then
+	#MGW specific items
+	mkdir /var/named >> /tmp/kura_install.log 2>&1
+
+	#remove ntpd
+	rm /etc/rc2.d/S20ntpd >> /tmp/kura_install.log 2>&1
+	rm /etc/rc3.d/S20ntpd >> /tmp/kura_install.log 2>&1
+	rm /etc/rc4.d/S20ntpd >> /tmp/kura_install.log 2>&1
+	rm /etc/rc5.d/S20ntpd >> /tmp/kura_install.log 2>&1
+fi
+
+echo ""
+##############################################
+# END PRE-INSTALL SCRIPT
+##############################################
+
+echo "Extracting Kura files"
+SKIP=`awk '/^__TARFILE_FOLLOWS__/ { print NR + 1; exit 0; }' $0`
+
+# take the tarfile and pipe it into tar and redirect the output
+tail -n +$SKIP $0 | tar -xz
+
+
+##############################################
+# POST INSTALL SCRIPT
+##############################################
+mkdir -p /opt/eclipse >> /tmp/kura_install.log 2>&1
+unzip kura-*.zip -d /opt/eclipse >> /tmp/kura_install.log 2>&1
+
+#install Kura files
+sh /opt/eclipse/kura-*/install/kura_install.sh >> /tmp/kura_install.log 2>&1
+
+#clean up
+rm -rf /opt/eclipse/kura/install >> /tmp/kura_install.log 2>&1
+rm kura-*.zip >> /tmp/kura_install.log 2>&1
+
+#move the log file
+mv /tmp/kura_install.log /opt/eclipse/kura/kura/
+
+#flush all cached filesystem to disk
+sync
+
+echo ""
+echo "Finished.  Kura has been installed to /opt/eclipse/kura and will start automatically after a reboot"
+exit 0
+#############################################
+# END POST INSTALL SCRIPT
+##############################################
+
+# NOTE: Don't place any newline characters after the last line below.
+__TARFILE_FOLLOWS__
diff --git a/kura/distrib/src/main/sh/extract_upgrade.sh b/kura/distrib/src/main/sh/extract_upgrade.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4fd85f0474283002d574061538ca16302071ccab
--- /dev/null
+++ b/kura/distrib/src/main/sh/extract_upgrade.sh
@@ -0,0 +1,154 @@
+#!/bin/bash
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+OLD_VERSION=
+INSTALL_DIR=
+REMOVE_LIST=
+
+TMP=/tmp/kura_upgrade
+LOG=$TMP/kura_upgrade.log
+
+##############################################
+# PRE-INSTALL SCRIPT
+##############################################
+mkdir -p $TMP
+echo "Upgrading Kura..." > $LOG
+
+# Check currently installed version
+CURRENT_VERSION=`grep -e "^kura.version=" /opt/eclipse/kura/kura/kura.properties |cut -d'=' -f2`
+if [ "$CURRENT_VERSION" != "$OLD_VERSION" ]; then
+    echo "Could not upgrade - Currently installed version is not $OLD_VERSION" | tee $LOG 2>&1
+    exit 1
+fi
+
+# Check that upgraded version does not already exist
+if [ -d "/opt/eclipse/$INSTALL_DIR" ]; then
+    echo "Could not upgrade - Updated version already exists in /opt/eclipse/$INSTALL_DIR" | tee $LOG 2>&1
+    exit 1
+fi
+
+
+# kill JVM and monit for upgrade
+echo "Stopping monit and kura" >> $LOG 2>&1
+killall monit java >> $LOG 2>&1
+
+
+# remove .dp file and dpa.properties entry if it exists
+# wait for the dp to get written to disk first
+sync
+sleep 3
+KURA_DP=`grep -e "^kura-upgrade=" /opt/eclipse/kura/kura/dpa.properties |cut -d'=' -f2`
+KURA_DP=${KURA_DP#file\\:}
+echo "Found kura upgrade deployment package file: $KURA_DP" >> $LOG 2>&1
+if [ -n "$KURA_DP" ]; then
+	echo "Removing kura upgrade deployment package" >> $LOG 2>&1
+    sed "/^kura-upgrade=.*/d" /opt/eclipse/kura/kura/dpa.properties > /tmp/dpa.properties
+    mv -f /tmp/dpa.properties /opt/eclipse/kura/kura/dpa.properties >> $LOG 2>&1
+    rm -f $KURA_DP >> $LOG 2>&1
+fi
+
+# Make a copy of the previous installation using hard links
+echo "Creating hard link copy of previous version into $INSTALL_DIR" >> $LOG 2>&1
+mkdir "/opt/eclipse/$INSTALL_DIR"
+cd "/opt/eclipse/kura" && find . -type d | cpio -dp /opt/eclipse/$INSTALL_DIR >> $LOG 2>&1
+cd "/opt/eclipse/kura" && find . -type f -exec ln {} /opt/eclipse/$INSTALL_DIR/{} \; >> $LOG 2>&1
+
+# Replace hard links with real copies for certain files
+FILES=" \
+	bin/* \
+	data/* \
+	kura/config.ini \
+	kura/dpa.properties \
+	kura/kura_install.log \
+	kura/kura.properties \
+	kura/kura_custom.properties \
+	kura/log4j.properties
+"
+for f in $FILES
+do
+	target="/opt/eclipse/$INSTALL_DIR/$f"
+	echo "Creating a real copy of $target" >> $LOG 2>&1
+	rm -rf $target >> $LOG 2>&1
+	# copy file, removing the filename from the target to support wildcards
+	cp -r /opt/eclipse/kura/$f ${target%/*} >> $LOG 2>&1
+done
+
+echo "" >> $LOG 2>&1
+##############################################
+# END PRE-INSTALL SCRIPT
+##############################################
+
+SKIP=`awk '/^__TARFILE_FOLLOWS__/ { print NR + 1; exit 0; }' $0`
+
+# take the tarfile and pipe it into tar and redirect the output
+cd $TMP && tail -n +$SKIP $0 | tar -xz >> $LOG 2>&1
+
+##############################################
+# POST INSTALL SCRIPT
+##############################################
+
+# Remove files not needed in the new version
+echo "Removing old files..." >> $LOG 2>&1
+while read line
+do
+	# Skip comments
+	if [[ $line == "#"* ]] ; then
+		continue
+	fi
+
+	# TODO - remove files outside of kura directory
+	rmfile="/opt/eclipse/$INSTALL_DIR/$line"
+	echo "Removing $rmfile" >> $LOG 2>&1
+	rm -f $rmfile
+done < $REMOVE_LIST
+
+# Extract new files
+unzip -o kura-*.zip -d /opt/eclipse >> $LOG 2>&1
+
+## install Kura files
+#if [ -f /opt/eclipse/$INSTALL_DIR/install/kura_upgrade.sh ]; then
+#	sh /opt/eclipse/$INSTALL_DIR/install/kura_upgrade.sh >> $LOG 2>&1
+#fi
+
+# Point symlink to new version
+rm -f /opt/eclipse/kura
+ln -s /opt/eclipse/$INSTALL_DIR /opt/eclipse/kura
+
+# clean up
+rm -rf /opt/eclipse/kura/install >> $LOG 2>&1
+rm kura-*.zip >> $LOG 2>&1
+
+# set permissions
+chmod +x /opt/eclipse/kura/bin/*.sh >> $LOG 2>&1
+
+
+echo "" >> $LOG 2>&1
+echo "Finished.  Kura has been upgraded in /opt/eclipse/kura and system will now reboot" >> $LOG 2>&1
+
+# move the log file
+mkdir -p /opt/eclipse/kura/log
+cp $LOG /opt/eclipse/kura/log
+
+# flush all cached filesystem to disk
+sync
+
+reboot
+exit 0
+
+#############################################
+# END POST INSTALL SCRIPT
+##############################################
+
+# NOTE: Don't place any newline characters after the last line below.
+__TARFILE_FOLLOWS__
diff --git a/kura/distrib/src/main/sh/get_build_versions.sh b/kura/distrib/src/main/sh/get_build_versions.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5214a08c5e168d55bff3cbae721e89cfb17e5dd5
--- /dev/null
+++ b/kura/distrib/src/main/sh/get_build_versions.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+TARGET_DIR=$1
+KURA_ZIP_FILE_NAME=$2
+OUTPUT_NAME=$3
+BUILD_NAME=$4
+TMP_DIR="tmp_versions"
+KURA_FILE_NAME="${KURA_ZIP_FILE_NAME%.zip}"
+
+# Check for existence of md5sum or md5 (OSX)
+MD5=md5sum
+if ! command -v $MD5 >&-
+then
+	MD5="md5 -r "
+	if ! command -v $MD5 >&-
+	then
+		echo "Could not find md5sum or md5.  Exiting..."
+		exit 1
+	fi
+fi
+
+
+# unpack the zip...
+cd $TARGET_DIR
+rm -rf $TMP_DIR
+mkdir $TMP_DIR
+unzip $KURA_ZIP_FILE_NAME -d $TMP_DIR
+
+
+# Get version from MANIFEST.MF for jar files, use md5 for others
+echo "# $KURA_FILE_NAME" > $OUTPUT_NAME
+
+FILES=`find $TMP_DIR -type f`
+for file in $FILES
+do
+	# Remove the first two directories from name
+	filename=`echo ${file#$TMP_DIR/$KURA_FILE_NAME/}`
+
+	version=`$MD5 $file | awk '{ print $1 }' `
+	if [[ $file == *.jar ]]
+	then
+		# extract the manifest and get the bundle version
+		jar xf $file META-INF/MANIFEST.MF
+		version=`grep Bundle-Version META-INF/MANIFEST.MF |awk '{print $2}'`
+	fi
+
+	printf "$filename	$version\n" >> $OUTPUT_NAME
+done
+
+#clean up
+rm -rf $TMP_DIR
diff --git a/kura/distrib/src/main/sh/upgrade_wrapper.sh b/kura/distrib/src/main/sh/upgrade_wrapper.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4989cc4662dd9bf5e1215df84681da41f75a9048
--- /dev/null
+++ b/kura/distrib/src/main/sh/upgrade_wrapper.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+# remove the original update file
+rm /tmp/kura-update-*.zip
+
+# make the upgrade executable
+chmod +x /tmp/kura-*_upgrader.sh
+
+# execute the upgrade
+sh /tmp/kura-*_upgrader.sh &
+
+echo "Installing Kura and rebooting"
+sleep 90
+
+# clean up
+rm -rf /opt/eclipse/kura/install >> /tmp/kura_upgrade.log 2>&1
+rm kura-*.zip >> /tmp/kura_upgrade.log 2>&1
+
+# move the log file
+mv /tmp/kura_upgrade.log /opt/eclipse/kura/configuration/
+
+# restore dps except old Kura version
+rm /tmp/dps/kura-*.dp
+mv /tmp/dps/* /opt/eclipse/kura/kura/packages/
+
+# restore dpa
+cd /opt/eclipse/kura/kura/packages
+KURA=`ls kura-*.dp`
+sed "s/KURA_VERSION_DP/kura=file\\\:\/opt\/eclipse\/kura\/kura\/packages\/${KURA}/" /tmp/dpa1.properties > /opt/eclipse/kura/kura/dpa.properties
+
+# set permissions
+chmod +x /opt/eclipse/kura/bin/*.sh
+
+# flush all cached filesystem to disk
+sync                          
+
+# finally reboot
+reboot
diff --git a/kura/examples/org.eclipse.kura.demo.heater/.gitignore b/kura/examples/org.eclipse.kura.demo.heater/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/kura/examples/org.eclipse.kura.demo.heater/META-INF/MANIFEST.MF b/kura/examples/org.eclipse.kura.demo.heater/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..7221eb643fc4743e0c47e0593e2e20ff0db241dc
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.demo.heater
+Bundle-SymbolicName: org.eclipse.kura.demo.heater;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.osgi.service.component;version="1.2.0",
+ org.slf4j;version="1.6.4"
diff --git a/kura/examples/org.eclipse.kura.demo.heater/OSGI-INF/heater.xml b/kura/examples/org.eclipse.kura.demo.heater/OSGI-INF/heater.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e824f974936cc372d272b6e99b3546d0efe59488
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/OSGI-INF/heater.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+    name="org.eclipse.kura.demo.heater.Heater"
+    activate="activate" 
+    deactivate="deactivate" 
+    modified="updated" 
+    enabled="true"
+    immediate="true"
+    configuration-policy="require">
+	<implementation class="org.eclipse.kura.demo.heater.Heater"/>
+
+   <!-- If the component is configurable through the Kura ConfigurationService, it must expose a Service. -->
+   <property name="service.pid" type="String" value="org.eclipse.kura.demo.heater.Heater"/>
+   <service>
+       <provide interface="org.eclipse.kura.demo.heater.Heater"/>
+   </service>
+   
+   <reference name="CloudService"
+              policy="static"
+              bind="setCloudService"       
+              unbind="unsetCloudService"       
+              cardinality="1..1" 
+              interface="org.eclipse.kura.cloud.CloudService"/>
+</scr:component>
diff --git a/kura/examples/org.eclipse.kura.demo.heater/OSGI-INF/metatype/org.eclipse.kura.demo.heater.Heater.xml b/kura/examples/org.eclipse.kura.demo.heater/OSGI-INF/metatype/org.eclipse.kura.demo.heater.Heater.xml
new file mode 100644
index 0000000000000000000000000000000000000000..907928b47391650b623e79fb9d1bc21e87ac49bb
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/OSGI-INF/metatype/org.eclipse.kura.demo.heater.Heater.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.demo.heater.Heater"
+         name="Heater" 
+         description="This is a simulator for an heater gateway application. Its configuration options will be passed down the smart heater. ">
+        
+        <Icon resource="http://sphotos-a.xx.fbcdn.net/hphotos-ash4/p480x480/408247_10151040905591065_1989684710_n.jpg" size="32"/>
+
+        <AD id="mode"  
+            name="mode"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="Program" 
+            description="Operating mode for the heater. If operatng mode is Vacation, set point is automatiaclly set to 6.0C.">
+           <Option label="Program"  value="Program"/>
+           <Option label="Manual"   value="Manual"/>          
+           <Option label="Vacation" value="Vacation"/>
+        </AD>
+        
+        <AD id="program.startTime"  
+            name="program.startTime"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="06:00" 
+            description="Start time for the heating cycle with the operating mode is Program."/>
+        
+        <AD id="program.stopTime"  
+            name="program.stopTime"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="22:00" 
+            description="Stop time for the heating cycle with the operating mode is Program."/>
+    
+        <AD id="program.setPoint"  
+            name="program.setPoint"
+            type="Float"
+            cardinality="0" 
+            required="false"
+            default="20.5"
+            min="5.0" 
+            max="40.0" 
+            description="Temperature Set Point in Celsius for the heating cycle with the operating mode is Program."/>
+
+        <AD id="manual.setPoint"  
+            name="manual.setPoint"
+            type="Float"
+            cardinality="0" 
+            required="false"
+            default="15.0" 
+            min="5.0" 
+            max="40.0" 
+            description="Temperature Set Point in Celsius for the heating cycle with the operating mode is Manual."/>
+
+        <AD id="temperature.initial"  
+            name="temperature.initial"
+            type="Float"
+            cardinality="0" 
+            required="true"
+            default="10"
+            description="Initial value for the temperature metric."/>
+        
+        <AD id="temperature.increment"  
+            name="temperature.increment"
+            type="Float"
+            cardinality="0" 
+            required="true"
+            default="0.25"
+            description="Increment value for the temperature metric."/>
+
+        <AD id="publish.rate"  
+            name="publish.rate"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2"
+            min="1" 
+            description="Default message publishing rate in seconds (min 1)."/>
+
+        <AD id="publish.semanticTopic"  
+            name="publish.semanticTopic"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="data" 
+            description="Default semantic topic to publish the messages to."/>
+        
+        <AD id="publish.qos"  
+            name="publish.qos"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="0" 
+            description="Default QoS to publish the messages with.">
+           <Option label="Fire and forget" value="0"/>
+           <Option label="Al least once" value="1"/>          
+           <Option label="At most once" value="2"/>
+        </AD>
+
+        <AD id="publish.retain"  
+            name="publish.retain"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Default retaing flag for the published messages."/>
+    </OCD>
+    
+    <Designate pid="org.eclipse.kura.demo.heater.Heater">
+        <Object ocdref="org.eclipse.kura.demo.heater.Heater"/>
+    </Designate>
+</MetaData>
diff --git a/kura/examples/org.eclipse.kura.demo.heater/about.html b/kura/examples/org.eclipse.kura.demo.heater/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.demo.heater/about_files/epl-v10.html b/kura/examples/org.eclipse.kura.demo.heater/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.demo.heater/build.properties b/kura/examples/org.eclipse.kura.demo.heater/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2d88c5cd1d08aadec2e3466dbc5156f8f5faf1fe
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/build.properties
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.api,\
+                     slf4j.api
+src.includes = about.html,\
+               about_files/
+                     
diff --git a/kura/examples/org.eclipse.kura.demo.heater/pom.xml b/kura/examples/org.eclipse.kura.demo.heater/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f263f6311d3572d13dc4ac80787b428c6957ec4e
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>examples</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.demo.heater</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/../..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/examples/org.eclipse.kura.demo.heater/src/main/java/org/eclipse/kura/demo/heater/Heater.java b/kura/examples/org.eclipse.kura.demo.heater/src/main/java/org/eclipse/kura/demo/heater/Heater.java
new file mode 100644
index 0000000000000000000000000000000000000000..100bf8bbc474a220f5737f43521f378d6d6e2ff7
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/src/main/java/org/eclipse/kura/demo/heater/Heater.java
@@ -0,0 +1,296 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.demo.heater;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.message.KuraPayload;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Heater implements ConfigurableComponent, CloudClientListener  
+{	
+	private static final Logger s_logger = LoggerFactory.getLogger(Heater.class);
+	
+	// Cloud Application identifier
+	private static final String APP_ID = "heater";
+
+	// Publishing Property Names
+	private static final String   MODE_PROP_NAME           = "mode";
+	private static final String   MODE_PROP_PROGRAM        = "Program";
+	private static final String   MODE_PROP_MANUAL         = "Manual";
+	private static final String   MODE_PROP_VACATION       = "Vacation";
+
+	private static final String   PROGRAM_SETPOINT_NAME    = "program.setPoint";
+	private static final String   MANUAL_SETPOINT_NAME     = "manual.setPoint";
+	
+	private static final String   TEMP_INITIAL_PROP_NAME   = "temperature.initial";
+	private static final String   TEMP_INCREMENT_PROP_NAME = "temperature.increment";
+
+	private static final String   PUBLISH_RATE_PROP_NAME   = "publish.rate";
+	private static final String   PUBLISH_TOPIC_PROP_NAME  = "publish.semanticTopic";
+	private static final String   PUBLISH_QOS_PROP_NAME    = "publish.qos";
+	private static final String   PUBLISH_RETAIN_PROP_NAME = "publish.retain";
+	
+	private CloudService                m_cloudService;
+	private CloudClient      			m_cloudClient;
+	
+	private ScheduledExecutorService    m_worker;
+	private ScheduledFuture<?>          m_handle;
+	
+	private float                       m_temperature;
+	private Map<String, Object>         m_properties;
+	private Random                      m_random;
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+	
+	public Heater() 
+	{
+		super();
+		m_random = new Random();
+		m_worker = Executors.newSingleThreadScheduledExecutor();
+	}
+
+	public void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+	}
+
+	public void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+		
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.info("Activating Heater...");
+		
+		m_properties = properties;
+		for (String s : properties.keySet()) {
+			s_logger.info("Activate - "+s+": "+properties.get(s));
+		}
+		
+		// get the mqtt client for this application
+		try  {
+			
+			// Acquire a Cloud Application Client for this Application 
+			s_logger.info("Getting CloudClient for {}...", APP_ID);
+			m_cloudClient = m_cloudService.newCloudClient(APP_ID);
+			m_cloudClient.addCloudClientListener(this);
+			
+			// Don't subscribe because these are handled by the default 
+			// subscriptions and we don't want to get messages twice			
+			doUpdate(false);
+		}
+		catch (Exception e) {
+			s_logger.error("Error during component activation", e);
+			throw new ComponentException(e);
+		}
+		s_logger.info("Activating Heater... Done.");
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.debug("Deactivating Heater...");
+
+		// shutting down the worker and cleaning up the properties
+		m_worker.shutdown();
+		
+		// Releasing the CloudApplicationClient
+		s_logger.info("Releasing CloudApplicationClient for {}...", APP_ID);
+		m_cloudClient.release();
+
+		s_logger.debug("Deactivating Heater... Done.");
+	}	
+	
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("Updated Heater...");
+
+		// store the properties received
+		m_properties = properties;
+		for (String s : properties.keySet()) {
+			s_logger.info("Update - "+s+": "+properties.get(s));
+		}
+		
+		// try to kick off a new job
+		doUpdate(true);
+		s_logger.info("Updated Heater... Done.");
+	}
+	
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Cloud Application Callback Methods
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onConnectionLost() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Called after a new set of properties has been configured on the service
+	 */
+	private void doUpdate(boolean onUpdate) 
+	{
+		// cancel a current worker handle if one if active
+		if (m_handle != null) {
+			m_handle.cancel(true);
+		}
+		
+		if (!m_properties.containsKey(TEMP_INITIAL_PROP_NAME) ||
+		    !m_properties.containsKey(PUBLISH_RATE_PROP_NAME)) {
+			s_logger.info("Update Heater - Ignore as properties do not contain TEMP_INITIAL_PROP_NAME and PUBLISH_RATE_PROP_NAME.");
+			return;
+		}
+		
+		// reset the temperature to the initial value
+		if (!onUpdate) {
+			m_temperature = (Float) m_properties.get(TEMP_INITIAL_PROP_NAME);
+		}
+		
+		// schedule a new worker based on the properties of the service
+		int pubrate = (Integer) m_properties.get(PUBLISH_RATE_PROP_NAME);
+		m_handle = m_worker.scheduleAtFixedRate(new Runnable() {		
+			@Override
+			public void run() {
+				Thread.currentThread().setName(getClass().getSimpleName());
+				doPublish();
+			}
+		}, 0, pubrate, TimeUnit.SECONDS);
+	}
+	
+	
+	/**
+	 * Called at the configured rate to publish the next temperature measurement.
+	 */
+	private void doPublish() 
+	{				
+		// fetch the publishing configuration from the publishing properties
+		String  topic  = (String) m_properties.get(PUBLISH_TOPIC_PROP_NAME);
+		Integer qos    = (Integer) m_properties.get(PUBLISH_QOS_PROP_NAME);
+		Boolean retain = (Boolean) m_properties.get(PUBLISH_RETAIN_PROP_NAME);
+		String    mode = (String)  m_properties.get(MODE_PROP_NAME);
+		
+		// Increment the simulated temperature value
+		float setPoint = 0;
+		float tempIncr = (Float) m_properties.get(TEMP_INCREMENT_PROP_NAME);
+		if (MODE_PROP_PROGRAM.equals(mode)) {
+			setPoint = (Float) m_properties.get(PROGRAM_SETPOINT_NAME);
+		}
+		else if (MODE_PROP_MANUAL.equals(mode)) {
+			setPoint = (Float) m_properties.get(MANUAL_SETPOINT_NAME);
+		}
+		else if (MODE_PROP_VACATION.equals(mode)) {
+			setPoint = 6.0F;			
+		}
+		if (m_temperature + tempIncr < setPoint) {
+			m_temperature += tempIncr;
+		}
+		else {
+			m_temperature -= 4*tempIncr;
+		}
+				
+		// Allocate a new payload
+		KuraPayload payload = new KuraPayload();
+		
+		// Timestamp the message
+		payload.setTimestamp(new Date());
+		
+		// Add the temperature as a metric to the payload
+		payload.addMetric("temperatureInternal", m_temperature);
+		payload.addMetric("temperatureExternal", 5.0F);
+		payload.addMetric("temperatureExhaust",  30.0F);
+
+		int code = m_random.nextInt();
+		if ((m_random.nextInt() % 5) == 0) {
+			payload.addMetric("errorCode", code);
+		}
+		else {
+			payload.addMetric("errorCode", 0);
+		}
+		
+		// Publish the message
+		try {
+			m_cloudClient.publish(topic, payload, qos, retain);
+			s_logger.info("Published to {} message: {}", topic, payload);
+		} 
+		catch (Exception e) {
+			s_logger.error("Cannot publish topic: "+topic, e);
+		}
+	}
+}
diff --git a/kura/examples/org.eclipse.kura.demo.heater/src/main/resources/org.eclipse.kura.demo.heater.dpp b/kura/examples/org.eclipse.kura.demo.heater/src/main/resources/org.eclipse.kura.demo.heater.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b9fa0dbebce07bd1426e123583f0d766a6eafe9
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.heater/src/main/resources/org.eclipse.kura.demo.heater.dpp
@@ -0,0 +1,19 @@
+#Deployment Plugin Project File
+#Tue Jul 23 11:20:57 CEST 2013
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.demo.heater_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.demo.heater.dp
+build.location=
+bundles.0.bundle_path=<.>/.project
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.demo.heater.jar
+bundles.0.symbolic_name=org.eclipse.kura.demo.heater;singleton\:\=true
+bundles.0.version=1.0.0.SNAPSHOT
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.demo.heater
+headers.version=1.0.0
+resources.count=0
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/META-INF/MANIFEST.MF b/kura/examples/org.eclipse.kura.demo.modbus/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..96658b72645fce33cd1c313878c0d59a81414edd
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.demo.modbus
+Bundle-SymbolicName: org.eclipse.kura.demo.modbus;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.clock; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.protocol.modbus; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.eclipse.kura.watchdog; version="[0.2,1.0)",
+ org.osgi.framework;version="1.4.0",
+ org.osgi.service.component;version="1.0.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.slf4j;version="1.6.4"
+Unit-Test: true
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.kura.demo.modbus; version="0.2.0"
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/OSGI-INF/metatype/org.eclipse.kura.demo.modbus.ModbusExample.xml b/kura/examples/org.eclipse.kura.demo.modbus/OSGI-INF/metatype/org.eclipse.kura.demo.modbus.ModbusExample.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c7cc279bb5f8f329257c2fe960cea62986b115d0
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/OSGI-INF/metatype/org.eclipse.kura.demo.modbus.ModbusExample.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.demo.modbus.ModbusExample"
+         name="ModbusExample" 
+         description="Modbus protocol example application.">
+              
+        <Icon resource="http://sphotos-a.xx.fbcdn.net/hphotos-ash4/p480x480/408247_10151040905591065_1989684710_n.jpg" size="32"/>
+        
+        <AD id="port"
+            name="port"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="/dev/ttyUSB0"
+            description="Serial Port Name."/>
+        
+        <AD id="baudRate"  
+            name="baudRate"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="9600" 
+            description="The baud rate of the serial connection."/>
+
+        <AD id="bitsPerWord"  
+            name="bitsPerWord"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="8" 
+            description="The number of bits per word or the 'data bits' for the serial connection."/>
+
+        <AD id="stopBits"  
+            name="stopBits"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="1" 
+            description="The stop bits for the serial connection."/>
+
+        <AD id="parity"  
+            name="parity"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="0" 
+            description="The parity for the serial connection."/>
+
+        <AD id="controlTopic"  
+            name="controlTopic"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="/modbus/manager" 
+            description="The control topic for the device connected."/>
+    </OCD>
+    <Designate pid="org.eclipse.kura.demo.modbus.ModbusExample">
+        <Object ocdref="org.eclipse.kura.demo.modbus.ModbusExample"/>
+    </Designate>
+</MetaData>
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/OSGI-INF/modbusexample.xml b/kura/examples/org.eclipse.kura.demo.modbus/OSGI-INF/modbusexample.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8d3a583e570a6b3d904490630f29d0d999715aae
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/OSGI-INF/modbusexample.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.demo.modbus.ModbusExample">
+   <implementation class="org.eclipse.kura.demo.modbus.ModbusExample"/>
+   <service>
+      <provide interface="org.eclipse.kura.demo.modbus.ModbusExample"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.demo.modbus.ModbusExample"/>
+
+   <reference bind="setModbusProtocolDeviceService" 
+    		  cardinality="1..1" 
+    		  interface="org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService" 
+    		  name="ModbusProtocolDeviceService" 
+    		  policy="static" 
+    		  unbind="unsetModbusProtocolDeviceService"/>
+</scr:component>
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/about.html b/kura/examples/org.eclipse.kura.demo.modbus/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/about_files/epl-v10.html b/kura/examples/org.eclipse.kura.demo.modbus/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/build.properties b/kura/examples/org.eclipse.kura.demo.modbus/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b9a9c8e9f21eeeeb5251926812d413a83cf8d9c7
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = slf4j.api,\
+                     org.eclipse.kura.test
+src.includes = about.html,\
+               about_files/
+
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/pom.xml b/kura/examples/org.eclipse.kura.demo.modbus/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..35e1a02220da76db4f850143d87fee02e4663af1
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>examples</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.demo.modbus</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/../..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/examples/org.eclipse.kura.demo.modbus/src/main/java/org/eclipse/kura/demo/modbus/ModbusExample.java b/kura/examples/org.eclipse.kura.demo.modbus/src/main/java/org/eclipse/kura/demo/modbus/ModbusExample.java
new file mode 100644
index 0000000000000000000000000000000000000000..136e36ddd3e5b8255db0a6cfe8415a918585f48e
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.demo.modbus/src/main/java/org/eclipse/kura/demo/modbus/ModbusExample.java
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.demo.modbus;
+
+import java.lang.Thread.State;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService;
+import org.eclipse.kura.protocol.modbus.ModbusProtocolException;
+import org.eclipse.kura.protocol.modbus.ModbusTransmissionMode;
+
+public class ModbusExample implements ConfigurableComponent {
+	private static final Logger s_logger = LoggerFactory.getLogger(ModbusExample.class);
+
+	static final boolean isTCP = true;
+	private ModbusProtocolDeviceService m_protocolDevice;
+	private Thread 						m_thread;
+	private Map<String,Object>    		m_properties;
+	private static Properties 			modbusProperties;
+	private boolean 					configured;
+	private boolean						m_threadShouldStop;
+	
+	public void setModbusProtocolDeviceService(ModbusProtocolDeviceService modbusService) {
+		this.m_protocolDevice = modbusService;
+	}
+	
+	public void unsetModbusProtocolDeviceService(ModbusProtocolDeviceService modbusService) {
+		this.m_protocolDevice = null;
+	}
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) {
+		configured = false;		
+		m_properties = properties;
+		modbusProperties = getModbusProperties();
+		m_threadShouldStop=false;
+		m_thread = new Thread(new Runnable() {		
+			@Override
+			public void run() {
+				doModbusLoop();		  
+			}
+		});
+		m_thread.start();
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		s_logger.info("Modbus deactivate");
+		m_threadShouldStop=true;
+		while(m_thread.getState()!=State.TERMINATED){
+			try {
+				Thread.sleep(100);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		s_logger.info(m_thread.getState().toString());
+		s_logger.info("Modbus polling thread killed");
+		
+		if(m_protocolDevice!=null)
+			m_protocolDevice.disconnect();
+		configured = false;
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("updated...");		
+		m_properties = properties;
+		modbusProperties = getModbusProperties();
+		configured=false;
+	}	
+	
+	private int bcd2Dec(int bcdVal) {
+		byte bcd = (byte)bcdVal;
+	    int decimal =	(bcd & 0x000F) + 
+	    				(((int)bcd & 0x000F0) >> 4)*10 +
+	    				(((int)bcd & 0x00F00) >> 8)*100 +
+	    				(((int)bcd & 0x0F000) >> 12)*1000 +
+	    				(((int)bcd & 0xF0000) >> 16)*10000;
+    				
+	    return decimal;
+	}
+
+	private void doModbusLoop(){
+		while(!m_threadShouldStop){
+			if(!configured){
+				try {
+					if(modbusProperties!=null){
+						configureDevice();
+//						boolean[] ab=m_protocolDevice.readExceptionStatus();
+//						m_protocolDevice.writeSingleCoil( 2048, false);
+//						int[] regs=m_protocolDevice.readHoldingRegisters(40000, 8);
+//						for(int reg:regs)
+//							s_logger.info(String.valueOf(reg));
+//						boolean[] ab=m_protocolDevice.readCoils(2048, 8);
+//						for(boolean b:ab)
+//							s_logger.info(String.valueOf(b));
+						initializeLeds();
+					}
+				} catch (ModbusProtocolException e) {
+					//s_logger.error(e.getMessage());
+					e.printStackTrace();
+				}
+			}
+			else{
+				try {
+					int[] analogInputs = m_protocolDevice.readInputRegisters(512, 8);
+					int qc = bcd2Dec(analogInputs[7]);
+					s_logger.info("qc = "+qc);
+				} catch (ModbusProtocolException e) {
+					e.printStackTrace();
+				}
+			}
+			try {
+				Thread.sleep(2000);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		m_threadShouldStop=false;
+		s_logger.info("Sortie de doModbusLoop");
+	}
+	
+	private void configureDevice() throws ModbusProtocolException {
+		if(m_protocolDevice!=null){
+			m_protocolDevice.disconnect();
+
+			m_protocolDevice.configureProtocol(getProtocolProperties());
+			m_protocolDevice.configureConnection(modbusProperties);
+
+			configured = true;
+		}
+	}
+	
+	private void initializeLeds() throws ModbusProtocolException {
+		s_logger.debug("Initializing LEDs");	// once on startup, turn on each light
+		for( int led = 1; led <= 6; led++)
+		{
+			m_protocolDevice.writeSingleCoil( 2047 + led, true);
+			try {
+				Thread.sleep(200);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			m_protocolDevice.writeSingleCoil( 2047 + led, false);
+		}			
+	}
+
+	
+	private Properties getModbusProperties() {
+		Properties prop = new Properties();
+
+		if(isTCP){
+			prop.setProperty("connectionType", "ETHERTCP");
+			prop.setProperty("port", "502");
+			prop.setProperty("ipAddress","192.168.1.3");
+		}
+		else{
+			if(m_properties!=null){
+				String portName = null;
+				String serialMode = null;
+				String baudRate = null;
+				String bitsPerWord = null;
+				String stopBits = null;
+				String parity = null;
+				String ctopic = null;
+				if(m_properties.get("port") != null) portName 			= (String) m_properties.get("port");
+				if(m_properties.get("serialMode") != null) serialMode 	= (String) m_properties.get("serialMode");
+				if(m_properties.get("baudRate") != null) baudRate 		= (String) m_properties.get("baudRate");
+				if(m_properties.get("bitsPerWord") != null) bitsPerWord = (String) m_properties.get("bitsPerWord");
+				if(m_properties.get("stopBits") != null) stopBits 		= (String) m_properties.get("stopBits");
+				if(m_properties.get("parity") != null) parity 			= (String) m_properties.get("parity");
+				if(m_properties.get("controlTopic") != null) ctopic		= (String) m_properties.get("controlTopic");
+
+				prop.setProperty("connectionType", "SERIAL");
+				if(portName==null) //portName="/dev/ttyUSB0";
+					return null;		
+				if(baudRate==null) baudRate="9600";
+				if(stopBits==null) stopBits="1";
+				if(parity==null) parity="0";
+				if(bitsPerWord==null) bitsPerWord="8";
+				if(ctopic==null) ctopic="/modbus/manager";
+
+				prop.setProperty("port", portName);
+				if(serialMode!=null)
+					prop.setProperty("serialMode", serialMode);
+				prop.setProperty("exclusive", "false");
+				prop.setProperty("mode", "0");
+				prop.setProperty("baudRate", baudRate);
+				prop.setProperty("stopBits", stopBits);
+				prop.setProperty("parity", parity);
+				prop.setProperty("bitsPerWord", bitsPerWord);
+				prop.setProperty("controlTopic", ctopic);
+
+			} 
+		}
+		return prop;
+	}
+
+
+	private Properties getProtocolProperties() {
+		Properties prop = new Properties();
+
+		prop.setProperty("unitName", "Demo");
+		prop.setProperty("unitAddress", "1");
+		prop.setProperty("txMode", ModbusTransmissionMode.RTU);
+		prop.setProperty("respTimeout", "1000");
+
+		return prop;
+	}
+}
diff --git a/kura/examples/org.eclipse.kura.example.project/.gitignore b/kura/examples/org.eclipse.kura.example.project/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/kura/examples/org.eclipse.kura.example.project/META-INF/MANIFEST.MF b/kura/examples/org.eclipse.kura.example.project/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..c0ec0ef043d6d85d0ad6612ff7ecaa829568c986
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/META-INF/MANIFEST.MF
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.example.project
+Bundle-SymbolicName: org.eclipse.kura.example.project;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/component.xml
+Import-Package: javax.comm;version="1.2.0",
+ javax.microedition.io;resolution:=optional,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.clock; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.comm; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,1.0)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,1.0)",
+ org.eclipse.kura.net.wifi; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.osgi.util.position;version="1.0.1",
+ org.slf4j;version="1.6.4"
+Bundle-ClassPath: .
diff --git a/kura/examples/org.eclipse.kura.example.project/OSGI-INF/component.xml b/kura/examples/org.eclipse.kura.example.project/OSGI-INF/component.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a5b83f137533aa286b71c06d32af744b91b98376
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/OSGI-INF/component.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" modified="updated" name="org.eclipse.kura.example.project.ExampleComponent">
+	<implementation class="org.eclipse.kura.example.project.ExampleComponent"/>
+ 
+ <reference bind="setCloudService" cardinality="1..1" interface="org.eclipse.kura.cloud.CloudService" name="CloudService" policy="static" unbind="unsetCloudService"/>
+ <reference bind="setPositionService" cardinality="1..1" interface="org.eclipse.kura.position.PositionService" name="PositionService" policy="static" unbind="unsetPositionService"/>
+ <reference bind="setConnectionFactory" cardinality="1..1" interface="org.osgi.service.io.ConnectionFactory" name="ConnectionFactory" policy="static" unbind="unsetConnectionFactory"/>
+ <reference bind="setClockService" cardinality="1..1" interface="org.eclipse.kura.clock.ClockService" name="ClockService" policy="static" unbind="unsetClockService"/>
+ <reference bind="setConfigurationService" cardinality="1..1" interface="org.eclipse.kura.configuration.ConfigurationService" name="ConfigurationService" policy="static" unbind="unsetConfigurationService"/>
+ <reference bind="setNetworkService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkService" name="NetworkService" policy="static" unbind="unsetNetworkService"/>
+ <reference bind="setUsbService" cardinality="1..1" interface="org.eclipse.kura.usb.UsbService" name="UsbService" policy="static" unbind="unsetUsbService"/>
+ 
+</scr:component>
diff --git a/kura/examples/org.eclipse.kura.example.project/about.html b/kura/examples/org.eclipse.kura.example.project/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.example.project/about_files/epl-v10.html b/kura/examples/org.eclipse.kura.example.project/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.example.project/build.properties b/kura/examples/org.eclipse.kura.example.project/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..78c6a4ae1f69eabc30ea19b2923f5d67a1e57e3e
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/build.properties
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.equinox.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/examples/org.eclipse.kura.example.project/pom.xml b/kura/examples/org.eclipse.kura.example.project/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..182097c6e7afaac10f23f6ca84da176d064aab18
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/pom.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>examples</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.example.project</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/../..</kura.basedir>
+	</properties>
+
+	<build>
+        	<plugins>
+            		<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+                		<artifactId>maven-eclipse-plugin</artifactId>
+                		<version>2.9</version>
+                		<configuration>
+                    			<skip>false</skip>
+                		</configuration>
+            		</plugin>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+        	<pluginManagement>
+        		<plugins>
+        			<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        			<plugin>
+        				<groupId>org.eclipse.m2e</groupId>
+        				<artifactId>lifecycle-mapping</artifactId>
+        				<version>1.0.0</version>
+        				<configuration>
+        					<lifecycleMappingMetadata>
+        						<pluginExecutions>
+        							<pluginExecution>
+        								<pluginExecutionFilter>
+        									<groupId>
+        										org.eclipse.tycho
+        									</groupId>
+        									<artifactId>
+        										tycho-packaging-plugin
+        									</artifactId>
+        									<versionRange>
+        										[0.20.0,)
+        									</versionRange>
+        									<goals>
+        										<goal>validate-id</goal>
+        										<goal>
+        											build-qualifier
+        										</goal>
+        										<goal>
+        											validate-version
+        										</goal>
+        									</goals>
+        								</pluginExecutionFilter>
+        								<action>
+        									<ignore></ignore>
+        								</action>
+        							</pluginExecution>
+        							<pluginExecution>
+        								<pluginExecutionFilter>
+        									<groupId>
+        										org.eclipse.tycho
+        									</groupId>
+        									<artifactId>
+        										tycho-compiler-plugin
+        									</artifactId>
+        									<versionRange>
+        										[0.20.0,)
+        									</versionRange>
+        									<goals>
+        										<goal>compile</goal>
+        									</goals>
+        								</pluginExecutionFilter>
+        								<action>
+        									<ignore></ignore>
+        								</action>
+        							</pluginExecution>
+        						</pluginExecutions>
+        					</lifecycleMappingMetadata>
+        				</configuration>
+        			</plugin>
+        		</plugins>
+        	</pluginManagement>
+	</build>
+</project>
diff --git a/kura/examples/org.eclipse.kura.example.project/src/org/eclipse/kura/example/project/ExampleComponent.java b/kura/examples/org.eclipse.kura.example.project/src/org/eclipse/kura/example/project/ExampleComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b7ecb2a97aa7aa6ef0bd99903ad5137e61f8e93
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.project/src/org/eclipse/kura/example/project/ExampleComponent.java
@@ -0,0 +1,523 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.example.project;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.clock.ClockService;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.position.PositionService;
+import org.eclipse.kura.usb.UsbService;
+import org.eclipse.kura.usb.UsbTtyDevice;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.position.Position;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ExampleComponent implements CloudClientListener, EventHandler {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(ExampleComponent.class);
+
+	// Cloud Application identifier
+	private static final String APP_ID = "EXAMPLE_COMPONENT";
+	private static final int POLL_DELAY_SEC = 10;
+	
+	private CloudService m_cloudService;
+	private PositionService m_positionService;
+	private ConfigurationService m_configurationService;
+	private ClockService m_clockService;
+	private CloudClient m_cloudClient;
+	private NetworkService m_networkService;
+	private UsbService m_usbService;
+	
+	private ConnectionFactory m_connectionFactory;
+	private ScheduledThreadPoolExecutor m_worker;
+	private ScheduledFuture<?> m_handle;
+	private ScheduledExecutorService m_gpsWorker;
+	private ScheduledFuture<?> m_gpsHandle;
+	private ScheduledThreadPoolExecutor m_systemPropsWorker;
+	private ScheduledFuture<?> m_systemPropsHandle;
+	private Thread 	m_serialThread;
+	private int counter;
+	private StringBuilder m_serialSb;
+	
+	InputStream in;
+	OutputStream out;
+	CommConnection conn=null;
+	
+	public void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+	}
+
+	public void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+	public void setPositionService(PositionService positionService) {
+		m_positionService = positionService;
+	}
+
+	public void unsetPositionService(PositionService positionService) {
+		m_positionService = null;
+	}
+	
+	public void setConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = connectionFactory;
+	}
+	
+	public void unsetConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = null;
+	}
+	
+	public void setConfigurationService(ConfigurationService configurationService) {
+		m_configurationService = configurationService;
+	}
+
+	public void unsetConfigurationService(ConfigurationService configurationService) {
+		m_configurationService = null;
+	}
+	
+	public void setClockService(ClockService clockService) {
+		m_clockService = clockService;
+	}
+
+	public void unsetClockService(ClockService clockService) {
+		m_clockService = null;
+	}
+	
+	public void setNetworkService(NetworkService networkService) {
+		m_networkService = networkService;
+	}
+
+	public void unsetNetworkService(NetworkService networkService) {
+		m_networkService = null;
+	}
+	
+	public void setUsbService(UsbService usbService) {
+		m_usbService = usbService;
+	}
+
+	public void unsetUsbService(UsbService usbService) {
+		m_usbService = null;
+	}
+
+	private boolean clockIsSynced = false;
+	
+	protected void activate(ComponentContext componentContext) {
+		s_logger.debug("Activating ExampleComponent");
+		
+		List<UsbTtyDevice> ttyDevices = m_usbService.getUsbTtyDevices();
+		if(ttyDevices != null && !ttyDevices.isEmpty()) {
+			for(UsbTtyDevice device : ttyDevices) {
+				System.out.println("Device: " + device.getVendorId() + ":" + device.getProductId());
+				System.out.println("\t" + device.getDeviceNode());
+				System.out.println("\t" + device.getManufacturerName());
+				System.out.println("\t" + device.getProductName());
+				System.out.println("\t" + device.getUsbPort());
+			}
+		}
+		
+		/*
+		m_worker = new ScheduledThreadPoolExecutor(1);
+		
+		m_worker.schedule(new Runnable() {
+
+			@Override
+			public void run() {
+				try {
+					System.out.println("m_networkService.getState(): " + m_networkService.getState());
+					
+					List<String> interfaceNames = m_networkService.getAllNetworkInterfaceNames();
+					if(interfaceNames != null && interfaceNames.size() > 0) {
+						for(String interfaceName : interfaceNames) {
+							System.out.println("Interface Name: " + interfaceName + " with State: " + m_networkService.getState(interfaceName));
+						}
+					}
+					
+					List<NetInterface<? extends NetInterfaceAddress>> activeNetworkInterfaces = m_networkService.getActiveNetworkInterfaces();
+					if(activeNetworkInterfaces != null && activeNetworkInterfaces.size() > 0) {
+						for(NetInterface<? extends NetInterfaceAddress> activeNetworkInterface : activeNetworkInterfaces) {
+							System.out.println("ActiveNetworkInterface: " + activeNetworkInterface);
+						}
+					}
+					
+					List<NetInterface<? extends NetInterfaceAddress>> networkInterfaces = m_networkService.getNetworkInterfaces();
+					if(networkInterfaces != null && networkInterfaces.size() > 0) {
+						for(NetInterface<? extends NetInterfaceAddress> networkInterface : networkInterfaces) {
+							System.out.println("NetworkInterface: " + networkInterface);
+						}
+					}
+					
+					List<WifiAccessPoint> wifiAccessPoints = m_networkService.getAllWifiAccessPoints();
+					if(wifiAccessPoints != null && wifiAccessPoints.size() > 0) {
+						for(WifiAccessPoint wifiAccessPoint : wifiAccessPoints) {
+							System.out.println("WifiAccessPoint: " + wifiAccessPoint);
+						}
+					}
+					
+					List<WifiAccessPoint> wlan0wifiAccessPoints = m_networkService.getAllWifiAccessPoints();
+					if(wlan0wifiAccessPoints != null && wlan0wifiAccessPoints.size() > 0) {
+						for(WifiAccessPoint wifiAccessPoint : wlan0wifiAccessPoints) {
+							System.out.println("wlan0 WifiAccessPoint: " + wifiAccessPoint);
+						}
+					}
+				} catch(Exception e) {
+					e.printStackTrace();
+				}
+			}
+			
+		}, 0, TimeUnit.SECONDS);
+		*/
+		
+		doGpsUpdate();
+		
+		/*
+		// install event listener for serial ports and specific topics of interest
+		Dictionary props = new Hashtable<String, String>();
+		props.put(EventConstants.EVENT_TOPIC, "CLOCK_SERVICE_EVENT");
+		BundleContext bc = componentContext.getBundleContext();
+		bc.registerService(EventHandler.class.getName(), this, props);
+		
+		try {
+			if(m_clockService.getLastSync() != null) {
+				clockIsSynced = true;
+			}
+		} catch (KuraException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		try {
+			List<ComponentConfiguration> configs = m_configurationService.getComponentConfigurations();
+			for(ComponentConfiguration config : configs) {
+				System.out.println(config.getPid());
+			}
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}*/
+		
+		//doGpsUpdate();
+		
+		/*
+		m_systemPropsWorker = new ScheduledThreadPoolExecutor(1);		
+		m_systemPropsHandle = m_systemPropsWorker.scheduleAtFixedRate(new Runnable() {
+			@Override
+			public void run() {
+				try {
+
+					String[] values = {"Zero", "One", "Two", "Three", "Four"};
+
+					for(int i=0; i<5; i++) { 
+						Map<String, Object> map = new Hashtable<String, Object>();
+						System.out.println("SETTING TO " + values[i]);
+						map.put("0", values[i]);
+						m_systemPropertiesService.setValues(map);
+						if(m_systemPropertiesService.getValue("0").equals(values[i])) {
+							System.out.println("SUCCESS... " + m_systemPropertiesService.getValue("0"));
+						} else {
+							System.out.println("FAILURE!!! " + m_systemPropertiesService.getValue("0"));
+						}
+					}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+
+			}    
+		}, 10, (Integer) 10, TimeUnit.SECONDS);
+		*/
+
+		/*
+		// get the mqtt client for this application
+		try  {
+			s_logger.info("Getting CloudApplicationClient for {}...", APP_ID);
+			m_cloudClient = m_cloudService.getCloudApplicationClient(APP_ID);
+			m_cloudClient.addCloudCallbackHandler(this);
+
+			// initialize a COM port
+			Properties props = new Properties();
+			props.setProperty("port", "/dev/ttyUSB0");
+			props.setProperty("baudRate", "9600");
+			props.setProperty("stopBits", "1");
+			props.setProperty("parity", "0");
+			props.setProperty("bitsPerWord", "8");
+			try {
+				initSerialCom(props);
+			} catch (ProtocolException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			m_serialSb = new StringBuilder();
+			if(conn!=null){
+				m_serialThread = new Thread(new Runnable() {		
+					@Override
+					public void run() {
+						while(conn!=null){
+							doSerial();
+						}
+					}
+				});
+				m_serialThread.start();
+			}
+			counter = 0;
+			doUpdate();
+			doGpsUpdate();
+		} catch (KuraException e) {
+			s_logger.error("Cannot activate", e);
+			throw new ComponentException(e);
+		}*/
+	}
+	
+	private boolean serialPortExists(String portName){
+		if(portName!=null){						
+			File f = new File(portName);
+			if(f.exists())
+				return true;
+//		List<UsbTtyDevice> utd=m_usbService.getUsbTtyDevices();	
+//			if(utd!=null){
+//				for (UsbTtyDevice u : utd) {
+//					if(portName.contains(u.getDeviceNode()))
+//						return true;
+//				}
+//			}
+		}
+		return false;
+	}
+	
+	private void initSerialCom(Properties connectionConfig) throws KuraException {
+		String sPort;
+		String sBaud;
+		String sStop;
+		String sParity;
+		String sBits;				
+
+		if (((sPort = connectionConfig.getProperty("port")) == null)
+				|| ((sBaud = connectionConfig.getProperty("baudRate")) == null)
+				|| ((sStop = connectionConfig.getProperty("stopBits")) == null)
+				|| ((sParity = connectionConfig.getProperty("parity")) == null)
+				|| ((sBits = connectionConfig.getProperty("bitsPerWord")) == null))
+			throw new KuraException(KuraErrorCode.SERIAL_PORT_INVALID_CONFIGURATION);
+		
+		int baud = Integer.valueOf(sBaud).intValue();
+		int stop = Integer.valueOf(sStop).intValue();
+		int parity = Integer.valueOf(sParity).intValue();
+		int bits = Integer.valueOf(sBits).intValue();
+		if(!serialPortExists(sPort)){
+			throw new KuraException(KuraErrorCode.SERIAL_PORT_NOT_EXISTING);
+		}
+		
+		String uri = new CommURI.Builder(sPort)
+								.withBaudRate(baud)
+								.withDataBits(bits)
+								.withStopBits(stop)
+								.withParity(parity)
+								.withTimeout(2000)
+								.build().toString();
+
+		try {
+			conn = (CommConnection) m_connectionFactory.createConnection(uri, 1, false);
+			s_logger.info(sPort+" initialized");
+		} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+
+		// get the streams
+		try {
+			in = conn.openInputStream();
+			out = conn.openOutputStream();
+			byte[] array = "Port opened \r\n".getBytes();
+			out.write(array);
+			out.flush();
+			} catch (Exception e) {
+			e.printStackTrace();
+		}		
+	}
+	private void doSerial() {
+		synchronized (in) {
+			try {
+				if(in.available()==0) {								
+					try {
+						Thread.sleep(10);	// avoid a high cpu load
+					} catch (InterruptedException e) {
+						e.printStackTrace();
+					}
+					return;
+				}
+			} catch (IOException e1) {
+				e1.printStackTrace();
+			}
+			int c=0;
+			try {
+				c = in.read();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			// on reception of CR, publish the received sentence
+			if(c==13){
+				s_logger.debug("Received : "+m_serialSb.toString());
+				KuraPayload payload = new KuraPayload();
+				payload.addMetric("sentence", m_serialSb.toString());
+				try {
+					m_cloudClient.publish("message", payload, 0, false);
+				} catch (KuraException e) {
+					e.printStackTrace();
+				}
+				m_serialSb = new StringBuilder();
+			}
+			else if(c!=10){
+				m_serialSb.append((char)c);
+			}			
+		}
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		s_logger.debug("Deactivating ExampleComponent");
+		if (conn!=null) {
+			try {
+				conn.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			conn = null;
+		}
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("updated...");		
+//		m_properties = properties;
+//		modbusProperties = getModbusProperties();
+//		m_serialPortExist=serialPortExists(); // check if /dev/ttyxxx exists
+//		configured=false;
+	}	
+	
+	private void doUpdate() {
+		if (m_handle != null) {
+			m_handle.cancel(true);
+		}
+		
+		m_handle = m_worker.scheduleAtFixedRate(new Runnable() {
+			
+			@Override
+			public void run() {
+				doPublish();
+			}
+		}, 0, (Integer) POLL_DELAY_SEC, TimeUnit.SECONDS);
+	}
+	
+	private void doGpsUpdate() {
+		if (m_gpsHandle != null) {
+			m_gpsHandle.cancel(true);
+		}
+		
+		m_gpsWorker = Executors.newSingleThreadScheduledExecutor();
+		m_gpsHandle = m_gpsWorker.scheduleAtFixedRate(new Runnable() {
+			
+			@Override
+			public void run() {
+				Position position = m_positionService.getPosition();
+				s_logger.debug("Latitude: " + position.getLatitude());
+				s_logger.debug("Longitude: " + position.getLongitude());
+				s_logger.debug("Altitude: " + position.getAltitude());
+				s_logger.debug("Speed: " + position.getSpeed());
+				s_logger.debug("Track: " + position.getTrack());
+				s_logger.debug("Time: " + m_positionService.getNmeaTime());
+				s_logger.debug("Date: " + m_positionService.getNmeaDate());
+				s_logger.debug("Last Sentence: " + m_positionService.getLastSentence());
+			}
+		}, 0, (Integer) POLL_DELAY_SEC, TimeUnit.SECONDS);
+	}
+	
+	public void doPublish() {
+
+		try {
+			if(m_cloudClient != null){
+				KuraPayload payload = new KuraPayload();
+				payload.addMetric("counter", counter);
+				m_cloudClient.publish("sensor", payload, 0, false);
+				counter++;
+				if(counter==4){
+					if (conn!=null) {
+						try {
+							conn.close();
+							s_logger.info("conn closed");
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+						conn = null;
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic, KuraPayload msg, int qos, boolean retain) {
+		s_logger.debug("control arrived for " + deviceId + " on topic " + appTopic);
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic, KuraPayload msg, int qos, boolean retain) {
+		s_logger.debug("publish arrived for " + deviceId + " on topic " + appTopic);
+	}
+
+	@Override
+	public void onConnectionLost() {
+		s_logger.debug("connection lost");
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		s_logger.debug("connection restored");
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		s_logger.debug("published: " + messageId);
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		s_logger.debug("published: " + messageId);
+	}
+
+	@Override
+	public void handleEvent(Event event) {
+		System.out.println("Got clock event: " + event);
+		clockIsSynced = true;
+	}
+}
diff --git a/kura/examples/org.eclipse.kura.example.publisher/.gitignore b/kura/examples/org.eclipse.kura.example.publisher/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/kura/examples/org.eclipse.kura.example.publisher/META-INF/MANIFEST.MF b/kura/examples/org.eclipse.kura.example.publisher/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..51a90126afac2b8c4f2c2c7f51aad51da9103971
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.example.publisher
+Bundle-SymbolicName: org.eclipse.kura.example.publisher;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.osgi.service.component;version="1.2.0",
+ org.slf4j;version="1.6.4"
+Bundle-ClassPath: .
diff --git a/kura/examples/org.eclipse.kura.example.publisher/OSGI-INF/example.xml b/kura/examples/org.eclipse.kura.example.publisher/OSGI-INF/example.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2e75e22e517565dd314ea425a31d870851896a59
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/OSGI-INF/example.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+    name="org.eclipse.kura.example.publisher.ExamplePublisher"
+    activate="activate" 
+    deactivate="deactivate" 
+    modified="updated" 
+    enabled="true"
+    immediate="true"
+    configuration-policy="require">
+	<implementation class="org.eclipse.kura.example.publisher.ExamplePublisher"/>
+
+   <!-- If the component is configurable through the Kura ConfigurationService, it must expose a Service. -->
+   <property name="service.pid" type="String" value="org.eclipse.kura.example.publisher.ExamplePublisher"/>
+   <service>
+       <provide interface="org.eclipse.kura.example.publisher.ExamplePublisher"/>
+   </service>
+   
+   <reference name="CloudService"
+              policy="static"
+              bind="setCloudService"       
+              unbind="unsetCloudService"       
+              cardinality="1..1" 
+              interface="org.eclipse.kura.cloud.CloudService"/>
+</scr:component>
diff --git a/kura/examples/org.eclipse.kura.example.publisher/OSGI-INF/metatype/org.eclipse.kura.example.publisher.ExamplePublisher.xml b/kura/examples/org.eclipse.kura.example.publisher/OSGI-INF/metatype/org.eclipse.kura.example.publisher.ExamplePublisher.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f6fed5c91e42801fe577d118a96fb376c7f82cd4
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/OSGI-INF/metatype/org.eclipse.kura.example.publisher.ExamplePublisher.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.example.publisher.ExamplePublisher"
+         name="ExamplePublisher" 
+         description="Example of a Configuring Kura Application.">
+        
+        <Icon resource="http://sphotos-a.xx.fbcdn.net/hphotos-ash4/p480x480/408247_10151040905591065_1989684710_n.jpg" size="32"/>
+        
+        <AD id="publish.rate"  
+            name="publish.rate"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="1000"
+            min="1"
+            description="Default message publishing rate in milliseconds (min 1)."/>
+            
+        <AD id="publish.qos"  
+            name="publish.qos"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="0" 
+            description="Default QoS to publish the messages with.">
+           <Option label="0 - At most once" value="0"/>
+           <Option label="1 - At least once" value="1"/>          
+           <Option label="2 - Exactly once" value="2"/>
+        </AD>
+
+        <AD id="publish.retain"  
+            name="publish.retain"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Default retaing flag for the published messages."/>
+        
+        <AD id="publish.appTopic"  
+            name="publish.appTopic"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="data/metrics" 
+            description="Default semantic topic to publish the metrics to."/>
+        
+        <AD id="metric.temperature.initial"  
+            name="metric.temperature.initial"
+            type="Float"
+            cardinality="0" 
+            required="true"
+            default="10"
+            description="Initial value for the temperature metric."/>
+        
+        <AD id="metric.temperature.increment"  
+            name="metric.temperature.increment"
+            type="Float"
+            cardinality="0" 
+            required="true"
+            default="0.1"
+            description="Increment value for the temperature metric."/>
+
+        <!-- String, Long, Integer, Short, Double, Float, Char, Byte, Boolean, Password -->
+        
+        <AD id="metric.string"
+            name="metric.string"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="string.value"
+            description="Test metric of String type."/>
+         
+        <AD id="metric.string.oneof"
+            name="metric.string.oneof"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="string.value.option.1"
+            description="Test metric of String type whose value is one of a list.">
+           <Option label="string.value.option.1" value="string.value.option.1"/>
+           <Option label="string.value.option.2" value="string.value.option.2"/>          
+           <Option label="string.value.option.3" value="string.value.option.3"/>          
+        </AD>
+        
+        <AD id="metric.long"  
+            name="metric.long"
+            type="Long"
+            cardinality="0" 
+            required="true"
+            default="4294967295" 
+            min = "-4294967296"
+            max = "4294967296"
+            description="Long metric. Metric range min -4294967296 max 4294967296."/>
+
+        <AD id="metric.integer"  
+            name="metric.integer"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2147483599" 
+            min = "-2147483600"
+            max = "2147483600"
+            description="Integer metric. Metric range min -2147483600 max 2147483600. Integer min -2147483647 max 2147483647."/>
+
+        <AD id="metric.integer.fixed"  
+            name="metric.integer.fixed"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="101" 
+            min = "101"
+            max = "101"
+            description="Integer metric. Metric range min -2147483600 max 2147483600. Integer min -2147483647 max 2147483647."/>
+        
+        <AD id="metric.short"  
+            name="metric.short"
+            type="Short"
+            cardinality="0" 
+            required="true"
+            default="32759" 
+            min = "-32760"
+            max = "32760"
+            description="Short metric. Metric range min -32760 max 32760. Short min -32767 max 32767."/>
+        
+        <AD id="metric.double"  
+            name="metric.double"
+            type="Double"
+            cardinality="0" 
+            required="true"
+            default="4294967295.99998" 
+            min = "-4294967295.99999"
+            max = "4294967295.99999"
+            description="Double metric. Metric range min -4294967295.99999 max 4294967295.99999."/>
+        
+        <AD id="metric.float"  
+            name="metric.float"
+            type="Float"
+            cardinality="0" 
+            required="true"
+            default="32766.98" 
+            min = "-32766.99"
+            max = "32766.99"
+            description="Float metric. Metric range min -32766.99 max 32766.99."/>
+
+        <AD id="metric.char"  
+            name="metric.char"
+            type="Char"
+            cardinality="0" 
+            required="true"
+            default="a" 
+            min = "a"
+            max = "z"
+            description="Char metric. Min a. Max z."/>
+
+        <AD id="metric.byte"  
+            name="metric.byte"
+            type="Byte"
+            cardinality="0" 
+            required="true"
+            default="119" 
+            min = "-120"
+            max = "120"
+            description="Byte metric. Metric range min -120 max 120. Byte min -127 max 127."/>
+
+        <AD id="metric.boolean"  
+            name="metric.boolean"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Boolean metric."/>
+        
+        <AD id="metric.password"
+            name="metric.password"
+            type="Password"
+            cardinality="0" 
+            required="true"
+            default="password.value"
+            description="Password metric."/>
+
+        <AD id="metric.string.array"
+            name="metric.string.array"
+            type="String"
+            cardinality="5" 
+            required="false"
+            default="string.value1,string.value2,string.value3"
+            description="Test metric of Array of String type."/>
+
+        <AD id="metric.short.array"  
+            name="metric.short.array"
+            type="Short"
+            cardinality="5" 
+            required="false"
+            min = "-32760"
+            max = "32760"
+            default="10,20,30"
+            description="Short Array metric. Metric range min -32760 max 32760. Short min -32767 max 32767."/>
+  
+        <AD id="metric.string.optional"
+            name="metric.string.optional"
+            type="String"
+            cardinality="1" 
+            required="false"
+            default=""
+            description="Test optional strng metric. Leave EMPTY."/>
+        
+    </OCD>
+    <Designate pid="org.eclipse.kura.example.publisher.ExamplePublisher">
+        <Object ocdref="org.eclipse.kura.example.publisher.ExamplePublisher"/>
+    </Designate>
+</MetaData>
diff --git a/kura/examples/org.eclipse.kura.example.publisher/about.html b/kura/examples/org.eclipse.kura.example.publisher/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.example.publisher/about_files/epl-v10.html b/kura/examples/org.eclipse.kura.example.publisher/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.example.publisher/build.properties b/kura/examples/org.eclipse.kura.example.publisher/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2a478ca86b276b96832ab67ad521908b930481e7
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/build.properties
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.api,\
+                     slf4j.api
+src.includes = about.html,\
+               about_files/
diff --git a/kura/examples/org.eclipse.kura.example.publisher/pom.xml b/kura/examples/org.eclipse.kura.example.publisher/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fd26a7ffaa44df90b64a7f392d2e4cde14a7e3ef
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/pom.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>examples</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.example.publisher</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/../..</kura.basedir>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-eclipse-plugin</artifactId>
+				<version>2.9</version>
+				<configuration>
+					<skip>false</skip>
+				</configuration>
+			</plugin>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.eclipse.tycho
+										</groupId>
+										<artifactId>
+											tycho-compiler-plugin
+										</artifactId>
+										<versionRange>
+											[0.20.0,)
+										</versionRange>
+										<goals>
+											<goal>compile</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.eclipse.tycho
+										</groupId>
+										<artifactId>
+											tycho-packaging-plugin
+										</artifactId>
+										<versionRange>
+											[0.20.0,)
+										</versionRange>
+										<goals>
+											<goal>build-qualifier</goal>
+											<goal>validate-id</goal>
+											<goal>
+												validate-version
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+</project>
diff --git a/kura/examples/org.eclipse.kura.example.publisher/src/main/java/org/eclipse/kura/example/publisher/ExamplePublisher.java b/kura/examples/org.eclipse.kura.example.publisher/src/main/java/org/eclipse/kura/example/publisher/ExamplePublisher.java
new file mode 100644
index 0000000000000000000000000000000000000000..6aa0b9a950308686de94187b1dba4c7dc17c54f7
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/src/main/java/org/eclipse/kura/example/publisher/ExamplePublisher.java
@@ -0,0 +1,307 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.example.publisher;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.message.KuraPayload;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ExamplePublisher implements ConfigurableComponent, CloudClientListener  
+{	
+	private static final Logger s_logger = LoggerFactory.getLogger(ExamplePublisher.class);
+	
+	// Cloud Application identifier
+	private static final String APP_ID = "EXAMPLE_PUBLISHER";
+
+	// Publishing Property Names
+	private static final String   PUBLISH_RATE_PROP_NAME   = "publish.rate";
+	private static final String   PUBLISH_TOPIC_PROP_NAME  = "publish.appTopic";
+	private static final String   PUBLISH_QOS_PROP_NAME    = "publish.qos";
+	private static final String   PUBLISH_RETAIN_PROP_NAME = "publish.retain";
+	private static final String   TEMP_INITIAL_PROP_NAME   = "metric.temperature.initial";
+	private static final String   TEMP_INCREMENT_PROP_NAME = "metric.temperature.increment";
+	private static final String[] METRIC_PROP_NAMES        = { 
+		"metric.string",
+		"metric.string.oneof",
+		"metric.long",
+		"metric.integer",
+		"metric.integer.fixed",
+		"metric.short",
+		"metric.double",
+		"metric.float",
+		"metric.char",
+		"metric.byte",
+		"metric.boolean",
+		"metric.password"
+	};
+
+	
+	private CloudService m_cloudService;
+	private CloudClient m_cloudClient;
+	
+	private ScheduledExecutorService    m_worker;
+	private ScheduledFuture<?>          m_handle;
+	
+	private float               m_temperature;
+	private Map<String, Object> m_properties;
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+	
+	public ExamplePublisher() 
+	{
+		super();
+		m_worker = Executors.newSingleThreadScheduledExecutor();
+	}
+
+	public void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+	}
+
+	public void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+		
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.info("Activating ExamplePublisher...");
+		
+		m_properties = properties;
+		for (String s : properties.keySet()) {
+			s_logger.info("Activate - "+s+": "+properties.get(s));
+		}
+		
+		// get the mqtt client for this application
+		try  {
+			
+			// Acquire a Cloud Application Client for this Application 
+			s_logger.info("Getting CloudApplicationClient for {}...", APP_ID);
+			m_cloudClient = m_cloudService.newCloudClient(APP_ID);
+			m_cloudClient.addCloudClientListener(this);
+			
+			// Don't subscribe because these are handled by the default 
+			// subscriptions and we don't want to get messages twice			
+			doUpdate();
+		}
+		catch (Exception e) {
+			s_logger.error("Error during component activation", e);
+			throw new ComponentException(e);
+		}
+		s_logger.info("Activating ExamplePublisher... Done.");
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.debug("Deactivating ExamplePublisher...");
+
+		// shutting down the worker and cleaning up the properties
+		m_worker.shutdown();
+		
+		// Releasing the CloudApplicationClient
+		s_logger.info("Releasing CloudApplicationClient for {}...", APP_ID);
+		m_cloudClient.release();
+
+		s_logger.debug("Deactivating ExamplePublisher... Done.");
+	}	
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("Updated ExamplePublisher...");
+
+		// store the properties received
+		m_properties = properties;
+		for (String s : properties.keySet()) {
+			s_logger.info("Update - "+s+": "+properties.get(s));
+		}
+		
+		// try to kick off a new job
+		doUpdate();
+		s_logger.info("Updated ExamplePublisher... Done.");
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Cloud Application Callback Methods
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public void onConnectionEstablished() 
+	{
+		s_logger.info("Connection established");
+		
+		try {
+			// Getting the lists of unpublished messages
+			s_logger.info("Number of unpublished messages: {}", m_cloudClient.getUnpublishedMessageIds().size());
+		} catch (KuraException e) {
+			s_logger.error("Cannot get the list of unpublished messages");
+		}
+		
+		try {
+			// Getting the lists of in-flight messages
+			s_logger.info("Number of in-flight messages: {}", m_cloudClient.getInFlightMessageIds().size());
+		} catch (KuraException e) {
+			s_logger.error("Cannot get the list of in-flight messages");
+		}
+		
+		try {
+			// Getting the lists of dropped in-flight messages
+			s_logger.info("Number of dropped in-flight messages: {}", m_cloudClient.getDroppedInFlightMessageIds().size());
+		} catch (KuraException e) {
+			s_logger.error("Cannot get the list of dropped in-flight messages");
+		}
+	}
+
+	@Override
+	public void onConnectionLost() 
+	{
+		s_logger.warn("Connection lost!");
+	}
+
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		s_logger.info("Control message arrived on assetId: {} and semantic topic: {}", deviceId, appTopic);
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		s_logger.info("Message arrived on assetId: {} and semantic topic: {}", deviceId, appTopic);
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		s_logger.info("Published message with ID: {} on application topic: {}", messageId, appTopic);
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		s_logger.info("Confirmed message with ID: {} on application topic: {}", messageId, appTopic);
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Called after a new set of properties has been configured on the service
+	 */
+	private void doUpdate() 
+	{
+		// cancel a current worker handle if one if active
+		if (m_handle != null) {
+			m_handle.cancel(true);
+		}
+		
+		if (!m_properties.containsKey(TEMP_INITIAL_PROP_NAME) ||
+		    !m_properties.containsKey(PUBLISH_RATE_PROP_NAME)) {
+			s_logger.info("Update ExamplePublisher - Ignore as properties do not contain TEMP_INITIAL_PROP_NAME and PUBLISH_RATE_PROP_NAME.");
+			return;
+		}
+		
+		// reset the temperature to the initial value
+		m_temperature = (Float) m_properties.get(TEMP_INITIAL_PROP_NAME);		
+		
+		// schedule a new worker based on the properties of the service
+		int pubrate = (Integer) m_properties.get(PUBLISH_RATE_PROP_NAME);
+		m_handle = m_worker.scheduleAtFixedRate(new Runnable() {		
+			@Override
+			public void run() {
+				doPublish();
+			}
+		}, 0, pubrate, TimeUnit.MILLISECONDS);
+	}
+	
+	
+	/**
+	 * Called at the configured rate to publish the next temperature measurement.
+	 */
+	private void doPublish() 
+	{				
+		// fetch the publishing configuration from the publishing properties
+		String  topic  = (String) m_properties.get(PUBLISH_TOPIC_PROP_NAME);
+		Integer qos    = (Integer) m_properties.get(PUBLISH_QOS_PROP_NAME);
+		Boolean retain = (Boolean) m_properties.get(PUBLISH_RETAIN_PROP_NAME);
+		
+		// Increment the simulated temperature value
+		float tempIncr = (Float) m_properties.get(TEMP_INCREMENT_PROP_NAME);
+		m_temperature += tempIncr;
+				
+		// Allocate a new payload
+		KuraPayload payload = new KuraPayload();
+		
+		// Timestamp the message
+		payload.setTimestamp(new Date());
+		
+		// Add the temperature as a metric to the payload
+		payload.addMetric("temperature", m_temperature);
+
+		// add all the other metrics
+		for (String metric : METRIC_PROP_NAMES) {
+			if ("metric.char".equals(metric)) {			
+				// publish character as a string as the 
+				// "char" type is not support in the EDC Payload
+				payload.addMetric(metric, String.valueOf(m_properties.get(metric)));
+			}
+			else if ("metric.short".equals(metric)) {
+				// publish short as an integer as the 
+				// "short " type is not support in the EDC Payload
+				payload.addMetric(metric, ((Short) (m_properties.get(metric))).intValue());
+			}
+			else if ("metric.byte".equals(metric)) {
+				// publish byte as an integer as the 
+				// "byte" type is not support in the EDC Payload
+				payload.addMetric(metric, ((Byte) (m_properties.get(metric))).intValue());
+			}
+			else {
+				payload.addMetric(metric, m_properties.get(metric));
+			}
+		}
+		
+		// Publish the message
+		try {
+			int messageId = m_cloudClient.publish(topic, payload, qos, retain);
+			s_logger.info("Published to {} message: {} with ID: {}", new Object[] {topic, payload, messageId});
+		} 
+		catch (Exception e) {
+			s_logger.error("Cannot publish topic: "+topic, e);
+		}
+	}
+}
diff --git a/kura/examples/org.eclipse.kura.example.publisher/src/main/resources/org.eclipse.kura.example.publisher.dpp b/kura/examples/org.eclipse.kura.example.publisher/src/main/resources/org.eclipse.kura.example.publisher.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..d0feeac63bf4b52027c1bbbe3e58ce501ef7a0a3
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.publisher/src/main/resources/org.eclipse.kura.example.publisher.dpp
@@ -0,0 +1,20 @@
+#Deployment Plugin Project File
+#Sat Jul 13 17:44:27 CEST 2013
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.example.publisher_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.example.publisher.dp
+build.location=
+bundles.0.bundle_path=<.>/.project
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.example.publisher.jar
+bundles.0.symbolic_name=org.eclipse.kura.example.publisher
+bundles.0.version=1.0.0.SNAPSHOT
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.example.publisher
+headers.version=1.0.0
+resources.count=0
+
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/.gitignore b/kura/examples/org.eclipse.kura.example.serial.publisher/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/META-INF/MANIFEST.MF b/kura/examples/org.eclipse.kura.example.serial.publisher/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..26b4cd967146ed580530b871aad6d260313aaafe
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.example.serial.publisher
+Bundle-SymbolicName: org.eclipse.kura.example.serial.publisher;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.comm; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ javax.comm;version="1.2.0",
+ javax.microedition.io;resolution:=optional,
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.io;version="1.0.0",
+ org.slf4j;version="1.6.4"
+Bundle-ClassPath: .
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/OSGI-INF/example.xml b/kura/examples/org.eclipse.kura.example.serial.publisher/OSGI-INF/example.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f4a19269c338ce8d604ebda84a9df2b378026d69
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/OSGI-INF/example.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+    name="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher"
+    activate="activate" 
+    deactivate="deactivate" 
+    modified="updated" 
+    enabled="true"
+    immediate="true"
+    configuration-policy="require">
+	<implementation class="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher"/>
+
+   <!-- If the component is configurable through the Kura ConfigurationService, it must expose a Service. -->
+   <property name="service.pid" type="String" value="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher"/>
+   <service>
+       <provide interface="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher"/>
+   </service>
+   
+   <reference name="CloudService"
+              policy="static"
+              bind="setCloudService"       
+              unbind="unsetCloudService"       
+              cardinality="1..1" 
+              interface="org.eclipse.kura.cloud.CloudService"/>
+   <reference bind="setConnectionFactory" cardinality="1..1" interface="org.osgi.service.io.ConnectionFactory" name="ConnectionFactory" policy="static" unbind="unsetConnectionFactory"/>
+</scr:component>
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/OSGI-INF/metatype/org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher.xml b/kura/examples/org.eclipse.kura.example.serial.publisher/OSGI-INF/metatype/org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8bfc486ce859c7c37483702d50f3b59dc7710c3a
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/OSGI-INF/metatype/org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher"
+         name="ExampleSerialPublisher" 
+         description="Example of a Configuring Kura Application publishing data read from the serial port.">
+        
+        <Icon resource="http://sphotos-a.xx.fbcdn.net/hphotos-ash4/p480x480/408247_10151040905591065_1989684710_n.jpg" size="32"/>
+        
+        <AD id="publish.semanticTopic"  
+            name="publish.semanticTopic"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="data" 
+            description="Default semantic topic to publish the messages to."/>
+        
+        <AD id="publish.qos"  
+            name="publish.qos"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="0" 
+            description="Default QoS to publish the messages with.">
+           <Option label="Fire and forget" value="0"/>
+           <Option label="Al least once" value="1"/>          
+           <Option label="At most once" value="2"/>
+        </AD>
+
+        <AD id="publish.retain"  
+            name="publish.retain"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Default retaing flag for the published messages."/>
+  
+        <AD id="serial.device"  
+            name="serial.device"
+            type="String"
+            cardinality="0"
+            required="false"
+            description="Name of the serial device (e.g. /dev/ttyS0, /dev/ttyACM0, /dev/ttyUSB0)."/>  
+
+        <AD id="serial.baudrate"  
+            name="serial.baudrate"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="9600"
+            description="Baudrate.">  
+           <Option label="9600" value="9600"/>
+           <Option label="19200" value="19200"/>          
+           <Option label="38400" value="38400"/>
+           <Option label="57600" value="57600"/>
+           <Option label="115200" value="115200"/>         
+        </AD>
+        
+        <AD id="serial.data-bits"  
+            name="serial.data-bits"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="8"
+            description="Data bits.">  
+           <Option label="7" value="7"/>
+           <Option label="8" value="8"/>          
+        </AD>
+        
+        <AD id="serial.parity"  
+            name="serial.parity"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="none"
+            description="Parity.">  
+           <Option label="none" value="none"/>
+           <Option label="even" value="even"/>
+           <Option label="odd" value="odd"/>
+        </AD>
+
+        <AD id="serial.stop-bits"  
+            name="serial.stop-bits"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="1"
+            description="Stop bits.">  
+           <Option label="1" value="1"/>
+           <Option label="2" value="2"/>          
+        </AD>
+        
+        <AD id="serial.echo"
+            name="serial.echo"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Wheter the device echoes received characters."/>
+        
+        <AD id="serial.cloud-echo"
+            name="serial.cloud-echo"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Wheter the Cloud echoes received characters."/>
+                            
+    </OCD>
+    <Designate pid="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher">
+        <Object ocdref="org.eclipse.kura.example.serial.publisher.ExampleSerialPublisher"/>
+    </Designate>
+</MetaData>
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/about.html b/kura/examples/org.eclipse.kura.example.serial.publisher/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/about_files/epl-v10.html b/kura/examples/org.eclipse.kura.example.serial.publisher/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/build.properties b/kura/examples/org.eclipse.kura.example.serial.publisher/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..714fab917024cdb4c64aae83f4f43d235173c03a
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/build.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.equinox.io,\
+                     osgi.cmpn
+src.includes = about.html,\
+               about_files/
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/pom.xml b/kura/examples/org.eclipse.kura.example.serial.publisher/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0a735b3ad0305c9e59cd8e23a4fff254deb2491
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>examples</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.example.serial.publisher</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/../..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+                                <artifactId>maven-eclipse-plugin</artifactId>
+                                <version>2.9</version>
+                                <configuration>
+                                        <skip>false</skip>
+                                </configuration>
+                        </plugin>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/src/main/java/org/eclipse/kura/example/serial/publisher/ExampleSerialPublisher.java b/kura/examples/org.eclipse.kura.example.serial.publisher/src/main/java/org/eclipse/kura/example/serial/publisher/ExampleSerialPublisher.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1b0243c82d40a1e5fa9219c1981310b1323f0b2
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/src/main/java/org/eclipse/kura/example/serial/publisher/ExampleSerialPublisher.java
@@ -0,0 +1,435 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.example.serial.publisher;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.message.KuraPayload;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.osgi.service.io.ConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ExampleSerialPublisher implements ConfigurableComponent, CloudClientListener  
+{	
+	private static final Logger s_logger = LoggerFactory.getLogger(ExampleSerialPublisher.class);
+	
+	// Cloud Application identifier
+	private static final String APP_ID = "EXAMPLE_SERIAL_PUBLISHER";
+
+	// Publishing Property Names
+	private static final String   PUBLISH_TOPIC_PROP_NAME  = "publish.semanticTopic";
+	private static final String   PUBLISH_QOS_PROP_NAME    = "publish.qos";
+	private static final String   PUBLISH_RETAIN_PROP_NAME = "publish.retain";
+	
+	private static final String   SERIAL_DEVICE_PROP_NAME= "serial.device";
+	private static final String   SERIAL_BAUDRATE_PROP_NAME= "serial.baudrate";
+	private static final String   SERIAL_DATA_BITS_PROP_NAME= "serial.data-bits";
+	private static final String   SERIAL_PARITY_PROP_NAME= "serial.parity";
+	private static final String   SERIAL_STOP_BITS_PROP_NAME= "serial.stop-bits";
+	
+	private static final String   SERIAL_ECHO_PROP_NAME= "serial.echo";
+	private static final String   SERIAL_CLOUD_ECHO_PROP_NAME= "serial.cloud-echo";
+	
+	private CloudService m_cloudService;
+	private CloudClient m_cloudClient;
+	
+	private ConnectionFactory m_connectionFactory;
+	
+	private CommConnection m_commConnection;
+	private InputStream m_commIs;
+	private OutputStream m_commOs;
+//	private BufferedReader m_commBr;
+//	private BufferedWriter m_commBw;
+
+	
+	private ScheduledExecutorService m_worker;
+	private Future<?>           m_handle;
+	
+	private Map<String, Object> m_properties;
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+	
+	public ExampleSerialPublisher() 
+	{
+		super();
+		m_worker = Executors.newSingleThreadScheduledExecutor();
+	}
+
+	public void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+	}
+
+	public void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+	public void setConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = connectionFactory;
+	}
+
+	public void unsetConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = null;
+	}
+		
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.info("Activating ExampleSerialPublisher...");
+		
+		m_properties = new HashMap<String, Object>();
+				
+		// get the mqtt client for this application
+		try  {
+			
+			// Acquire a Cloud Application Client for this Application 
+			s_logger.info("Getting CloudApplicationClient for {}...", APP_ID);
+			m_cloudClient = m_cloudService.newCloudClient(APP_ID);
+			m_cloudClient.addCloudClientListener(this);
+			
+			// Don't subscribe because these are handled by the default 
+			// subscriptions and we don't want to get messages twice			
+			doUpdate(properties);
+		}
+		catch (Exception e) {
+			s_logger.error("Error during component activation", e);
+			throw new ComponentException(e);
+		}
+		s_logger.info("Activating ExampleSerialPublisher... Done.");
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("Deactivating ExampleSerialPublisher...");
+
+		m_handle.cancel(true);
+		
+		// shutting down the worker and cleaning up the properties
+		m_worker.shutdownNow();
+		
+		// Releasing the CloudApplicationClient
+		s_logger.info("Releasing CloudApplicationClient for {}...", APP_ID);
+		m_cloudClient.release();
+		
+		closePort();
+
+		s_logger.info("Deactivating ExampleSerialPublisher... Done.");
+	}	
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("Updated ExampleSerialPublisher...");
+		
+		// try to kick off a new job
+		doUpdate(properties);
+		s_logger.info("Updated ExampleSerialPublisher... Done.");
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Cloud Application Callback Methods
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onConnectionLost() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Called after a new set of properties has been configured on the service
+	 */
+	private void doUpdate(Map<String, Object> properties) 
+	{
+		try {
+
+			for (String s : properties.keySet()) {
+				s_logger.info("Update - "+s+": "+properties.get(s));
+			}
+
+			// cancel a current worker handle if one if active
+			if (m_handle != null) {
+				m_handle.cancel(true);
+			}
+
+			String topic = (String) m_properties.get(PUBLISH_TOPIC_PROP_NAME);
+			if (topic != null) {
+				try {
+					m_cloudClient.unsubscribe(topic);
+				} catch (KuraException e) {
+					s_logger.error("Unsubscribe failed", e);
+				}
+			}
+
+			closePort();
+
+			m_properties.clear();
+			m_properties.putAll(properties);
+
+			openPort();
+
+			Boolean cloudEcho = (Boolean) m_properties.get(SERIAL_CLOUD_ECHO_PROP_NAME);
+			if (cloudEcho) {
+				try {
+					m_cloudClient.subscribe(topic, 0);
+				} catch (KuraException e) {
+					s_logger.error("Subscribe failed", e);
+				}
+			}
+
+			m_handle = m_worker.submit(new Runnable() {		
+				@Override
+				public void run() {
+					doSerial();
+				}
+			});
+		} catch (Throwable t) {
+			s_logger.error("Unexpected Throwable", t);
+		}
+	}
+	
+	private void openPort()
+	{
+		String port = (String) m_properties.get(SERIAL_DEVICE_PROP_NAME);
+		
+		if (port == null) {
+			s_logger.info("Port name not configured");
+			return;
+		}
+		
+	    int baudRate = Integer.valueOf((String) m_properties.get(SERIAL_BAUDRATE_PROP_NAME));
+	    int dataBits = Integer.valueOf((String) m_properties.get(SERIAL_DATA_BITS_PROP_NAME)); 
+	    int stopBits = Integer.valueOf((String) m_properties.get(SERIAL_STOP_BITS_PROP_NAME));
+
+	    String sParity = (String) m_properties.get(SERIAL_PARITY_PROP_NAME);
+	    
+	    int parity = CommURI.PARITY_NONE;
+	    if (sParity.equals("none")) {
+	    	parity = CommURI.PARITY_NONE;
+	    } else if (sParity.equals("odd")) {
+	    	parity = CommURI.PARITY_ODD;	
+	    } else if (sParity.equals("even")) {
+	    	parity = CommURI.PARITY_EVEN;
+	    }
+
+		String uri = new CommURI.Builder(port)
+		.withBaudRate(baudRate)
+		.withDataBits(dataBits)
+		.withStopBits(stopBits)
+		.withParity(parity)
+		.withTimeout(1000)
+		.build().toString();
+
+		try {
+			m_commConnection = (CommConnection) m_connectionFactory.createConnection(uri, 1, false);
+			m_commIs = m_commConnection.openInputStream();
+			m_commOs = m_commConnection.openOutputStream();
+			
+//			m_commBr = new BufferedReader(new InputStreamReader(m_commIs));
+//			m_commBw = new BufferedWriter(new OutputStreamWriter(m_commOs));
+			
+			s_logger.info(port+" open");
+		} catch (IOException e) {
+			s_logger.error("Failed to open port", e);
+			cleanupPort();
+		}
+	}
+	
+	private void cleanupPort()
+	{
+//		if (m_commBr != null) {
+//			try {
+//				m_commBr.close();
+//			} catch (IOException e) {
+//				s_logger.error("Cannot close port buffered reader", e);
+//			}
+//			m_commBr = null;
+//		}
+//		if (m_commBw != null) {
+//			try {
+//				m_commBw.close();
+//			} catch (IOException e) {
+//				s_logger.error("Cannot close port buffered writer", e);
+//			}
+//			m_commBw = null;
+//		}
+		if (m_commIs != null) {
+			try {
+				s_logger.info("Closing port input stream...");
+				m_commIs.close();
+				s_logger.info("Closed port input stream");
+			} catch (IOException e) {
+				s_logger.error("Cannot close port input stream", e);
+			}
+			m_commIs = null;
+		}
+		if (m_commOs != null) {
+			try {
+				s_logger.info("Closing port output stream...");
+				m_commOs.close();
+				s_logger.info("Closed port output stream");
+			} catch (IOException e) {
+				s_logger.error("Cannot close port output stream", e);
+			}
+			m_commOs = null;
+		}
+		if (m_commConnection != null) {
+			try {
+				s_logger.info("Closing port...");
+				m_commConnection.close();
+				s_logger.info("Closed port");
+			} catch (IOException e) {
+				s_logger.error("Cannot close port", e);
+			}
+			m_commConnection = null;
+		}
+	}
+	
+	private void closePort()
+	{
+		cleanupPort();
+	}
+		
+	private void doSerial() 
+	{				
+		// fetch the publishing configuration from the publishing properties
+		String  topic  = (String) m_properties.get(PUBLISH_TOPIC_PROP_NAME);
+		Integer qos    = (Integer) m_properties.get(PUBLISH_QOS_PROP_NAME);
+		Boolean retain = (Boolean) m_properties.get(PUBLISH_RETAIN_PROP_NAME);
+		
+		Boolean echo = (Boolean) m_properties.get(SERIAL_ECHO_PROP_NAME);
+		
+		if (m_commIs != null) {
+			
+			try {
+				int c = -1;
+				StringBuilder sb = new StringBuilder();
+				
+				while (m_commIs != null) {
+					
+					if (m_commIs.available() != 0) {
+						c = m_commIs.read();
+					} else {
+						try {
+							Thread.sleep(100);
+							continue;
+						} catch (InterruptedException e) {
+							return;
+						}
+					}
+					
+					if (echo && m_commOs != null) {
+						m_commOs.write((char) c);
+					}
+					
+					// on reception of CR, publish the received sentence
+					if (c==13) {
+						
+						// Allocate a new payload
+						KuraPayload payload = new KuraPayload();
+
+						// Timestamp the message
+						payload.setTimestamp(new Date());
+						
+						payload.addMetric("line", sb.toString());
+
+						// Publish the message
+						try {
+							m_cloudClient.publish(topic, payload, qos, retain);
+							s_logger.info("Published to {} message: {}", topic, payload);
+						} 
+						catch (Exception e) {
+							s_logger.error("Cannot publish topic: "+topic, e);
+						}
+
+						sb = new StringBuilder();
+						
+					} else if (c!=10) {
+						sb.append((char) c);
+					}					
+				}
+			} catch (IOException e) {
+				s_logger.error("Cannot read port", e);
+			} finally {
+				try {
+					m_commIs.close();
+				} catch (IOException e) {
+					s_logger.error("Cannot close buffered reader", e);
+				}
+			}
+		}
+	}
+}
diff --git a/kura/examples/org.eclipse.kura.example.serial.publisher/src/main/resources/org.eclipse.kura.example.serial.publisher.dpp b/kura/examples/org.eclipse.kura.example.serial.publisher/src/main/resources/org.eclipse.kura.example.serial.publisher.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..ca02a35b7a3498488c38adaede50395c3e660cdc
--- /dev/null
+++ b/kura/examples/org.eclipse.kura.example.serial.publisher/src/main/resources/org.eclipse.kura.example.serial.publisher.dpp
@@ -0,0 +1,20 @@
+#Deployment Plugin Project File
+#Thu Jun 27 16:13:01 CEST 2013
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.example.serial.publisher_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.example.serial.publisher.dp
+build.location=
+bundles.0.bundle_path=<.>/.project
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.example.serial.publisher.jar
+bundles.0.symbolic_name=org.eclipse.kura.example.serial.publisher;singleton\:\=true
+bundles.0.version=1.0.0.SNAPSHOT
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.example.serial.publisher
+headers.version=1.0.0
+resources.count=0
+
diff --git a/kura/examples/pom.xml b/kura/examples/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..48bac4296a6de35d92019f1befe570d914f8375d
--- /dev/null
+++ b/kura/examples/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>examples</artifactId>
+	<packaging>pom</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<modules>
+		<module>org.eclipse.kura.demo.heater</module>
+		<module>org.eclipse.kura.demo.modbus</module>
+		<module>org.eclipse.kura.example.project</module>
+		<module>org.eclipse.kura.example.publisher</module>
+		<module>org.eclipse.kura.example.serial.publisher</module>
+	</modules>
+</project>
diff --git a/kura/manifest_pom.xml b/kura/manifest_pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dfbdfe77170b87baa6d03dddc257a5caabeb866a
--- /dev/null
+++ b/kura/manifest_pom.xml
@@ -0,0 +1,337 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (c) 2011, 2014 Eurotech and/or its affiliates All rights reserved. 
+	This program and the accompanying materials are made available under the 
+	terms of the Eclipse Public License v1.0 which accompanies this distribution, 
+	and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: 
+	Eurotech -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.eclipse.kura</groupId>
+	<artifactId>kura</artifactId>
+	<version>0.7.0</version>
+
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>target-definition</module>
+		<module>org.eclipse.kura.api</module>
+		<module>org.eclipse.kura.test</module>
+		<module>org.eclipse.kura.core</module>
+		<module>org.eclipse.kura.core.cloud</module>
+		<module>org.eclipse.kura.core.comm</module>
+		<module>org.eclipse.kura.core.configuration</module>
+		<module>org.eclipse.kura.core.crypto</module>
+		<module>org.eclipse.kura.core.deployment</module>
+		<module>org.eclipse.kura.core.net</module>
+		<module>org.eclipse.kura.core.test</module>
+		<module>org.eclipse.kura.deployment.agent</module>
+		<module>org.eclipse.kura.deployment.customizer</module>
+		<module>org.eclipse.kura.deployment.customizer.upgrade</module>
+		<module>org.eclipse.kura.deployment.update</module>
+		<module>org.eclipse.kura.linux.clock</module>
+		<module>org.eclipse.kura.linux.command</module>
+		<module>org.eclipse.kura.linux.net</module>
+		<module>org.eclipse.kura.linux.net.test</module>
+		<module>org.eclipse.kura.linux.position</module>
+		<module>org.eclipse.kura.linux.usb</module>
+		<module>org.eclipse.kura.linux.watchdog</module>
+		<module>org.eclipse.kura.net.admin</module>
+		<module>org.eclipse.kura.protocol.modbus</module>
+		<module>org.eclipse.kura.protocol.modbus.test</module>
+		<module>org.eclipse.kura.emulator</module>
+		<module>examples</module>
+	</modules>
+
+	<properties>
+		<tycho-version>0.20.0</tycho-version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
+		<kura.basedir>${project.basedir}</kura.basedir>
+		<kura.build.version>${maven.build.timestamp}</kura.build.version>
+	</properties>
+
+	<profiles>
+		<profile>
+			<id>default</id>
+			<activation>
+				<property>
+					<name>!kura.osgi</name>
+				</property>
+			</activation>
+			<repositories>
+				<repository>
+					<id>p2-repo-equinox_3.8.1</id>
+					<layout>p2</layout>
+					<url>file:///${kura.basedir}/target-definition/equinox_3.8.1/repository/</url>
+				</repository>
+			</repositories>
+		</profile>
+		<profile>
+			<id>equinox</id>
+			<activation>
+				<property>
+					<name>kura.osgi</name>
+					<value>equinox</value>
+				</property>
+			</activation>
+			<repositories>
+				<repository>
+					<id>p2-repo-equinox_3.8.1</id>
+					<layout>p2</layout>
+					<url>file:///${kura.basedir}/target-definition/equinox_3.8.1/repository/</url>
+				</repository>
+			</repositories>
+		</profile>
+		<profile>
+			<id>can</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<modules>
+				<module>org.eclipse.kura.protocol.can</module>
+				<module>org.eclipse.kura.protocol.can.test</module>
+			</modules>
+		</profile>
+	</profiles>
+
+	<repositories>
+		<repository>
+			<id>p2-repo-common</id>
+			<layout>p2</layout>
+			<url>file:///${kura.basedir}/target-definition/common/repository/</url>
+		</repository>
+		<repository>
+			<id>kura_addons</id>
+			<name>Kura Addons Maven Repository</name>
+			<url>https://raw.github.com/eurotech/kura_addons/mvn-repo/</url>
+			<snapshots>
+				<enabled>true</enabled>
+				<updatePolicy>always</updatePolicy>
+			</snapshots>
+		</repository>
+	</repositories>
+
+	<build>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-ssh</artifactId>
+				<version>1.0-beta-6</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.7</version>
+				<executions>
+					<execution>
+						<id>store-bundle-version</id>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<propertyfile file="${kura.basedir}/distrib/build.properties" comment="Generated by maven">
+									<entry key="${project.name}.version" value="${project.version}" />
+								</propertyfile>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-eclipse-plugin</artifactId>
+				<version>2.9</version>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-deploy-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>target-platform-configuration</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<!-- <target> <artifact> <groupId>org.eclipse.kura</groupId> <artifactId>target-definition</artifactId> 
+						<version>${project.version}</version> <classifier>kura-equinox_3.8.1</classifier> 
+						</artifact> </target> -->
+					<environments>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86</arch>
+						</environment>
+					</environments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-maven-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<extensions>true</extensions>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-packaging-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<strictVersions>false</strictVersions>
+					<format>${kura.build.version}</format>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-compiler-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<compilerArgument>-warn:[+|-]warning_tokens_separated_by_comma</compilerArgument>
+					<!-- <compilerArgument>-err:-forbidden</compilerArgument> -->
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<providerHint>junit4</providerHint>
+					<parallel>both</parallel>
+					<useUnlimitedThreads>true</useUnlimitedThreads>
+					<argLine>-Deurotech.framework.mode=emulator -Dequinox.ds.print=true</argLine>
+					<dependencies>
+						<dependency>
+							<type>p2-installable-unit</type>
+							<artifactId>org.eclipse.equinox.ds</artifactId>
+						</dependency>
+					</dependencies>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>wagon-maven-plugin</artifactId>
+				<version>1.0-beta-3</version>
+				<executions>
+					<execution>
+						<phase>deploy</phase>
+						<goals>
+							<goal>upload</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<fromDir>target</fromDir>
+					<includes>kura-${project.version}-javadoc.jar,</includes>
+					<url>scp://107.20.195.222</url>
+					<toDir>/home/edcupload/kura_builds/${project.version}/</toDir>
+					<serverId>eurotechcloud-transfer</serverId>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-site-plugin</artifactId>
+				<version>3.3</version>
+			</plugin>
+			<plugin>
+				<!-- license:format to add license:check to check -->
+				<groupId>com.mycila</groupId>
+				<artifactId>license-maven-plugin</artifactId>
+				<version>2.2</version>
+				<configuration>
+					<header>distrib/eclipse_license.txt</header>
+					<properties>
+						<owner>Eurotech and/or its affiliates</owner>
+						<contributor>Eurotech</contributor>
+						<dates>2011, 2014</dates>
+					</properties>
+					<includes>
+						<include>**/*.java</include>
+						<include>**/*.properties</include>
+						<include>**/*.sh</include>
+						<include>**/*.xml</include>
+						<include>**/denali.css</include>
+						<include>**/.conf</include>
+					</includes>
+					<mapping>
+						<conf>SCRIPT_STYLE</conf>
+					</mapping>
+				</configuration>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<version>2.9</version>
+					<configuration>
+						<doctitle>Kura ${project.version}</doctitle>
+						<!-- Default configuration for all reports -->
+						<skip>false</skip>
+						<links>
+							<link>http://javax-usb.sourceforge.net/jdoc/</link>
+							<link>http://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/index.html</link>
+							<link>http://docs.oracle.com/javame/config/cldc/opt-pkgs/api/bluetooth/jsr082/index.html?javax/bluetooth/package-summary.html</link>
+						</links>
+						<!-- Remove packages from the list to have them included in the aggregate 
+							javadocs -->
+						<excludePackageNames>
+							*.ermes:*.demo*:*.example:*.core:*.cloud.app:*.net.admin:*.deployment:*.emulator:*.linux:*.qa:*.web:*.service.io:*.test
+						</excludePackageNames>
+						<!-- Add URLs for open source javadocs below -->
+					</configuration>
+					<executions>
+						<execution>
+							<id>javadoc</id>
+							<goals>
+								<goal>javadoc</goal>
+							</goals>
+							<phase>package</phase>
+							<configuration>
+								<skip>false</skip>
+							</configuration>
+						</execution>
+						<execution>
+							<id>aggregate</id>
+							<goals>
+								<goal>aggregate</goal>
+							</goals>
+							<phase>package</phase>
+							<configuration>
+								<!-- Specific configuration for the aggregate report -->
+								<skip>false</skip>
+								<doctitle>Kura ${project.version}</doctitle>
+							</configuration>
+						</execution>
+					</executions>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+	<!-- Use the below format to specify specific reports to run <reporting> 
+		<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> 
+		<version>2.7</version> <reportSets> <reportSet> <reports> <report>index</report> 
+		<report>dependencies</report> <report>dependency-convergence</report> <report>dependency-info</report> 
+		<report>dependency-management</report> </reports> </reportSet> </reportSets> 
+		</plugin> </plugins> </reporting> -->
+</project>
diff --git a/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..23e8ce69cc3103fed09b5c702c7285dad34c563b
--- /dev/null
+++ b/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.api
+Bundle-SymbolicName: org.eclipse.kura.api;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.kura; version="0.2.0",org.eclipse.kura.blu
+ etooth; version="0.2.0",org.eclipse.kura.clock; version="0.2.0",org.e
+ clipse.kura.cloud; version="0.2.0",org.eclipse.kura.comm; version="0.
+ 2.0",org.eclipse.kura.command; version="0.2.0",org.eclipse.kura.confi
+ guration; version="0.2.0",org.eclipse.kura.configuration.metatype; ve
+ rsion="0.2.0",org.eclipse.kura.crypto; version="0.2.0",org.eclipse.ku
+ ra.data; version="0.2.0",org.eclipse.kura.db; version="0.2.0",org.ecl
+ ipse.kura.linux.udev; version="0.2.0",org.eclipse.kura.message; versi
+ on="0.2.0",org.eclipse.kura.net; version="0.2.0",org.eclipse.kura.net
+ .dhcp; version="0.2.0",org.eclipse.kura.net.dns; version="0.2.0",org.
+ eclipse.kura.net.firewall; version="0.2.0",org.eclipse.kura.net.modem
+ ; version="0.2.0",org.eclipse.kura.net.route; version="0.2.0",org.ecl
+ ipse.kura.net.wifi; version="0.2.0",org.eclipse.kura.position; versio
+ n="0.2.0",org.eclipse.kura.ssl; version="0.2.0",org.eclipse.kura.syst
+ em; version="0.2.0",org.eclipse.kura.usb; version="0.2.0",org.eclipse
+ .kura.watchdog; version="0.2.0"
+Import-Package: javax.comm;version="1.2.0",
+ javax.microedition.io,
+ javax.usb;version="1.0.2",
+ org.osgi.framework;version="[1.5.0,2.0.0)",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.osgi.util.measurement;version="1.0.1",
+ org.osgi.util.position;version="1.0.1",
+ org.slf4j;version="1.6.4"
diff --git a/kura/org.eclipse.kura.api/about.html b/kura/org.eclipse.kura.api/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.api/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/about_files/epl-v10.html b/kura/org.eclipse.kura.api/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/build.properties b/kura/org.eclipse.kura.api/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..381b972fb66098f2a63dc4b7709840f9cd17f263
--- /dev/null
+++ b/kura/org.eclipse.kura.api/build.properties
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/,src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.equinox.io,\
+                     slf4j.api,\
+                     osgi.cmpn,\
+                     javax.usb.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.api/pom.xml b/kura/org.eclipse.kura.api/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7df6185d596cebc00d23f9d1f7c32b96645d53f5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/pom.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.api</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-packaging-plugin</artifactId>
+				<version>${tycho-version}</version>
+                <configuration>
+                        <format>'${kura.build.version}'</format>
+                </configuration>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<id>package-plugin</id>
+						<goals>
+							<goal>package-plugin</goal>
+						</goals>
+						<configuration>
+							<finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.eclipse.tycho
+										</groupId>
+										<artifactId>
+											tycho-compiler-plugin
+										</artifactId>
+										<versionRange>
+											[0.18.1,)
+										</versionRange>
+										<goals>
+											<goal>compile</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.eclipse.tycho
+										</groupId>
+										<artifactId>
+											tycho-packaging-plugin
+										</artifactId>
+										<versionRange>
+											[0.18.1,)
+										</versionRange>
+										<goals>
+											<goal>build-qualifier</goal>
+											<goal>
+												validate-version
+											</goal>
+											<goal>validate-id</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+</project>
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraConnectException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraConnectException.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c7da2a6a6cb27db7b54ab923a865848b25714b7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraConnectException.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+
+/**
+ * KuraConnectException is raised during connect failures. 
+ */
+public class KuraConnectException extends KuraException 
+{
+	private static final long serialVersionUID = 5894832757268538532L;
+
+	public KuraConnectException(Object argument) {
+		super(KuraErrorCode.CONNECTION_FAILED, null, argument);
+	}
+	
+	public KuraConnectException(Throwable cause, Object argument) {
+		super(KuraErrorCode.CONNECTION_FAILED, cause, argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraConnectionStatus.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraConnectionStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..5edc306ac7d56612d5e2c2a111cf63ff0eefbf72
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraConnectionStatus.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+public class KuraConnectionStatus {
+
+	/**
+	 * initial state for any connection
+	 */
+	public static final int NEVERCONNECTED=-1;
+	/**
+	 * attempts have been made to connect to the device, but currently 
+	 * no connection exists
+	 */
+	public static final int DISCONNECTED=0;
+	/**
+	 * attempting to connect to field device, this is a transient state
+	 */
+	public static final int CONNECTING=1;
+	/**
+	 * a connection to the field device currently exists.  A status of
+	 * CONNECTED does not assure that requests from or commands to this
+	 * field device will succeed.
+	 */
+	public static final int CONNECTED=2;
+	/**
+	 * attempting to disconnect from the field device.  Disconnection from
+	 * a field device may be delayed while outstanding commands are either
+	 * completed or terminated.
+	 */
+	public static final int DISCONNECTING=3;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraErrorCode.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraErrorCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..97d67af7136d6111527007fc5f8b11bdc6a30b28
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraErrorCode.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+/**
+ * KuraErrorCode holds the enumeration of valid error codes for the exception message. For each defined enum value, a corresponding message should be defined in the properties bundle named:
+ * KuraExceptionMessagesBundle.properties.
+ * 
+ */
+public enum KuraErrorCode {
+	CONFIGURATION_ERROR,
+	CONFIGURATION_UPDATE,
+	CONFIGURATION_ROLLBACK,
+	CONFIGURATION_ATTRIBUTE_UNDEFINED,
+	CONFIGURATION_ATTRIBUTE_INVALID,
+	CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING,
+	CONFIGURATION_SNAPSHOT_NOT_FOUND,
+	CONFIGURATION_SNAPSHOT_TAKING,
+	CONFIGURATION_SNAPSHOT_LISTING,
+	CONFIGURATION_SNAPSHOT_LOADING,
+	INTERNAL_ERROR,
+	SERIAL_PORT_INVALID_CONFIGURATION,
+	SERIAL_PORT_NOT_EXISTING,
+	PORT_IN_USE,
+	PARTIAL_SUCCESS,
+	SECURITY_EXCEPTION,
+	NOT_CONNECTED,
+	TIMED_OUT,
+	CONNECTION_FAILED,
+	TOO_MANY_INFLIGHT_MESSAGES,
+	STORE_ERROR,
+	ENCODE_ERROR,
+	DECODER_ERROR,
+	INVALID_METRIC_EXCEPTION,
+	INVALID_MESSAGE_EXCEPTION,
+	OPERATION_NOT_SUPPORTED;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraException.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d76bed724d38997937cbd544e4001dbffadcaa7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraException.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The KuraException class is the superclass of all errors and exceptions in the Kura project. It extends the JDK Exception class by requesting its invokers to provide an error code when
+ * building its instances. The code is one value of KuraErrorCode enum; the code is used to document the possible error conditions generated by the platform as well as to identify the localized
+ * exception messages to be reported. Exceptions messages are stored in the KuraExceptionMessagesBundle Properties Bundle and they are keyed on the exception code.
+ */
+public class KuraException extends Exception 
+{
+	private static final long serialVersionUID = 7468633737373095296L;
+
+	private static final Logger s_logger = LoggerFactory.getLogger(KuraException.class);
+	
+	private static final String KURA_GENERIC_MESSAGES_PATTERN = "Generic Error - {0}: {1}";
+	private static final String KURA_EXCEPTION_MESSAGES_BUNDLE = "org.eclipse.kura.core.messages.KuraExceptionMessagesBundle";
+
+	//TODO - add back when logger is working
+	//private static final Logger s_logger = LoggerFactory.getLogger(KuraException.class);
+
+	protected KuraErrorCode m_code;
+	private Object[] m_arguments;
+
+	@SuppressWarnings("unused")
+	private KuraException() {
+		super();
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public KuraException(KuraErrorCode code) {
+		m_code = code;
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public KuraException(KuraErrorCode code, Object... arguments) {
+		m_code = code;
+		m_arguments = arguments;
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode, an optional Throwable cause, and optional arguments for the associated exception message.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public KuraException(KuraErrorCode code, Throwable cause, Object... arguments) {
+		super(cause);
+		m_code = code;
+		m_arguments = arguments;
+	}
+
+	/**
+	 * Factory method to build an EdcException with the EdcErrorCode.INTERNAL_ERROR code providing a cause and a message.
+	 * 
+	 * @param cause
+	 * @param message
+	 * @return
+	 */
+	public static KuraException internalError(Throwable cause, String message) {
+		return new KuraException(KuraErrorCode.INTERNAL_ERROR, cause, message);
+	}
+
+	/**
+	 * Factory method to build an EdcException with the EdcErrorCode.INTERNAL_ERROR code providing a cause and a message.
+	 * 
+	 * @param cause
+	 * @param message
+	 * @return
+	 */
+	public static KuraException internalError(Throwable cause) {
+		return new KuraException(KuraErrorCode.INTERNAL_ERROR, cause, "");
+	}
+
+	/**
+	 * Factory method to build an EdcException with the EdcErrorCode.INTERNAL_ERROR code providing only a message.
+	 * 
+	 * @param cause
+	 * @param message
+	 * @return
+	 */
+	public static KuraException internalError(String message) {
+		return new KuraException(KuraErrorCode.INTERNAL_ERROR, null, message);
+	}
+
+	
+	public KuraErrorCode getCode() {
+		return m_code;
+	}
+
+	
+	public String getMessage() {
+		return getLocalizedMessage(Locale.US);
+	}
+
+	
+	public String getLocalizedMessage() {
+		return getLocalizedMessage(Locale.getDefault());
+	}
+
+	
+	private String getLocalizedMessage(Locale locale) 
+	{
+		String pattern = getMessagePattern(locale, m_code);
+		if (m_code == null || KuraErrorCode.INTERNAL_ERROR.equals(m_code)) {
+			if (m_arguments != null && m_arguments.length > 1) {
+				// append all arguments into a single one			
+				StringBuilder sbAllArgs = new StringBuilder();
+				for (Object arg : m_arguments) {
+					sbAllArgs.append(" - ");
+					sbAllArgs.append(arg);
+				}
+				m_arguments = new Object[] {sbAllArgs.toString()};
+			}
+		}
+		String message = MessageFormat.format(pattern, m_arguments);
+		return message;
+	}
+	
+
+	private String getMessagePattern(Locale locale, KuraErrorCode code) 
+	{
+		//
+		// Load the message pattern from the bundle
+		String messagePattern = null;
+		ResourceBundle resourceBundle = null;
+		try {
+			
+			resourceBundle = ResourceBundle.getBundle(KURA_EXCEPTION_MESSAGES_BUNDLE, locale);
+			if (resourceBundle != null && code != null) {
+				messagePattern = resourceBundle.getString(code.name());
+				if (messagePattern == null) {
+					s_logger.warn("Could not find Exception Messages for Locale {} and code {}", locale, code);
+				}
+			}
+		} catch (MissingResourceException mre) {
+			// log the failure to load a message bundle
+			s_logger.warn("Could not load Exception Messages Bundle for Locale {}", locale);
+		}
+
+		//
+		// If no bundle or code in the bundle is found, use a generic message
+		if (messagePattern == null) {
+			if (code != null) {
+				// build a generic message format
+				messagePattern = MessageFormat.format(KURA_GENERIC_MESSAGES_PATTERN, code.name());
+			}
+			else {
+				// build a generic message format
+				messagePattern = MessageFormat.format(KURA_GENERIC_MESSAGES_PATTERN, "Unknown");			
+			}
+		}
+
+		return messagePattern;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraInvalidMessageException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraInvalidMessageException.java
new file mode 100644
index 0000000000000000000000000000000000000000..c61daa46665b907cd07534fde967d979fcac84aa
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraInvalidMessageException.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+public class KuraInvalidMessageException extends KuraRuntimeException 
+{
+	private static final long serialVersionUID = -3636897647706575102L;
+
+	public KuraInvalidMessageException(Object argument) {
+		super(KuraErrorCode.INVALID_MESSAGE_EXCEPTION, argument);
+	}
+
+	public KuraInvalidMessageException(Throwable cause) {
+		super(KuraErrorCode.INVALID_MESSAGE_EXCEPTION, cause);
+	}
+
+	public KuraInvalidMessageException(Throwable cause, Object argument) {
+		super(KuraErrorCode.INVALID_MESSAGE_EXCEPTION, cause, argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraInvalidMetricTypeException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraInvalidMetricTypeException.java
new file mode 100644
index 0000000000000000000000000000000000000000..64cdf8789daaff7b4b1d48f7ffce98e038b49dbd
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraInvalidMetricTypeException.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+public class KuraInvalidMetricTypeException extends KuraRuntimeException 
+{
+	private static final long serialVersionUID = 3811194468467381264L;
+
+	public KuraInvalidMetricTypeException(Object argument) {
+		super(KuraErrorCode.INVALID_METRIC_EXCEPTION, argument);
+	}
+
+	public KuraInvalidMetricTypeException(Throwable cause, Object argument) {
+		super(KuraErrorCode.INVALID_METRIC_EXCEPTION, cause, argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraNotConnectedException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraNotConnectedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c8e63a6bb5c717899a9fa48e0ce032bb988acef
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraNotConnectedException.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+
+/**
+ * KuraNotConnectedException is raised when the attempted operation requires 
+ * an active connection to the remote server while the current state is
+ * disconnected.  
+ */
+public class KuraNotConnectedException extends KuraException 
+{
+	private static final long serialVersionUID = 5894832757268538532L;
+
+	public KuraNotConnectedException(Object argument) {
+		super(KuraErrorCode.NOT_CONNECTED, null, argument);
+	}
+	
+	public KuraNotConnectedException(Throwable cause, Object argument) {
+		super(KuraErrorCode.NOT_CONNECTED, cause, argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraPartialSuccessException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraPartialSuccessException.java
new file mode 100644
index 0000000000000000000000000000000000000000..064e7ec9d167d13e6246c3aab54c2ea8fb2c058b
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraPartialSuccessException.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+import java.util.List;
+
+/**
+ * KuraPartialSuccessException is used capture the response 
+ * of bulk operations which allow for the failures of some 
+ * of their steps.
+ * KuraPartialSuccessException.getCauses() will return the
+ * exceptions collected during operations for those steps
+ * that failed.
+ */
+public class KuraPartialSuccessException extends KuraException
+{
+	private static final long serialVersionUID = -350563041335590477L;
+
+	private List<Throwable> m_causes;
+	
+	public KuraPartialSuccessException(String message, List<Throwable> causes)
+	{
+		super(KuraErrorCode.PARTIAL_SUCCESS, (Throwable) null, message);
+		m_causes = causes; 
+	}
+	
+	
+	/**
+	 * Returns the list of failures collected during the execution of the bulk operation.
+	 * @return causes
+	 */
+	public List<Throwable> getCauses()
+	{
+		return m_causes;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraRuntimeException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraRuntimeException.java
new file mode 100644
index 0000000000000000000000000000000000000000..84ea6e8b4f67ab2916cf6fcd8cbe8f98eaea8f04
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraRuntimeException.java
@@ -0,0 +1,147 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KuraRuntimeException extends RuntimeException
+{
+	private static final long serialVersionUID = -7202805328805688329L;
+
+	private static final Logger s_logger = LoggerFactory.getLogger(KuraRuntimeException.class);
+	
+	private static final String KURA_GENERIC_MESSAGES_PATTERN = "Generic Error - {0}: {1}";
+	private static final String KURA_EXCEPTION_MESSAGES_BUNDLE = "org.eclipse.kura.core.messages.KuraExceptionMessagesBundle";
+
+	//TODO - add back when logger is working
+	//private static final Logger s_logger = LoggerFactory.getLogger(KuraException.class);
+
+	protected KuraErrorCode m_code;
+	private Object[] m_arguments;
+
+	@SuppressWarnings("unused")
+	private KuraRuntimeException() {
+		super();
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public KuraRuntimeException(KuraErrorCode code) {
+		m_code = code;
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public KuraRuntimeException(KuraErrorCode code, Object... arguments) {
+		m_code = code;
+		m_arguments = arguments;
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode, an optional Throwable cause, and optional arguments for the associated exception message.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public KuraRuntimeException(KuraErrorCode code, Throwable cause, Object... arguments) {
+		super(cause);
+		m_code = code;
+		m_arguments = arguments;
+	}
+
+	public KuraErrorCode getCode() {
+		return m_code;
+	}
+
+	public String getMessage() {
+		return getLocalizedMessage(Locale.US);
+	}
+
+	
+	public String getLocalizedMessage() {
+		return getLocalizedMessage(Locale.getDefault());
+	}
+
+	
+	private String getLocalizedMessage(Locale locale) 
+	{
+		String pattern = getMessagePattern(locale, m_code);
+		if (m_code == null || KuraErrorCode.INTERNAL_ERROR.equals(m_code)) {
+			if (m_arguments != null && m_arguments.length > 1) {
+				// append all arguments into a single one			
+				StringBuilder sbAllArgs = new StringBuilder();
+				for (Object arg : m_arguments) {
+					sbAllArgs.append(" - ");
+					sbAllArgs.append(arg);
+				}
+				m_arguments = new Object[] {sbAllArgs.toString()};
+			}
+		}
+		String message = MessageFormat.format(pattern, m_arguments);
+		return message;
+	}
+	
+
+	private String getMessagePattern(Locale locale, KuraErrorCode code) 
+	{
+		//
+		// Load the message pattern from the bundle
+		String messagePattern = null;
+		ResourceBundle resourceBundle = null;
+		try {
+			
+			resourceBundle = ResourceBundle.getBundle(KURA_EXCEPTION_MESSAGES_BUNDLE, locale);
+			if (resourceBundle != null && code != null) {
+				messagePattern = resourceBundle.getString(code.name());
+				if (messagePattern == null) {
+					s_logger.warn("Could not find Exception Messages for Locale {} and code {}", locale, code);
+				}
+			}
+		} catch (MissingResourceException mre) {
+			// log the failure to load a message bundle
+			s_logger.warn("Could not load Exception Messages Bundle for Locale {}", locale);
+		}
+
+		//
+		// If no bundle or code in the bundle is found, use a generic message
+		if (messagePattern == null) {
+			if (code != null) {
+				// build a generic message format
+				messagePattern = MessageFormat.format(KURA_GENERIC_MESSAGES_PATTERN, code.name());
+			}
+			else {
+				// build a generic message format
+				messagePattern = MessageFormat.format(KURA_GENERIC_MESSAGES_PATTERN, "Unknown");			
+			}
+		}
+
+		return messagePattern;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraStoreCapacityReachedException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraStoreCapacityReachedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7e81539144e8946918b6945b23f0d0bbc86bd71
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraStoreCapacityReachedException.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+
+/**
+ * KuraStoreCapacityReachedException is raised when a message can not be appended
+ * to the publishing queue as the internal database buffer has reached its 
+ * capacity for messages that are not yet published or they are still in transit.
+ */
+public class KuraStoreCapacityReachedException extends KuraStoreException 
+{
+	private static final long serialVersionUID = 2622483579047285733L;
+
+	public KuraStoreCapacityReachedException(Object argument) {
+		super(argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraStoreException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraStoreException.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e8f04c90a7ddb86915aaa78d2c2f5dea39d19d7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraStoreException.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+
+/**
+ * KuraStoreException is raised when a failure occurred during a persistence operation.
+ */
+public class KuraStoreException extends KuraException 
+{
+	private static final long serialVersionUID = -3405089623687223551L;
+	
+	public KuraStoreException(Object argument) {
+		super(KuraErrorCode.STORE_ERROR, null, argument);
+	}
+	
+	public KuraStoreException(Throwable cause, Object argument) {
+		super(KuraErrorCode.STORE_ERROR, cause, argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraTimeoutException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraTimeoutException.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2b12ecddc6253afa23fa3c937efba3a7cffc797
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraTimeoutException.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+
+/**
+ * KuraTimeoutException is raised when the attempted operation failed to respond before the timeout exprises.
+ */
+public class KuraTimeoutException extends KuraException 
+{
+	private static final long serialVersionUID = -3042470573773974746L;
+
+	public KuraTimeoutException(String message) {
+		super(KuraErrorCode.TIMED_OUT, null, message);
+	}
+	
+	public KuraTimeoutException(String message, Throwable cause) {
+		super(KuraErrorCode.TIMED_OUT, cause, message);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraTooManyInflightMessagesException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraTooManyInflightMessagesException.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e11e317d3199094fb2c811f22826fbfb4e1352a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/KuraTooManyInflightMessagesException.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura;
+
+
+/**
+ * KuraTooManyInflightMessagesException is raised if a publish is attempted when there are already too many messages queued for publishing.
+ */
+public class KuraTooManyInflightMessagesException extends KuraException 
+{
+	private static final long serialVersionUID = 8759879149959567323L;
+
+	public KuraTooManyInflightMessagesException(Object argument) {
+		super(KuraErrorCode.TOO_MANY_INFLIGHT_MESSAGES, null, argument);
+	}
+	
+	public KuraTooManyInflightMessagesException(Throwable cause, Object argument) {
+		super(KuraErrorCode.TOO_MANY_INFLIGHT_MESSAGES, cause, argument);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/bluetooth/BluetoothConnectorService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/bluetooth/BluetoothConnectorService.java
new file mode 100644
index 0000000000000000000000000000000000000000..77a4f1d936504ef470f58754f2684c100433a336
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/bluetooth/BluetoothConnectorService.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.bluetooth;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.microedition.io.Connection;
+
+import org.osgi.service.io.ConnectorService;
+
+
+public interface BluetoothConnectorService extends ConnectorService
+{
+	/**
+	 * Access mode READ
+	 */
+	public static final int READ = 1;
+
+	/**
+	 * Access mode WRITE
+	 */
+	public static final int WRITE = 2;
+
+	/**
+	 * Access mode READ_WRITE
+	 */
+	public static final int READ_WRITE = 3;
+	
+
+	/**
+	 * Create and open a Connection.
+	 * 
+	 * @param name			The URL for the connection.
+	 * 
+	 * @return				A new Connection object.
+	 * 				
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the requested connection cannot be made,
+	 * or the protocol type does not exist.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If a requested protocol handler is not permitted.
+	 */
+	public Connection open(String name) throws IOException;
+	
+
+	/**
+	 * Create and open a Connection.
+	 * 
+	 * @param name			The URL for the connection.
+	 * @param mode			The access mode.
+	 * 
+	 * @return				A new Connection object.
+	 * 				
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the requested connection cannot be made,
+	 * or the protocol type does not exist.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If a requested protocol handler is not permitted.
+	 */
+	public Connection open(String name, int mode) throws IOException;
+	
+
+	/**
+	 * Create and open a Connection.
+	 * 
+	 * @param name			The URL for the connection.
+	 * @param mode			The access mode.
+	 * @param timeouts		A flag to indicate that the caller wants timeout exceptions
+	 * 
+	 * @return				A new Connection object.
+	 * 				
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the requested connection cannot be made,
+	 * or the protocol type does not exist.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If a requested protocol handler is not permitted.
+	 */
+	public Connection open(String name, int mode, boolean timeouts) throws IOException;
+	
+
+	/**
+	 * Create and open a connection input stream.
+	 * 
+	 * @param name			The URL for the connection.
+	 * @return				A DataInputStream.
+	 * 
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the connection cannot be found.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If access to the requested stream is not permitted.
+	 */
+	public DataInputStream openDataInputStream(String name) throws IOException;
+
+	
+	/**
+	 * Create and open a connection output stream.
+	 * 
+	 * @param name			The URL for the connection.
+	 * @return				A DataOutputStream.
+	 * 
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the connection cannot be found.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If access to the requested stream is not permitted.
+	 */
+	public DataOutputStream openDataOutputStream(String name) throws IOException;
+
+	
+	/**
+	 * Create and open a connection input stream.
+	 * 
+	 * @param name			The URL for the connection.
+	 * @return				An InputStream
+	 * 
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the connection cannot be found.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If access to the requested stream is not permitted.
+	 */
+	public InputStream openInputStream(String name) throws IOException;
+
+	
+	/**
+	 * Create and open a connection output stream.
+	 * 
+	 * @param name			The URL for the connection.
+	 * @return				An OutputStream
+	 * 
+	 * @throws IllegalArgumentException		If a parameter is invalid.
+	 * @throws ConnectionNotFoundException	If the connection cannot be found.
+	 * @throws java.io.IOException			If some other kind of I/O error occurs.
+	 * @throws SecurityException			If access to the requested stream is not permitted.
+	 */
+	public OutputStream openOutputStream(String name) throws IOException;
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/bluetooth/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/bluetooth/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..0273a2c276157e1aed22f240ee66c137c304a899
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/bluetooth/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Contains interface to open and manage a bluetooth connection.
+ *
+ */
+package org.eclipse.kura.bluetooth;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/ClockEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/ClockEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6953089877b13fd661c39700fba13646d1926ae
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/ClockEvent.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.clock;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * ClockEvent is raised when a clock synchronization has been performed. 
+ */
+public class ClockEvent extends Event
+{
+	/** Topic of the ClockEvent */
+	public static final String CLOCK_EVENT_TOPIC = "org/ecliplse/kura/clock";
+	
+	public ClockEvent(Map<String, ?> properties) {
+		super(CLOCK_EVENT_TOPIC, properties);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/ClockService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/ClockService.java
new file mode 100644
index 0000000000000000000000000000000000000000..e672aa54c473799a0deef7ed182702e3ab022d49
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/ClockService.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.clock;
+
+import java.util.Date;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * The ClockService is used to configure how to sych the hardware clock with a remote network service.
+ * The service reports when the clock has been synchronized last and raises an event when it is synchronized. 
+ * The ClockService is configurable to determine how the clock synchronization should happen.
+ * By default, the ClockService can be configured to set the time through a Java NTP Client.
+ * It can also be extended to synchronize the clock through a native Linux NTPD service, 
+ * using the clock acquired from a GPS signal provided by the Position Service, or
+ * through the a cellular carrier. 
+ */
+public interface ClockService 
+{
+	/**
+	 * Returns a Date denoting when the clock was synchronized last. If the clock has
+	 * not yet synchronized since Kura started, null is returned.
+	 * 
+	 * @return Date that the clock was last synchronized, null if not synchronized yet.
+	 */
+	public Date getLastSync() throws KuraException;
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..c548879f1ef2e2cd61f8f70f5489e1117c095236
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/clock/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Contains interface and event model to synchronize hardware clock.
+ *
+ */
+package org.eclipse.kura.clock;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudCallService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudCallService.java
new file mode 100644
index 0000000000000000000000000000000000000000..8b0d4b29181eca971a34ae6dc97d3cdec5610dec
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudCallService.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.KuraTimeoutException;
+import org.eclipse.kura.data.DataTransportService;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+
+/**
+ * The CloudCallService provides helper methods to make a request/response conversation with the remote server.
+ * The call methods deal with the logic required to build request messages and track the corresponding responses.
+ * All call methods are synchronous; after a request is issued, the implementation will wait for the response 
+ * to arrive or a timeout occurs. The timeout interval used by the service is configurable as a property
+ * of the {@link DataTransportService}.
+ */
+public interface CloudCallService 
+{	
+	/**
+	 * Sends a local (to this device) request to a Cloudlet application 
+	 * with the given application ID waiting for the response.
+	 * 
+	 * @param appId
+	 * @param appTopic
+	 * @param appPayload the application specific payload of an KuraRequestPayload.
+	 * @param timeout
+	 * @return
+	 * @throws KuraConnectException
+	 * @throws KuraTimeoutException
+	 * @throws KuraStoreException
+	 * @throws KuraException
+	 */
+	public KuraResponsePayload call(String appId,
+			  					   String appTopic,
+			  					   KuraPayload appPayload,
+			  					   int timeout) 
+		throws KuraConnectException, KuraTimeoutException, KuraStoreException, KuraException;
+	
+
+	/**
+	 * Sends a request to a remote server or device identified by the specified deviceId
+	 * and targeting the given application ID waiting for the response.
+	 * 
+	 * @param deviceId
+	 * @param appId
+	 * @param appTopic
+	 * @param appPayload
+	 * @param timeout
+	 * @return
+	 * @throws KuraConnectException
+	 * @throws KuraTimeoutException
+	 * @throws KuraStoreException
+	 * @throws KuraException
+	 */
+	public KuraResponsePayload call(String deviceId,
+								   String appId,
+	 							   String appTopic,
+	 							   KuraPayload appPayload,
+	 							   int timeout) 
+	 	throws KuraConnectException, KuraTimeoutException, KuraStoreException, KuraException;
+	
+	
+	/**
+	 * Returns true if the underlying {@link DataService} is currently connected to the remote server.
+	 * @return
+	 */
+	public boolean isConnected();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudClient.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d0ec62b2d47310e454dc1b12064f8c9d9e66587
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudClient.java
@@ -0,0 +1,388 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.message.KuraPayload;
+
+/**
+ * The CloudClient is designed to be used by single application bundles.
+ * CloudClient instances are acquired from the CloudService and they
+ * are released when the work is completed. Generally, a CloudClient
+ * is acquired during the activation phase of a bundle and it is released
+ * during the deactivation phase.
+ * <br>
+ * CloudClient leverages the {@link org.eclipse.kura.data.DataService} 
+ * for all interactions with the transport layer and the communication
+ * with the remote server. CloudClient establishes a set of default 
+ * subscriptions that allow remote servers or other devices to direct messages 
+ * to the application instance. 
+ * <br>
+ * If the bundle using the CloudClient relies on custom subscriptions
+ * beyond the default ones, it is responsibility of the application to implement 
+ * the {@link CloudClientListener#connectionRestored} callback method in the 
+ * CloudCallbackHandler to restore the subscriptions it needs. 
+ * <br>
+ * The <b>CloudClient.release method will unsubscribe</b> all subscriptions
+ * incurred by this client and it will unregister this CloudClient 
+ * instance from the list of CloudCallbackHandlers registered.
+ * <br>
+ * There can be more than one instance of CloudClient in the system,
+ * ideally one per ApplicationId but this is not enforced.
+ * The class accepts more than one callback handler; all registered handlers are invoked 
+ * when a message is received. It is up to the received to analyze the topic
+ * of the message received and handle it appropriately.
+ * <br>
+ * The CloudClient publishes and receives messages using a topic namespace 
+ * following a structure as: [CRTL_PREFIX/]accountName/deviceId/appId/appTopic.<br>
+ * <ul>
+ * <li>CRTL_PREFIX: is an optional prefix to denote topic used for control messages
+ * as opposed to data messages. The framework makes use of control topics to
+ * separate management messages like replies from those used for application data. 
+ * <li>accountName: an unique identifier that represents a group of devices and users
+ * <li>deviceId: an unique identifier within an account that represents a single gateway device.
+ * By default, the MAC address of its primary network interface is generally used as the deviceId of the gateway. 
+ * In the case of an MQTT transport, for example, deviceId maps to the Client Identifier (Client ID).
+ * <li>appId: an identifier to denote an application running on the gateway device. 
+ * We suggest to version the application identifier in order to allow multiple versions of the application 
+ * to coexist, e.g. CONF-V1, CONF-V2, etc.
+ * <li>appTopic topic defined and managed by the application.
+ * </ul>
+ * accountName, deviceId, and applicationId are derived based on the configuration parameters 
+ * of the system where this instance is deployed while the applicationTopic is controlled 
+ * by the application. The following is an example of topic used for publishing where the prefix 
+ * used for the control Topics is $EDC.
+ * <ul>
+ * <li>publish: accountName/deviceId/applicationId/appTopic
+ * <li>controlPublish: $EDC/accountName/assetId/applicationId/appTopic
+ * <li>subscribe: accountName/deviceId/applicationId/appTopic
+ * <li>controlSubscribe: $EDC/accountName/deviceId/applicationId/appTopic
+ * <li>default subscriptions: $EDC/accountName/deviceId/applicationId/#
+ * </ul>
+ * Note that the default subscription of a CloudClient allows remote servers
+ * or applications running on other devices to publish messages addressed
+ * to specific applications running on specific devices. 
+ */
+public interface CloudClient
+{
+	/**
+	 * Returns the applicationId of this CloudClient 
+	 * @return applicationId
+	 */
+	public String getApplicationId();
+	
+	/**
+	 * Releases this CloudClient handle.  This instance should no longer be used.
+	 * Note: CloudClient does not unsubscribes all subscriptions incurred by this client,
+	 * this responsibility is left to the application developer
+	 */
+	public void release();
+
+	
+	/**
+	 * Returns an indication of whether the connection to the remote server is established.
+	 * If your application needs to manage the connection directly, it can use the 
+	 * {@link DataService#connect} and {@link DataService#disconnect} methods.
+	 * 
+	 * @return boolean, whether connection to broker is established.
+	 */
+	public boolean isConnected();
+	
+	/**
+	 * Publishes a message to the remote server using the default priority 5.
+	 * Before passing the message the to {@link org.eclipse.kura.data.DataService}, 
+	 * the CloudClient will manipulate the provided topic by appending the necessary parts
+	 * to achieve topic partitioning and device identification. It is also responsible to
+	 * encode the {@link KuraPayload} payload into binary format.
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit.
+	 * 
+	 * @param appTopic  A String specifying the application portion of the topic the message is published on.
+	 * @param payload	An KuraPayload representing the message to be published
+	 * @param qos		An integer specifying the quality of service the message was published on.
+	 * @param retain	Whether or not the broker should retain the message
+	 * @return			The published message's ID.
+	 */
+	public int publish(String appTopic, KuraPayload payload, int qos, boolean retain) throws KuraException;
+
+	/**
+	 * Publishes a message to the remote server.
+	 * Before passing the message the to {@link org.eclipse.kura.data.DataService}, 
+	 * the CloudClient will manipulate the provided topic by appending the necessary parts
+	 * to achieve topic partitioning and device identification. It is also responsible to
+	 * encode the {@link KuraPayload} payload into binary format.
+	 * <br>
+	 * The priority argument can be used to control the relative ordering of this
+	 * message with other messages that may be currently queued for publishing.
+	 * Priority level 0 (highest) should be used sparingly and reserved for
+	 * messages that should be sent with the minimum latency. Life-cycle messages
+	 * (e.g. device start and stop) are an example of messages that are
+	 * published by the framework with priority 0.
+	 * Priority 1 messages are used by the framework to publish response messages
+	 * in request/response conversations to prevent a timeout at the requester.
+	 * Application should consider using priority 5 or higher.
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit. The limit does not apply to internal messages with the priority less than 2. 
+	 * These priority levels are reserved to the framework which uses it for life-cycle messages 
+	 * - birth and death certificates - and replies to request/response flows.
+	 * 
+	 * @param appTopic  A String specifying the application portion of the topic the message is published on.
+	 * @param payload	An KuraPayload representing the message to be published
+	 * @param qos		An integer specifying the quality of service the message was published on.
+	 * @param retain	Whether or not the broker should retain the message
+	 * @param priority  Relative ordering of this message with other messages that may be currently queued for publishing.
+	 * @return			The published message's ID.
+	 */
+	public int publish(String appTopic, KuraPayload payload, int qos, boolean retain, int priority) throws KuraException;
+
+
+	/**
+	 * Publishes a message to the remote server with a raw byte array payload.
+	 * This is the lowest level publish API exposed by the CloudClient.
+	 * Before passing the message the to {@link org.eclipse.kura.data.DataService}, 
+	 * the CloudClient will manipulate the provided topic by appending the necessary parts
+	 * to achieve topic partitioning and device identification.
+	 * <br>
+	 * The priority argument can be used to control the relative ordering of this
+	 * message with other messages that may be currently queued for publishing.
+	 * Priority level 0 (highest) should be used sparingly and reserved for
+	 * messages that should be sent with the minimum latency. Life-cycle messages
+	 * (e.g. device start and stop) are an example of messages that are
+	 * published by the framework with priority 0.
+	 * Priority 1 messages are used by the framework to publish response messages
+	 * in request/response conversations to prevent a timeout at the requester.
+	 * Application should consider using priority 5 or higher.
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit. The limit does not apply to internal messages with the priority less than 2. 
+	 * These priority levels are reserved to the framework which uses it for life-cycle messages 
+	 * - birth and death certificates - and replies to request/response flows.
+	 * 
+	 * @param appTopic  A String specifying the application portion of the topic the message is published on.
+	 * @param payload	Binary payload representing the message to be published
+	 * @param qos		An integer specifying the quality of service the message was published on.
+	 * @param retain	Whether or not the broker should retain the message
+	 * @param priority  Relative ordering of this message with other messages that may be currently queued for publishing.
+	 * @return			The published message's ID.
+	 */
+	public int publish(String appTopic, byte[] payload, int qos, boolean retain, int priority) throws KuraException;
+
+	/**
+	 * Publishes a control message to the remote server. Control messages are qualified with an 
+	 * additional prefix appended at the beginning of the target topic. The
+	 * prefix is configured as a property of the {@link CloudService} and it appended 
+	 * automatically by this controlPublish method. Just as {@link #publish}, the 
+	 * controlPublish method will manipulate the provided topic by appending the necessary parts
+	 * to achieve topic partitioning including device identification and encode 
+	 * the {@link KuraPayload} payload into binary format.
+	 * <br>
+	 * The priority argument can be used to control the relative ordering of this
+	 * message with other messages that may be currently queued for publishing.
+	 * Priority level 0 (highest) should be used sparingly and reserved for
+	 * messages that should be sent with the minimum latency. Life-cycle messages
+	 * (e.g. device start and stop) are an example of messages that are
+	 * published by the framework with priority 0.
+	 * Priority 1 messages are used by the framework to publish response messages
+	 * in request/response conversations to prevent a timeout at the requester.
+	 * Application should consider using priority 5 or higher.
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit. The limit does not apply to internal messages with the priority less than 2. 
+	 * These priority levels are reserved to the framework which uses it for life-cycle messages 
+	 * - birth and death certificates - and replies to request/response flows.
+	 * 
+	 * @param appTopic  A String specifying the application topic the message is published on.
+	 * @param payload   An KuraPayload representing the message to be published
+	 * @param qos		An integer specifying the quality of service the message was published on.
+	 * @param retain	Whether or not the broker should retain the message
+	 * @param priority  Relative ordering of this message with other messages that may be currently queued for publishing.
+	 * @return			The published message's ID.
+	 */
+	public int controlPublish(String appTopic, KuraPayload payload, int qos, boolean retain, int priority) throws KuraException;
+	
+	/**
+	 * Publishes a control message to the remote server addressing it to another device. 
+	 * Control messages are qualified with an additional prefix appended at the beginning of the target topic. 
+	 * The prefix is configured as a property of the {@link CloudService} and it appended 
+	 * automatically by this controlPublish method. Just as {@link #publish}, the 
+	 * controlPublish method will manipulate the provided topic by appending the necessary parts
+	 * to achieve topic partitioning including device identification and encode 
+	 * the {@link KuraPayload} payload into binary format.
+	 * <br>
+	 * The priority argument can be used to control the relative ordering of this
+	 * message with other messages that may be currently queued for publishing.
+	 * Priority level 0 (highest) should be used sparingly and reserved for
+	 * messages that should be sent with the minimum latency. Life-cycle messages
+	 * (e.g. device start and stop) are an example of messages that are
+	 * published by the framework with priority 0.
+	 * Priority 1 messages are used by the framework to publish response messages
+	 * in request/response conversations to prevent a timeout at the requester.
+	 * Application should consider using priority 5 or higher.
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit. The limit does not apply to internal messages with the priority less than 2. 
+	 * These priority levels are reserved to the framework which uses it for life-cycle messages 
+	 * - birth and death certificates - and replies to request/response flows.
+	 *  
+	 * @param deviceId  A String specifying the asset ID.
+	 * @param appTopic	A String specifying the application topic the message is published on.
+	 * @param payload	An KuraPayload representing the message to be published
+	 * @param qos		An integer specifying the quality of service the message was published on.
+	 * @param retain	Whether or not the broker should retain the message
+	 * @param priority  Relative ordering of this message with other messages that may be currently queued for publishing.
+	 * @return			The published message's ID.
+	 */
+	public int controlPublish(String deviceId, String appTopic, KuraPayload payload, int qos, boolean retain, int priority) throws KuraException;
+	
+	/**
+	 * Publishes a control message to the remote server addressing it to another device
+	 *  with a raw byte array payload.
+	 * Control messages are qualified with an additional prefix appended at the beginning of the target topic. 
+	 * The prefix is configured as a property of the {@link CloudService} and it appended 
+	 * automatically by this controlPublish method. Just as {@link #publish}, the 
+	 * controlPublish method will manipulate the provided topic by appending the necessary parts
+	 * to achieve topic partitioning including device identification.
+	 * <br>
+	 * The priority argument can be used to control the relative ordering of this
+	 * message with other messages that may be currently queued for publishing.
+	 * Priority level 0 (highest) should be used sparingly and reserved for
+	 * messages that should be sent with the minimum latency. Life-cycle messages
+	 * (e.g. device start and stop) are an example of messages that are
+	 * published by the framework with priority 0.
+	 * Priority 1 messages are used by the framework to publish response messages
+	 * in request/response conversations to prevent a timeout at the requester.
+	 * Application should consider using priority 5 or higher.
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit. The limit does not apply to internal messages with the priority less than 2. 
+	 * These priority levels are reserved to the framework which uses it for life-cycle messages 
+	 * - birth and death certificates - and replies to request/response flows.
+	 *  
+	 * @param deviceId  A String specifying the asset ID.
+	 * @param appTopic	A String specifying the application topic the message is published on.
+	 * @param payload	Binary payload representing the message to be published
+	 * @param qos		An integer specifying the quality of service the message was published on.
+	 * @param retain	Whether or not the broker should retain the message
+	 * @param priority  Relative ordering of this message with other messages that may be currently queued for publishing.
+	 * @return			The published message's ID.
+	 */
+	public int controlPublish(String deviceId, String appTopic, byte[] payload, int qos, boolean retain, int priority) throws KuraException;
+
+	/**
+     * Subscribes to a topic with the remote server. The topic is specified as a String 
+     * object and the QoS is specified as an integer. The CloudClient will manipulate the 
+     * provided topic by appending the necessary parts to achieve topic partitioning and 
+     * device identification.<br>
+     * This is a synchronous call. If the subscribe fails, an exception will be thrown 
+     * that will contain information about the cause of the failure.
+	 * 
+     * @param appTopic A String object containing the application topic.
+     * @param qos   An int containing the Quality of Service.
+	 */
+    public void subscribe(String appTopic, int qos) throws KuraException;
+		
+    /**
+     * Subscribes to a control topic with the remote server. The topic is specified as a String 
+     * object and the QoS is specified as an integer. The CloudClient will manipulate the 
+     * provided topic by appending the necessary parts to achieve topic partitioning and 
+     * including control prefix and device identification.<br>
+     * This is a synchronous call. If the subscribe fails, an exception will be thrown 
+     * that will contain information about the cause of the failure.
+	 * 
+	 * @param appTopic  A String object containing the application topic.
+	 * @param qos		An int containing the Quality of Service.
+	 */
+	public void controlSubscribe(String appTopic, int qos) throws KuraException;
+
+	/**
+     * Unubscribes to a topic with the remote server. The topic is specified as a String 
+     * object and the QoS is specified as an integer. The CloudClient will manipulate the 
+     * provided topic by appending the necessary parts to achieve topic partitioning and 
+     * device identification.<br>
+     * This is a synchronous call. If the unsubscribe fails, an exception will be thrown 
+     * that will contain information about the cause of the failure.
+	 * 
+	 * @param appTopic		A String object containing the application topic.
+	 */
+	public void unsubscribe(String appTopic) throws KuraException;
+		
+    /**
+     * Unsubscribes to a control topic with the remote server. The topic is specified as a String 
+     * object and the QoS is specified as an integer. The CloudClient will manipulate the 
+     * provided topic by appending the necessary parts to achieve topic partitioning and 
+     * including control prefix and device identification.<br>
+     * This is a synchronous call. If the unsubscribe fails, an exception will be thrown 
+     * that will contain information about the cause of the failure.
+	 * 
+	 * @param appTopic	A String object containing the application topic.
+	 */
+	public void controlUnsubscribe(String appTopic) throws KuraException;
+
+	/**
+	 * Adds a CloudCallbackHandler with this CloudClient. This handler 
+	 * will receive events when a client publication has arrived, and 
+	 * when a publish has been fully acknowledged by the remote server.
+	 * 
+	 * @param cloudCallbackHandler An implementation of the CloudCallbackHandler interface.
+	 */
+	public void addCloudClientListener(CloudClientListener cloudClientListener);
+
+	/**
+	 * Removes a CloudCallbackHandler from this CloudClient.
+	 * The provided CloudCallbackHandler will no longer receive the events
+	 * when a published message is received. 
+	 */
+	public void removeCloudClientListener(CloudClientListener cloudClientListener);
+	
+	/**
+	 * Gets the list of identifiers of messages that have not been published yet.
+	 * 
+	 * @return
+	 * @throws KuraException
+	 */
+	List<Integer> getUnpublishedMessageIds() throws KuraException;
+
+	/**
+	 * Finds the list of identifiers of messages that are still in-flight 
+	 * (messages published but not confirmed yet).
+	 * This only applies to messages published with QoS > 0.
+	 * 
+	 * @return
+	 * @throws KuraException
+	 */
+	List<Integer> getInFlightMessageIds() throws KuraException;
+
+	/**
+	 * Finds the list of identifiers of in-flight messages that have been dropped.
+	 * This only applies to messages published with QoS > 0.
+	 * On the establishment of a new connection, the service can be configured
+	 * either to republish or drop in-flight messages.
+	 * The former option can be used if service users tolerate publishing message
+	 * duplicates.
+	 * The latter option can be used it service users tolerate losing messages.
+	 * 
+	 * @return
+	 * @throws KuraException
+     */
+	List<Integer> getDroppedInFlightMessageIds() throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudClientListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudClientListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..897dfef1a84a0bf7575d6407b0dda75fdf187039
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudClientListener.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import org.eclipse.kura.data.DataTransportService;
+import org.eclipse.kura.message.KuraPayload;
+
+
+/**
+ * CloudClientListener is the interface to be implemented by applications that needs to be notified of events in the {@link CloudClient}.
+ * Arrived methods are invoked whenever a message is sent to a appTopic associated to the CloudClient.
+ * The Arrived method signatures are differentiated based on whether the incoming messages have been 
+ * published to a data topic (by default accountName/#) or a control topic (by default $EDC/accountName/#).
+ */
+public interface CloudClientListener 
+{
+	/**
+	 * Called by the CloudClient when it receives a published control message from the broker.
+	 * If the message received has a binary payload that it has NOT been encoded using the 
+	 * the KuraPayload class, the received bytes will be set as the body field of a new
+	 * KuraPaylaod instance which is passed to the callback Listener interface.
+	 * 
+	 * @param deviceId	The deviceId this message was addressed to.
+	 * @param appTopic	The appTopic the message arrived on.
+	 * @param msg	    The KuraPayload that arrived.
+	 * @param qos		The Quality of Service that the message was received on.
+	 * @param retain	Whether the message was retained by the broker.
+	 */
+	void onControlMessageArrived(String deviceId, String appTopic, KuraPayload msg, int qos, boolean retain);
+	
+	/**
+	 * Called by the client when it receives a published data message from the broker.
+	 * If the message received has a binary payload that it has NOT been encoded using the 
+	 * the KuraPayload class, the received bytes will be set as the body field of a new
+	 * KuraPaylaod instance which is passed to the callback Listener interface.
+	 * 
+	 * @param deviceId	The asset ID of the semanticTopic prefix the message arrived on.
+	 * @param appTopic	The appTopic the message arrived on.
+	 * @param msg		The KuraPayload that arrived.
+	 * @param qos		The Quality of Service that the message was received on.
+	 * @param retain	Whether the message was retained by the broker.
+	 */
+	void onMessageArrived(String deviceId, String appTopic, KuraPayload msg, int qos, boolean retain);
+		
+	/**
+	 * Called when the client has lost its connection with the broker. Depending on the {@link DataService}
+	 * configuration, the client will attempt to reconnect and call the {@link CloudClientListener#onConnectionEstablished} 
+	 * method upon a successful reconnect. This is only a notification, the callback handler should 
+	 * not attempt to handle the reconnect.
+	 * <br>
+	 * If the bundle using the client relies on subscriptions beyond the default ones, 
+	 * it is responsibility of the application to implement the {@link CloudClientListener#onConnectionEstablished} 
+	 * callback method to restore the subscriptions it needs after a connection loss.
+	 */
+	void onConnectionLost();
+	
+	/**
+	 * Called when the CloudClient has successfully connected with the broker.
+	 * <br>
+	 * If the bundle using the client relies on subscriptions beyond the default ones, 
+	 * it is responsibility of the application to implement the {@link CloudClientListener#onConnectionEstablished} 
+	 * callback method to restore the subscriptions it needs after a connection loss.
+	 */
+	void onConnectionEstablished();
+
+	/**
+	 * Called by the CloudClient when a published message has been fully acknowledged by the broker, 
+	 * as appropriate for the quality of service. The published method is not called for QoS 0 publications.
+	 * 
+	 * @param messageId		The message id of the published message
+	 */
+	void onMessageConfirmed(int messageId, String appTopic);	
+
+
+	/**
+	 * Called by the CloudClient when a message has been transfered from the publishing queue
+	 * to the underlying {@link DataTransportService} for publishing on the wire.
+	 */ 
+	void onMessagePublished(int messageId, String appTopic);	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudConnectionEstablishedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudConnectionEstablishedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..62145535488934d93dedc993b1eddabf3853c88f
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudConnectionEstablishedEvent.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * CloudConnectionEstablishedEvent is raised with the Cloud Connection is established. 
+ */
+public class CloudConnectionEstablishedEvent extends Event
+{
+	/** Topic of the CloudConnectionEstablishedEvent */
+	public static final String CLOUD_CONNECTION_STATUS_ESTABLISHED = "org/eclipse/kura/cloud/CloudConnectionStatus/ESTABLISHED";
+	
+	public CloudConnectionEstablishedEvent(Map<String, ?> properties) {
+		super(CLOUD_CONNECTION_STATUS_ESTABLISHED, properties);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudConnectionLostEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudConnectionLostEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..08c7167f832c73b9cf078b3e274d551b654e5b66
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudConnectionLostEvent.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * CloudConnectionEstablishedEvent is raised with the Cloud Connection is lost. 
+ */
+public class CloudConnectionLostEvent extends Event
+{
+	/** Topic of the CloudConnectionLostEvent */
+	public static final String CLOUD_CONNECTION_STATUS_LOST = "org/eclipse/kura/cloud/CloudConnectionStatus/LOST";
+	
+	public CloudConnectionLostEvent(Map<String, ?> properties) {
+		super(CLOUD_CONNECTION_STATUS_LOST, properties);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudPayloadProtoBufDecoder.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudPayloadProtoBufDecoder.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6fb3f57f6bddb755b0c7ec4650cbf750030844a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudPayloadProtoBufDecoder.java
@@ -0,0 +1,15 @@
+package org.eclipse.kura.cloud;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.message.KuraPayload;
+
+public interface CloudPayloadProtoBufDecoder {
+	/**
+	 * Decodes a Google Protocol Buffers encoded, optionally gzipped, binary payload to a {@link org.eclipse.kura.message.KuraPayload}.
+	 * 
+	 * @param payload
+	 * @return
+	 * @throws KuraException
+	 */
+	public KuraPayload buildFromByteArray(byte[] payload) throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudPayloadProtoBufEncoder.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudPayloadProtoBufEncoder.java
new file mode 100644
index 0000000000000000000000000000000000000000..47476065f4bff134cfe65cb5b6d13ff13d5886b5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudPayloadProtoBufEncoder.java
@@ -0,0 +1,16 @@
+package org.eclipse.kura.cloud;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.message.KuraPayload;
+
+public interface CloudPayloadProtoBufEncoder {
+	/**
+	 * Encodes a {@link org.eclipse.kura.message.KuraPayload} to a Google Protocol Buffers encoded, optionally gzipped, binary payload.
+	 * 
+	 * @param kuraPayload
+	 * @param gzipped
+	 * @return
+	 * @throws KuraException
+	 */
+	byte[] getBytes(KuraPayload kuraPayload, boolean gzipped) throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d365f35658f879d0cd8e65071243d45869dc5ce
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudService.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * The CloudService provides an easy to use API layer for M2M application to communicate with a remote server. 
+ * It operates as a decorator for the {@link org.eclipse.kura.data.DataService} providing add-on
+ * features over the management of the transport layer.
+ * In addition to simple publish/subscribe, the Cloud Service API simplifies the implementation of more complex 
+ * interaction flows like request/response or remote resource management. Cloud Service abstracts the 
+ * developers from the complexity of the transport protocol and payload format used in the communication.<br>
+ * CloudService allows for a single connection to a remote server to be shared across more than one application 
+ * in the gateway providing the necessary topic partitioning.<br>
+ * Its responsibilities can be summarized as:
+ * <ul>
+ * <li>Adds application topic prefixes to allow for a single remote server connection to be shared across applications
+ * <li>Define a payload data model and provide default encoding/decoding serializers
+ * <li>Publish life-cycle messages when device and applications start and stop 
+ * </ul>
+ * The CloudService can be used through the {@link CloudClient} API or by extending the {@link Cloudlet} class.
+ * {@link Cloudlet} simplifies the interactions with remote servers providing a servlet-like API
+ * to implement request and response flows and remote resource management.
+ */
+public interface CloudService 
+{    
+    /**
+     * Returns a new instance of the CloudClient for the given application Id. 
+     * The CloudClient is designed to be used by single application bundles.
+     * CloudClient instances are acquired from the CloudService and they are released 
+     * when the work is completed. Generally, a CloudClient is acquired during the 
+     * activation phase of a bundle and it is released through the 
+     * {@link CloudClient#release} method during the bundle deactivation phase.
+     * <br>
+     * CloudClient will clean-up the subscriptions and the callback registrations 
+     * when the {@link CloudClient#release} method is called.
+     * <br>
+     * If the bundle using the CloudClient relies on subscriptions, 
+     * it is responsibility of the application to implement the 
+     * {@link CloudClientListener#connectionRestored} callback method 
+     * in the CloudCallbackHandler to restore the subscriptions it needs.
+     * 
+     * @param  appId A String object specifying a unique application ID.
+     * @return CloudClient instance
+     * @throws KuraException
+     */
+    public CloudClient newCloudClient(String appId) throws KuraException;
+    
+    
+    /**
+     * Returns the application identifiers for which a CloudClient instance was created.
+     * @return An array of application identifiers
+     */
+    public String[] getCloudApplicationIdentifiers();
+
+
+    /**
+     * Returns true if the underlying {@link org.eclipse.kura.data.DataService} is currently connected to the remote server. 
+     * @return
+     */
+	public boolean isConnected();
+}
+
+
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/Cloudlet.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/Cloudlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..feb90722b65b85582764bae00baf8f288ff40419
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/Cloudlet.java
@@ -0,0 +1,327 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+import java.util.Date;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraRequestPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Cloudlet is an abstract class that can be extended by services that wants to implement remote resource management.
+ * The Cloudlet  abstracts the detailed of the communication with the remote clients providing easy to use template
+ * methods to be implemented by subclasses to handle CRUD operations on local resources.
+ * <ul>
+ * <li>{@link Cloudlet#doGet} is used to implement a READ request for a resource identified by the supplied {@link CloudletTopic#getResources()} 
+ * <li>{@link Cloudlet#doPut} is used to implement a CREATE or UPDATE request for a resource identified by the supplied {@link CloudletTopic#getResources()} 
+ * <li>{@link Cloudlet#doDel} is used to implement a DELETE request for a resource identified by the supplied {@link CloudletTopic#getResources()} 
+ * <li>{@link Cloudlet#doPost} is used to implement other operations on a resource identified by the supplied {@link CloudletTopic#getResources()} 
+ * <li>{@link Cloudlet#doExec} is used to perform applicatioon operation not necessary tied to a given resource.
+ * </ul> 
+ */
+public abstract class Cloudlet implements CloudClientListener 
+{		
+	private static final Logger s_logger = LoggerFactory.getLogger(Cloudlet.class);
+	
+	protected static final int     DFLT_PUB_QOS  = 0;
+	protected static final boolean DFLT_RETAIN   = false;
+	protected static final int     DFLT_PRIORITY = 1;
+
+	private static int NUM_CONCURRENT_CALLBACKS = 2;
+	private static ExecutorService m_callbackExecutor = Executors.newFixedThreadPool(NUM_CONCURRENT_CALLBACKS);
+	
+	private CloudService m_cloudService;
+	private CloudClient  m_cloudClient;
+	
+	private String       m_applicationId;
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+	}
+
+	public void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) 
+	{			
+		// get the mqtt client for this application
+		try  {
+			
+			s_logger.info("Getting CloudApplicationClient for {}...", m_applicationId);
+			m_cloudClient = m_cloudService.newCloudClient(m_applicationId);
+			m_cloudClient.addCloudClientListener(this);
+			
+			//Don't subscribe because these are handled by the default subscriptions and we don't want to get messages twice
+		}
+		catch (KuraException e) {
+			s_logger.error("Cannot activate", e);
+			throw new ComponentException(e);
+		}
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		// close the application client. 
+		// this will unsubscribe all open subscriptions
+		s_logger.info("Releasing CloudApplicationClient for {}...", m_applicationId);
+		m_cloudClient.release();
+		m_cloudService = null;
+	}
+
+	protected Cloudlet(String appId) {
+		this.m_applicationId = appId;
+	}
+	
+	public String getAppId() {
+		return m_applicationId;
+	}
+	
+	protected CloudService getCloudService() {
+		return m_cloudService;
+	}
+	
+	protected CloudClient getCloudApplicationClient() {
+		return m_cloudClient;
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Default handlers
+	//
+	// ----------------------------------------------------------------
+
+	protected void doGet(CloudletTopic reqTopic, KuraRequestPayload reqPayload, KuraResponsePayload respPayload)
+			throws KuraException {
+		s_logger.info("Default GET handler");
+		respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+	}
+	
+	protected void doPut(CloudletTopic reqTopic, KuraRequestPayload reqPayload, KuraResponsePayload respPayload)
+			throws KuraException {
+		s_logger.info("Default PUT handler");
+		respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+	}
+
+	protected void doPost(CloudletTopic reqTopic, KuraRequestPayload reqPayload, KuraResponsePayload respPayload)
+			throws KuraException {
+		s_logger.info("Default POST handler");
+		respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+	}
+	
+	protected void doDel(CloudletTopic reqTopic, KuraRequestPayload reqPayload, KuraResponsePayload respPayload)
+			throws KuraException {
+		s_logger.info("Default DEL handler");
+		respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+	}
+	
+	protected void doExec(CloudletTopic reqTopic, KuraRequestPayload reqPayload, KuraResponsePayload respPayload)
+			throws KuraException {
+		s_logger.info("Default EXEC handler");
+		respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+	}
+	
+	@Override
+	public void onControlMessageArrived(String deviceId, 
+			                            String appTopic,
+			                            KuraPayload msg, 
+			                            int qos, 
+			                            boolean retain) 
+	{		
+		try {
+			s_logger.debug("Control Arrived on topic: {}", appTopic);
+			
+			StringBuilder sb = new StringBuilder(m_applicationId)
+			.append("/")
+			.append("REPLY");
+			
+			if (appTopic.startsWith(sb.toString())) {
+				// Ignore replies
+				return;
+			}
+			
+			// Handle the message asynchronously to not block the master client
+			m_callbackExecutor.submit( new MessageHandlerCallable(this,
+					                                              deviceId,
+					                        		              appTopic,
+					                        		              msg,
+					                        		              qos,
+					                        		              retain));
+		} catch (Throwable t) {
+			s_logger.error("Unexpected throwable: {}", t);
+		}
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, 
+						         String appTopic,
+						         KuraPayload msg, 
+						         int qos, 
+						         boolean retain) 
+	{
+		s_logger.error("Unexpected message arrived on topic: " + appTopic);
+	}
+
+	@Override
+	public void onConnectionLost() {
+		s_logger.warn("Cloud Client Connection Lost!");
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		s_logger.info("Cloud Client Connection Restored");
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		s_logger.debug("Message Confirmed (" + messageId + ")");
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		s_logger.debug("Message Published (" + messageId + ")");
+	}
+}
+
+class MessageHandlerCallable implements Callable<Void> 
+{	
+	private static final Logger s_logger = LoggerFactory.getLogger(MessageHandlerCallable.class);
+	
+	private Cloudlet   m_cloudApp;
+	@SuppressWarnings("unused")
+	private String     m_deviceId;
+	private String     m_appTopic;
+	private KuraPayload m_msg;
+	@SuppressWarnings("unused")
+	private int        m_qos;
+	@SuppressWarnings("unused")
+	private boolean    m_retain;
+	
+	public MessageHandlerCallable(Cloudlet cloudApp,
+			                      String deviceId,
+			                      String appTopic,
+			                      KuraPayload msg,
+			                      int qos,
+			                      boolean retain) {
+		super();
+		this.m_cloudApp = cloudApp;
+		this.m_deviceId = deviceId;
+		this.m_appTopic = appTopic;
+		this.m_msg = msg;
+		this.m_qos = qos;
+		this.m_retain = retain;
+	}
+
+	@Override
+	public Void call() throws Exception 
+	{		
+		s_logger.debug("Control Arrived on topic: {}", m_appTopic);
+
+		// Prepare the default response
+		KuraRequestPayload reqPayload = KuraRequestPayload.buildFromKuraPayload(m_msg);
+		KuraResponsePayload respPayload = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_OK);
+		try {
+			
+			CloudletTopic reqTopic = CloudletTopic.parseAppTopic(m_appTopic);
+			CloudletTopic.Method method = reqTopic.getMethod();
+			switch (method) {
+			case GET:
+				s_logger.debug("Handling GET request topic: {}", m_appTopic);
+				m_cloudApp.doGet(reqTopic, reqPayload, respPayload);
+				break;
+				
+			case PUT:
+				s_logger.debug("Handling PUT request topic: {}", m_appTopic);
+				m_cloudApp.doPut(reqTopic, reqPayload, respPayload);
+				break;
+				
+			case POST:
+				s_logger.debug("Handling POST request topic: {}", m_appTopic);
+				m_cloudApp.doPost(reqTopic, reqPayload, respPayload);
+				break;
+				
+			case DEL:
+				s_logger.debug("Handling DEL request topic: {}", m_appTopic);
+				m_cloudApp.doDel(reqTopic, reqPayload, respPayload);
+				break;
+				
+			case EXEC:
+				s_logger.debug("Handling EXEC request topic: {}", m_appTopic);
+				m_cloudApp.doExec(reqTopic, reqPayload, respPayload);
+				break;
+			
+			default:
+				s_logger.error("Bad request topic: {}", m_appTopic);
+				respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+				break;
+			}
+		}
+		catch (IllegalArgumentException e) {
+			s_logger.error("Bad request topic: {}", m_appTopic);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+		}
+		catch (KuraException e) {
+			s_logger.error("Error handling request topic: {}\n{}", m_appTopic, e);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_ERROR);
+			respPayload.setException(e);
+		}
+		
+		try {
+
+			CloudClient cloudClient = m_cloudApp.getCloudApplicationClient();			
+			respPayload.setTimestamp(new Date());
+			
+			StringBuilder sb = new StringBuilder("REPLY")
+			.append("/")
+			.append(reqPayload.getRequestId());
+			
+			String requesterClientId = reqPayload.getRequesterClientId();
+
+			s_logger.debug("Publishing response topic: {}", sb.toString());			
+			cloudClient.controlPublish(
+					requesterClientId,
+					sb.toString(),
+					respPayload,
+					Cloudlet.DFLT_PUB_QOS,
+					Cloudlet.DFLT_RETAIN,
+					Cloudlet.DFLT_PRIORITY);
+		}
+		catch (KuraException e) {
+			s_logger.error("Error publishing response for topic: {}\n{}", m_appTopic, e);
+		}
+		
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudletTopic.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudletTopic.java
new file mode 100644
index 0000000000000000000000000000000000000000..bde8736dfaab56516b2713d7a5dc964654d22336
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/CloudletTopic.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud;
+
+
+public class CloudletTopic
+{
+	public enum Method {
+		GET,
+		PUT,
+		POST,
+		DEL,
+		EXEC;		
+	}
+	
+	private Method   m_method;
+	private String[] m_resources;
+	
+	public static CloudletTopic parseAppTopic(String appTopic) 
+	{
+		CloudletTopic edcApplicationTopic = new CloudletTopic();
+		
+		String[] parts = appTopic.split("/");		
+		edcApplicationTopic.m_method = Method.valueOf(parts[0]);	
+		if (parts.length > 1) {
+			
+			edcApplicationTopic.m_resources = new String[parts.length - 1];
+			for (int i = 0; i < edcApplicationTopic.m_resources.length; i++) {
+				edcApplicationTopic.m_resources[i] = parts[i + 1];
+			}
+		}		
+		return edcApplicationTopic;
+	}
+	
+	private CloudletTopic() {
+		super();
+	}
+				
+	public Method getMethod() {
+		return m_method;
+	}
+
+	public String[] getResources() {
+		return m_resources;
+	}
+		
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder(m_method.name());		
+		if (m_resources != null) {
+			for (int i = 0; i < m_resources.length; i++) {
+				sb.append("/");
+				sb.append(m_resources[i]);
+			}
+		}		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc80543c248c460e8a31625fa7b2b84538760d76
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/cloud/package-info.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides services for managing communications between M2M applications and remote servers. Types of communications include simple publish/subscribe models to more complex
+ * request/response and remote resource management.
+ *
+ */
+package org.eclipse.kura.cloud;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/CommConnection.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/CommConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf398f5cbe0c714a962c70c590ef991da6beef2d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/CommConnection.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.comm;
+
+import java.io.IOException;
+
+import javax.microedition.io.StreamConnection;
+
+import org.eclipse.kura.KuraException;
+
+
+/**
+ * This is the primary control class for a Serial port.  An instance of
+ * this class may be operated on by more than one thread.  Settings will be
+ * those of the last thread to successfully change each particular setting.  
+ * <p>
+ * Code written to use a javax.comm.SerialPort object in a shared mode should
+ * make use of synchronization blocks where exclusive transactions are wanted.
+ * In most instances, both the OutputStream and the InputStream should be
+ * synchronized on, normally with the OutputStream being synchronized first.
+ * <pre>
+ * Example Code:
+ * 		try {
+ *			String uri = new CommURI.Builder("/dev/tty.PL2303-00001004")
+ *										.withBaudRate(19200)
+ *										.withDataBits(8)
+ *										.withStopBits(1)
+ *										.withParity(0)
+ *										.withTimeout(2000)
+ *										.build().toString();
+ *			CommConnection connOne = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+ *			assertNotNull(connOne);
+ *			uri = new CommURI.Builder("/dev/tty.PL2303-00002006")
+ *										.withBaudRate(19200)
+ *										.withDataBits(8)
+ *										.withStopBits(1)
+ *										.withParity(0)
+ *										.withTimeout(2000)
+ *										.build().toString();
+ *			CommConnection connTwo = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+ *			assertNotNull(connTwo);
+ *			
+ *			InputStream isOne = connOne.openInputStream();
+ *			OutputStream osOne = connOne.openOutputStream();
+ *			InputStream isTwo = connTwo.openInputStream();
+ *			OutputStream osTwo = connTwo.openOutputStream();
+ *			
+ *			assertNotNull(isOne);
+ *			assertNotNull(osOne);
+ *			assertNotNull(isTwo);
+ *			assertNotNull(osTwo);
+ *			
+ *			//write from one to two
+ *			byte[] array = "this is a message from one to two\n".getBytes();
+ *			osOne.write(array);
+ *			StringBuffer sb = new StringBuffer();
+ *			int c;
+ *			while((c = isTwo.read()) != 0xa) {
+ *				//System.out.println("port 2: read byte: 0x" + Integer.toHexString(c) + " -> " + (char)c);
+ *				sb.append((char)c);
+ *			}
+ *			System.out.println("Port 2: Read from serial port two: " + sb.toString());
+ *			
+ *			array = "this is a message from two to one\n".getBytes();
+ *			osTwo.write(array);
+ *			sb = new StringBuffer();
+ *			while((c = isOne.read()) != 0xa) {
+ *				//System.out.println("port 1: read byte: 0x" + Integer.toHexString(c) + " -> " + (char)c);
+ *				sb.append((char)c);
+ *			}
+ *			System.out.println("Port 1: Read from serial port: " + sb.toString());
+ *			
+ *			isOne.close();
+ *			osOne.close();
+ *			isOne = null;
+ *	 		osOne = null;
+ *			isTwo.close();
+ *			osTwo.close();
+ *			isTwo = null;
+ *			osTwo = null;
+ *			connOne.close();
+ *			connOne = null;
+ *			connTwo.close();
+ *			connTwo = null;
+ *		} catch (Exception e) {
+ *			e.printStackTrace();
+ *		}
+ * </pre>
+ * 
+ * Note: avoid blocking read (InputStream.read()) if the InputStream can be closed on a different thread,
+ * in this case, the read will never exit and the thread will be blocked forever.
+ * 
+ * It is preferable to test InputStream.available before InputStream.read():
+ * <pre>
+ *		if (isOne.available() != 0) {
+ *			c = isOne.read();
+ *		} else {
+ *		try {
+ *			Thread.sleep(100);
+ *			continue;
+ *		} catch (InterruptedException e) {
+ *			return;
+ *		}
+ *</pre>
+ */
+public interface CommConnection extends StreamConnection 
+{
+	/**
+	 * Returns the URI for this connection.
+	 * @return this connection URI
+	 */
+	public CommURI getURI();
+	
+	/**
+	 * Sends and array of bytes to a CommConnection
+	 * 
+	 * @param message		the array of bytes to send to the CommConnection
+	 * @throws KuraException
+	 * @throws IOException
+	 */
+	public void sendMessage(byte[] message) throws KuraException, IOException;
+
+	/**
+	 * Sends and array of bytes to a CommConnection and returns an array of bytes
+	 * that represents the 'response' to the command.  If the timeout is exceeded
+	 * before any bytes are read on the InputStream null is returned.  This is 
+	 * meant to be used in common command/response type situations when communicating
+	 * with serial devices
+	 * 
+	 * @param command		the array of bytes to send to the CommConnection
+	 * @param timeout		the maximum length of time to wait before returning a null
+	 * 						response in the event no response is ever returned.
+	 * @return				an array of bytes representing the response
+	 * @throws KuraException
+	 * @throws IOException
+	 */
+	public byte[] sendCommand(byte[] command, int timeout) throws KuraException, IOException;
+	
+	public byte[] sendCommand(byte[] command, int timeout, int demark) throws KuraException, IOException;
+
+	/**
+	 * Reads all bytes that are waiting in the serial port buffer and returns them in
+	 * an array.  This can be used to read unsolicited messages from an attached
+	 * serial device.
+	 * 
+	 * @return				the array of bytes buffered on the InputStream if any
+	 * @throws KuraException
+	 * @throws IOException
+	 */
+	public byte[] flushSerialBuffer() throws KuraException, IOException;
+	
+	public void close() throws IOException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/CommURI.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/CommURI.java
new file mode 100644
index 0000000000000000000000000000000000000000..42fd05876f5046654a3022b070b18cd4bb4910a9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/CommURI.java
@@ -0,0 +1,260 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.comm;
+
+import java.net.URISyntaxException;
+
+import javax.comm.SerialPort;
+
+/**
+ * Represents a Uniform Resource Identifier (URI) for a Comm/Serial Port.
+ *
+ */
+public class CommURI 
+{
+	public static final int DATABITS_5 = SerialPort.DATABITS_5;
+	public static final int DATABITS_6 = SerialPort.DATABITS_6;
+	public static final int DATABITS_7 = SerialPort.DATABITS_7;
+	public static final int DATABITS_8 = SerialPort.DATABITS_8;
+	
+	public static final int PARITY_EVEN = SerialPort.PARITY_EVEN;
+	public static final int PARITY_MARK = SerialPort.PARITY_MARK;
+	public static final int PARITY_NONE = SerialPort.PARITY_NONE;
+	public static final int PARITY_ODD = SerialPort.PARITY_ODD;
+	public static final int PARITY_SPACE = SerialPort.PARITY_SPACE;
+	
+	public static final int STOPBITS_1 = SerialPort.STOPBITS_1;
+	public static final int STOPBITS_1_5 = SerialPort.STOPBITS_1_5;
+	public static final int STOPBITS_2 = SerialPort.STOPBITS_2;
+	
+	public static final int FLOWCONTROL_NONE = SerialPort.FLOWCONTROL_NONE;
+	public static final int FLOWCONTROL_RTSCTS_IN = SerialPort.FLOWCONTROL_RTSCTS_IN;
+	public static final int FLOWCONTROL_RTSCTS_OUT = SerialPort.FLOWCONTROL_RTSCTS_OUT;
+	public static final int FLOWCONTROL_XONXOFF_IN = SerialPort.FLOWCONTROL_XONXOFF_IN;
+	public static final int FLOWCONTROL_XONXOFF_OUT = SerialPort.FLOWCONTROL_XONXOFF_OUT;
+
+	private String m_port;
+	private int    m_baudRate;
+	private int    m_dataBits;
+	private int    m_stopBits;
+	private int    m_parity; 
+	private int    m_flowControl;
+	private int    m_timeout;
+
+	/**
+	 * Constructor to build the CommURI
+	 * 
+	 * @param builder	the builder that contains the comm port parameters
+	 */
+	private CommURI(Builder builder) {
+		m_port            = builder.m_port;
+		m_baudRate        = builder.m_baudRate;
+		m_dataBits        = builder.m_dataBits;
+		m_stopBits        = builder.m_stopBits;
+		m_parity          = builder.m_parity;
+		m_flowControl     = builder.m_flowControl;
+		m_timeout 		  = builder.m_timeout;	
+	}
+	
+	/**
+	 * The COM port or device node associated with this port
+	 * 
+	 * @return	a {@link String } representing the port
+	 */
+	public String getPort() {
+		return m_port;
+	}
+
+	/**
+	 * The baud rate associated with the port
+	 * 
+	 * @return	an int representing the baud rate
+	 */
+	public int getBaudRate() {
+		return m_baudRate;
+	}
+
+	/**
+	 * The number of data bits associated with the port
+	 * 
+	 * @return	an int representing the number of data bits
+	 */
+	public int getDataBits() {
+		return m_dataBits;
+	}
+
+	/**
+	 * The number of stop bits associated with the port
+	 * 
+	 * @return	an int representing the number of stop bits
+	 */
+	public int getStopBits() {
+		return m_stopBits;
+	}
+
+	/**
+	 * The parity associated with the port
+	 * 
+	 * @return	an int representing the parity
+	 */
+	public int getParity() {
+		return m_parity;
+	}
+	
+	/**
+	 * The flow control associated with the port
+	 * 
+	 * @return	an int representing the flow control
+	 */
+	public int getFlowControl() {
+		return m_flowControl;
+	}
+
+	/**
+	 * The timeout associated with the port
+	 * 
+	 * @return	an int representing the timeout in milliseconds
+	 */
+	public int getTimeout() {
+		return m_timeout;
+	}
+
+	/**
+	 * The {@link String } representing the CommURI
+	 */
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("comm:")
+		  .append(m_port)
+		  .append(";baudrate=")
+		  .append(m_baudRate)
+		  .append(";databits=")
+		  .append(m_dataBits)
+		  .append(";stopbits=")
+		  .append(m_stopBits)
+		  .append(";parity=")
+		  .append(m_parity)
+		  .append(";flowcontrol=")
+		  .append(m_flowControl)
+		  .append(";timeout=")
+		  .append(m_timeout);
+		return sb.toString();
+	}
+
+	/**
+	 * Converts a String of the CommURI form to a CommURI Object
+	 * 
+	 * @param uri	the {@link String } representing the CommURI
+	 * @return		a CommURI Object based on the uri String
+	 * @throws URISyntaxException
+	 */
+	public static CommURI parseString(String uri)
+		throws URISyntaxException	
+	{	
+		if (!uri.startsWith("comm:")) {
+			throw new URISyntaxException(uri, "Does not start with comm:");
+		}
+		
+		// get port
+		int idx = uri.indexOf(";") == -1 ? uri.length() : uri.indexOf(";");
+		String port = uri.substring(5, idx); 
+		Builder builder = new Builder(port);
+		
+		// get params
+		if (idx != uri.length()) {
+			
+			String[] params = uri.substring(idx).split(";");
+			for (String param : params) {
+				
+				int i = param.indexOf("=");
+				if (i != -1) {
+					String name  = param.substring(0, i);
+					String value = param.substring(i+1);
+					if ("baudrate".equals(name)) {
+						builder = builder.withBaudRate(Integer.parseInt(value));
+					}
+					else if ("databits".equals(name)) {
+						builder = builder.withDataBits(Integer.parseInt(value));
+					}
+					else if ("stopbits".equals(name)) {
+						builder = builder.withStopBits(Integer.parseInt(value));
+					}
+					else if ("parity".equals(name)) {
+						builder = builder.withParity(Integer.parseInt(value));
+					}
+					else if ("flowcontrol".equals(name)) {
+						builder = builder.withFlowControl(Integer.parseInt(value));
+					}
+					else if ("timeout".equals(name)) {
+						builder = builder.withTimeout(Integer.parseInt(value));
+					}
+				}
+			}
+		}
+		return builder.build();
+	}
+	
+	/**
+	 * Builder class used as a helper in building the components of a CommURI
+	 * 
+	 * @author eurotech
+	 *
+	 */
+	public static class Builder {
+
+		private String m_port;
+		private int    m_baudRate          = 19200;
+		private int    m_dataBits          = 8;
+		private int    m_stopBits          = 1;
+		private int    m_parity            = 0; 
+		private int    m_flowControl       = 0;
+		private int    m_timeout 		   = 2000;
+
+		public Builder(String port) {
+			m_port = port;
+		}
+		
+		public Builder withBaudRate(int baudRate) {
+			m_baudRate = baudRate;
+			return this;
+		}
+
+		public Builder withDataBits(int dataBits) {
+			m_dataBits = dataBits;
+			return this;
+		}
+
+		public Builder withStopBits(int stopBits) {
+			m_stopBits = stopBits;
+			return this;
+		}
+
+		public Builder withParity(int parity) {
+			m_parity = parity;
+			return this;
+		}
+		
+		public Builder withFlowControl(int flowControl) {
+			m_flowControl = flowControl;
+			return this;
+		}
+
+		public Builder withTimeout(int timeout) {
+			m_timeout = timeout;
+			return this;
+		}
+		
+		public CommURI build() {
+			return new CommURI(this);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..9dd5b56a4c6c9b36119ff1f45c6167e5931313e9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/comm/package-info.java
@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * Provides services for managing a connection with a serial port.
+ *
+ */
+package org.eclipse.kura.comm;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/command/CommandService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/command/CommandService.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a3063669d7f666f238d071b1114032878e49d04
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/command/CommandService.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.command;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * This interface provides methods for running system commands from the web console.
+ *
+ */
+public interface CommandService {
+
+	public String execute(String cmd) throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/command/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/command/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..b79154103c94368b0ce1ab4a6ebdbbd047144ffc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/command/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * @author dwoodard
+ *
+ */
+package org.eclipse.kura.command;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ComponentConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ComponentConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..418121c871bb32e206dde89fe05a5823374b44e8
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ComponentConfiguration.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.configuration;
+
+import java.util.Map;
+
+import org.eclipse.kura.configuration.metatype.OCD;
+
+/**
+ * The ComponentConfiguration groups all the information related to the Configuration of a Component.
+ * It provides access to parsed ObjectClassDefintion associated to this Component.
+ * ComponentConfiguration does not reuse the OSGi ObjectClassDefinition as the latter
+ * does not provide access to certain aspects such as the required attribute, 
+ * the min and max values. Instead it returns the raw ObjectClassDefintion as parsed 
+ * from the MetaType Information XML resource associated to this Component.  
+ */
+public interface ComponentConfiguration 
+{
+	/**
+	 * Returns the PID (service's persistent identity) of the component
+	 * associated to this Configuration.
+	 * The service's persistent identity is defined as the name attribute of the
+	 * Component Descriptor XML file; at runtime, the same value is also available
+	 * in the component.name and in the service.pid attributes of the Component Configuration.
+	 * @return PID of the component associated to this Configuration.
+	 */
+	public String getPid();
+	
+	
+	/**
+	 * Returns the raw ObjectClassDefinition as parsed from the MetaType
+	 * Information XML resource associated to this Component.
+	 * @return
+	 */
+	public OCD getDefinition();
+	
+	
+	/**
+	 * Returns the Dictionary of properties currently used by this component.
+	 * @return the Component's Configuration properties.
+	 */
+	public Map<String,Object> getConfigurationProperties();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ConfigurableComponent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ConfigurableComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..78b26f5770aebf6a833690143cc80e30099e04b0
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ConfigurableComponent.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.configuration;
+
+/**
+ * Marker interface for all Service Component that wants to expose the Configuration through the ConfigurationService.
+ * The Configuration Service tracks all OSGi Components which implement the {@see ConfigurableComponent} marker interface.
+ * When a ConfigurableComponent is registered, the Configuration Service will call its "update"
+ * method with the latest saved configuration as returned the ConfigurationAdmin or, if none
+ * is available, with the Configuration properties fabricated from the default attribute values as 
+ * specified in the ObjectClassDefinition of this service.
+ * In OSGi terms, this process in similar to the Auto Configuration Service.
+ * <b>The ConfigurationService assumes that Meta Type Information XML resource
+ * for a given ConfigurableComponent with name abc" to be stored under OSGI-INF/metatype/abc.xml.</b>
+ * This is an extra restriction over the OSGi specification: the Meta Type Information XML resource
+ * must be named as the name of the Declarative Service Component. 
+ * <br>
+ */
+public interface ConfigurableComponent 
+{
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ConfigurationService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ConfigurationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ec0e1b84377606a99c3809c916b01e383b3c1e5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/ConfigurationService.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.configuration;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * The Configuration Service is used to manage the configuration of ConfigurableComponents.
+ * It works in concert with the OSGi ConfigurationAdmin and the OSGi MetaTypeService services.
+ * What it provides over the native OSGi services is the ability to easily access the current
+ * configuration of a ConfigurableComponent together with its full ObjectClassDefintion,
+ * the ability to take snapshots of the current configuration of all registered 
+ * ConfigurableComponents or rollback to older snapshots and, finally, the ability to access 
+ * and manage configurations remotely through the CloudService. 
+ * <br>    
+ * The Configuration Service operates on a subset of all the Components registered under the OSGi container.
+ * It tracks all OSGi Components which implement the {@see ConfigurableComponent} marker interface.
+ * When a ConfigurableComponent is registered, the Configuration Service will call its "update"
+ * method with the latest saved configuration as returned the ConfigurationAdmin or, if none
+ * is available, with the Configuration properties fabricated from the default attribute values as 
+ * specified in the ObjectClassDefinition of this service.
+ * In OSGi terms, this process in similar to the Auto Configuration Service.
+ * <b>The ConfigurationService assumes that Meta Type Information XML resource
+ * for a given Declarative Service with name abc" to be stored under OSGI-INF/metatype/abc.xml.</b>
+ * This is an extra restriction over the OSGi specification: the Meta Type Information XML resource
+ * must be named as the name of the Declarative Service Component. 
+ * <br>
+ * The ConfigurationService has the ability to create a snapshot for the current configuration
+ * of all the registered ConfigurableComponents. The snapshot is saved in the form of an
+ * XML file stored under $KuraHome/snapshots/snapshot_epoch.xml where epoch is replaced
+ * with the epoch timestamp at the time of the snapshot creation.
+ * The ConfigurationService also has the ability to rollback the configuration of the
+ * registered components taking them back to a previous stored snapshot. 
+ * <br>
+ * The ConfigurationService interacts with the CloudService to allow to access 
+ * current configuration and to modify it remotely through messages sent and received via cloud.   
+ */
+public interface ConfigurationService 
+{
+	/**
+	 * Return the PIDs (service's persistent identity) for all the services that 
+	 * implements the ConfigurableComponent Maker interface and registered themselves
+	 * with the container.
+	 * The service's persistent identity is defined as the name attribute of the
+	 * Component Descriptor XML file; at runtime, the same value is also available
+	 * in the component.name and in the service.pid attributes of the Component Configuration. 
+	 * @return list of PIDs for registered ConfigurableComponents
+	 */
+	public Set<String> getConfigurableComponentPids();
+
+	
+	/**
+	 * Returns the list of ConfigurableComponents currently registered with the ConfigurationService.
+	 * @return list of registered ConfigurableComponents
+	 */
+	public List<ComponentConfiguration> getComponentConfigurations() throws KuraException;
+
+
+	
+	/**
+	 * Returns the ComponentConfiguration for the component identified with specified PID (service's persistent identity).
+	 * The service's persistent identity is defined as the name attribute of the
+	 * Component Descriptor XML file; at runtime, the same value is also available
+	 * in the component.name and in the service.pid attributes of the Component Configuration. 
+	 * @param pid The ID of the component whose configuration is requested. 
+	 * @return ComponentConfiguration of the requested Component.
+	 */
+	public ComponentConfiguration getComponentConfiguration(String pid) throws KuraException;
+	
+	
+	/**
+	 * Updates the Configuration of the registered component with the specified pid.
+	 * Using the OSGi ConfigurationAdmin, it retrieves the Configuration of the 
+	 * component with the specified PID and then send an update using the 
+	 * specified properties.
+	 * <br>
+	 * If the component to be updated is not yet registered with the ConfigurationService,
+	 * it is first registered and then it is updated with the specified properties.
+	 * Before updating the component, the specified properties are validated against
+	 * the ObjectClassDefinition associated to the Component. The Configuration Service
+	 * is fully compliant with the OSGi MetaType Information and the validation happens
+	 * through the OSGi MetaType Service.
+	 * <br>
+	 * The Configuration Service is compliant with the OSGi MetaType Service so 
+	 * it accepts all attribute types defined in the OSGi Compendium Specifications.
+	 * <br>
+	 * it accepts all 
+	 * @param pid The ID of the component whose configuration is requested.
+	 * @param properties Properties to be used as the new Configuration for the specified Component.
+	 * @throws KuraException if the properties specified do not pass the validation of the ObjectClassDefinition
+	 */
+	public void updateConfiguration(String pid, Map<String,Object> properties)
+		throws KuraException;
+
+
+	public void updateConfigurations(List<ComponentConfiguration> configs)
+		throws KuraException;
+		
+	/**
+	 * Returns the ID of all the snapshots taken by the ConfigurationService.
+	 * The snapshot ID is the epoch time at which the snapshot was taken.
+	 * The snapshots are stored in the KuraHome/snapshots/ directory.
+	 * This API will return all the snpashot files available in that location.
+	 *  
+	 * @return IDs of the snapshots available.
+	 * @throws KuraException
+	 */
+	public Set<Long> getSnapshots() 
+		throws KuraException;
+	
+	/**
+	 * Loads a snapshot given its ID and return the component configurations stored in that snapshot.
+	 * 
+	 * @param sid - ID of the snapshot to be loaded
+	 * @return List of ComponentConfigurations contained in the snapshot 
+	 * @throws KuraException
+	 */
+	public List<ComponentConfiguration> getSnapshot(long sid)
+		throws KuraException;
+	
+	
+	/**
+	 * Takes a new snapshot of the current configuration of all the registered ConfigurableCompoenents.
+	 * It returns the ID of a snapshot as the epoch time at which the snapshot was taken. 
+	 * @return the ID of the snapshot.
+	 * @throws KuraException
+	 */
+	public long snapshot() 
+		throws KuraException;
+
+	/**
+	 * Rolls back to the last saved snapshot if available.
+	 * 
+	 * @return the ID of the snapshot it rolled back to
+	 * @throws KuraException if no snapshots are available or 
+	 */
+	public long rollback()
+		throws KuraException;
+	
+	/**
+	 * Rolls back to the specified snapshot id. 
+	 * 
+	 * @param id ID of the snapshot we need to rollback to
+	 * @throws KuraException if the snapshot is not found
+	 */
+	public void rollback(long id) 
+		throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/SelfConfiguringComponent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/SelfConfiguringComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6ee8369a0238bf89c5b69bccfc750c228fd3e71
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/SelfConfiguringComponent.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.configuration;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * A SelfConfiguringComponent is a configurable component which maintains its state.
+ * A SelfConfiguringComponent exposes its configuration information to the ConfigurationService 
+ * and therefore can be have its configuration updated locally or remotely through the 
+ * ConfigurationService APIs. 
+ * However, a SelfConfiguringComponent does not rely on the ConfigurationService 
+ * to keep the storage of its configuration. The configuration state is kept
+ * internally in the SelfConfiguringComponent or derived at runtime from
+ * other resources such system resources.<br>
+ * An example of a SelfConfiguringComponent is the NetworkService whose state
+ * is kept in the operating system instead of in the ConfigurationService. 
+ */
+public interface SelfConfiguringComponent 
+{
+	/**
+	 * This method is called by the ConfigurationService when it requires
+	 * the current snapshot of the configuration for this components.
+	 * As SelfConfiguringComponents do not rely on the ConfigurationService
+	 * to capture and store the current configuration, this call is needed
+	 * to expose the current configuration externally and, for example,
+	 * being able to store it in snapshot files. 
+	 *  
+	 * @return the current configuration for this component
+	 * @throws KuraException
+	 */
+	public ComponentConfiguration getConfiguration() throws KuraException;
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/AD.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/AD.java
new file mode 100644
index 0000000000000000000000000000000000000000..2eab3f4074255d829e4af02702989721e9e82891
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/AD.java
@@ -0,0 +1,170 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+import java.util.List;
+
+
+/**
+ * <p>Java class for Tad complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tad">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Option" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Toption" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="type" use="required" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tscalar" />
+ *       &lt;attribute name="cardinality" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
+ *       &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="default" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="required" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface AD 
+{
+    /**
+     * Gets the value of the option property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the option property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getOption().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Option }
+     * 
+     * 
+     */
+    public List<Option> getOption();
+
+    /**
+     * Gets the value of the name property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getName();
+
+    /**
+     * Gets the value of the description property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDescription();
+
+    /**
+     * Gets the value of the id property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getId();
+
+    /**
+     * Gets the value of the type property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Scalar }
+     *     
+     */
+    public Scalar getType();
+
+    /**
+     * Gets the value of the cardinality property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Integer }
+     *     
+     */
+    public int getCardinality();
+
+    /**
+     * Gets the value of the min property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getMin();
+
+    /**
+     * Gets the value of the max property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getMax();
+
+    /**
+     * Gets the value of the default property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDefault();
+
+    /**
+     * Gets the value of the required property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Boolean }
+     *     
+     */
+    public boolean isRequired();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Attribute.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Attribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..89a3fcae119b0856e8468fb83154d201c684869a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Attribute.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+import java.util.List;
+
+
+/**
+ * <p>Java class for Tattribute complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tattribute">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Value" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="adref" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="content" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface Attribute 
+{
+    /**
+     * Gets the value of the value property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the value property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getValue().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * 
+     * 
+     */
+    public List<String> getValue();
+
+    /**
+     * Gets the value of the adref property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getAdref();
+
+    /**
+     * Gets the value of the content property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getContent();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Designate.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Designate.java
new file mode 100644
index 0000000000000000000000000000000000000000..046013cb5c0ed17185b87c1489e7fcb21a6cbc2a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Designate.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+
+
+/**
+ * <p>Java class for Tdesignate complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tdesignate">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Object" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tobject"/>
+ *         &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="pid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="factoryPid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="bundle" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="optional" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       &lt;attribute name="merge" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface Designate 
+{
+    /**
+     * Gets the value of the object property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link TObject }
+     *     
+     */
+    public TObject getObject();
+
+    /**
+     * Gets the value of the pid property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getPid();
+
+    /**
+     * Gets the value of the factoryPid property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getFactoryPid();
+
+    /**
+     * Gets the value of the bundle property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getBundle();
+
+    /**
+     * Gets the value of the optional property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Boolean }
+     *     
+     */
+    public boolean isOptional();
+
+    /**
+     * Gets the value of the merge property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Boolean }
+     *     
+     */
+    public boolean isMerge();
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Icon.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Icon.java
new file mode 100644
index 0000000000000000000000000000000000000000..94e86add87dd82850a029fd1157f852277806143
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Icon.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+import java.math.BigInteger;
+
+
+/**
+ * <p>Java class for Ticon complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Ticon">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="resource" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="size" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface Icon 
+{
+    /**
+     * Gets the value of the resource property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getResource();
+
+    /**
+     * Gets the value of the size property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *     
+     */
+    public BigInteger getSize();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/MetaData.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/MetaData.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d9dda0dd4a61b9d47c9a90eac42bc47a9373507
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/MetaData.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+import java.util.List;
+
+
+/**
+ * <p>Java class for Tmetadata complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tmetadata">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="OCD" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tocd" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;element name="Designate" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tdesignate" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="localization" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface MetaData 
+{
+    /**
+     * Gets the value of the ocd property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the ocd property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getOCD().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link OCD }
+     * 
+     * 
+     */
+    public List<OCD> getOCD();
+
+    /**
+     * Gets the value of the designate property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the designate property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getDesignate().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Designate }
+     * 
+     * 
+     */
+    public List<Designate> getDesignate();
+
+    /**
+     * Gets the value of the localization property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getLocalization();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/OCD.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/OCD.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee88cfc911750a3cc320c359311dc814f517f631
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/OCD.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+import java.util.List;
+
+
+/**
+ * <p>Java class for Tocd complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tocd">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="AD" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tad" maxOccurs="unbounded"/>
+ *         &lt;element name="Icon" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Ticon" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface OCD 
+{
+    /**
+     * Gets the value of the ad property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the ad property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAD().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link AD }
+     * 
+     * 
+     */
+    public List<AD> getAD();
+
+    /**
+     * Gets the value of the icon property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the icon property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getIcon().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Icon }
+     * 
+     * 
+     */
+    public List<Icon> getIcon();
+
+    /**
+     * Gets the value of the name property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getName();
+
+    /**
+     * Gets the value of the description property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDescription();
+
+    /**
+     * Gets the value of the id property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getId();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Option.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Option.java
new file mode 100644
index 0000000000000000000000000000000000000000..3949eedcdf4c8fe6ab906ca4a3d8d64916d37ee1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Option.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+
+
+/**
+ * <p>Java class for Toption complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Toption">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="label" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface Option 
+{
+    /**
+     * Gets the value of the label property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getLabel();
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Scalar.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Scalar.java
new file mode 100644
index 0000000000000000000000000000000000000000..47589a3ce01188ced233cf97e6d9fd88e209decc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/Scalar.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+
+
+/**
+ * <p>Java class for Tscalar.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="Tscalar">
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     &lt;enumeration value="String"/>
+ *     &lt;enumeration value="Long"/>
+ *     &lt;enumeration value="Double"/>
+ *     &lt;enumeration value="Float"/>
+ *     &lt;enumeration value="Integer"/>
+ *     &lt;enumeration value="Byte"/>
+ *     &lt;enumeration value="Char"/>
+ *     &lt;enumeration value="Boolean"/>
+ *     &lt;enumeration value="Short"/>
+ *     &lt;enumeration value="Password"/>
+ *   &lt;/restriction>
+ * &lt;/simpleType>
+ * </pre>
+ * 
+ */
+public enum Scalar {
+
+    STRING("String"),
+    LONG("Long"),
+    DOUBLE("Double"),
+    FLOAT("Float"),
+    INTEGER("Integer"),
+    BYTE("Byte"),
+    CHAR("Char"),
+    BOOLEAN("Boolean"),
+    SHORT("Short"),
+    PASSWORD("Password");
+    private final String value;
+
+    Scalar(String v) {
+        value = v;
+    }
+
+    public String value() {
+        return value;
+    }
+
+    public static Scalar fromValue(String v) {
+        for (Scalar c: Scalar.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/TObject.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/TObject.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8c4746a756b21ecaeeda93782999be58abf81b9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/TObject.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+
+package org.eclipse.kura.configuration.metatype;
+
+import java.util.List;
+
+
+/**
+ * <p>Java class for Tobject complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tobject">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Attribute" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tattribute" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="ocdref" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+public interface TObject 
+{
+    /**
+     * Gets the value of the attribute property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the attribute property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAttribute().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Attribute }
+     * 
+     * 
+     */
+    public List<Attribute> getAttribute();
+
+    /**
+     * Gets the value of the ocdref property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getOcdref();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7c42fc60acfc52fbba3b6428d9d1b0373a68b8c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/metatype/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides expected schemas for JAXB bindings.
+ *
+ */
+package org.eclipse.kura.configuration.metatype;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a1fd5b3cc8c6f1b4d8436668a0b52267b6f7b23
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/configuration/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Contains services to manage all configurable components of the system. This provides an extension to the existing OSGi MetaTypeService services.
+ *
+ */
+package org.eclipse.kura.configuration;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/crypto/CryptoService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/crypto/CryptoService.java
new file mode 100644
index 0000000000000000000000000000000000000000..6473356e5e1c6868b18698cb3bad7ea87d5902f7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/crypto/CryptoService.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.crypto;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+
+/**
+ * The CryptoService is used to provide AES encrypt and decrypt functionality, Base64 encoding and
+ * decoding, and SHA1 hash generation. 
+ *
+ */
+public interface CryptoService 
+{
+	/**
+	 * Returns an AES encrypted string based on the provided value.
+	 * 
+	 * @param value A string that will be encrypted.
+	 * @return String that has been encrypted.
+	 * @throws NoSuchAlgorithmException
+	 * @throws NoSuchPaddingException
+	 * @throws InvalidKeyException
+	 * @throws IllegalBlockSizeException
+	 * @throws BadPaddingException
+	 */
+	public String encryptAes(String value) 
+			throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException;
+
+	/**
+	 * Returns a plain text string based on the provided encrypted value.
+	 * 
+	 * @param encryptedValue A string representing the value to be decrypted.
+	 * @return String that has been decrypted.
+	 * @throws NoSuchAlgorithmException
+	 * @throws NoSuchPaddingException
+	 * @throws InvalidKeyException
+	 * @throws IOException
+	 * @throws IllegalBlockSizeException
+	 * @throws BadPaddingException
+	 */
+	public String decryptAes(String encryptedValue) 
+			throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException;
+	
+	/**
+	 * Returns a SHA1 hashed value of the provided string s.
+	 * @param s A string on which to run the SHA1 hasing algorithm.
+	 * @return String that has been hashed.
+	 * @throws NoSuchAlgorithmException
+	 * @throws UnsupportedEncodingException
+	 */
+	public String sha1Hash(String s) 
+			throws NoSuchAlgorithmException, UnsupportedEncodingException;
+			
+	/**
+	 * Returns an encoded string based on the provided stringValue.
+	 * @param stringValue A string to be encoded.
+	 * @return String that has been encoded.
+	 * @throws NoSuchAlgorithmException
+	 * @throws UnsupportedEncodingException
+	 */
+	public String encodeBase64(String stringValue)
+			throws NoSuchAlgorithmException, UnsupportedEncodingException;
+	
+	/**
+	 * Returns a decoded string based on the provided encodedValue.
+	 * @param encodedValue A string to be decoded.
+	 * @return String that has been decoded.
+	 * @throws NoSuchAlgorithmException
+	 * @throws UnsupportedEncodingException
+	 */
+	public String decodeBase64(String encodedValue) 
+			throws NoSuchAlgorithmException, UnsupportedEncodingException;
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataService.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e93a9e0896e08b5a5844ebdfbf60dafcef57067
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataService.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.data;
+
+import java.util.List;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraNotConnectedException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.KuraTimeoutException;
+
+/**
+ * The DataService provides the ability of connecting to a remote
+ * broker, publish messages, subscribe to topics, receive messages on the
+ * subscribed topics, and disconnect from the remote message broker.
+ * The DataService delegates to the {@link DataTransportService} the implementation 
+ * of the transport protocol used to interact with the remote server.
+ * <br>
+ * The DataService offers methods and configuration options to manage the 
+ * connection to the remote server. For example, it can be configured
+ * to auto-connect to the remote server on start-up or it offers
+ * methods for applications to directly manage the connection. 
+ * It also adds the capability of storing published messages in a persistent store 
+ * and send them over the wire at a later time.
+ * The purpose is to relieve service users from implementing their own persistent store. 
+ * Service users may publish messages independently on the DataService connection status.
+ * <br> 
+ * In order to overcome the potential latencies introduced by buffering messages, 
+ * the DataService allows to assign a priority level to each published message. 
+ * Dependently on the store configuration there are certain guarantees that stored 
+ * messages are not lost due to sudden crashes or power outages.
+ * <br> 
+ * The whiteboard pattern {@link http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf}
+ * is used to notify the service users about events such as message arrived, connection lost etc.
+ * {@see DataServiceListener}
+ */
+public interface DataService 
+{
+	/**
+	 * Connects to the broker if not already connected.
+	 */
+	public void connect() throws KuraConnectException;
+
+	/**
+	 * Answers if the DataService is connected to the broker.
+	 * 
+	 * @return
+	 */
+	public boolean isConnected();
+	public boolean isAutoConnectEnabled();
+	public int getRetryInterval();
+	/**
+	 * Disconnects from the broker. This method will block, up to the specified
+	 * duration, allowing the protocol implementation to complete delivery of
+	 * in-flight messages before actually disconnecting from the broker.
+	 * If the Data Service is configured to auto-connect on startup and it's
+	 * explicitly disconnected it will not automatically reconnect.
+	 * 
+	 * @param quiesceTimeout
+	 */
+	public void disconnect(long quiesceTimeout);
+
+	/**
+	 * Subscribes to the specified topic with the remote server.
+	 * The method requires an active connection with the remote server and it is operates synchronously.
+	 * The implementation is a pass-through to the {@link DataTransportService#subscribe} method.
+	 * @param topic
+	 * @param qos
+	 * @throws KuraTimeoutException
+	 * @throws KuraException
+	 * @throws KuraNotConnectedException TODO
+	 */
+	public void subscribe(String topic, int qos) throws KuraTimeoutException, KuraException, KuraNotConnectedException;
+
+	/**
+	 * Unubscribes to the specified topic with the remote server.
+	 * The method requires an active connection with the remote server and it is operates synchronously.
+	 * The implementation is a pass-through to the {@link DataTransportService#unsubscribe} method.
+	 * 
+	 * @param topic
+	 * @throws KuraTimeoutException
+	 * @throws KuraException
+	 * @throws KuraNotConnectedException TODO
+	 */
+	public void unsubscribe(String topic) throws KuraTimeoutException, KuraException, KuraNotConnectedException;
+
+	/**
+	 * Publishes a message to the broker. This method quickly returns deferring
+	 * the actual message publication accordingly to the current service policy
+	 * and to the specified priority, 0 being the highest.
+	 * 
+	 * Messages are confirmed asynchronously to the caller by the
+	 * {@link DataServiceListener#onMessageConfirmed} callback.
+	 * 
+	 * A unique identifier is always returned, independently on the specified
+	 * QoS or priority level, which can be used to match the asynchronous
+	 * message confirm.
+	 * 
+	 * The actual semantics associated to a message confirm is as follows:
+	 * <ul>
+	 * <li>For messages published at QoS = 0, receiving the confirm just means that
+	 * the message is about to be transmitted on the wire without any guarantee
+	 * that it eventually will.</li>
+	 * <li>For messages published at QoS > 0, receiving the confirm means that the
+	 * broker acknowledged the message.</li>
+	 * </ul>
+	 *  
+	 * Priority level 0 (highest) should be used sparingly and reserved for
+	 * messages that should be sent with the minimum latency.
+	 * For example Cloud life-cycle messages are published with priority 0
+	 * as soon the connection is established and just before disconnecting. 
+	 * <br>
+	 * Data messages, tolerating an higher latency, may be published with a
+	 * lower priority. Within each priority level and each QoS level, messages 
+	 * are guaranteed do be delivered in order (oldest first).
+	 * <br>
+	 * The KuraStoreCapacityReachedException is thrown if the database buffer
+	 * has reached its capacity for messages that are not yet published or
+	 * they are still in transit. The limit does not apply to internal messages 
+	 * with the priority less than 2. 
+	 * These priority levels are reserved to the framework which uses it for life-cycle messages 
+	 * - birth and death certificates - and replies to request/response flows.
+	 * 
+	 * @param topic
+	 * @param payload
+	 * @param qos
+	 * @param retain
+	 * @param priority
+	 * @return
+	 * @throws KuraStoreException 
+	 */
+	public int publish(String topic, byte[] payload, int qos, boolean retain,
+			int priority) throws KuraStoreException;
+
+	/**
+	 * Finds the list of identifiers of messages that have not been published yet.
+	 * Given the service has no means of knowing who
+	 * published the message, a regex topic must be specified in order to find
+	 * only the relevant identifiers.
+	 * 
+	 * 
+	 * @param topicRegex
+	 * @return
+	 * @throws KuraStoreException
+	 */
+	List<Integer> getUnpublishedMessageIds(String topicRegex)
+			throws KuraStoreException;
+
+	/**
+	 * Finds the list of identifiers of messages that are still in-flight 
+	 * (messages published but not confirmed yet).
+	 * This only applies to messages published with QoS > 0.
+	 * Given the service has no means of knowing who
+	 * published the message, a regex topic must be specified in order to find
+	 * only the relevant identifiers.
+	 * 
+	 * @param topicRegex
+	 * @return
+	 * @throws KuraStoreException
+	 */
+	List<Integer> getInFlightMessageIds(String topicRegex)
+			throws KuraStoreException;
+
+	/**
+	 * Finds the list of identifiers of in-flight messages that have been dropped.
+	 * This only applies to messages published with QoS > 0.
+	 * On the establishment of a new connection, the service can be configured
+	 * either to republish or drop in-flight messages.
+	 * The former option can be used if service users tolerate publishing message
+	 * duplicates.
+	 * The latter option can be used it service users tolerate losing messages. 
+	 * Given the service has no means of knowing who
+	 * published the message, a regex topic must be specified in order to find
+	 * only the relevant identifiers.
+     */
+	List<Integer> getDroppedInFlightMessageIds(String topicRegex)
+			throws KuraStoreException;
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataServiceListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataServiceListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..0fbb84bd5027cb528323f5890d55c5adde97c845
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataServiceListener.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.data;
+
+/**
+ * Implementors of this interface will be able to handle {@link DataService}
+ * events such as notifications of connection establishing, message arrival, etc.
+ * In order to detect implementors, the {@link DataService} uses the The
+ * whiteboard pattern {@link http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf}.
+ * <br>
+ * All registered listeners are called synchronously by the {@link DataService} at the occurrence of the event.
+ * It expected that implementers of this interface do NOT perform long running tasks in the implementation of this interface.
+ */
+public interface DataServiceListener 
+{
+	/**
+	 * Notifies that the DataService has established a connection.
+	 */
+	public void onConnectionEstablished();
+
+	/**
+	 * Notifies that the DataService is about to cleanly disconnect. If
+	 * something needs to be done in reaction to this event, e.g. publishing a
+	 * special last message, it SHOULD be done before the method returns.
+	 * As soon as the method returns the DataService will start disconnecting.
+	 */
+	public void onDisconnecting();
+
+	/**
+	 * Notifies that the DataService has cleanly disconnected.
+	 */
+	public void onDisconnected();
+
+	/**
+	 * Notifies that the DataService has unexpectedly disconnected.
+	 */
+	public void onConnectionLost(Throwable cause);
+
+	/**
+	 * Notifies a message arrival.
+	 * 
+	 * @param topic
+	 * @param payload
+	 * @param qos
+	 * @param retained
+	 */
+	public void onMessageArrived(String topic, byte[] payload, int qos, boolean retained);
+
+	/**
+	 * Notifies the a message has been published. There is no guarantee the
+	 * message has been actually transmitted over the wire or that it eventually
+	 * will. The only guarantee is that message byte have been passed to the
+	 * underlying OS.
+	 * 
+	 * @param messageId
+	 */
+	public void onMessagePublished(int messageId, String topic);
+
+	/**
+	 * Confirms message delivery to the broker.
+	 * 
+	 * @param messageId
+	 */
+	public void onMessageConfirmed(int messageId, String topic);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b544b3a7616a782ec34882d7bf83f67777852b9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportListener.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.data;
+
+/**
+ * Listener interface to be implemented by applications that needs to be notified of events in the {@link DataTransportService}.
+ * All registered listeners are called synchronously by the {@link DataTransportService} at the occurrence of the event.
+ * It expected that implementers of this interface do NOT perform long running tasks in the implementation of this interface.
+ */
+public interface DataTransportListener 
+{	
+	/**
+	 * Notifies the listener of the establishment of the new connection with the remote server.
+	 * @param newSession true if the connection is to the same broker with the same client ID.
+	 */
+    public void onConnectionEstablished(boolean newSession);
+    
+	/**
+	 * Notifies the listener that the connection to the remote server is about to be terminated.
+	 */
+    public void onDisconnecting();
+    
+	/**
+	 * Notifies the listener that the connection to the remote server has been terminated.
+	 */
+    public void onDisconnected();
+    
+	/**
+	 * Notifies the {@link DataTransportService} has received a configuration update.
+	 */
+    public void onConfigurationUpdating(boolean wasConnected);
+
+    /**
+	 * Notifies the {@link DataTransportService} has received a configuration update and it has applied the new configuration
+	 */
+    public void onConfigurationUpdated(boolean wasConnected);
+    
+	/**
+	 * Notifies the listener that the connection to the remote server has been lost.
+	 */
+	public void onConnectionLost(Throwable cause);
+
+	/**
+	 * Notifies the listener that a new message has been received from the remote server.
+	 */
+	public void onMessageArrived(String topic, byte [] payload, int qos, boolean retained);
+	
+
+	/**
+	 * Notifies the listener that a message has been confirmed by the remote server.
+	 */
+	public void onMessageConfirmed(DataTransportToken token);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportService.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec446d458417d19e0cc1f30c905232e7bb7ca5e8
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportService.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.data;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraNotConnectedException;
+import org.eclipse.kura.KuraTimeoutException;
+import org.eclipse.kura.KuraTooManyInflightMessagesException;
+
+
+/**
+ * DataTransportService implementations provide the ability of connecting to a
+ * remote broker, publish messages, subscribe to topics, receive messages on the
+ * subscribed topics, and disconnect from the remote message broker.
+ * 
+ * The whiteboard pattern {@link http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf} 
+ * is used to notify the service users about events such as message arrived, connection lost etc.
+ * 
+ * {@see DataTransportListener}
+ */
+public interface DataTransportService 
+{
+	/**
+	 * Connects to the remote broker. This method will block until the
+	 * connection is established or a timeout occurs. The actual configuration
+	 * needed to establish a connection is protocol specific (e.g. MQTT) and is
+	 * exposed through the ConfigurationAdmin.
+	 * 
+	 * @throws KuraConnectException the caller MAY retry connecting a later time.
+	 */
+	public void connect() throws KuraConnectException;
+
+	/**
+	 * Returns true if the DataTransportService is currently connected to the remote server.
+	 */
+	public boolean isConnected();
+	public String getBrokerUrl();
+	/**
+	 * Returns the account name associated with the DataTransportService
+	 */
+	public String getAccountName();
+	public String getUsername();
+	
+	public String getClientId();
+	
+	/**
+	 * Disconnects from the broker. This method will block, up to the specified
+	 * duration, allowing the protocol implementation to complete delivery of
+	 * in-flight messages before actually disconnecting from the broker.
+	 * 
+	 * @param quiesceTimeout - timeout that will be used before forcing a disconnect
+	 */
+	public void disconnect(long quiesceTimeout);
+
+	/**
+	 * Subscribes to a topic on the broker. This method MAY block until the
+	 * underlying protocol message (e.g. the MQTT SUBSCRIBE message) is
+	 * acknowledged by the broker or a timeout occurs. This message is
+	 * idempotent so the caller may safely retry subscribing. The timeout
+	 * interval used by the service is configurable through the
+	 * ConfigurationService.
+	 * 
+	 * @param topic
+	 * @param qos
+	 * @throws KuraTimeoutException TODO
+	 * @throws KuraException 
+	 * @throws KuraNotConnectedException TODO
+	 */
+	public void subscribe(String topic, int qos) throws KuraTimeoutException, KuraException, KuraNotConnectedException;
+
+	/**
+	 * Unsubscribes to a topic on the broker. This method MAY block until the
+	 * underlying protocol message (e.g. the MQTT UNSUBSCRIBE message) is
+	 * acknowledged by the broker or a timeout occurs. The timeout
+	 * interval used by the service is configurable through the
+	 * ConfigurationService.
+	 *
+	 * @param topic
+	 * @throws KuraTimeoutException
+	 * @throws KuraException
+	 * @throws KuraNotConnectedException TODO
+	 */
+	public void unsubscribe(String topic) throws KuraTimeoutException, KuraException, KuraNotConnectedException;
+
+	/**
+	 * Enqueues a message for publishing with the underlying transport implementation.
+	 * An active connection to the remote server is required.
+	 * 
+	 * @param topic
+	 * @param payload
+	 * @param qos
+	 * @param retain
+	 * @return
+	 * @throws KuraTooManyInflightMessagesException
+	 * @throws KuraException
+	 * @throws KuraNotConnectedException TODO
+	 */
+	public DataTransportToken publish(String topic, byte[] payload, int qos, boolean retain)
+			throws KuraTooManyInflightMessagesException, KuraException, KuraNotConnectedException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportToken.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..89e1d9d98dbdadcacadb5a8357196e544de999c5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/DataTransportToken.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.data;
+
+/**
+ * DataTransportToken is an receipt returned by the {@link DataTransportService} after the publishing of a message.
+ * Such receipt can be used to track and compare subsequence message confirmation callbacks.  
+ */
+public class DataTransportToken 
+{
+	private int messageId;
+	private String sessionId;
+	
+	public DataTransportToken(int messageId, String sessionId) {
+		super();
+		this.messageId = messageId;
+		this.sessionId = sessionId;
+	}
+
+	public int getMessageId() {
+		return messageId;
+	}
+
+	public String getSessionId() {
+		return sessionId;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + messageId;
+		result = prime * result
+				+ ((sessionId == null) ? 0 : sessionId.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		DataTransportToken other = (DataTransportToken) obj;
+		if (messageId != other.messageId)
+			return false;
+		if (sessionId == null) {
+			if (other.sessionId != null)
+				return false;
+		} else if (!sessionId.equals(other.sessionId))
+			return false;
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..b873944889c2beb01bb365f68f6316b4c4fb05ba
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/data/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides services for connecting and communicating with a MQTT broker.
+ *
+ */
+package org.eclipse.kura.data;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/db/DbService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/db/DbService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3aa45b098dbb77f8f473d5e3da911e1d66f0545b
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/db/DbService.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.db;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * DbService offers APIs to acquire and use a JDBC Connection to the embedded SQL database running in the framework. 
+ * The configuration of the DbService will determine the configuration of the embedded SQL database.
+ * The usage of API is typical for JDBC Connections; the connection is first acquired with getConnection(),
+ * and it must be released when the operation is completed with close(). The implementation of the
+ * DbService and the returned JdbcConnection will manage the concurrent access into the database appropriately. 
+ */
+public interface DbService 
+{
+	/**
+	 * Returns the JDBC Connection to be used to communicate with the embedded SQL database.
+	 * For each acquired connection, the DbService.close() method must be called. 
+	 * @return Connection to be used
+	 * @throws SQLException
+	 */
+	public Connection getConnection() throws SQLException;
+
+	/**
+	 * Releases a previously acquired JDCB connection to the DbService.
+	 * @param conn to be released
+	 */
+	public void close(Connection conn);
+
+	/**
+	 * Utility method to silently rollback a JDBC Connection without throwing SQLExcepton.
+	 * The method will catch any SQLExcepton thrown and log it.
+	 */	
+	public void rollback(Connection conn);
+		
+	/**
+	 * Utility method to silently close a JDBC ResultSet without throwing SQLExcepton.
+	 * The method will catch any SQLExcepton thrown and log it.
+	 */	
+	public void close(ResultSet... rss);
+	
+	/**
+	 * Utility method to silently close a JDBC Statement without throwing SQLExcepton.
+	 * The method will catch any SQLExcepton thrown and log it.
+	 */	
+	public void close(Statement... stmts);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/db/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/db/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..0675b75a6b4f35abbc2d67da88366e433295255a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/db/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides APIs to acquire and use a JDBC Connection to the embedded SQL database running in the framework. 
+ *
+ */
+package org.eclipse.kura.db;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/linux/udev/LinuxUdevListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/linux/udev/LinuxUdevListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ae1df8b77cbc4d569355b3cf8b7b90ebaa57975
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/linux/udev/LinuxUdevListener.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.udev;
+
+import org.eclipse.kura.usb.UsbDevice;
+
+public interface LinuxUdevListener {
+
+	/**
+	 * Callback for notifications of new UsbDevice ATTACH events
+	 *
+	 * @param device	The UsbDevice that was just attached
+	 */
+	void attached(UsbDevice device);
+
+	/**
+	 * Callback for notifications of new UsbDevice DETACH events
+	 *
+	 * @param device	The UsbDevice that was just detached
+	 */
+	void detached(UsbDevice device);
+}
+
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/linux/udev/UdevEventType.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/linux/udev/UdevEventType.java
new file mode 100644
index 0000000000000000000000000000000000000000..c26f7e04cb21f7e6a38923ae865f674c1d61f898
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/linux/udev/UdevEventType.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.udev;
+
+public enum UdevEventType {
+
+	ATTACHED,
+	DETACHED;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraPayload.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..de9a4484eb1cf55421a78d67fccffc015e0f431f
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraPayload.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.message;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * EdcPayload defines the recommended payload structure for the messages sent to the Everyware Cloud platform.
+ * Eurotech designed the format as an open format that is flexible from the aspect of data modeling
+ * yet is efficient when it comes to bandwidth conservation. The same payload model is used by the REST API 
+ * - in which case it is serialized into XML or JSON as requested by the client - or uses the efficient 
+ * Google ProtoBuf when sent over an MQTT connection when the bandwidth is very important.  
+ * The EdcPayload contains the following fields: sentOn timestamp, an optional set of metrics represented as 
+ * name-value pairs, an optional position field to capture a GPS position, and an optional binary body. 
+ * <ul>
+ * <li>sentOn: it is the timestamp when the data was captured and sent to the Everyware Cloud platform.
+ * <li>metrics: a metric is a data structure composed of the name, a value, and the type of the value.
+ *     When used with the REST API valid metric types are: string, double, int, float, long, boolean, base64Binary.
+ *     Data exposed into the payload metrics can be processed through the real-time rules offered by the 
+ *     Everyware Cloud platform or used as query criteria when searching for messages through the messages/searchByMetric API.
+ *     Each payload can have zero or more metrics. 
+ * <li>position: it is an optional field  used to capture a geo position associated to this payload.
+ * <li>body: it is an optional part of the payload that allows additional information to be transmitted in any format determined by the user.  
+ * This field will be stored into the platform database, but the Everyware Cloud cannot apply any statistical analysis on it.
+ * </ul>
+ */
+public class KuraPayload 
+{
+	/**
+	 * Timestamp when the data was captured and sent to the Everyware Cloud platform.
+	 */
+ 	private Date			   timestamp;
+
+    /**
+     * It is an optional field used to capture a geo position associated to this payload.
+     */
+    private KuraPosition		   position;
+
+    /**
+     * A metric is a data structure composed of the name, a value, and the type of the value.
+     * When used with the REST API valid metric types are: string, double, int, float, long, boolean, base64Binary.
+     * Data exposed into the payload metrics can be processed through the real-time rules offered by the 
+     * Everyware Cloud platform or used a query criteria when searching for messages through the messages/searchByMetric API.
+     * Each payload can have zero or more metrics.
+     */
+    private Map<String,Object> metrics;
+	
+    /**
+     * It is an optional part of the payload that allows additional information to be transmitted in any format determined by the user.  
+     * This field will be stored into the platform database but the Everyware Cloud cannot apply any statistical analysis on it.
+     */
+    private byte[]             body;
+
+	
+	public KuraPayload() {
+		this.metrics = new HashMap<String,Object>();
+		this.body    = null;
+	}
+	
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+
+    public KuraPosition getPosition() {
+		return position;
+	}
+	
+	public void setPosition(KuraPosition position) {
+		this.position = position;
+	}
+	
+	public Object getMetric(String name) {
+		return metrics.get(name);
+	}
+
+	public void addMetric(String name, Object value) {
+		metrics.put(name, value);
+	}
+	
+	public void removeMetric(String name) {
+		metrics.remove(name);
+	}
+
+    public void removeAllMetrics() {
+        metrics.clear();
+    }
+
+    public Set<String> metricNames() {
+		return Collections.unmodifiableSet(metrics.keySet());
+	}
+	
+	public Iterator<String> metricsIterator() {
+		return metrics.keySet().iterator();
+	}
+
+	public Map<String,Object> metrics() {
+		return Collections.unmodifiableMap(metrics);
+	}
+
+	public byte[] getBody() {
+		return body;
+	}
+	
+	public void setBody(byte[] body) {
+		this.body = body;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraPosition.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraPosition.java
new file mode 100644
index 0000000000000000000000000000000000000000..2195673051c8dc6e4e49e7929abf988f3717ffea
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraPosition.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.message;
+
+import java.util.Date;
+
+/**
+ * EdcPosition is a data structure to capture a geo location. It can be
+ * associated to an EdcPayload to geotag an EdcMessage before sending to the
+ * Everyware Cloud. Refer to the description of each of the fields for more
+ * information on the model of EdcPosition.
+ */
+public class KuraPosition 
+{
+	/**
+	 * Longitude of this position in degrees. This is a mandatory field.
+	 */
+	private Double longitude;
+
+	/**
+	 * Latitude of this position in degrees. This is a mandatory field.
+	 */
+	private Double latitude;
+
+	/**
+	 * Altitude of the position in meters.
+	 */
+	private Double altitude;
+
+	/**
+	 * Dilution of the precision (DOP) of the current GPS fix.
+	 */
+	private Double precision;
+
+	/**
+	 * Heading (direction) of the position in degrees
+	 */
+	private Double heading;
+
+	/**
+	 * Speed for this position in meter/sec.
+	 */
+	private Double speed;
+
+	/**
+	 * Timestamp extracted from the GPS system
+	 */
+	private Date timestamp;
+
+	/**
+	 * Number of satellites seen by the systems
+	 */
+	private Integer satellites;
+
+	/**
+	 * Status of GPS system: 1 = no GPS response, 2 = error in response, 4 =
+	 * valid.
+	 */
+	private Integer status;
+
+	public KuraPosition() {
+	}
+
+	public Double getLongitude() {
+		return longitude;
+	}
+
+	public void setLongitude(double longitude) {
+		this.longitude = longitude;
+	}
+
+	public Double getLatitude() {
+		return latitude;
+	}
+
+	public void setLatitude(double latitude) {
+		this.latitude = latitude;
+	}
+
+	public Double getAltitude() {
+		return altitude;
+	}
+
+	public void setAltitude(double altitude) {
+		this.altitude = altitude;
+	}
+
+	public Double getPrecision() {
+		return precision;
+	}
+
+	public void setPrecision(double precision) {
+		this.precision = precision;
+	}
+
+	public Double getHeading() {
+		return heading;
+	}
+
+	public void setHeading(double heading) {
+		this.heading = heading;
+	}
+
+	public Double getSpeed() {
+		return speed;
+	}
+
+	public void setSpeed(double speed) {
+		this.speed = speed;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public Integer getSatellites() {
+		return satellites;
+	}
+
+	public void setSatellites(int satellites) {
+		this.satellites = satellites;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(int status) {
+		this.status = status;
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraRequestPayload.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraRequestPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..60ec64ad732178429760f851e8d6ac07a8e69354
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraRequestPayload.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.message;
+
+import java.text.ParseException;
+
+public class KuraRequestPayload extends KuraPayload 
+{
+	public static final String METRIC_REQUEST_ID   = "request.id";
+	public static final String REQUESTER_CLIENT_ID = "requester.client.id";
+	
+	public KuraRequestPayload() {
+		super();
+	}
+	
+	public KuraRequestPayload(KuraPayload payload) {
+		super();
+		
+		for (String name : payload.metricNames()) {
+			Object value = payload.getMetric(name);
+			addMetric(name, value);
+		}
+		
+		setBody(payload.getBody());
+		setPosition(payload.getPosition());
+		setTimestamp(payload.getTimestamp());
+	}
+	
+	public String getRequestId() {
+		return (String) getMetric(METRIC_REQUEST_ID);
+	}
+	
+	public void setRequestId(String requestId) {
+		addMetric(METRIC_REQUEST_ID, requestId);
+	}
+	
+	public String getRequesterClientId() {
+		return (String) getMetric(REQUESTER_CLIENT_ID);
+	}
+	
+	public void setRequesterClientId(String requesterClientId) {
+		addMetric(REQUESTER_CLIENT_ID, requesterClientId);
+	}
+	
+	public static KuraRequestPayload buildFromKuraPayload(KuraPayload payload) throws ParseException 
+	{
+		if (payload.getMetric(METRIC_REQUEST_ID) == null) {
+			throw new ParseException("Not a valid request payload", 0);
+		}		
+		KuraRequestPayload requestPayload = new KuraRequestPayload(payload);
+		return requestPayload;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraResponsePayload.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraResponsePayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..86d17930e0eb63b2599820221c3b0db77bd1d60d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraResponsePayload.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.message;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class KuraResponsePayload extends KuraPayload
+{
+	public static final int RESPONSE_CODE_OK          = 200;
+	public static final int RESPONSE_CODE_BAD_REQUEST = 400;
+	public static final int RESPONSE_CODE_NOTFOUND    = 404;
+	public static final int RESPONSE_CODE_ERROR       = 500;
+
+	public static final String METRIC_RESPONSE_CODE   = "response.code";
+	public static final String METRIC_EXCEPTION_MSG   = "response.exception.message";
+	public static final String METRIC_EXCEPTION_STACK = "response.exception.stack";
+	
+	public KuraResponsePayload(int responseCode) 
+	{
+		super();
+		addMetric(METRIC_RESPONSE_CODE, Integer.valueOf(responseCode));
+	}
+
+	public KuraResponsePayload(Throwable t) 
+	{
+		this(RESPONSE_CODE_ERROR, t);
+	}
+
+	public KuraResponsePayload(int responseCode, Throwable t)
+	{
+		super();
+		addMetric(METRIC_RESPONSE_CODE, Integer.valueOf(responseCode));
+		setException(t);
+	}
+	
+	public KuraResponsePayload(KuraPayload kuraPayload)
+	{
+		for (String name : kuraPayload.metricNames()) {
+			Object value = kuraPayload.getMetric(name);
+			addMetric(name, value);
+		}
+		setBody(kuraPayload.getBody());
+	}
+	
+	public int getResponseCode() {
+		return (Integer) getMetric(METRIC_RESPONSE_CODE);
+	}
+	
+	public void setResponseCode(int responseCode) {
+		addMetric(METRIC_RESPONSE_CODE, Integer.valueOf(responseCode));
+	}
+	
+	public String getExceptionMessage() {
+		return (String) getMetric(METRIC_EXCEPTION_MSG);
+	}
+	
+	public void setExceptionMessage(String message) {
+		if (message != null) {
+			addMetric(METRIC_EXCEPTION_MSG, message);
+		}
+	}
+	
+	public String getExceptionStack() {
+		return (String) getMetric(METRIC_EXCEPTION_STACK);
+	}
+	
+	public void setExceptionStack(String stack) {
+		if (stack != null) {
+			addMetric(METRIC_EXCEPTION_STACK, stack);
+		}
+	}
+	
+	public void setException(Throwable t) {
+		if (t != null) {
+			addMetric(METRIC_EXCEPTION_MSG, t.getMessage());		
+			addMetric(METRIC_EXCEPTION_STACK, stackTraceAsString(t));		
+		}
+	}
+	
+	private String stackTraceAsString(Throwable t) {
+		StringWriter sw = new StringWriter();
+		PrintWriter pw = new PrintWriter(sw);
+		t.printStackTrace(pw);
+		return sw.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraTopic.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraTopic.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bd96dc9b1ce478104a473624721029d3c098283
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraTopic.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.message;
+
+/**
+ * Models a topic for messages posted to the Kura platform.
+ * Topic are expected to be in the form of "account/asset/<application_specific>";
+ * system topic starts with the $EDC account. 
+ */
+public class KuraTopic 
+{	
+	private String   m_fullTopic;
+	private String[] m_topicParts;
+	private String   m_prefix;
+	private String   m_accountName;
+	private String   m_deviceId;
+	private String   m_applicationId;
+	private String   m_applicationTopic;
+
+	public KuraTopic(String fullTopic) 
+	{	    
+		m_fullTopic = fullTopic;		
+		if(fullTopic.compareTo("#") == 0) {
+			return;
+		}
+		
+		m_topicParts = fullTopic.split("/");		
+		if (m_topicParts.length == 0) {
+			return;
+		}
+		
+		// prefix
+		int index  = 0;
+		int offset = 0; // skip a slash
+		if (m_topicParts[0].startsWith("$")) {			
+			m_prefix = m_topicParts[index];
+			offset += m_prefix.length()+1;
+			index++;
+		}
+		
+		// account name
+		if (index < m_topicParts.length) {
+			m_accountName = m_topicParts[index];
+			offset += m_accountName.length()+1;
+			index++;
+		}
+
+		// deviceId
+		if (index < m_topicParts.length) {
+			m_deviceId = m_topicParts[index];
+			offset += m_deviceId.length()+1;
+			index++;
+		}
+
+		// applicationId
+		if (index < m_topicParts.length) {
+			m_applicationId = m_topicParts[index];
+			offset += m_applicationId.length()+1;
+			index++;
+		}
+		
+		// applicationTopic
+		if (offset < m_fullTopic.length()) {
+			m_applicationTopic = m_fullTopic.substring(offset);
+		}
+	}
+
+	public String getFullTopic() {
+		return m_fullTopic;
+	}
+
+	public String[] getTopicParts() {
+		return m_topicParts;
+	}
+
+	public String getPrefix() {
+		return m_prefix;
+	}
+
+	public String getAccountName() {
+		return m_accountName;
+	}
+
+	public String getDeviceId() {
+		return m_deviceId;
+	}
+
+	public String getApplicationId() {
+		return m_applicationId;
+	}
+
+	public String getApplicationTopic() {
+		return m_applicationTopic;
+	}
+	
+/*	
+	public static void main(String argv[]) 
+	{
+		KuraTopic topic = new KuraTopic("$EDC/edcguest/68:A8:6D:27:B4:B0/DEPLOY-V1/GET/packages");
+		System.err.println(topic.getPrefix());
+		System.err.println(topic.getAccountName());
+		System.err.println(topic.getDeviceId());
+		System.err.println(topic.getApplicationId());
+		System.err.println(topic.getApplicationTopic());
+
+		KuraTopic topic1 = new KuraTopic("edcguest/68:A8:6D:27:B4:B0/app/appTopic1/appTopic2");
+		System.err.println(topic1.getPrefix());
+		System.err.println(topic1.getAccountName());
+		System.err.println(topic1.getDeviceId());
+		System.err.println(topic1.getApplicationId());
+		System.err.println(topic1.getApplicationTopic());
+	}
+*/
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..54c06f89f002e098f2b0ab60caf833ab11817c5c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Defines the recommended payload structure for the messages sent to the Everyware Cloud platform.
+ *
+ */
+package org.eclipse.kura.message;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/ConnectionInfo.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/ConnectionInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..302484ec881bdfd2b4f775109353bd14a8801f61
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/ConnectionInfo.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.List;
+
+/**
+ * Interface for network interface 'connection info'.  At runtime an interface may be associated with
+ * gateways or DNS but the interface itself may not be active.  If this is the case the ConnectionInfo
+ * class is used to keep all relevant information in the event that this interface should become the 
+ * active one.  This is necessary because many operating systems to not persist this information.
+ */
+public interface ConnectionInfo {
+	
+	/**
+	 * Gets the gateway address associated with this interface
+	 * 
+	 * @return		A IP4Address representing the gateway if it is not null
+	 */
+	public IP4Address getGateway();
+		
+	/**
+	 * Gets the DNS addresses associated with this interface
+	 * 
+	 * @return		A List of IP4Address objects representing the DNS of this interface.  If there are none it returns an empty list.
+	 */
+	public List<IP4Address> getDnsServers();
+
+	/**
+	 * Gets the interface name associated with this connection information
+	 * 
+	 * @return		The interface name associated with this connection information
+	 */
+	public String getIfaceName();
+	
+	/**
+	 * Reports IP address
+	 * 
+	 * @return IP address as {@link IP4Address}
+	 */
+	public IP4Address getIpAddress();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/EthernetInterface.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/EthernetInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a4ba9d54437a6f17df1f395e71e0ad5591e843a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/EthernetInterface.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Network interface for Ethernet cards. 
+ */
+public interface EthernetInterface<T extends NetInterfaceAddress> extends NetInterface<T> 
+{	
+	/**
+	 * Indicates whether the physical carrier is found (e.g. whether a cable is plugged in or not).
+	 * @return
+	 */
+	public boolean isLinkUp();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/EthernetMonitorService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/EthernetMonitorService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1df09d1362df01998cd42b8d29e1156257b8bbb
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/EthernetMonitorService.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Placeholder for the EthernetLinkStateMonitorService
+ * 
+ * @author eurotech
+ *
+ */
+public interface EthernetMonitorService {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IP4Address.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IP4Address.java
new file mode 100644
index 0000000000000000000000000000000000000000..6302ac68ee616d26d08135838d7f91c477129a75
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IP4Address.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * This class represents an Internet Protocol version 4 (IPv4) address. 
+ */
+public class IP4Address extends IPAddress 
+{
+	IP4Address(byte[] addr, java.net.InetAddress jnAddress) {
+		super(addr, jnAddress);
+	}
+	
+	@Override
+	public String toString() {
+	    return this.getHostAddress();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IP6Address.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IP6Address.java
new file mode 100644
index 0000000000000000000000000000000000000000..0237610e7d63b3b2d6a35417ad4262c4db1a8d29
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IP6Address.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * This class represents an Internet Protocol version 6 (IPv6) address.
+ */
+public class IP6Address extends IPAddress
+{
+	IP6Address(byte[] addr, java.net.InetAddress jnAddress) {
+		super(addr, jnAddress);
+	}
+
+	/**
+	 * Utility routine to check if the InetAddress is an IPv4 compatible IPv6 address.
+	 * @return a boolean indicating if the InetAddress is an IPv4 compatible IPv6 address; or false if address is IPv4 address.
+	 */
+	public boolean isIPv4CompatibleAddress() {
+		return ((java.net.Inet6Address) javaNetAddress).isIPv4CompatibleAddress();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IPAddress.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IPAddress.java
new file mode 100644
index 0000000000000000000000000000000000000000..bfc54f901013d50d02528fb99eb654ba4c74fa5c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/IPAddress.java
@@ -0,0 +1,223 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+
+/**
+ * This class represents an Internet Protocol (IP) address.
+ */
+public abstract class IPAddress 
+{
+	private   byte[] address;
+	protected java.net.InetAddress javaNetAddress;
+	
+	IPAddress(byte[] address,
+				java.net.InetAddress jnAddress) 
+	{
+		this.address = address;
+		this.javaNetAddress = jnAddress;
+	}
+	
+	/**
+	 * Returns an InetAddress object given the raw IP address. 
+	 * The argument is in network byte order: the highest order byte of the address is in getAddress()[0].
+	 * This method doesn't block, i.e. no reverse name service lookup is performed.
+	 * <br/>
+	 * IPv4 address byte array must be 4 bytes long and IPv6 byte array must be 16 bytes long
+	 * @param addr - the raw IP address in network byte order
+	 * @return an InetAddress object created from the raw IP address.
+	 */
+	public static IPAddress getByAddress(byte[] addr)
+		throws UnknownHostException
+	{
+		IPAddress result = null;
+		java.net.InetAddress jnetAddr = null;
+		if(addr.length==16) {
+	    	StringBuffer sb = new StringBuffer();
+	    	for(int i=0; i<16; i=i+2) {
+	       		sb.append(Integer.toHexString(0xFF & addr[i]));
+	       		sb.append(Integer.toHexString(0xFF & addr[i+1]));
+	       		if(i!=14) {
+	       			sb.append(":");
+	       		}
+	       	}
+	    	jnetAddr = java.net.InetAddress.getByName(sb.toString());
+		} else {
+			jnetAddr = java.net.InetAddress.getByAddress(addr);
+		}
+		if (jnetAddr instanceof java.net.Inet4Address) {
+			result = new IP4Address(addr, jnetAddr);
+		}
+		else if (jnetAddr instanceof java.net.Inet6Address) {
+			result = new IP6Address(addr, jnetAddr);
+		}
+		return result;
+	}
+	
+	//TODO - only works on IPv4 now
+	public static IPAddress getByAddress(int addr) throws UnknownHostException {
+
+		StringBuffer sb = new StringBuffer();
+		for (int shift = 24; shift > 0; shift -= 8) {
+			// process 3 bytes, from high order byte down
+			sb.append(Integer.toString((addr >>> shift) & 0xff));
+			sb.append('.');
+		}
+		sb.append(Integer.toString(addr & 0xff));
+
+		InetAddress jnetAddr = InetAddress.getByName(sb.toString());
+		return getByAddress(jnetAddr.getAddress());
+	}
+	
+	/**
+	 * Parse a literal representation of an IP address and returns the 
+	 * corresponding IPAddress class.
+	 * 
+	 * @param hostAddress
+	 * @return
+	 */
+	public static IPAddress parseHostAddress(String hostAddress)
+		throws UnknownHostException
+	{
+		InetAddress jnetAddr = InetAddress.getByName(hostAddress);
+		return getByAddress(jnetAddr.getAddress()); 
+	}
+	
+	/**
+	 * Returns the raw IP address of this InetAddress object. 
+	 * The result is in network byte order: the highest order byte of the address is in getAddress()[0].
+	 * @return the raw IP address of this object.
+	 */
+	public byte[] getAddress() {
+		return address;
+	}
+
+	/**
+	 * Returns the IP address string in textual presentation.
+	 * @return the raw IP address in a string format.
+	 */
+	public String getHostAddress() {
+		return javaNetAddress.getHostAddress();
+	}
+
+	/**
+	 * Utility routine to check if the InetAddress in a wildcard address.
+	 * @return a boolean indicating if the Inetaddress is a wildcard address.
+	 */
+	public boolean isAnyLocalAddress() {
+		return javaNetAddress.isAnyLocalAddress();
+	}
+
+	/**
+	 * Utility routine to check if the InetAddress is an link local address.
+	 * @return a boolean indicating if the InetAddress is a link local address; or false if address is not a link local unicast address.
+	 */
+	public boolean isLinkLocalAddress() {
+		return javaNetAddress.isLinkLocalAddress();
+	}
+
+	/**
+	 * Utility routine to check if the InetAddress is a loopback address.
+	 * @return a boolean indicating if the InetAddress is a loopback address; or false otherwise.
+	 */
+	public boolean isLoopbackAddress() {
+		return javaNetAddress.isLoopbackAddress();
+	}
+
+	/**
+	 * Utility routine to check if the multicast address has global scope.
+	 * @return a boolean indicating if the address has is a multicast address of global scope, false if it is not of global scope or it is not a multicast address
+	 */
+	public boolean isMCGlobal() {
+		return javaNetAddress.isMCGlobal();
+	}
+
+	/**
+	 * Utility routine to check if the multicast address has link scope.
+	 * @return a boolean indicating if the address has is a multicast address of link-local scope, false if it is not of link-local scope or it is not a multicast address
+	 */
+	public boolean isMCLinkLocal() {
+		return javaNetAddress.isMCLinkLocal();
+	}
+
+	/**
+	 * Utility routine to check if the multicast address has node scope.
+	 * @return a boolean indicating if the address has is a multicast address of node-local scope, false if it is not of node-local scope or it is not a multicast address
+	 */
+	public boolean isMCNodeLocal() {
+		return javaNetAddress.isMCNodeLocal();
+	}
+
+	/**
+	 * Utility routine to check if the multicast address has organization scope.
+	 * @return a boolean indicating if the address has is a multicast address of organization-local scope, false if it is not of organization-local scope or it is not a multicast address
+	 */
+	public boolean isMCOrgLocal() {
+		return javaNetAddress.isMCOrgLocal();
+	}
+
+	/**
+	 * Utility routine to check if the multicast address has site scope.
+	 * @return a boolean indicating if the address has is a multicast address of site-local scope, false if it is not of site-local scope or it is not a multicast address
+	 */
+	public boolean isMCSiteLocal() {
+		return javaNetAddress.isMCSiteLocal();
+	}
+
+	/**
+	 * Utility routine to check if the InetAddress is an IP multicast address.
+	 * @return
+	 */
+	public boolean isMulticastAddress() {
+		return javaNetAddress.isMulticastAddress();
+	}
+
+	/**
+	 * Utility routine to check if the InetAddress is a site local address.}
+	 * @return a boolean indicating if the InetAddress is a site local address; or false if address is not a site local unicast address.
+	 */
+	public boolean isSiteLocalAddress() {
+		return javaNetAddress.isSiteLocalAddress();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + Arrays.hashCode(address);
+		result = prime * result
+				+ ((javaNetAddress == null) ? 0 : javaNetAddress.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		IPAddress other = (IPAddress) obj;
+		if (!Arrays.equals(address, other.address))
+			return false;
+		if (javaNetAddress == null) {
+			if (other.javaNetAddress != null)
+				return false;
+		} else if (!javaNetAddress.equals(other.javaNetAddress))
+			return false;
+		return true;
+	}	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/LoopbackInterface.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/LoopbackInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d314251ad9181b7f236dd83f7f99a914e6fa4f3
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/LoopbackInterface.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Placeholder for a LoopbackInterface
+ * 
+ * @author eurotech
+ *
+ * @param <T>
+ */
+public interface LoopbackInterface<T extends NetInterfaceAddress> extends NetInterface<T> {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd6f99794d741457d70b747ed3f789cb18030fe6
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+
+/**
+ * Marker interface for all network configuration classes
+ */
+public interface NetConfig {
+
+	/**
+	 * Checks whether or not this configuration is valid.
+	 * 
+	 * @return		true if the configuration is valid, otherwise false
+	 */
+	public boolean isValid();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig4.java
new file mode 100644
index 0000000000000000000000000000000000000000..73f70655813ec340ca423970a3bb6cadb409d642
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig4.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Marker interface for IPv4-based configurations of network interfaces
+ */
+public interface NetConfig4 extends NetConfig 
+{
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig6.java
new file mode 100644
index 0000000000000000000000000000000000000000..2166177c6d0b8f9a7c6fa36612a6b408c1c4e81e
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfig6.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Marker interface for IPv6-based configurations of network interfaces
+ */
+public interface NetConfig6 extends NetConfig 
+{
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP.java
new file mode 100644
index 0000000000000000000000000000000000000000..907271303e6dbc48e0ce373a9e6c0ccc7053b09f
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP.java
@@ -0,0 +1,446 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+
+/**
+ * Base class for configuration of network interfaces.
+ * The two subclasses NetConfigIP4 and NetConfigIP6 represent 
+ * configurations of IPv4 and IPv6 addresses respectively.
+ * @param <T> IPv4 or IPv6 address
+ */
+public abstract class NetConfigIP<T extends IPAddress> implements NetConfig
+{
+	private NetInterfaceStatus	m_status;
+	private boolean				m_autoConnect;
+	private boolean			 	m_dhcp;
+	private T           	 	m_address;
+	private short            	m_networkPrefixLength;
+	private T					m_subnetMask;
+	private T					m_gateway;
+	private List<T>     	 	m_dnsServers;
+	private List<String>	 	m_domains;
+	private Map<String,Object> 	m_properties;
+
+	NetConfigIP(NetInterfaceStatus status, boolean autoConnect) {
+		m_status = status;
+		m_autoConnect = autoConnect;
+		m_dhcp = false;
+		m_address = null;
+		m_networkPrefixLength = -1;
+		m_subnetMask = null;
+		m_gateway = null;
+		m_dnsServers = new ArrayList<T>();
+		m_domains    = new ArrayList<String>();
+		m_properties  = new HashMap<String,Object>();
+	}
+
+	NetConfigIP(NetInterfaceStatus status, boolean autoConnect, boolean dhcp) {
+		m_status = status;
+		m_autoConnect = autoConnect;
+		m_dhcp = dhcp;
+		m_address = null;
+		m_networkPrefixLength = -1;
+		m_subnetMask = null;
+		m_gateway = null;
+		m_dnsServers = new ArrayList<T>();
+		m_domains    = new ArrayList<String>();
+		m_properties  = new HashMap<String,Object>();
+	}
+	
+	NetConfigIP(NetInterfaceStatus status, boolean autoConnect, T address, short networkPrefixLength, T gateway) throws KuraException {
+		m_status = status;
+		m_autoConnect = autoConnect;
+		m_dhcp = false;
+		m_address = address;
+		m_networkPrefixLength = networkPrefixLength;
+		m_subnetMask = calculateNetmaskFromNetworkPrefix(networkPrefixLength);
+		m_gateway = gateway;
+		m_dnsServers = new ArrayList<T>();
+		m_domains    = new ArrayList<String>();
+		m_properties  = new HashMap<String,Object>();
+	}
+	
+	NetConfigIP(NetInterfaceStatus status, boolean autoConnect, T address, T subnetMask, T gateway) throws KuraException {
+		m_status = status;
+		m_autoConnect = autoConnect;
+		m_dhcp = false;
+		m_address = address;
+		m_networkPrefixLength = calculateNetworkPrefixFromNetmask(subnetMask.getHostAddress());
+		m_subnetMask = subnetMask;
+		m_gateway = gateway;
+		m_dnsServers = new ArrayList<T>();
+		m_domains    = new ArrayList<String>();
+		m_properties  = new HashMap<String,Object>();
+	}
+	
+	
+	/**
+	 * Return the NetInterfaceStatus of this configuration
+	 * @return
+	 */
+	public NetInterfaceStatus getStatus() {
+		return m_status;
+	}
+
+	/**
+	 * Sets the NetInterfaceStatus to be used for the network interface
+	 * @param status
+	 */
+	public void setStatus(NetInterfaceStatus status) {
+		m_status = status;
+	}
+	
+	public boolean isAutoConnect() {
+		return m_autoConnect;
+	}
+
+	public void setAutoConnect(boolean autoConnect) {
+		m_autoConnect = autoConnect;
+	}
+
+	public boolean isDhcp() {
+		return m_dhcp;
+	}
+	
+	/**
+	 * Sets whether of not this configuration should be a dhcp client.  If dhcp
+	 * is set to true it overrides and static configuration that is present in
+	 * the configuration.
+	 * @param dhcp whether or not dhcp client mode should be used
+	 */
+	public void setDhcp(boolean dhcp) {
+		m_dhcp = dhcp;
+	}
+
+	/**
+	 * Returns the address that should be statically assigned to the interface.
+	 * The returned address is IP4Address or IP6Address depending on
+	 * the NetConfigIP instance used. This is only used if dhcp is set to false.
+	 * @return the static address for the interface
+	 */
+	public T getAddress() {
+		return m_address;
+	}
+
+	/**
+	 * Sets the static address to be assigned to the interface.
+	 * The address should IP4Address or IP6Address depending on 
+	 * the NetConfigIP instance used. This is only used if dhcp is set to false.
+	 * @param address - address to be statically assigned to the interface
+	 */
+	public void setAddress(T address) throws KuraException {
+		m_address = address;
+	}
+	
+	/**
+	 * Return the prefix to be used for the network interface
+	 * @return
+	 */
+	public short getNetworkPrefixLength() {
+		return m_networkPrefixLength;
+	}
+
+	/**
+	 * Sets the prefix length to be used for the network interface
+	 * @param networkPrefixLength
+	 * @throws KuraException 
+	 */
+	public void setNetworkPrefixLength(short networkPrefixLength) throws KuraException {
+		m_networkPrefixLength = networkPrefixLength;
+		m_subnetMask = calculateNetmaskFromNetworkPrefix(networkPrefixLength);
+	}
+	
+	/**
+	 * Return the prefix to be used for the network interface
+	 * @return
+	 */
+	public T getSubnetMask() {
+		return m_subnetMask;
+	}
+	
+	/**
+	 * Sets the subnet mask to be used for the network interface
+	 * @param subnetMask
+	 * @throws KuraException 
+	 */
+	public void setSubnetMask(T subnetMask) throws KuraException {
+		m_networkPrefixLength = calculateNetworkPrefixFromNetmask(subnetMask.getHostAddress());
+		m_subnetMask = subnetMask;
+	}
+	
+	/**
+	 * Returns the address of the gateway to be used for the interface
+	 * @return
+	 */
+	public T getGateway() {
+		return m_gateway;
+	}
+
+	/**
+	 * Sets the gateway to be used for the interface
+	 * @param gateway
+	 */
+	public void setGateway(T gateway) {
+		m_gateway = gateway;
+	}
+
+	/**
+	 * Returns the list of Name Servers to be associated to the interface.
+	 * The returned addresses are IP4Address or IP6Address depending on
+	 * the NetConfigIP instance used. This is only used if dhcp is set to false.
+	 * @return list of address for the DNS Servers
+	 */
+	public List<T> getDnsServers() {
+		if(m_dnsServers != null) {
+			return Collections.unmodifiableList(m_dnsServers);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Sets the list of Name Servers to be associated to the interface.
+	 * The addresses are IP4Address or IP6Address depending on
+	 * the NetConfigIP instance used. This is only used if dhcp is set to false.
+	 * @return list of address for the DNS Servers
+	 */
+	public void setDnsServers(List<T> dnsServers) {
+		this.m_dnsServers = dnsServers;
+	}
+
+	/**
+	 * Returns the list of DNS domains to be associated to the interface.
+	 * This is only used if dhcp is set to false.
+	 * @return - list of DNS domains
+	 */
+	public List<String> getDomains() {
+		if(m_domains != null) {
+			return Collections.unmodifiableList(m_domains);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Sets the list of DNS domains to be associated to the interface.
+	 * This is only used if dhcp is set to false.
+	 * @param domains
+	 */
+	public void setDomains(List<String> domains) {
+		this.m_domains = domains;
+	}
+	
+	public Map<String, Object> getProperties() {
+		if(m_properties != null) {
+			return Collections.unmodifiableMap(m_properties);
+		} else {
+			return null;
+		}
+	}
+
+	public void setProperties(Map<String, Object> properties) {
+		m_properties = properties;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((m_address == null) ? 0 : m_address.hashCode());
+		result = prime * result + (m_autoConnect ? 1231 : 1237);
+		result = prime * result + (m_dhcp ? 1231 : 1237);
+		result = prime * result
+				+ ((m_dnsServers == null) ? 0 : m_dnsServers.hashCode());
+		result = prime * result
+				+ ((m_domains == null) ? 0 : m_domains.hashCode());
+		result = prime * result
+				+ ((m_gateway == null) ? 0 : m_gateway.hashCode());
+		result = prime * result + m_networkPrefixLength;
+		result = prime * result
+				+ ((m_properties == null) ? 0 : m_properties.hashCode());
+		result = prime * result
+				+ ((m_status == null) ? 0 : m_status.hashCode());
+		result = prime * result
+				+ ((m_subnetMask == null) ? 0 : m_subnetMask.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		@SuppressWarnings("rawtypes")
+		NetConfigIP other = (NetConfigIP) obj;
+		if (m_address == null) {
+			if (other.m_address != null)
+				return false;
+		} else if (!m_address.equals(other.m_address))
+			return false;
+		if (m_autoConnect != other.m_autoConnect)
+			return false;
+		if (m_dhcp != other.m_dhcp)
+			return false;
+		if (m_dnsServers == null) {
+			if (other.m_dnsServers != null)
+				return false;
+		} else if (!m_dnsServers.equals(other.m_dnsServers))
+			return false;
+		if (m_domains == null) {
+			if (other.m_domains != null)
+				return false;
+		} else if (!m_domains.equals(other.m_domains))
+			return false;
+		if (m_gateway == null) {
+			if (other.m_gateway != null)
+				return false;
+		} else if (!m_gateway.equals(other.m_gateway))
+			return false;
+		if (m_networkPrefixLength != other.m_networkPrefixLength)
+			return false;
+		if (m_properties == null) {
+			if (other.m_properties != null)
+				return false;
+		} else if (!m_properties.equals(other.m_properties))
+			return false;
+		if (m_status != other.m_status)
+			return false;
+		if (m_subnetMask == null) {
+			if (other.m_subnetMask != null)
+				return false;
+		} else if (!m_subnetMask.equals(other.m_subnetMask))
+			return false;
+		return true;
+	}
+
+	public boolean isValid() {
+		//FIXME
+		if(m_dhcp) {
+			return true;
+		} else {			
+			try {
+				m_address.getHostAddress();
+			} catch(Exception e) {
+				e.printStackTrace();
+				return false;
+			}
+
+			for(IPAddress dns : m_dnsServers) {
+				try {
+					dns.getHostAddress();
+				} catch(Exception e) {
+					e.printStackTrace();
+					return false;
+				}
+			}
+			
+			//if we got here...
+			return true;
+		}
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("NetConfigIP [m_status=");
+		builder.append(m_status);
+		builder.append(", m_autoConnect=");
+		builder.append(m_autoConnect);
+		builder.append(", m_dhcp=");
+		builder.append(m_dhcp);
+		builder.append(", m_address=");
+		builder.append(m_address);
+		builder.append(", m_networkPrefixLength=");
+		builder.append(m_networkPrefixLength);
+		builder.append(", m_subnetMask=");
+		builder.append(m_subnetMask);
+		builder.append(", m_gateway=");
+		builder.append(m_gateway);
+		builder.append(", m_dnsServers=");
+		builder.append(m_dnsServers);
+		builder.append(", m_domains=");
+		builder.append(m_domains);
+		builder.append(", m_properties=");
+		builder.append(m_properties);
+		builder.append("]");
+		return builder.toString();
+	}	
+	
+	//TODO - only works on IPv4 now
+	private short calculateNetworkPrefixFromNetmask(String netmask) throws KuraException {
+		if(netmask == null) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "netmask is null");
+		}
+		
+		int netmaskValue = 0;
+		StringTokenizer st = new StringTokenizer(netmask, ".");
+		for (int i = 24; i >= 0; i -= 8) {
+			netmaskValue = netmaskValue | (Integer.parseInt(st.nextToken()) << i);
+		}
+
+		boolean hitZero = false;
+		int displayMask = 1 << 31;
+		int count = 0;
+
+		for (int c = 1; c<=32; c++) {
+			if((netmaskValue & displayMask) == 0) {
+				hitZero=true;
+			} else {
+				if(hitZero) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "received invalid mask: " + netmask);
+				}
+
+				count++;
+			}
+
+			netmaskValue <<= 1;
+		}
+
+		return (short)count;
+	}
+
+	//TODO - only works on IPv4 now
+    private T calculateNetmaskFromNetworkPrefix(int networkPrefixLength) throws KuraException {
+    	int mask = ~((1 << (32 - networkPrefixLength)) - 1);
+        StringBuffer sb = new StringBuffer(15);
+        for (int shift = 24; shift > 0; shift -= 8) {
+                // process 3 bytes, from high order byte down.
+                sb.append(Integer.toString((mask >>> shift) & 0xff));
+                sb.append('.');
+        }
+
+        sb.append(Integer.toString(mask & 0xff));
+        
+        try {
+        	@SuppressWarnings("unchecked")
+			T netmask = (T) IPAddress.parseHostAddress(sb.toString());
+            return netmask;
+        } catch(UnknownHostException e) {
+        	throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP4.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee6f4015824780467b1e5292eb2cc012e13b7b37
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP4.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * Configuration for a network interface based on IPv4 addresses.
+ */
+public class NetConfigIP4 extends NetConfigIP<IP4Address> implements NetConfig4
+{
+
+	private List<IP4Address> 	winsServers;
+
+	/**
+	 * Constructor for a Configuration for a 
+	 * network interface based on IPv4 addresses.
+	 * @param address - address to be assigned to the interface
+	 * @param networkPrefixLength - prefix to be used for the interface 
+	 * @param gateway - gateway to be associated with the interface
+	 */
+	public NetConfigIP4(NetInterfaceStatus status, boolean autoConnect)
+	{
+		super(status, autoConnect);
+		this.winsServers         = new ArrayList<IP4Address>();
+	}
+	
+	/**
+	 * Constructor for a DHCP Configration for a
+	 * network interface nased on IPv4 addresses.
+	 * @param dhcp whether or not DHCP client mode should be used
+	 */
+	public NetConfigIP4(NetInterfaceStatus status, boolean autoConnect, boolean dhcp) {
+		super(status, autoConnect, dhcp);
+		this.winsServers         = new ArrayList<IP4Address>();
+	}
+	
+	public NetConfigIP4(NetInterfaceStatus status, boolean autoConnect, IP4Address address, short networkPrefixLength, IP4Address gateway) throws KuraException {
+		super(status, autoConnect, address, networkPrefixLength, gateway);
+		this.winsServers         = new ArrayList<IP4Address>();
+	}
+	
+	public NetConfigIP4(NetInterfaceStatus status, boolean autoConnect, IP4Address address, IP4Address subnetMask, IP4Address gateway) throws KuraException {
+		super(status, autoConnect, address, subnetMask, gateway);
+		this.winsServers         = new ArrayList<IP4Address>();
+	}
+
+	/**
+	 * Returns the list of Windows Servers to be associated with the interface 
+	 * @return
+	 */
+	public List<IP4Address> getWinsServers() {
+		if(winsServers != null) {
+			return Collections.unmodifiableList(winsServers);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Sets the list of Windows Servers to be associated with the interface
+	 * @param winsServers
+	 */
+	public void setWinsServers(List<IP4Address> winsServers) {
+		this.winsServers = winsServers;
+	}
+	
+	@Override
+	public boolean isValid() {
+		return super.isValid();
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("NetConfigIP4 [winsServers=");
+		builder.append(winsServers);
+		builder.append(", super.toString()=");
+		builder.append(super.toString());
+		builder.append("]");
+		return builder.toString();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result
+				+ ((winsServers == null) ? 0 : winsServers.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		NetConfigIP4 other = (NetConfigIP4) obj;
+		if (winsServers == null) {
+			if (other.winsServers != null)
+				return false;
+		} else if (!winsServers.equals(other.winsServers))
+			return false;
+		return true;
+	}	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP6.java
new file mode 100644
index 0000000000000000000000000000000000000000..de2b6cf3c86e8da0b53569f7d8ef622f67dc0359
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetConfigIP6.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * Configuration for a network interface based on IPv6 addresses.
+ */
+public class NetConfigIP6 extends NetConfigIP<IP6Address> implements NetConfig6
+{
+	/**
+	 * Empty Constructor 
+	 */
+	public NetConfigIP6(NetInterfaceStatus status, boolean autoConnect) {
+		super(status, autoConnect);
+	}
+	
+	/**
+	 * Constructor for a DHCP Client Configuration for a
+	 * network interface based on IPv6 addresses.
+	 * @param dhcp whether or not DHCP client mode should be used
+	 */
+	public NetConfigIP6(NetInterfaceStatus status, boolean autoConnect, boolean dhcp) {
+		super(status, autoConnect, dhcp);
+	}
+	
+	/**
+	 * Constructor for a Static Configuration for a 
+	 * network interface based on IPv6 addresses.
+	 * @param address - address to be assigned to the interface
+	 * @param networkPrefixLength - network prefix length to be assigned to the interface
+	 * @param gateway - default gateway to be assigned to the interface
+	 * @throws KuraException 
+	 */
+	public NetConfigIP6(NetInterfaceStatus status, boolean autoConnect, IP6Address address, short networkPrefixLength, IP6Address gateway) throws KuraException {
+		super(status, autoConnect, address, networkPrefixLength, gateway);
+	}
+	
+	/**
+	 * Constructor for a Static Configuration for a 
+	 * network interface based on IPv6 addresses.
+	 * @param address - address to be assigned to the interface
+	 * @param subnetMask - subnet mask to be assigned to the interface
+	 * @param gateway - default gateway to be assigned to the interface
+	 * @throws KuraException 
+	 */
+	public NetConfigIP6(NetInterfaceStatus status, boolean autoConnect, IP6Address address, IP6Address subnetMask, IP6Address gateway) throws KuraException {
+		super(status, autoConnect, address, subnetMask, gateway);
+	}
+	
+	@Override
+	public boolean isValid() {
+		return super.isValid();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterface.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..14e5f2a1a75f099ca67708ddb9d90463b4ef69e7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterface.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net;
+
+import java.util.List;
+
+import org.eclipse.kura.usb.UsbDevice;
+
+
+/**
+ * NetworkInterface represent a network interface of the system.
+ * Its APIs are purposefully modeled after the java.net.NetworkInterface.
+ * Compared to the standard Java API, this class provides additional information 
+ * such as the NetworkInterfaceType, whether the interface is provided to the system
+ * through a USB Adapter, and additional low-level characteristics of the interface.   
+ */
+public interface NetInterface<T extends NetInterfaceAddress> {	
+	/**
+	 * Returns the name of this NetworkInterface.
+	 * @return interface name
+	 */
+	public String getName();
+
+	/**
+	 * Returns the type of this NetworkInterface.
+	 * @return interface type
+	 */
+	public NetInterfaceType getType();
+
+	/**
+	 * The driver handling the device.
+	 * @return
+	 */
+	public String getDriver();
+	
+	/**
+	 * The version of the driver handling the device.
+	 * @return
+	 */
+	public String getDriverVersion();
+	
+	/**
+	 * The firmware version for the device. 
+	 * @return
+	 */
+	public String getFirmwareVersion();
+	
+	/**
+	 * The current state of the device.
+	 * @return
+	 */
+	public NetInterfaceState getState();
+	
+	/**
+	 * Returns the hardware address (usually MAC) of the interface if it has one.
+	 * @return a byte array containing the address or null if the address doesn't exist
+	 */
+	public byte[] getHardwareAddress();
+	
+	/**
+	 * Returns a List of all InterfaceAddresses of this network interface.
+	 * @return a List object with all or a subset of the InterfaceAddresss of this network interface
+	 */
+	public List<T> getNetInterfaceAddresses(); 
+		
+	/**
+	 * Returns whether a network interface is a loopback interface.
+	 * @return true if the interface is a loopback interface.
+	 */
+	public boolean isLoopback();
+	
+	/**
+	 * Returns whether a network interface is a point to point interface. 
+	 * A typical point to point interface would be a PPP connection through a modem.
+	 * @return true if the interface is a point to point interface.
+	 */
+	public boolean isPointToPoint();
+	
+	/**
+	 * Returns whether this interface is a virtual interface (also called subinterface). 
+	 * Virtual interfaces are, on some systems, interfaces created as a child of a physical 
+	 * interface and given different settings (like address or MTU). 
+	 * Usually the name of the interface will the name of the parent followed by a colon (:) 
+	 * and a number identifying the child since there can be several virtual interfaces 
+	 * attached to a single physical interface.
+	 * @return true if this interface is a virtual interface.
+	 */
+	public boolean isVirtual();
+	
+	/**
+	 * Returns whether a network interface supports multicasting or not.
+	 * @return true if the interface supports Multicasting.
+	 */
+	public boolean supportsMulticast();
+    
+    /**
+     * Returns whether a network interface is up and running. 
+     * @return true if the interface is up and running.
+     */
+    public boolean isUp();
+	
+	/**
+	 * Returns whether a network interface will auto connect. 
+	 * @return true if the interface will auto connect.
+	 */
+	public boolean isAutoConnect();
+
+	/**
+	 * Returns the Maximum Transmission Unit (MTU) of this interface
+	 * - Design speed of the device, in megabits/second (Mb/s).
+	 * @return the value of the MTU for that interface.
+	 */
+	public int getMTU();
+	
+
+	//
+	// Kura Extensions
+	//
+		
+	/**
+	 * Returns the UsbDevice which provided this NetworkInterface to the system if any.
+	 * @return the UsbDevice providing this NetworkInterface to the system 
+	 * or null if this NetworkInterface is not provided by a USB device
+	 */
+	public UsbDevice getUsbDevice();
+	
+	
+/*	
+	public String getScope();
+	
+	public String getBroadcast();
+	
+	public String getMask();	
+	
+	public boolean isBroadcast();
+	
+	public boolean isRunning();
+	
+	public boolean isMulticast();
+	
+	public boolean isAllmulti();
+	
+	public boolean isPromisc();	
+	
+	public long getRxPackets();
+	
+	public long getRxErrors();
+	
+	public long getRxDropped();
+	
+	public long getRxOverruns();
+	
+	public long getRxFrame();
+	
+	public long getTxPackets();
+	
+	public long getTxErrors();
+	
+	public long getTxDropped();
+	
+	public long getTxOverruns();
+	
+	public long getTxCarrier();
+	
+	public long getCollisions();
+	
+	public long getTxQueueLength();
+	
+	public long getTxBytes();
+	
+	public long getRxBytes();
+*/
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..5289c43b6c9bbe2ea8ffddde1ec5261bbfe7041f
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddedEvent.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * An event raised when a new network interface has been added to the system. 
+ */
+public class NetInterfaceAddedEvent extends Event
+{
+	/** Topic of the NetworkInterfaceAddedEvent */
+	public static final String NETWORK_EVENT_INTERFACE_ADDED_TOPIC = "org/eclipse/kura/net/NetworkEvent/interface/ADDED";
+	
+	/** Name of the property to access the network interface name */
+	public static final String NETWORK_EVENT_INTERFACE_PROPERTY = "network.interface";
+
+	public NetInterfaceAddedEvent(Map<String, ?> properties) {
+		super(NETWORK_EVENT_INTERFACE_ADDED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the name of the added interface.
+	 * @return
+	 */
+	public String getInterfaceName() {
+		return (String) getProperty(NETWORK_EVENT_INTERFACE_PROPERTY);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddress.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddress.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd8961ecd37b90ea93b27f9925c4e710ee0b7fbc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddress.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.List;
+
+
+
+/**
+ * This class represents a Network Interface address as currently running on the system
+ * In short it's an IP address, a subnet mask and a broadcast address when the address is an IPv4 one.
+ * An IP address and a network prefix length in the case of IPv6 address.
+ * Both IPv4 and IPv6 addresses will have a gateway and one or more DNS addresses.
+ */
+public interface NetInterfaceAddress 
+{
+	/**
+	 * Returns an InetAddress for this address. 
+	 * @return the address
+	 */
+	public IPAddress getAddress();
+    
+	/**
+	 * Returns the network prefix length for this address. 
+	 * This is also known as the subnet mask in the context of IPv4 addresses. 
+	 * Typical IPv4 values would be 8 (255.0.0.0), 16 (255.255.0.0) or 24 (255.255.255.0).
+	 * Typical IPv6 values would be 128 (::1/128) or 10 (fe80::203:baff:fe27:1243/10)
+	 * @return a short representing the prefix length for the subnet of that address.
+	 */
+	public short getNetworkPrefixLength();
+
+	/**
+	 * Returns the network mask for this address
+	 * Typical IPv4 values would be 255.0.0.0, 255.255.0.0 or 255.255.255.0.
+	 * Typical IPv6 values would be ::1/128 or fe80::203:baff:fe27:1243/10
+	 * @return an IPaddress representing the subnet mask of that address
+	 */
+	public IPAddress getNetmask();
+    
+    /**
+     * Returns the InetAddress for the gateway. 
+     * @return the gateway address
+     */
+    public IPAddress getGateway(); 
+	
+	/**
+	 * Returns an InetAddress for the broadcast address for this InterfaceAddress.
+	 * @return the broadcast address
+	 */
+	public IPAddress getBroadcast();
+	
+    /**
+     * Gets the list of DNS servers associated with this interface
+     * @return the list of DNS servers
+     */
+    public List<? extends IPAddress> getDnsServers();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddressConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddressConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..03b075ea21312a2f5e3c20e9df2c01dfd22b2b65
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceAddressConfig.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.List;
+
+/**
+ * Extends a NetInterfaceAddress which is status as currently running on the system with the
+ * interface's configuration in the form of a List of NetConfig objects.  The configuration
+ * and the status may differ based on environmental conditions and this is why configuration
+ * is modeled separately.  For example, an interface could be configured as a DHCP client.
+ * In this case, the configuration would not include an IP address.  However, the 'status' in
+ * the NetInterfaceAddress would because the interface does have an IP - just not one that is
+ * configured because it is dynamically assigned by the DHCP server.
+ * 
+ * @author eurotech
+ *
+ */
+public interface NetInterfaceAddressConfig extends NetInterfaceAddress {
+
+	/**
+	 * Returns a List of NetConfig Objects associated with a given NetInterfaceAddressConfig
+	 * for a given NetInterface
+	 * @return the NetConfig Objects associated with the NetInterfaceAddressConfig
+	 */
+	public List<NetConfig> getConfigs();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a7e7b18809d9ce7513193cf3f2fe771ace6c68d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceConfig.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Marker class for NetInterfaceConfig objects
+ * 
+ * @author eurotech
+ *
+ * @param <T>
+ */
+public interface NetInterfaceConfig<T extends NetInterfaceAddressConfig> extends NetInterface<T> {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceRemovedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceRemovedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..03a4613101826ca228073b8d288398be7d13efdd
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceRemovedEvent.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * An event raised when a network interface has been removed from the system. 
+ */
+public class NetInterfaceRemovedEvent extends Event
+{
+	/** Topic of the NetworkInterfaceRemovedEvent */
+	public static final String NETWORK_EVENT_INTERFACE_REMOVED_TOPIC = "org/eclipse/kura/net/NetworkEvent/interface/REMOVED";
+
+	/** Name of the property to access the network interface name */
+	public static final String NETWORK_EVENT_INTERFACE_PROPERTY = "network.interface";
+
+	public NetInterfaceRemovedEvent(Map<String, ?> properties) {
+		super(NETWORK_EVENT_INTERFACE_REMOVED_TOPIC, properties);
+	}
+
+	/**
+	 * Returns the name of the removed interface.
+	 * @return
+	 */
+	public String getInterfaceName() {
+		return (String) getProperty(NETWORK_EVENT_INTERFACE_PROPERTY);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceState.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceState.java
new file mode 100644
index 0000000000000000000000000000000000000000..53f23977b6e8cf4937727c49ac4473b98dd79085
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceState.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * The current state of the a NetworkInterface.
+ */
+public enum NetInterfaceState 
+{
+	/** The device is in an unknown state. */
+	UNKNOWN(0),
+	/** The device is recognized but not managed by NetworkManager. */
+	UNMANAGED(10),
+	/** The device cannot be used (carrier off, rfkill, etc). */
+	UNAVAILABLE(20),
+	/** The device is not connected. */
+	DISCONNECTED(30),
+	/** The device is preparing to connect. */ 
+	PREPARE(40),
+	/** The device is being configured. */
+	CONFIG(50),
+	/** The device is awaiting secrets necessary to continue connection. */
+	NEED_AUTH(60),
+	/** The IP settings of the device are being requested and configured. */
+	IP_CONFIG(70),
+	/** The device's IP connectivity ability is being determined. */
+	IP_CHECK(80),
+	/** The device is waiting for secondary connections to be activated. */
+	SECONDARIES(90),
+	/** The device is active. */
+	ACTIVATED(100),
+	/** The device's network connection is being torn down. */
+	DEACTIVATING(110),
+	/** The device is in a failure state following an attempt to activate it. */
+	FAILED(120);
+	
+	private int m_code;
+	
+	private NetInterfaceState(int code) {
+		m_code = code;
+	}
+	
+	public static NetInterfaceState parseCode(int code) {
+		for(NetInterfaceState state : NetInterfaceState.values()) {
+			if(state.m_code == code) {
+				return state;
+			}
+		}
+		
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceStateChangedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceStateChangedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..85cc97dd55ca832828d32b93f498e02f6f52b439
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceStateChangedEvent.java
@@ -0,0 +1,232 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * Event raised when the state of a network interface has changed.
+ */
+public class NetInterfaceStateChangedEvent extends Event 
+{
+	/** Topic of the NetworkStateChangedEvent */
+	public static final String NETWORK_EVENT_INTERFACE_STATE_CHANGED_TOPIC = "org/eclipse/kura/net/NetworkEvent/interface/STATE_CHANGED";
+
+	/** Name of the property to access the network interface name */
+	public static final String NETWORK_EVENT_INTERFACE_PROPERTY  = "network.interface";
+
+	/** Name of the property to access the new network state */
+	public static final String NETWORK_EVENT_NEW_STATE_PROPERTY  = "network.state.new"; 
+	
+	/** Name of the property to access the old network state */
+	public static final String NETWORK_EVENT_OLD_STATE_PROPERTY  = "network.state.old"; 
+
+	/** Name of the property to access the reason of the change */
+	public static final String NETWORK_EVENT_STATE_CHANGE_REASON_PROPERTY = "network.state.change.reason"; 
+
+	public NetInterfaceStateChangedEvent(Map<String, ?> properties) {
+		super(NETWORK_EVENT_INTERFACE_STATE_CHANGED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the network interface name.
+	 * @return
+	 */
+	public String getInterfaceName() {
+		return (String) getProperty(NETWORK_EVENT_INTERFACE_PROPERTY);
+	}
+
+	/**
+	 * Returns the new network interface state.
+	 * @return
+	 */
+	public NetInterfaceState getNewState() {
+		return (NetInterfaceState) getProperty(NETWORK_EVENT_NEW_STATE_PROPERTY);
+	}
+
+	/**
+	 * Returns the old network interface state.
+	 * @return
+	 */
+	public NetInterfaceState getOldState() {
+		return (NetInterfaceState) getProperty(NETWORK_EVENT_OLD_STATE_PROPERTY);
+	}
+	
+	/**
+	 * Returns the reason for the state transition.
+	 * @return
+	 */
+	public Reason getReason() {
+		return (Reason) getProperty(NETWORK_EVENT_STATE_CHANGE_REASON_PROPERTY);
+	}
+	
+	public enum Reason
+	{
+		/** The reason for the device state change is unknown. */
+		REASON_UNKNOWN,
+		
+		/** The state change is normal. */
+		REASON_NONE,
+		
+		/** The device is now managed. */
+		REASON_NOW_MANAGED,
+		
+		/** The device is no longer managed. */
+		REASON_NOW_UNMANAGED,
+		
+		/** The device could not be readied for configuration. */
+		REASON_CONFIG_FAILED,
+		
+		/** IP configuration could not be reserved (no available address, timeout, etc). */
+		REASON_CONFIG_UNAVAILABLE,
+		
+		/** The IP configuration is no longer valid. */
+		REASON_CONFIG_EXPIRED,
+		
+		/** Secrets were required, but not provided. */
+		REASON_NO_SECRETS,
+		
+		/** The 802.1X supplicant disconnected from the access point or authentication server. */
+		REASON_SUPPLICANT_DISCONNECT,
+		
+		/** Configuration of the 802.1X supplicant failed. */
+		REASON_SUPPLICANT_CONFIG_FAILED,
+		
+		/** The 802.1X supplicant quit or failed unexpectedly. */
+		REASON_SUPPLICANT_FAILED,
+		
+		/** The 802.1X supplicant took too long to authenticate. */
+		REASON_SUPPLICANT_TIMEOUT,
+		
+		/** The PPP service failed to start within the allowed time. */
+		REASON_PPP_START_FAILED,
+		
+		/** The PPP service disconnected unexpectedly. */
+		REASON_PPP_DISCONNECT,
+		
+		/** The PPP service quit or failed unexpectedly. */
+		REASON_PPP_FAILED,
+		
+		/** The DHCP service failed to start within the allowed time. */
+		REASON_DHCP_START_FAILED,
+		
+		/** The DHCP service reported an unexpected error. */
+		REASON_DHCP_ERROR,
+		
+		/** The DHCP service quit or failed unexpectedly. */
+		REASON_DHCP_FAILED,
+		
+		/** The shared connection service failed to start. */
+		REASON_SHARED_START_FAILED,
+		
+		/** The shared connection service quit or failed unexpectedly. */ 
+		REASON_SHARED_FAILED,
+		
+		/** The AutoIP service failed to start. */
+		REASON_AUTOIP_START_FAILED,
+		
+		/** The AutoIP service reported an unexpected error. */
+		REASON_AUTOIP_ERROR,
+		
+		/** The AutoIP service quit or failed unexpectedly. */
+		REASON_AUTOIP_FAILED,
+		
+		/** Dialing failed because the line was busy. */
+		REASON_MODEM_BUSY,
+		
+		/** Dialing failed because there was no dial tone. */
+		REASON_MODEM_NO_DIAL_TONE,
+		
+		/** Dialing failed because there was carrier. */
+		REASON_MODEM_NO_CARRIER,
+		
+		/** Dialing timed out. */
+		REASON_MODEM_DIAL_TIMEOUT,
+		
+		/** Dialing failed. */
+		REASON_MODEM_DIAL_FAILED,
+		
+		/** Modem initialization failed. */
+		REASON_MODEM_INIT_FAILED,
+		
+		/** Failed to select the specified GSM APN. */
+		REASON_GSM_APN_FAILED,
+		
+		/** Not searching for networks. */
+		REASON_GSM_REGISTRATION_NOT_SEARCHING,
+		
+		/** Network registration was denied.* */
+		REASON_GSM_REGISTRATION_DENIED,
+		
+		/** Network registration timed out. */
+		REASON_GSM_REGISTRATION_TIMEOUT,
+		
+		/** Failed to register with the requested GSM network. */
+		REASON_GSM_REGISTRATION_FAILED,
+		
+		/** PIN check failed. */
+		REASON_GSM_PIN_CHECK_FAILED,
+		
+		/** Necessary firmware for the device may be missing. */
+		REASON_FIRMWARE_MISSING,
+		
+		/** The device was removed. */
+		REASON_REMOVED,
+		
+		/** NetworkManager went to sleep. */
+		REASON_SLEEPING,
+		
+		/** The device's active connection was removed or disappeared. */
+		REASON_CONNECTION_REMOVED,
+		
+		/** A user or client requested the disconnection. */
+		REASON_USER_REQUESTED,
+		
+		/** The device's carrier/link changed. */
+		REASON_CARRIER,
+		
+		/** The device's existing connection was assumed. */
+		REASON_CONNECTION_ASSUMED,
+		
+		/** The 802.1x supplicant is now available. */
+		REASON_SUPPLICANT_AVAILABLE,
+		
+		/** The modem could not be found. */
+		REASON_MODEM_NOT_FOUND,
+		
+		/** The Bluetooth connection timed out or failed. */
+		REASON_BT_FAILED,
+		
+		/** GSM Modem's SIM Card not inserted. */
+		REASON_GSM_SIM_NOT_INSERTED,
+		
+		/** GSM Modem's SIM Pin required. */
+		REASON_GSM_SIM_PIN_REQUIRED,
+		
+		/** GSM Modem's SIM Puk required. */
+		REASON_GSM_SIM_PUK_REQUIRED,
+		
+		/** GSM Modem's SIM wrong */
+		REASON_GSM_SIM_WRONG,
+		
+		/** InfiniBand device does not support connected mode. */
+		REASON_INFINIBAND_MODE,
+		
+		/** A dependency of the connection failed. */
+		REASON_DEPENDENCY_FAILED,
+		
+		/** Problem with the RFC 2684 Ethernet over ADSL bridge. */
+		REASON_BR2684_FAILED;						
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceStatus.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..442344ac701e03a692858a3cd77c01e9969525dd
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceStatus.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Used to track interface configuration status
+ * 
+ * @author eurotech
+ *
+ */
+public enum NetInterfaceStatus {
+	/** IPv4 configuration is disabled **/
+	netIPv4StatusDisabled,
+	
+	/** IPv4 configuration is enabled as a LAN interface **/
+	netIPv4StatusEnabledLAN,
+	
+	/** IPv4 configuration is enabled as a WAN interface **/
+	netIPv4StatusEnabledWAN,
+	
+	/** IPv4 configuration is unknown **/
+	netIPv4StatusUnknown,
+	
+	/** IPv6 configuration is disabled **/
+	netIPv6StatusDisabled,
+	
+	/** IPv6 configuration is enabled as a LAN interface **/
+	netIPv6StatusEnabledLAN,
+	
+	/** IPv6 configuration is enabled as a WAN interface **/
+	netIPv6StatusEnabledWAN,
+	
+	/** IPv6 configuration is unknown **/
+	netIPv6StatusUnknown;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceType.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceType.java
new file mode 100644
index 0000000000000000000000000000000000000000..02e0633d76f63fa70d47976faafbc96cfebe5b1e
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetInterfaceType.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Used to store network interface types
+ * 
+ * @author eurotech
+ *
+ */
+public enum NetInterfaceType {
+
+	/** The device type is unknown. */
+	UNKNOWN,
+	/** The device is wired Ethernet device. */
+	ETHERNET,
+	/** The device is an 802.11 WiFi device. */
+	WIFI,
+	/** Unused */
+	UNUSED1,
+	/** Unused */
+	UNUSED2,
+	/** The device is Bluetooth device that provides PAN or DUN capabilities. */
+	BT,
+	/** The device is an OLPC mesh networking device. */
+	OLPC_MESH,
+	/** The device is an 802.16e Mobile WiMAX device. */
+	WIMAX,
+	/** The device is a modem supporting one or more of analog telephone, CDMA/EVDO, GSM/UMTS/HSPA, or LTE standards to access a cellular or wireline data network. */
+	MODEM,
+	/** The device is an IP-capable InfiniBand interface. */
+	INFINIBAND,
+	/** The device is a bond master interface. */
+	BOND,
+	/** The device is a VLAN interface. */
+	VLAN,
+	/** The device is an ADSL device supporting PPPoE and PPPoATM protocols. */
+	ADSL,
+	/** The device is a loopback device. */
+	LOOPBACK;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetProtocol.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetProtocol.java
new file mode 100644
index 0000000000000000000000000000000000000000..50e5c1e46b95fd4b9e99fa3490306af70bcd9004
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetProtocol.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Used to distinguish network protocol types
+ * 
+ * @author eurotech
+ *
+ */
+public enum NetProtocol {
+
+	/** Transmission Control Protocol (TCP) **/
+	tcp,
+	
+	/** User Datagram Protocol (UDP) **/
+	udp
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetRouterMode.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetRouterMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..a24cedd8ffb468bfb3c8dbfc59acb3b2d0576d15
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetRouterMode.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Used to specify the route mode of each interface.
+ * 
+ * @author eurotech
+ *
+ */
+public enum NetRouterMode {
+	/** DHCP and NAT **/
+	netRouterDchpNat,
+	
+	/** DHCP only **/
+	netRouterDchp,
+	
+	/** NAT only **/
+	netRouterNat,
+	
+	/** OFF **/
+	netRouterOff;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkAdminService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkAdminService.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2e93f20b7d6d9056604b61163affb4de3f38c6a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkAdminService.java
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.firewall.FirewallOpenPortConfigIP;
+import org.eclipse.kura.net.firewall.FirewallPortForwardConfigIP;
+import org.eclipse.kura.net.firewall.FirewallReverseNatConfig;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiHotspotInfo;
+
+/**
+ * Service API for getting and setting network interface configurations.
+ * 
+ * @author eurotech
+ *
+ */
+public interface NetworkAdminService {
+	
+    /**
+     * Returns a list of all of the configurations associated with all of the interfaces on
+     * the system.
+     *
+     * @return list of NetInterfaceConfigs on the system
+     * @throws KuraException
+     */
+    public List<? extends NetInterfaceConfig<? extends NetInterfaceAddressConfig>> getNetworkInterfaceConfigs() throws KuraException;
+
+	
+	/**
+	 * Returns the configuration information for the specified NetworkInterface name.
+	 * The returned NetConfig captured how the interface was configured; the returned
+	 * list will have a NetConfig4 instance for IPv4 and an NetConfig6 instance for IPv6. 
+	 * This should not be confused with the currently active NetInterfaceAddress associated 
+	 * with the NetInterface.
+	 *   
+	 * @param interfaceName
+	 * @return list of NetConfig for this interface.
+	 */
+	public List<NetConfig> getNetworkInterfaceConfigs(String interfaceName) throws KuraException;
+	
+	
+	/**
+	 * Updates the configuration of the specified EthernetInterface.
+	 * 
+	 * @param interfaceName - name of the Ethernet interface
+	 * @param autoConnect - specifies the auto-connect value for the interface
+	 * @param mtu - required MTU for the interface, -1 to keep the automatic default
+	 * @param netConfig4 - the IPv4 configuration
+	 * @param netConfig6 - the IPv6 configuration
+	 * @throws KuraException
+	 */
+	public void updateEthernetInterfaceConfig(String interfaceName,
+											  boolean autoConnect,
+											  int mtu,
+											  List<NetConfig> netConfigs) 
+	    throws KuraException;
+
+	
+	/**
+	 * Updates the configuration of the specified WifiInterface.
+	 * 
+	 * @param interfaceName - name of the wifi interface
+	 * @param autoConnect - specifies the auto-connect value for the interface
+	 * @param mtu - required MTU for the interface, -1 to keep the automatic default
+	 * @param netConfig4 - the IPv4 configuration
+	 * @param netConfig6 - the IPv6 configuration
+	 * @throws KuraException
+	 */
+	public void updateWifiInterfaceConfig(String interfaceName,
+										  boolean autoConnect,
+										  WifiAccessPoint accessPoint,
+										  List<NetConfig> netConfigs) 
+	    throws KuraException;
+	
+	
+	/**
+	 * Updates the configuration of the specified ModemInterface.
+	 * 
+	 * @param interfaceName - name of the Modem interface
+	 * @param serialNum - the modem's serial number
+	 * @param modemId - user string to identify the modem
+	 * @param pppNumber - ppp number to use for this interface
+	 * @param autoConnect - specifies the auto-connect value for the interface
+	 * @param mtu - required MTU for the interface, -1 to keep the automatic default
+	 * @param netConfigs - list of NetConfigs for this interface
+	 * @throws KuraException
+	 */
+	public void updateModemInterfaceConfig(String interfaceName,
+											  String serialNum,
+											  String modemId,
+											  int pppNumber,
+											  boolean autoConnect,
+											  int mtu,
+											  List<NetConfig> netConfigs) 
+	    throws KuraException;
+	
+	
+	/**
+	 * Enables the specified interface.
+	 * 
+	 * @param interfaceName - name of the interface to be enabled.
+	 */
+	public void enableInterface(String interfaceName, boolean dhcp) throws KuraException; 	
+
+	
+	/**
+	 * Disables the specified interface.
+	 * 
+	 * @param interfaceName - name of the interface to be disabled.
+	 */
+	public void disableInterface(String interfaceName) throws KuraException;
+	
+	
+	/**
+	 * Used to control DHCP servers on specified interfaces.
+	 * 
+	 * @param interfaceName		The interface of the DHCP server to modify the state
+	 * @param enable			Whether to enable or disable the DHCP server
+	 * @param allowedNetwork	The allowed network for the DHCP server if enabled
+	 * @throws KuraException
+	 */
+	public void manageDhcpServer(String interfaceName, boolean enable, NetworkPair<IP4Address> allowedNetwork) throws KuraException;
+	
+	/**
+	 * Releases current IP address and acquires a new lease for the provided interface.
+	 * 
+	 * @param interfaceName		The interface on which to renew the lease
+	 * @throws KuraException
+	 */
+	public void renewDhcpLease(String interfaceName) throws KuraException;
+	
+	/**
+	 * Gets the firewall configuration of the system as currently specified
+	 * 
+	 * @return					A list of NetConfigs representing the firewall configuration
+	 * @throws KuraException
+	 */
+	public List<NetConfig> getFirewallConfiguration() throws KuraException;
+
+	/**
+	 * Sets the 'open port' portion of the firewall configuration
+	 * 
+	 * @param firewallConfiguration		A list of FirewallOpenPortConfigIP Objects representing the configuration to set
+	 * @throws KuraException
+	 */
+	public void setFirewallOpenPortConfiguration(List<FirewallOpenPortConfigIP<? extends IPAddress>> firewallConfiguration) throws KuraException;
+	
+	/**
+	 * Sets the 'port forwarding' portion of the firewall configuration
+	 * 
+	 * @param firewallConfiguration		A list of FirewallPortForwardConfigIP Objects representing the configuration to set
+	 * @throws KuraException
+	 */
+	public void setFirewallPortForwardingConfiguration(List<FirewallPortForwardConfigIP<? extends IPAddress>> firewallConfiguration) throws KuraException;
+
+	public List<FirewallReverseNatConfig> getFirewallReverseNatConfiguration(String sourceIface) throws KuraException;
+	
+	public void setFirewallReverseNatConfiguration(String inIface,List<FirewallReverseNatConfig> reverseNatConfigs) throws KuraException;
+	
+	/**
+	 * Updates the Firewall configuration based on current environmental conditions. This is
+	 * used to update the firewall in events where NAT rules need to change based on a new WAN
+	 * interface coming up or going down.  This ensures all downstream clients utilizing NAT 
+	 * on the gateway can and will maintain active Internet connections through the gateway.
+	 * 
+	 * @param gatewayIface		The new gateway interface that is now active as the WAN interface
+	 * @throws KuraException
+	 */
+	public void manageFirewall (String gatewayIface) throws KuraException;
+	
+	public Map<String, WifiHotspotInfo> getWifiHotspots(String ifaceName) throws KuraException;
+	
+	public boolean verifyWifiCredentials(String ifaceName, WifiConfig wifiConfig, int tout);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkPair.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkPair.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5ccb3286ff6fa89887686cd5d0219b2f4f1752c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkPair.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/**
+ * Model class for a 'network' that is specified by an IP and a mask.  For example in the network
+ * represented by 192.168.1.0/24 the IpAddress would be 192.168.1.0 and the mask is 24 bits or 
+ * 255.255.255.0.  NetworkPairs are used in various components such as DHCP server configurations
+ * where a network must be specified to provide addresses on.
+ * 
+ * @author eurotech
+ *
+ * @param <T>
+ */
+public class NetworkPair<T extends IPAddress> {
+
+	/** The IP Address portion of the NetworkPair **/
+	public T 		m_ipAddress; 
+	
+	/** The prefix portion of the NetworkPair **/
+	public short	m_prefix;
+	
+	public NetworkPair(T ipAddress, short prefix) {
+		m_ipAddress = ipAddress;
+		m_prefix = prefix;
+	}
+
+	public T getIpAddress() {
+		return m_ipAddress;
+	}
+
+	public void setIpAddress(T ipAddress) {
+		m_ipAddress = ipAddress;
+	}
+
+	public short getPrefix() {
+		return m_prefix;
+	}
+
+	public void setPrefix(short prefix) {
+		m_prefix = prefix;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(m_ipAddress.getHostAddress())
+		.append("/")
+		.append(m_prefix);
+
+		return sb.toString();
+	}
+	
+	@Override
+	public boolean equals(Object o) {
+	    if(!(o instanceof NetworkPair<?>)) {
+	        return false;
+	    }
+	    
+	    NetworkPair<?> other = (NetworkPair<?>) o;
+	    
+	    if(!(this.m_ipAddress.equals(other.m_ipAddress))) {
+	        return false;
+	    } else if(this.m_prefix != other.m_prefix) {
+	        return false;
+	    }
+	    
+	    return true;
+	}
+	
+    @Override
+    public int hashCode() {
+        final int prime = 67;
+        int result = 1;
+        result = prime * result + m_prefix;
+        result = prime * result
+                + ((m_ipAddress == null) ? 0 : m_ipAddress.hashCode());
+
+        return result;
+    }
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkService.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c9bc864961cb843348c2f6e6acf57953c066819
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkService.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+
+/**
+ * The NetworkService allows to browse and configure the network interfaces of the system.
+ * <br/>
+ * NetworkService extends what is offered by the standard Java APIs by offering information 
+ * like the NetworkInterface type - e.g. wired vs wireless vs modem - and additional information
+ * regarding the address of a NetworkInterface - e.g. its getway address, DNS, and so on. 
+ */
+public interface NetworkService 
+{
+	/**
+	 * Returns the overall state of the networking subsystem
+	 */
+	public NetworkState getState() throws KuraException;
+	
+	/**
+	 * Returns the state of a specific network interface
+	 */
+	public NetInterfaceState getState(String interfaceName) throws KuraException;
+	
+	/**
+	 * Gets the names of all the network interface attached to the system.
+	 * @return the names of all interfaces regardless of 'up' status
+	 */
+	public List<String> getAllNetworkInterfaceNames() throws KuraException;
+	
+	/**
+	 * Gets the names of all the network interface attached to the system.
+	 * For each returned NetworkInterface, its currently active 
+	 * InterfaceAddresses are returned. 
+	 *  
+	 * @return all NetworkInterfaces
+	 */
+	public List<NetInterface<? extends NetInterfaceAddress>> getNetworkInterfaces() throws KuraException;
+	
+	/**
+	 * Returns the list of all available WifiAccessPoints as seen from the system.
+	 * @return all access points accessible from the system. 
+	 */
+	public List<WifiAccessPoint> getAllWifiAccessPoints() throws KuraException;
+	
+	/**
+	 * Returns the list of the WifiAccessPoints visible from the specified wifi network interface.
+	 * If this wifiInterfaceName is in Master mode it will return a List with one WifiAccessPoint
+	 * which is itself.
+	 * @param wifiInterfaceName name of the interface used to scan for the available access points
+	 * @return the list of the WifiAccessPoints visible from the specified wifi network interface.
+	 */
+	public List<WifiAccessPoint> getWifiAccessPoints(String wifiInterfaceName) throws KuraException;
+	
+	
+	/**
+	 * Return the active NetworkIntefaces which have active connections for the system.
+	 * @return
+	 */
+	public List<NetInterface<? extends NetInterfaceAddress>> getActiveNetworkInterfaces() throws KuraException;
+	
+	public String getModemUsbPort(String interfaceName);
+	
+	public String getModemPppPort(ModemDevice modemDevice) throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkState.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkState.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8c46e5f9c430e53eda3a63ab9b3b01d8a21176e
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkState.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+/** 
+ * The overall state of the networking subsystem.
+ */
+public enum NetworkState 
+{
+	/** Networking state is unknown. */
+	UNKNOWN(0),
+	/** Networking is inactive and all devices are disabled. */
+	ASLEEP(10),
+	/** There is no active network connection. */
+	DISCONNECTED(20),
+	/** Network connections are being cleaned up. */
+	DISCONNECTING(30),
+	/** A network device is connecting to a network and there is no other available network connection. */
+	CONNECTING(40),
+	/** A network device is connected, but there is only link-local connectivity. */
+	CONNECTED_LOCAL(50),
+	/** A network device is connected, but there is only site-local connectivity. */
+	CONNECTED_SITE(60),
+	/** A network device is connected, with global network connectivity. */
+	CONNECTED_GLOBAL(70);			
+	
+	private int m_code;
+	
+	private NetworkState(int code) {
+		m_code = code;
+	}
+	
+	public static NetworkState parseCode(int code) {
+		for(NetworkState state : NetworkState.values()) {
+			if(state.m_code == code) {
+				return state;
+			}
+		}
+		
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkStateChangedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkStateChangedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..2dcb61ab427b6a91a91deeecee7d1a63ea8dec21
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/NetworkStateChangedEvent.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * Event raised when the state of the network has changed.
+ */
+public class NetworkStateChangedEvent extends Event
+{	
+	/** Topic of the NetworkStateChangedEvent */
+	public static final String NETWORK_EVENT_STATE_CHANGED_TOPIC = "org/eclipse/kura/net/NetworkEvent/STATE_CHANGED";
+
+	/** Name of the property to access the new network state */
+	public static final String NETWORK_EVENT_NEW_STATE_PROPERTY = "network.state"; 
+	
+	public NetworkStateChangedEvent(Map<String, ?> properties) {
+		super(NETWORK_EVENT_STATE_CHANGED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the new network state.
+	 * @return
+	 */
+	public NetworkState getState() {
+		return (NetworkState) getProperty(NETWORK_EVENT_NEW_STATE_PROPERTY);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServer.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..710de1f6bd3075d44b83d613581b1bee59a5a295
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServer.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * Represents a DHCP server.
+ * 
+ * @author eurotech
+ *
+ */
+public interface DhcpServer {
+
+	/**
+	 * Returns whether or not the DhcpServer is actively running or not
+	 * 
+	 * @return	a boolean denoting whether or not the DhcpServer is running or not
+	 * @throws KuraException
+	 */
+	public boolean isRunning() throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4d1af382afad09bf96e7cf7461bcf0c86f8cdba
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+import java.util.List;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+
+/**
+ * Marker interface for all DHCP server configuration classes
+ */
+public interface DhcpServerConfig extends NetConfig {
+
+	/**
+	 * Returns the interface name associated with this DhcpServerConfig
+	 * 
+	 * @return	a {@link String} representing the interface name
+	 */
+	public String getInterfaceName();
+	
+	/**
+	 * Returns the {@link boolean} status associated with this DhcpServerConfig
+	 * 
+	 * @return	a {@link boolean} representing the status
+	 */
+	public boolean isEnabled();
+	
+	/**
+	 * Returns the subnet associated with this DhcpServerConfig
+	 * 
+	 * @return	a {@link IPAddress } representing the subnet
+	 */
+	public IPAddress getSubnet();
+	
+	/**
+	 * Returns the router IP address associated with this DhcpServerConfig
+	 * 
+	 * @return	a {@link IPAddress } representing the router IP address
+	 */
+	public IPAddress getRouterAddress();
+	
+	/**
+	 * Returns the subnet mask associated with this DhcpServerConfig
+	 * 
+	 * @return	a {@link IPAddress } representing the subnet mask
+	 */
+	public IPAddress getSubnetMask();
+	
+	/**
+	 * Returns the default lease time offered by the DHCP server
+	 * @return the default lease time (in seconds) offered by the DHCP server
+	 */
+	public int getDefaultLeaseTime();
+	
+	/**
+	 * Returns the maximum lease time offered by the DHCP server
+	 * @return the maximum lease time (in seconds) offered by the DHCP server
+	 */
+	public int getMaximumLeaseTime();
+	
+	/**
+	 * Returns the network prefix length for this DHCP server's address range
+	 * This is also known as the subnet mask in the context of IPv4 addresses. 
+	 * Typical IPv4 values would be 8 (255.0.0.0), 16 (255.255.0.0) or 24 (255.255.255.0).
+	 * Typical IPv6 values would be 128 (::1/128) or 10 (fe80::203:baff:fe27:1243/10)
+	 * @return a short representing the prefix length for the subnet of the DHCP server address range.
+	 */
+	public short getPrefix();
+	
+	/**
+	 * Returns the starting DHCP server InetAddress to provide to DHCP clients. 
+	 * @return the starting address to provide to DHCP clients
+	 */
+	public IPAddress getRangeStart();
+	
+	/**
+	 * Returns the ending DHCP server InetAddress to provide to DHCP clients. 
+	 * @return the ending address to provide to DHCP clients
+	 */
+	public IPAddress getRangeEnd();
+	
+	/**
+	 * Returns whether or not DHCP clients should get DNS services.
+	 * @return a boolean representing whether or not DHCP clients should receive DNS services.
+	 */
+	public boolean isPassDns();
+	
+	/**
+	 * Returns the DNS servers associated with this DhcpServerConfig that will be passed to DHCP clients
+	 * @return	a {@link List } of IPAddresses that represent the DNS servers
+	 */
+	public List<? extends IPAddress> getDnsServers();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig4.java
new file mode 100644
index 0000000000000000000000000000000000000000..dda572775c9d0b900270b54f2014ecdbe166920c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig4.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+/**
+ * Marker interface for IPv4-based configurations of DHCP Servers
+ */
+public interface DhcpServerConfig4 extends DhcpServerConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig6.java
new file mode 100644
index 0000000000000000000000000000000000000000..61584307443b4fdf3974983e3574a46a5b43e3c1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfig6.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+/**
+ * Marker interface for IPv6-based configurations of DHCP Servers
+ */
+public interface DhcpServerConfig6 extends DhcpServerConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP.java
new file mode 100644
index 0000000000000000000000000000000000000000..81185b0adaa34cc109d5dccb4c7da7ae5adb3aee
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP.java
@@ -0,0 +1,381 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+import java.util.List;
+
+import org.eclipse.kura.net.IPAddress;
+
+/**
+ * The abstract representation of a DhcpServerConfig object.
+ * 
+ * @author eurotech
+ *
+ * @param <T>	is the an appropriate subclass of IPAddress
+ */
+public abstract class DhcpServerConfigIP<T extends IPAddress> implements DhcpServerConfig {
+
+	private String			m_interfaceName;
+	private boolean     	m_enabled;
+	private T				m_subnet;
+	private T				m_routerAddress;
+	private T				m_subnetMask;
+	private int 			m_defaultLeaseTime;
+	private int 			m_maximumLeaseTime;
+	private short			m_prefix;
+	private T 				m_rangeStart;
+	private T				m_rangeEnd;
+	private boolean			m_passDns;
+	private List<T>			m_dnsServers;
+	
+	/**
+	 * The basic Constructor for a DhcpServerConfigIP
+	 * 
+	 * @param interfaceName			the interface name associated with the DhcpServerConfig
+	 * @param enabled			    the status of the DhcpServer as a boolean
+	 * @param subnet				the subnet of the DhcpServerConfig
+	 * @param routerAddress			the router IPAddress
+	 * @param subnetMask			the subnet mask of the DhcpServerConfig
+	 * @param defaultLeaseTime		the default lease time to issue to DHCP clients
+	 * @param maximumLeaseTime		the maximum lease time to issue to DHCP clients
+	 * @param prefix				the network prefix associated with the DhcpServerConfig
+	 * @param rangeStart			the network starting address to issue to DHCP clients
+	 * @param rangeEnd				the network ending address to issue to DHCP clients
+	 * @param passDns				whether or not to pass DNS to DHCP clients
+	 * @param dnsServers			the DNS servers that will get passed to DHCP clients if passDns is true
+	 */
+	public DhcpServerConfigIP(String interfaceName, boolean enabled, T subnet, T routerAddress, T subnetMask, int defaultLeaseTime, int maximumLeaseTime,
+			short prefix, T rangeStart, T rangeEnd, boolean passDns, List<T> dnsServers) {
+		super();
+		
+		m_interfaceName = interfaceName;
+		m_enabled = enabled;
+		m_subnet = subnet;
+		m_routerAddress = routerAddress;
+		m_subnetMask = subnetMask;
+		m_defaultLeaseTime = defaultLeaseTime;
+		m_maximumLeaseTime = maximumLeaseTime;
+		m_prefix = prefix;
+		m_rangeStart = rangeStart;
+		m_rangeEnd = rangeEnd;
+		m_passDns = passDns;
+		m_dnsServers = dnsServers;
+	}
+
+	@Override
+	public String getInterfaceName() {
+		return m_interfaceName;
+	}
+
+	/**
+	 * sets the interface name for the DhcpServerConfig
+	 * @param interfaceName	the interface name in the form of a {@link String}
+	 */
+	public void setInterfaceName(String interfaceName) {
+		m_interfaceName = interfaceName;
+	}
+	
+	@Override
+	public boolean isEnabled() {
+		return m_enabled;
+	}
+
+	/**
+	 * sets the status for the DhcpServerConfig
+	 * @param enabled	the Dhcp Server status in the form of a {@link boolean}
+	 */
+	public void setEnabledRouterMode(boolean enabled) {
+		m_enabled = enabled;
+	}
+
+	@Override
+	public T getSubnet() {
+		return m_subnet;
+	}
+
+	/**
+	 * sets the subnet for the DhcpServerConfig
+	 * @param subnet	the subnet in the form of a {@link IPAddress}
+	 */
+	public void setSubnet(T subnet) {
+		m_subnet = subnet;
+	}
+
+	@Override
+	public T getRouterAddress() {
+		return m_routerAddress;
+	}
+
+	/**
+	 * sets the router IPAddress for the DhcpServerConfig
+	 * @param routerAddress	the router IPAddress in the form of a {@link IPAddress}
+	 */
+	public void setRouterAddress(T routerAddress) {
+		m_routerAddress = routerAddress;
+	}
+
+	@Override
+	public T getSubnetMask() {
+		return m_subnetMask;
+	}
+
+	/**
+	 * sets the subnet mask for the DhcpServerConfig
+	 * @param subnetMask	the subnet mask in the form of a {@link IPAddress}
+	 */
+	public void setSubnetMask(T subnetMask) {
+		m_subnetMask = subnetMask;
+	}
+
+	@Override
+	public int getDefaultLeaseTime() {
+		return m_defaultLeaseTime;
+	}
+
+	/**
+	 * sets the default lease time for DHCP clients
+	 * @param defaultLeaseTime	the default lease time
+	 */
+	public void setDefaultLeaseTime(int defaultLeaseTime) {
+		m_defaultLeaseTime = defaultLeaseTime;
+	}
+
+	@Override
+	public int getMaximumLeaseTime() {
+		return m_maximumLeaseTime;
+	}
+
+	/**
+	 * sets the maximum lease time for DHCP clients
+	 * @param maximumLeaseTime	the maximum lease time
+	 */
+	public void setMaximumLeaseTime(int maximumLeaseTime) {
+		m_maximumLeaseTime = maximumLeaseTime;
+	}
+
+	@Override
+	public short getPrefix() {
+		return m_prefix;
+	}
+
+	/**
+	 * sets the network prefix for the DhcpServerConfig
+	 * @param prefix	the prefix
+	 */
+	public void setPrefix(short prefix) {
+		m_prefix = prefix;
+	}
+
+	@Override
+	public T getRangeStart() {
+		return m_rangeStart;
+	}
+
+	/**
+	 * sets the starting IPAddress in the pool for the DHCP clients
+	 * @param m_rangeStart	the starting IPAddress
+	 */
+	public void setRangeStart(T m_rangeStart) {
+		this.m_rangeStart = m_rangeStart;
+	}
+
+	@Override
+	public T getRangeEnd() {
+		return m_rangeEnd;
+	}
+
+	/**
+	 * sets the ending IPAddress in the pool for the DHCP clients
+	 * @param m_rangeEnd	the ending IPAddress
+	 */
+	public void setRangeEnd(T rangeEnd) {
+		this.m_rangeEnd = rangeEnd;
+	}
+
+	@Override
+	public boolean isPassDns() {
+		return m_passDns;
+	}
+
+	/**
+	 * whether or not to pass DNS to DHCP clients
+	 * @param passDns	true to pass, false to not
+	 */
+	public void setPassDns(boolean passDns) {
+		m_passDns = passDns;
+	}
+
+	@Override
+	public List<T> getDnsServers() {
+		return m_dnsServers;
+	}
+
+	/**
+	 * the DNS servers to pass to DHCP clients if passDns is set to true
+	 * @param m_dnsServers	the DNS servers to pass
+	 */
+	public void setDnsServers(List<T> m_dnsServers) {
+		this.m_dnsServers = m_dnsServers;
+	}
+
+	public boolean isValid() {
+		//TODO - implement
+		return true;
+	}
+	
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		
+		sb.append("# enabled? ").append(m_enabled).append("\n");
+		sb.append("# prefix: ").append(m_prefix).append("\n");
+		sb.append("# pass DNS? ").append(m_passDns).append("\n\n");
+		
+		sb.append("subnet " + m_subnet.getHostAddress() + " netmask " + m_subnetMask.getHostAddress() + " {\n");
+		
+		// DNS servers
+		if(m_passDns && m_dnsServers != null && m_dnsServers.size() > 0) {
+			sb.append("    option domain-name-servers " );
+			for(int i=0; i<m_dnsServers.size(); i++) {
+				if (m_dnsServers.get(i) != null) {
+					sb.append(m_dnsServers.get(i).getHostAddress());
+				}
+				
+				if(i+1 == m_dnsServers.size()) {
+					sb.append(";\n\n");
+				} else {
+					sb.append(",");
+				}
+			}
+		}
+		// interface
+		if(m_interfaceName != null) {
+			sb.append("    interface " + m_interfaceName + ";\n");
+		}
+		// router address
+		if(m_routerAddress != null) {
+			sb.append("    option routers " + m_routerAddress.getHostAddress() + ";\n");
+		}
+		// if DNS should not be forwarded, add the following lines
+		if(!m_passDns) {
+			sb.append("    ddns-update-style none;\n");
+			sb.append("    ddns-updates off;\n");
+		}
+		// Lease times
+		sb.append("    default-lease-time " + m_defaultLeaseTime + ";\n");
+		if(m_maximumLeaseTime > -1) {
+			sb.append("    max-lease-time " + m_maximumLeaseTime + ";\n");
+		}
+		
+		// Add the pool and range
+		sb.append("    pool {\n");
+		sb.append("        range " + m_rangeStart.getHostAddress() + " " + m_rangeEnd.getHostAddress() + ";\n");
+		sb.append("    }\n");
+		sb.append("}\n");
+		
+		return sb.toString();
+	}
+	
+	
+	public boolean equals(Object obj) {
+		
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		
+		@SuppressWarnings("rawtypes")
+		DhcpServerConfigIP other = (DhcpServerConfigIP) obj;
+		
+		if (m_enabled != other.m_enabled) {
+			return false;
+		}
+		
+		if (m_interfaceName == null) {
+			if (other.m_interfaceName != null) {
+				return false;
+			}
+		} else if (!m_interfaceName.equals(other.m_interfaceName)) {
+			return false;
+		}
+		
+		if (m_subnet == null) {
+			if (other.m_subnet != null) {
+				return false;
+			}
+		} else if (!m_subnet.equals(other.m_subnet)) {
+			return false;
+		}
+		
+		if (m_routerAddress == null) {
+			if (other.m_routerAddress != null) {
+				return false;
+			}
+		} else if (!m_routerAddress.equals(other.m_routerAddress)) {
+			return false;
+		}
+		
+		if (m_subnetMask == null) {
+			if (other.m_subnetMask != null) {
+				return false;
+			}
+		} else if (!m_subnetMask.equals(other.m_subnetMask)) {
+			return false;
+		}
+		
+		if (m_defaultLeaseTime != other.m_defaultLeaseTime) {
+			return false;
+		}
+		
+		if (m_maximumLeaseTime != other.m_maximumLeaseTime) {
+			return false;
+		}
+		
+		if (m_prefix != other.m_prefix) {
+			return false;
+		}
+		
+		if (m_rangeStart == null) {
+			if (other.m_rangeStart != null) {
+				return false;
+			}
+		} else if (!m_rangeStart.equals(other.m_rangeStart)) {
+			return false;
+		}
+		
+		if (m_rangeEnd == null) {
+			if (other.m_rangeEnd != null) {
+				return false;
+			}
+		} else if (!m_rangeEnd.equals(other.m_rangeEnd)) {
+			return false;
+		}
+	
+		if (m_passDns != other.m_passDns) {
+			return false;
+		}
+		
+		if (m_dnsServers == null) {
+			if (other.m_dnsServers != null) {
+				return false;
+			}
+		} else if (!m_dnsServers.equals(other.m_dnsServers)) {
+			return false;
+		}
+		
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP4.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ed422b712cade38ef21dc1f5c169daee1238c85
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP4.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+import java.util.List;
+
+import org.eclipse.kura.net.IP4Address;
+
+/**
+ * The configuration representing a DHCP server configuration for an IPv4 network.
+ * 
+ * @author eurotech
+ *
+ */
+public class DhcpServerConfigIP4 extends DhcpServerConfigIP<IP4Address> implements DhcpServerConfig4 {
+
+	/**
+	 * The basic Constructor for a DhcpServerConfigIP4
+	 * 
+	 * @param interfaceName			the interface name associated with the DhcpServerConfig
+	 * @param enabled			    the status of the DhcpServer as a boolean
+	 * @param subnet				the subnet of the DhcpServerConfig
+	 * @param routerAddress			the router IPAddress
+	 * @param subnetMask			the subnet mask of the DhcpServerConfig
+	 * @param defaultLeaseTime		the default lease time to issue to DHCP clients
+	 * @param maximumLeaseTime		the maximum lease time to issue to DHCP clients
+	 * @param prefix				the network prefix associated with the DhcpServerConfig
+	 * @param rangeStart			the network starting address to issue to DHCP clients
+	 * @param rangeEnd				the network ending address to issue to DHCP clients
+	 * @param passDns				whether or not to pass DNS to DHCP clients
+	 * @param dnsServers			the DNS servers that will get passed to DHCP clients if passDns is true
+	 */
+	public DhcpServerConfigIP4(String interfaceName, boolean enabled, IP4Address subnet, IP4Address routerAddress, IP4Address subnetMask, int defaultLeaseTime, int maximumLeaseTime,
+			short prefix, IP4Address rangeStart, IP4Address rangeEnd, boolean passDns, List<IP4Address> dnsServers) {
+
+		super(interfaceName, enabled, subnet, routerAddress, subnetMask, defaultLeaseTime, maximumLeaseTime,
+				prefix, rangeStart, rangeEnd, passDns, dnsServers);
+
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP6.java
new file mode 100644
index 0000000000000000000000000000000000000000..d56cbaa7fa9662311ed8f40ba4530e3a590eda92
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/DhcpServerConfigIP6.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dhcp;
+
+import java.util.List;
+
+import org.eclipse.kura.net.IP6Address;
+
+/**
+ * The configuration representing a DHCP server configuration for an IPv6 network.
+ * 
+ * @author eurotech
+ *
+ */
+public class DhcpServerConfigIP6 extends DhcpServerConfigIP<IP6Address> implements DhcpServerConfig6 {
+
+	/**
+	 * The basic Constructor for a DhcpServerConfigIP6
+	 * 
+	 * @param interfaceName			the interface name associated with the DhcpServerConfig
+	 * @param enabled      			the status of the DhcpServer as a {@link boolean }
+	 * @param subnet				the subnet of the DhcpServerConfig
+	 * @param routerAddress			the router IPAddress
+	 * @param subnetMask			the subnet mask of the DhcpServerConfig
+	 * @param defaultLeaseTime		the default lease time to issue to DHCP clients
+	 * @param maximumLeaseTime		the maximum lease time to issue to DHCP clients
+	 * @param prefix				the network prefix associated with the DhcpServerConfig
+	 * @param rangeStart			the network starting address to issue to DHCP clients
+	 * @param rangeEnd				the network ending address to issue to DHCP clients
+	 * @param passDns				whether or not to pass DNS to DHCP clients
+	 * @param dnsServers			the DNS servers that will get passed to DHCP clients if passDns is true
+	 */
+	public DhcpServerConfigIP6(String interfaceName, boolean enabled, IP6Address subnet, IP6Address routerAddress, IP6Address subnetMask, int defaultLeaseTime, int maximumLeaseTime,
+			short prefix, IP6Address rangeStart, IP6Address rangeEnd, boolean passDns, List<IP6Address> dnsServers) {
+
+		super(interfaceName, enabled, subnet, routerAddress, subnetMask, defaultLeaseTime, maximumLeaseTime,
+				prefix, rangeStart, rangeEnd, passDns, dnsServers);
+
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..73c2d757635b3c3fb74bd1aee265b8b9edbc402e
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dhcp/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Interfaces for all DHCP server instances.
+ *
+ */
+package org.eclipse.kura.net.dhcp;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsMonitorService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsMonitorService.java
new file mode 100644
index 0000000000000000000000000000000000000000..78837bcd8752a1e693a693a98f20f8e59512f11c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsMonitorService.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+/**
+ * Marker interface for dns server monitoring service
+ */
+public interface DnsMonitorService {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..eebede0aea24a8517659fcbc6c654a835ff202dc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * The placeholder for all DNS proxy servers
+ * @author eurotech
+ *
+ */
+public interface DnsServerConfig extends NetConfig {
+
+	/**
+	 * returns the DNS forwarders associated with this DnsServerConfig
+	 * @return	a {@link List } of DNS forwarders
+	 */
+	public Set<? extends IPAddress> getForwarders();
+
+	/**
+	 * returns the allowed networks for resolving DNS queries
+	 * @return	a {@link List } of {@link NetworkPair } representing the networks that are allowed to
+	 * 			perform DNS queries
+	 */
+	public Set<? extends NetworkPair<? extends IPAddress>> getAllowedNetworks();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig4.java
new file mode 100644
index 0000000000000000000000000000000000000000..45848137f1bb7091192b9a6bfc5530648e2c6b38
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig4.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+/**
+ * Placeholder for IPv4 DNS server configurations
+ * 
+ * @author eurotech
+ *
+ */
+public interface DnsServerConfig4 extends DnsServerConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig6.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f98cadcea60eb6b75965db6b825af7adbfe857b
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfig6.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+/**
+ * Placeholder for IPv6 DNS server configurations
+ * 
+ * @author eurotech
+ *
+ */
+public interface DnsServerConfig6 extends DnsServerConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1206ee8eb27a3484cb776a03a947b9fc3224bb2
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+import java.util.Set;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * Base class for DNS proxy configurations
+ * 
+ * @author eurotech
+ *
+ * @param <T>
+ */
+public abstract class DnsServerConfigIP<T extends IPAddress> implements DnsServerConfig {
+	
+	private Set<T>					m_forwarders;
+	private Set<NetworkPair<T>>	m_allowedNetworks;
+	
+	/**
+	 * Creates a DNS configuration with a default set of forwarders and a set of allowed networks
+	 * @param forwarders		The recursive DNS servers to use
+	 * @param allowedNetworks	The LAN networks that are allowed to make queries
+	 */
+	public DnsServerConfigIP(Set<T> forwarders, Set<NetworkPair<T>> allowedNetworks) {
+		super();
+		
+		m_forwarders = forwarders;
+		m_allowedNetworks = allowedNetworks;
+	}
+	
+	/**
+	 * Gets the current recursive domain name servers to use to resolve queries
+	 */
+	public Set<T> getForwarders() {
+		return m_forwarders;
+	}
+	
+	/**
+	 * Sets the current recursive domain name servers to use to resolve queries
+	 * @param forwarders	The recursive DNS servers to use
+	 */
+	public void setForwarders(Set<T> forwarders) {
+		m_forwarders = forwarders;
+	}
+	
+	/**
+	 * Gets a List of networks that are allowed to make DNS queries
+	 */
+	public Set<NetworkPair<T>> getAllowedNetworks() {
+		return m_allowedNetworks;
+	}
+	
+	/**
+	 * Sets a List of networks that are allowed to make DNS queries
+	 * @param allowedNetworks	The LAN networks that are allowed to make queries
+	 */
+	public void setAllowedNetworks(Set<NetworkPair<T>> allowedNetworks) {
+		m_allowedNetworks = allowedNetworks;
+	}
+
+	@Override
+	public String toString() {
+		return "DnsServerConfigIP [m_forwarders=" + m_forwarders
+				+ ", m_allowedNetworks=" + m_allowedNetworks + "]";
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime
+				* result
+				+ ((m_allowedNetworks == null) ? 0 : m_allowedNetworks
+						.hashCode());
+		result = prime * result
+				+ ((m_forwarders == null) ? 0 : m_forwarders.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		DnsServerConfigIP other = (DnsServerConfigIP) obj;
+		if (m_allowedNetworks == null) {
+			if (other.m_allowedNetworks != null)
+				return false;
+		} else if (!m_allowedNetworks.equals(other.m_allowedNetworks))
+			return false;
+		if (m_forwarders == null) {
+			if (other.m_forwarders != null)
+				return false;
+		} else if (!m_forwarders.equals(other.m_forwarders))
+			return false;
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP4.java
new file mode 100644
index 0000000000000000000000000000000000000000..075e32e13171c709645c6975b2c2a5298a942c75
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP4.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+import java.util.Set;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * DNS server configurations for IPv4 networks
+ * 
+ * @author eurotech
+ *
+ */
+public class DnsServerConfigIP4 extends DnsServerConfigIP<IP4Address> implements DnsServerConfig4 {
+
+	public DnsServerConfigIP4(Set<IP4Address> forwarders, Set<NetworkPair<IP4Address>> allowedNetworks) {
+		super(forwarders, allowedNetworks);
+	}
+
+	@Override
+	public boolean isValid() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP6.java
new file mode 100644
index 0000000000000000000000000000000000000000..a252e47a4579f88c2de12a183ca4ec99ce2004db
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/DnsServerConfigIP6.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.dns;
+
+import java.util.Set;
+
+import org.eclipse.kura.net.IP6Address;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * DNS server configurations for IPv6 networks
+ * 
+ * @author eurotech
+ *
+ */
+public class DnsServerConfigIP6 extends DnsServerConfigIP<IP6Address> implements DnsServerConfig6 {
+
+	public DnsServerConfigIP6(Set<IP6Address> forwarders, Set<NetworkPair<IP6Address>> allowedNetworks) {
+		super(forwarders, allowedNetworks);
+	}
+
+	@Override
+	public boolean isValid() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..0494b68127cc3e349393223beaffa668ff3d04a3
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/dns/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Interfaces for all DNS server instances.
+ *
+ */
+package org.eclipse.kura.net.dns;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallNatConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallNatConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..57f1430a6a47c2be526bed070d230d6f78231fd3
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallNatConfig.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.NetConfig;
+
+/**
+ * Represents a NAT configuration
+ * 
+ * @author eurotech
+ *
+ */
+public class FirewallNatConfig implements NetConfig {
+
+	/** The source interface (LAN interface) for the NAT configuration **/
+	private String m_sourceInterface;
+	
+	/** The destination interface (WAN interface) for the NAT configuration **/
+	private String m_destinationInterface;
+	
+	/** Whether or not MASQUERADE should be enabled **/
+	private boolean m_masquerade;
+	
+	/**
+	 * Creates a null NAT configuration
+	 */
+	public FirewallNatConfig() {
+		super();
+	}
+	
+	/**
+	 * Creates a complete NAT configuration
+	 * 
+	 * @param sourceInterface			The source interface (LAN interface) for the NAT configuration
+	 * @param destinationInterface		The destination interface (WAN interface) for the NAT configuration
+	 * @param masquerade				Whether or not MASQUERADE should be enabled
+	 */
+	public FirewallNatConfig(String sourceInterface, String destinationInterface, boolean masquerade) {
+		super();
+		this.m_sourceInterface = sourceInterface;
+		this.m_destinationInterface = destinationInterface;
+		this.m_masquerade = masquerade;
+	}
+
+	public String getSourceInterface() {
+		return m_sourceInterface;
+	}
+
+	public void setSourceInterface(String sourceInterface) {
+		this.m_sourceInterface = sourceInterface;
+	}
+
+	public String getDestinationInterface() {
+		return m_destinationInterface;
+	}
+
+	public void setDestinationInterface(String destinationInterface) {
+		this.m_destinationInterface = destinationInterface;
+	}
+
+	public boolean isMasquerade() {
+		return m_masquerade;
+	}
+
+	public void setMasquerade(boolean masquerade) {
+		this.m_masquerade = masquerade;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime
+				* result
+				+ ((m_destinationInterface == null) ? 0
+						: m_destinationInterface.hashCode());
+		result = prime * result + (m_masquerade ? 1231 : 1237);
+		result = prime
+				* result
+				+ ((m_sourceInterface == null) ? 0 : m_sourceInterface
+						.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		FirewallNatConfig other = (FirewallNatConfig) obj;
+		/*
+		if (m_destinationInterface == null) {
+			if (other.m_destinationInterface != null)
+				return false;
+		} else if (!m_destinationInterface.equals(other.m_destinationInterface))
+			return false;*/
+		if (m_masquerade != other.m_masquerade)
+			return false;
+		if (m_sourceInterface == null) {
+			if (other.m_sourceInterface != null)
+				return false;
+		} else if (!m_sourceInterface.equals(other.m_sourceInterface))
+			return false;
+
+		return true;
+	}
+
+	@Override
+	public boolean isValid() {
+		if(m_destinationInterface != null && !m_destinationInterface.trim().isEmpty() &&
+				m_sourceInterface != null && !m_sourceInterface.trim().isEmpty()) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("FirewallNatConfig [m_sourceInterface=");
+		builder.append(m_sourceInterface);
+		builder.append(", m_destinationInterface=");
+		builder.append(m_destinationInterface);
+		builder.append(", m_masquerade=");
+		builder.append(m_masquerade);
+		builder.append("]");
+		return builder.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8c85da8f9904f14c6bdd3700696ab3cf10e5870
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfig.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * Marker interface for firewall open port configurations
+ * 
+ * @author eurotech
+ *
+ */
+public interface FirewallOpenPortConfig extends NetConfig {
+
+	/**
+	 * Gets the port that is open for inbound connections
+	 * 
+	 * @return		The port number representing the inbound network port
+	 */
+	public int getPort();
+
+	/**
+	 * Gets the type of network protocol (TCP or UDP) that is open for inbound connections
+	 * 
+	 * @return		The NetProtocol type associated with this interface
+	 */
+	public NetProtocol getProtocol();
+
+	/**
+	 * Gets the (optional) permitted remote network that can make inbound connections
+	 * 
+	 * @return		The NetworkPair representing the permitted network
+	 */
+	public NetworkPair<? extends IPAddress> getPermittedNetwork();
+
+	/**
+	 * Gets the (optional) permitted MAC address that is allowed to make inbound connections
+	 * 
+	 * @return		The MAC address that is allowed to make inbound connections
+	 */
+	public String getPermittedMac();
+
+	/** Gets the (optional) permitted source port range that is allowed to make inbound connections
+	 * 
+	 * @return		The source port range that is allowed to make inbound connections
+	 */
+	public String getSourcePortRange();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfig4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfig4.java
new file mode 100644
index 0000000000000000000000000000000000000000..3018522554fe40f0101e0e13f254ae0104f6748d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfig4.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+/**
+ * Marker interface for IPv4 firewall open port configurations
+ * 
+ * @author eurotech
+ *
+ */
+public interface FirewallOpenPortConfig4 extends FirewallOpenPortConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfigIP.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfigIP.java
new file mode 100644
index 0000000000000000000000000000000000000000..1520d732b889ab694ab3533599f46aeda92653a3
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfigIP.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * The base class for firewall open port configurations
+ * 
+ * @author eurotech
+ *
+ * @param <T>
+ */
+public abstract class FirewallOpenPortConfigIP<T extends IPAddress> implements FirewallOpenPortConfig {
+
+	/** The port to open for inbound connections **/
+	private int port;
+	
+	/** The type of protocol to allow for inbound connections **/
+	private NetProtocol protocol;
+	
+	/** The (optional) permitted network for inbound connections **/
+	private NetworkPair<T> permittedNetwork;
+	
+	/** The (optional) permitted interface name for inbound connections **/
+	private String permittedInterfaceName;
+	
+	/** The (optional) not permitted interface name for inbound connections **/
+	private String unpermittedInterfaceName;
+	
+	/** The (optional) permitted MAC address for inbound connections **/
+	private String permittedMac;
+	
+	/** The (options) permitted source port range for inbound connections **/
+	private String sourcePortRange;
+	
+	/**
+	 * Creates and empty open port configuration
+	 */
+	public FirewallOpenPortConfigIP() {
+		super();
+	}
+
+	/**
+	 * Creates a complete Open Port configuration
+	 * 
+	 * @param port					   The port to open for inbound connections
+	 * @param protocol				   The type of protocol to allow for inbound connections
+	 * @param permittedNetwork		   The (optional) permitted network for inbound connections
+	 * @param permittedInterfaceName   The (optional) permitted interface name for inbound connections
+	 * @param unpermittedInterfaceName The (optional) not permitted interface name for inbound connections
+	 * @param permittedMac			   The (optional) permitted MAC address for inbound connections
+	 * @param sourcePortRange		   The (options) permitted source port range for inbound connections
+	 */
+	public FirewallOpenPortConfigIP(int port, NetProtocol protocol, NetworkPair<T> permittedNetwork, String permittedInterfaceName, String unpermittedInterfaceName, String permittedMac, String sourcePortRange) { 	
+		super();
+		this.port = port;
+		this.protocol = protocol;
+		this.permittedNetwork = permittedNetwork;
+		this.permittedInterfaceName = permittedInterfaceName;
+		this.unpermittedInterfaceName = unpermittedInterfaceName;
+		this.permittedMac = permittedMac;
+		this.sourcePortRange = sourcePortRange;
+	}
+
+	public int getPort() {
+		return port;
+	}
+
+	public void setPort(int port) {
+		this.port = port;
+	}
+
+	public NetProtocol getProtocol() {
+		return protocol;
+	}
+
+	public void setProtocol(NetProtocol protocol) {
+		this.protocol = protocol;
+	}
+
+	public NetworkPair<T> getPermittedNetwork() {
+		return permittedNetwork;
+	}
+
+	public void setPermittedNetwork(NetworkPair<T> permittedNetwork) {
+		this.permittedNetwork = permittedNetwork;
+	}
+
+	public String getPermittedInterfaceName() {
+		return permittedInterfaceName;
+	}
+
+	public void setPermittedInterfaceName(String permittedInterfaceName) {
+		this.permittedInterfaceName = permittedInterfaceName;
+	}
+
+	public String getUnpermittedInterfaceName() {
+		return unpermittedInterfaceName;
+	}
+
+	public void setUnpermittedInterfaceName(String unpermittedInterfaceName) {
+		this.unpermittedInterfaceName = unpermittedInterfaceName;
+	}
+	
+	public String getPermittedMac() {
+		return permittedMac;
+	}
+
+	public void setPermittedMac(String permittedMac) {
+		this.permittedMac = permittedMac;
+	}
+
+	public String getSourcePortRange() {
+		return sourcePortRange;
+	}
+
+	public void setSourcePortRange(String sourcePortRange) {
+		this.sourcePortRange = sourcePortRange;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime
+				* result
+				+ ((permittedInterfaceName == null) ? 0
+						: permittedInterfaceName.hashCode());
+		result = prime * result
+				+ ((permittedMac == null) ? 0 : permittedMac.hashCode());
+		result = prime
+				* result
+				+ ((permittedNetwork == null) ? 0 : permittedNetwork.hashCode());
+		result = prime * result + port;
+		result = prime * result
+				+ ((protocol == null) ? 0 : protocol.hashCode());
+		result = prime * result
+				+ ((sourcePortRange == null) ? 0 : sourcePortRange.hashCode());
+		result = prime
+				* result
+				+ ((unpermittedInterfaceName == null) ? 0
+						: unpermittedInterfaceName.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		FirewallOpenPortConfigIP other = (FirewallOpenPortConfigIP) obj;
+		if (permittedInterfaceName == null) {
+			if (other.permittedInterfaceName != null)
+				return false;
+		} else if (!permittedInterfaceName.equals(other.permittedInterfaceName))
+			return false;
+		if (permittedMac == null) {
+			if (other.permittedMac != null)
+				return false;
+		} else if (!permittedMac.equals(other.permittedMac))
+			return false;
+		if (permittedNetwork == null) {
+			if (other.permittedNetwork != null)
+				return false;
+		} else if (!permittedNetwork.equals(other.permittedNetwork))
+			return false;
+		if (port != other.port)
+			return false;
+		if (protocol != other.protocol)
+			return false;
+		if (sourcePortRange == null) {
+			if (other.sourcePortRange != null)
+				return false;
+		} else if (!sourcePortRange.equals(other.sourcePortRange))
+			return false;
+		if (unpermittedInterfaceName == null) {
+			if (other.unpermittedInterfaceName != null)
+				return false;
+		} else if (!unpermittedInterfaceName
+				.equals(other.unpermittedInterfaceName))
+			return false;
+		return true;
+	}
+
+	@Override
+	public boolean isValid() {
+		if(port < 0 || port > 65535) {
+			return false;
+		}
+		
+		if(protocol == null || !protocol.equals(NetProtocol.tcp) || !protocol.equals(NetProtocol.udp)) {
+			return false;
+		}
+		
+		//TODO - add checks for optional parameters to make sure if they are not null they are valid
+		
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("FirewallOpenPortConfigIP [port=");
+		builder.append(port);
+		builder.append(", protocol=");
+		builder.append(protocol);
+		builder.append(", permittedNetwork=");
+		builder.append(permittedNetwork);
+		builder.append(", permittedMac=");
+		builder.append(permittedMac);
+		builder.append(", sourcePortRange=");
+		builder.append(sourcePortRange);
+		builder.append("]");
+		return builder.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfigIP4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfigIP4.java
new file mode 100644
index 0000000000000000000000000000000000000000..4cde69368e28afd420a7df6563bb917a1c3c12b3
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallOpenPortConfigIP4.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * The implementation of IPv4 firewall open port configurations
+ * @author eurotech
+ *
+ */
+public class FirewallOpenPortConfigIP4 extends FirewallOpenPortConfigIP<IP4Address> implements FirewallOpenPortConfig4 {
+
+	public FirewallOpenPortConfigIP4() {
+		super();
+	}
+	
+	public FirewallOpenPortConfigIP4(int port, NetProtocol protocol, NetworkPair<IP4Address> permittedNetwork, String permittedInterfaceName, String unpermittedInterfaceName, String permittedMac, String sourcePortRange) { 	
+		super(port, protocol, permittedNetwork, permittedInterfaceName, unpermittedInterfaceName, permittedMac, sourcePortRange);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9311891f719108c8112f20ff050042c0885208c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfig.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * Marker interface for firewall port forward configurations
+ * 
+ * @author eurotech
+ *
+ */
+public interface FirewallPortForwardConfig extends NetConfig {
+
+	/**
+	 * The external (WAN) interface to listen for inbound connections on
+	 * 
+	 * @return		The interface name used for this port forward configuration
+	 */
+	public String getInterfaceName();
+	
+	/**
+	 * The LAN IP address to forward connections to
+	 * 
+	 * @return		The LAN IPAddress to forward connections to
+	 */
+	public IP4Address getAddress();
+	
+	/**
+	 * Gets the type of network protocol (TCP or UDP) that is used for this configuration
+	 * 
+	 * @return		The NetProtocol type associated with this interface
+	 */
+	public NetProtocol getProtocol();
+	
+	/**
+	 * The inbound (WAN) port to use for this configuration
+	 * 
+	 * @return		The WAN port number
+	 */
+	public int getInPort();
+	
+	/**
+	 * The outbound (LAN) port to use for this configuration
+	 * 
+	 * @return		The LAN port number
+	 */
+	public int getOutPort();
+	
+	/**
+	 * Gets the (optional) permitted remote network that can make inbound connections
+	 * 
+	 * @return		The NetworkPair representing the permitted network
+	 */
+	public NetworkPair<? extends IPAddress> getPermittedNetwork();
+
+	/**
+	 * Gets the (optional) permitted MAC address that is allowed to make inbound connections
+	 * 
+	 * @return		The MAC address that is allowed to make inbound connections
+	 */
+	public String getPermittedMac();
+
+	/** Gets the (optional) permitted source port range that is allowed to make inbound connections
+	 * 
+	 * @return		The source port range that is allowed to make inbound connections
+	 */
+	public String getSourcePortRange();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfig4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfig4.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ba0669248730d8e5901867476d0cfd82c830821
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfig4.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+/**
+ * Marker interface for IPv4 firewall port forward configurations
+ * 
+ * @author eurotech
+ *
+ */
+public interface FirewallPortForwardConfig4 extends FirewallPortForwardConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfigIP.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfigIP.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3165c8959df0aec1d74be6d79be74a65665d8c6
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfigIP.java
@@ -0,0 +1,261 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkPair;
+
+/**
+ * The base class for firewall port forward configurations
+ * 
+ * @author eurotech
+ *
+ * @param <T>
+ */
+public abstract class FirewallPortForwardConfigIP<T extends IPAddress> implements FirewallPortForwardConfig {
+	
+	/** The interface name on which this configuration will listen for inbound connections **/
+	private String interfaceName;
+	
+	/** The LAN address to forward to **/
+	private IP4Address address;
+	
+	/** The protocol (TCP or UDP) to listen for and forward **/
+	private NetProtocol protocol;
+	
+	/** The inbound (WAN) port to listen on **/
+	private int inPort;
+	
+	/** The outbound (LAN) port to listen on **/
+	private int outPort;
+	
+	/** The (optional) permitted network for inbound connections **/
+	private NetworkPair<T> permittedNetwork;
+	
+	/** The (optional) permitted MAC address for inbound connections **/
+	private String permittedMac;
+	
+	/** The (options) permitted source port range for inbound connections **/
+	private String sourcePortRange;
+	
+	/**
+	 * Creates and empty port forward configuration
+	 */
+	public FirewallPortForwardConfigIP() {
+		super();
+	}
+	
+	/**
+	 * Creates a complete port forward configuration
+	 * 
+	 * @param interfaceName			The interface name on which this configuration will listen for inbound connections
+	 * @param address				The LAN address to forward to
+	 * @param protocol				The protocol (TCP or UDP) to listen for and forward
+	 * @param inPort				The inbound (WAN) port to listen on
+	 * @param outPort				The outbound (LAN) port to listen on
+	 * @param permittedNetwork		The (optional) permitted network for inbound connections
+	 * @param permittedMac			The (optional) permitted MAC address for inbound connections
+	 * @param sourcePortRange		The (options) permitted source port range for inbound connections
+	 */
+	public FirewallPortForwardConfigIP(String interfaceName, IP4Address address,
+			NetProtocol protocol, int inPort, int outPort,
+			NetworkPair<T> permittedNetwork,
+			String permittedMac, String sourcePortRange) {
+		super();
+		this.interfaceName = interfaceName;
+		this.address = address;
+		this.protocol = protocol;
+		this.inPort = inPort;
+		this.outPort = outPort;
+		this.permittedNetwork = permittedNetwork;
+		this.permittedMac = permittedMac;
+		this.sourcePortRange = sourcePortRange;
+	}
+	
+	public String getInterfaceName() {
+		return interfaceName;
+	}
+	
+	public void setInterfaceName(String interfaceName) {
+		this.interfaceName = interfaceName;
+	}
+	
+	public IP4Address getAddress() {
+		return address;
+	}
+	
+	public void setAddress(IP4Address address) {
+		this.address = address;
+	}
+	
+	public NetProtocol getProtocol() {
+		return protocol;
+	}
+	
+	public void setProtocol(NetProtocol protocol) {
+		this.protocol = protocol;
+	}
+	
+	public int getInPort() {
+		return inPort;
+	}
+	
+	public void setInPort(int inPort) {
+		this.inPort = inPort;
+	}
+	
+	public int getOutPort() {
+		return outPort;
+	}
+	
+	public void setOutPort(int outPort) {
+		this.outPort = outPort;
+	}
+	
+	public NetworkPair<T> getPermittedNetwork() {
+		return permittedNetwork;
+	}
+	
+	public void setPermittedNetwork(
+			NetworkPair<T> permittedNetwork) {
+		this.permittedNetwork = permittedNetwork;
+	}
+	
+	public String getPermittedMac() {
+		return permittedMac;
+	}
+
+	public void setPermittedMac(String permittedMac) {
+		this.permittedMac = permittedMac;
+	}
+	
+	public String getSourcePortRange() {
+		return sourcePortRange;
+	}
+	
+	public void setSourcePortRange(String sourcePortRange) {
+		this.sourcePortRange = sourcePortRange;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((address == null) ? 0 : address.hashCode());
+		result = prime * result + inPort;
+		result = prime * result
+				+ ((interfaceName == null) ? 0 : interfaceName.hashCode());
+		result = prime * result + outPort;
+		result = prime * result
+				+ ((permittedMac == null) ? 0 : permittedMac.hashCode());
+		result = prime
+				* result
+				+ ((permittedNetwork == null) ? 0 : permittedNetwork.hashCode());
+		result = prime * result
+				+ ((protocol == null) ? 0 : protocol.hashCode());
+		result = prime * result
+				+ ((sourcePortRange == null) ? 0 : sourcePortRange.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		@SuppressWarnings("rawtypes")
+		FirewallPortForwardConfigIP other = (FirewallPortForwardConfigIP) obj;
+		if (address == null) {
+			if (other.address != null)
+				return false;
+		} else if (!address.equals(other.address))
+			return false;
+		if (inPort != other.inPort)
+			return false;
+		if (interfaceName == null) {
+			if (other.interfaceName != null)
+				return false;
+		} else if (!interfaceName.equals(other.interfaceName))
+			return false;
+		if (outPort != other.outPort)
+			return false;
+		if (permittedMac == null) {
+			if (other.permittedMac != null)
+				return false;
+		} else if (!permittedMac.equals(other.permittedMac))
+			return false;
+		if (permittedNetwork == null) {
+			if (other.permittedNetwork != null)
+				return false;
+		} else if (!permittedNetwork.equals(other.permittedNetwork))
+			return false;
+		if (protocol != other.protocol)
+			return false;
+		if (sourcePortRange == null) {
+			if (other.sourcePortRange != null)
+				return false;
+		} else if (!sourcePortRange.equals(other.sourcePortRange))
+			return false;
+		return true;
+	}
+	
+	@Override
+	public boolean isValid() {
+		if(interfaceName == null || interfaceName.trim().isEmpty()) {
+			return false;
+		}
+		
+		if(address == null) {
+			return false;
+		}
+		
+		if(inPort < 0 || inPort > 65535 || outPort < 0 || outPort > 65535) {
+			return false;
+		}
+		
+		if(protocol == null || !protocol.equals(NetProtocol.tcp) || !protocol.equals(NetProtocol.udp)) {
+			return false;
+		}
+		
+		//TODO - add checks for optional parameters to make sure if they are not null they are valid
+		
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("FirewallPortForwardConfigIP [interfaceName=");
+		builder.append(interfaceName);
+		builder.append(", address=");
+		builder.append(address);
+		builder.append(", protocol=");
+		builder.append(protocol);
+		builder.append(", inPort=");
+		builder.append(inPort);
+		builder.append(", outPort=");
+		builder.append(outPort);
+		builder.append(", permittedNetwork=");
+		builder.append(permittedNetwork);
+		builder.append(", permittedMac=");
+		builder.append(permittedMac);
+		builder.append(", sourcePortRange=");
+		builder.append(sourcePortRange);
+		builder.append("]");
+		return builder.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfigIP4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfigIP4.java
new file mode 100644
index 0000000000000000000000000000000000000000..c883a8f13ad13e08e4a311df1314473a7f43caa6
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallPortForwardConfigIP4.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkPair;
+
+public class FirewallPortForwardConfigIP4 extends FirewallPortForwardConfigIP<IP4Address> implements FirewallPortForwardConfig4 {
+	
+	public FirewallPortForwardConfigIP4() {
+		super();
+	}
+	
+	public FirewallPortForwardConfigIP4(String interfaceName, IP4Address address,
+			NetProtocol protocol, int inPort, int outPort,
+			NetworkPair<IP4Address> permittedNetwork,
+			String permittedMac, String sourcePortRange) {
+		super(interfaceName, address, protocol, inPort, outPort, permittedNetwork, permittedMac, sourcePortRange);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallReverseNatConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallReverseNatConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e475b167516d03900b713fefa937abb35ff3066
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/FirewallReverseNatConfig.java
@@ -0,0 +1,151 @@
+package org.eclipse.kura.net.firewall;
+
+import org.eclipse.kura.net.NetConfig;
+
+public class FirewallReverseNatConfig implements NetConfig {
+	
+	/** The source interface (WAN interface) for the Reverse NAT configuration **/
+	private String m_sourceInterface;
+	
+	/** The destination interface (LAN interface) for the Reverse NAT configuration **/
+	private String m_destinationInterface; 
+	
+	/** protocol (i.e. all, tcp, udp) */
+	private String m_protocol;
+	
+	/** source network/host in CIDR notation */
+	private String m_source;
+	
+	/** destination network/host in CIDR notation */
+	private String m_destination;
+
+	public FirewallReverseNatConfig(String srcIface, String dstIface, String protocol, String src, String dst) {
+		m_sourceInterface = srcIface;
+		m_destinationInterface = dstIface;
+		m_protocol = protocol;
+		m_source = src;
+		m_destination = dst; 
+	}
+	
+	public String getSourceInterface() {
+		return m_sourceInterface;
+	}
+
+	public String getDestinationInterface() {
+		return m_destinationInterface;
+	}
+	
+	public String getProtocol() {
+		return m_protocol;
+	}
+	
+	public String getSource() {
+		return m_source;
+	}
+
+	public String getDestination() {
+		return m_destination;
+	}
+
+	@Override
+	public boolean isValid() {
+		if ((m_destinationInterface != null)
+				&& !m_destinationInterface.trim().isEmpty()
+				&& (m_sourceInterface != null)
+				&& !m_sourceInterface.trim().isEmpty()) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime
+				* result
+				+ ((m_destinationInterface == null) ? 0 : m_destinationInterface.hashCode());
+	
+		result = prime
+				* result
+				+ ((m_sourceInterface == null) ? 0 : m_sourceInterface.hashCode());
+		
+		result = prime
+				* result
+				+ ((m_protocol == null) ? 0 : m_protocol.hashCode());
+		
+		result = prime
+				* result
+				+ ((m_source == null) ? 0 : m_source.hashCode());
+		
+		result = prime
+				* result
+				+ ((m_destination == null) ? 0 : m_destination.hashCode());
+				
+		return result;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		FirewallReverseNatConfig other = (FirewallReverseNatConfig) obj;
+		
+		if (m_sourceInterface == null) {
+			if (other.m_sourceInterface != null) {
+				return false;
+			}
+		} else if (!m_sourceInterface.equals(other.m_sourceInterface)) {
+			return false;
+		} else if (!m_protocol.equals(other.m_protocol)) {
+			return false;
+		}
+		
+		if (m_destinationInterface == null) {
+			if (other.m_destinationInterface != null) {
+				return false;
+			}
+		} else if (!m_destinationInterface.equals(other.m_destinationInterface)) {
+			return false;
+		}
+		
+		if (m_source == null) {
+			if (other.m_source != null) {
+				return false;
+			}
+		} else if (!m_source.equals(other.m_source)) {
+			return false;
+		}
+		
+		if (m_destination == null) {
+			if (other.m_destination != null) {
+				return false;
+			}
+		} else if (!m_destination.equals(other.m_destination)) {
+			return false;
+		}
+
+		return true;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("FirewallReverseNatConfig [m_sourceInterface=");
+		builder.append(m_sourceInterface);
+		builder.append(", m_destinationInterface=");
+		builder.append(m_destinationInterface);
+		builder.append(", m_source=");
+		builder.append(m_source);
+		builder.append(", m_destination=");
+		builder.append(m_destination);
+		builder.append("]");
+		return builder.toString();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6d1064e208abe65751e9b39c8657dd69737a7a1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/firewall/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Interfaces firewall configuration instances.
+ *
+ */
+package org.eclipse.kura.net.firewall;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemAddedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemAddedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2d1e6008d4433003830f9946a970da74ee576ec
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemAddedEvent.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * Emitted when a modem is inserted into the gateway
+ */
+public class ModemAddedEvent extends Event {
+	
+    /** Topic of the ModemAddedEvent */
+    public static final String MODEM_EVENT_ADDED_TOPIC = "org/eclipse/kura/net/modem/ADDED";
+
+    ModemDevice m_modemDevice;
+    
+    public ModemAddedEvent(ModemDevice modemDevice) {
+        super(MODEM_EVENT_ADDED_TOPIC, (Map<String, ?>)null);
+        
+        m_modemDevice = modemDevice;
+    }
+    
+	public ModemDevice getModemDevice() {
+		return m_modemDevice;
+	}
+}
+
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemCdmaServiceProvider.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemCdmaServiceProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7e66567d2f655a1772381361f36a53bfbc015b1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemCdmaServiceProvider.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public enum ModemCdmaServiceProvider {
+	
+	UNKNOWN(0),
+	SPRINT(1),
+	AERIS(2),
+	VERIZON(3);
+	
+	private int m_provider;
+	
+	private ModemCdmaServiceProvider(int provider) {
+		m_provider = provider;
+	}
+	
+	public int getProvider() {
+		return m_provider;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..31ce2a3f78c40dbef9e6a7922c910bb0a41f8c24
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConfig.java
@@ -0,0 +1,514 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+
+/**
+ * Modem configuration representation
+ *
+ */
+public class ModemConfig implements NetConfig {
+
+	/**
+	 * Configuration for a cellular modem.
+	 */
+	public static enum PdpType { IP, PPP, IPv6, UNKNOWN };
+	public static enum AuthType { NONE, AUTO, PAP, CHAP };
+	
+	private boolean m_enabled = false;
+	private String m_dialString = "";
+	private int m_pppNumber = 0;
+	private int m_profileID = 0;
+	private PdpType m_pdpType = PdpType.IP;
+	private AuthType m_authType = AuthType.NONE;
+	private String m_apn = "";
+	private String m_username = "";
+	private String m_password = "";
+	private int m_lcpEchoInterval = 0;
+	private int m_lcpEchoFailure = 0;
+	private IPAddress m_ipAddress = null;
+	private int m_dataCompression = 0;			// FIXME: change to enum?
+	private int m_headerCompression = 0;		// FIXME: change to enum?
+	private boolean m_gpsEnabled = false;
+	
+	/**
+	 * Empty constructor
+	 */
+	public ModemConfig() {}
+	
+	/**
+	 * PDP config constructor
+	 * 
+	 * @param apn - access point name as {@link String}
+	 * @param ipAddress - IP address as {@link String}
+	 * @param profileID - PDP profile ID as {@link int}
+	 * @param pdpType - PDP type as {@link PDP_Type}
+	 * @param dataCompression - PDP data compression as {@link int}
+	 * @param headerCompresion - PDP header compression as {@link int}
+	 */
+	public ModemConfig(int profileID, PdpType pdpType, String apn, IPAddress ipAddress,
+			int dataCompression, int headerCompresion) {
+		
+		this.m_profileID = profileID;
+		this.m_pdpType = pdpType;
+		this.m_apn = apn;
+		this.m_ipAddress = ipAddress;
+		this.m_dataCompression = dataCompression;
+		this.m_headerCompression = headerCompresion;
+	}
+	
+	
+	
+    /**
+     * Reports whether it is enabled.
+     * 
+     * @return is enabled as {@link boolean}
+     */
+    public boolean isEnabled() {
+        return this.m_enabled;
+    }
+    
+    /**
+     * Sets the enabled setting.
+     * 
+     * @param enabled - enabled status as {@link boolean}
+     */
+    public void setEnabled(boolean enabled) {
+        this.m_enabled = enabled;
+    }
+
+	/**
+	 * Gets the dial string.
+	 * 
+	 * @return dial string as {@link String}
+	 */
+	public String getDialString() {
+		return this.m_dialString;
+	}
+	
+	/**
+	 * Sets the dial string.
+	 * 
+	 * @param dialString - dial string as {@link String}
+	 */
+	public void setDialString(String dialString) {
+		this.m_dialString = dialString;
+	}
+	
+	/**
+	 * Reports authentication type.
+	 * 
+	 * @return authentication type as {@link AuthType}
+	 */
+	public AuthType getAuthType() {
+		return this.m_authType;
+	}
+	
+	/**
+	 * Sets authentication type.
+	 * 
+	 * @param authType - authentication type as {@link AuthType}
+	 */
+	public void setAuthType(AuthType authType) {
+		this.m_authType = authType;
+	}
+	
+	/**
+	 * Reports user name.
+	 * 
+	 * @return user name as {@link String}
+	 */
+	public String getUsername() {
+		return this.m_username;
+	}
+	
+	/**
+	 * Sets user name.
+	 * 
+	 * @param username - user name as {@link String}
+	 */
+	public void setUsername(String username) {
+		this.m_username = username;
+	}
+	
+	/**
+	 * Reports password.
+	 * 
+	 * @return password as {@link String}
+	 */
+	public String getPassword() {
+		return this.m_password;
+	}
+	
+	/**
+	 * Sets password.
+	 * 
+	 * @param password - password as {@link String}
+	 */
+	public void setPassword(String password) {
+		this.m_password = password;
+	}
+	
+	/**
+	 * Reports LCP echo interval
+	 * 
+	 * @return LCP echo interval (in sec) as {@link int}
+	 */
+	public int getLcpEchoInterval() {
+		return this.m_lcpEchoInterval;
+	}
+	
+	/**
+	 * Sets LCP echo interval
+	 * 
+	 * @param lcpEchoInterval - LCP Echo interval as {@link int}
+	 */
+	public void setLcpEchoInterval(int lcpEchoInterval) {
+		this.m_lcpEchoInterval = lcpEchoInterval;
+	}
+	
+	/**
+	 * Reports number of failed LCP echo requests 
+	 * @return number of failed LCP echo requests as {@link int}
+	 */
+	public int getLcpEchoFailure() {
+		return this.m_lcpEchoFailure;
+	}
+	
+	/**
+	 * Sets number of failed LCP echo requests 
+	 * (unacknowledged LCP echo requests to be sent for pppd to presume the peer to be dead)
+	 *  
+	 * @param lcpEchoFailure
+	 */
+	public void setLcpEchoFailure(int lcpEchoFailure) {
+		this.m_lcpEchoFailure = lcpEchoFailure;
+	}
+    
+    /**
+     * Reports PPP number (i.e. '0' for ppp0).
+     * 
+     * @return PPP number as {@link int}
+     */
+    public int getPppNumber() {
+        return this.m_pppNumber;
+    }
+    
+    /**
+     * Sets PPP number (i.e. '0' for ppp0).
+     * 
+     * @param pppNumber - PPP number as {@link int}
+     */
+    public void setPppNumber(int pppNumber) {
+        this.m_pppNumber = pppNumber;
+    }
+    
+    /**
+     * Reports PDP profile ID.
+     * 
+     * @return PDP profile ID as {@link int}
+     */
+    public int getProfileID() {
+        return this.m_profileID;
+    }
+	
+	/**
+	 * Sets PDP profile ID.
+	 * 
+	 * @param id - PDP profile ID as {@link int}
+	 */
+	public void setProfileID(int id) {
+		this.m_profileID = id;
+	}
+	
+	/**
+	 * Reports PDP type.
+	 * 
+	 * @return PDP type as {@link PDP_Type}
+	 */
+	public PdpType getPdpType() {
+		return this.m_pdpType;
+	}
+	
+	/**
+	 * Sets PDP type.
+	 * 
+	 * @param pdpType - PDP type as {@link PDP_Type}
+	 */
+	public void setPdpType(PdpType pdpType) {
+		this.m_pdpType = pdpType;
+	}
+	
+	/**
+	 * Reports access point name.
+	 * 
+	 * @return access point name as {@link String}
+	 */
+	public String getApn() {
+		return this.m_apn;
+	}
+	
+	/**
+	 * Sets access point name.
+	 * 
+	 * @param apn - access point name as {@link String}
+	 */
+	public void setApn(String apn) {
+		this.m_apn = apn;
+	}
+	
+	/**
+	 * Reports PDP IP address.
+	 * 
+	 * @return IP address as {@link IPAddress}
+	 */
+	public IPAddress getIpAddress() {
+		return this.m_ipAddress;
+	}
+	
+	/**
+	 * Sets PDP IP address.
+	 * 
+	 * @param ip - IP address as {@link IPAddress}
+	 */
+	public void setIpAddress(IPAddress address) {
+		this.m_ipAddress = address;
+	}
+	
+	/**
+	 * Reports a value of numeric parameter that supports PDP data compression.
+	 * 
+	 * @return PDP data compression as {@link int}
+	 */
+	public int getDataCompression() {
+		return this.m_dataCompression;
+	}
+	
+	/**
+	 * Sets a value of numeric parameter that supports PDP data compression.
+	 * 
+	 * @param dataCompression - PDP data compression as {@link int}
+	 */
+	public void setDataCompression(int dataCompression) {
+		this.m_dataCompression = dataCompression;
+	}
+	
+	/**
+	 * Reports a value of numeric parameter that supports PDP header compression.
+	 * 
+	 * @return PDP header compression as {@link int}
+	 */
+	public int getHeaderCompression() {
+		return this.m_headerCompression;
+	}
+	
+	/**
+	 * Sets a value of numeric parameter that supports PDP header compression.
+	 * 
+	 * @param - headerCompression PDP header compression as {@link int}
+	 */
+	public void setHeaderCompression(int headerCompression) {
+		this.m_headerCompression = headerCompression;
+	}
+	
+	/**
+	 * Reports if PDP data compression is enabled.
+	 * 
+	 * @return {@link boolean}
+	 */
+	public boolean isDataCompression() {
+		return (this.m_dataCompression == 0)? false : true;
+	}
+	
+	/**
+	 * Reports if PDP header compression is enabled.
+	 * 
+	 * @return {@link boolean}
+	 */
+	public boolean isHeaderCompression() {
+		return (this.m_headerCompression == 0)? false : true;
+	}
+	
+	public boolean isGpsEnabled() {
+		return m_gpsEnabled;
+	}
+	
+	public void setGpsEnabled(boolean gpsEnabled) {
+		m_gpsEnabled = gpsEnabled;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 59;
+		int result = super.hashCode();
+		
+		result = prime * result
+				+ m_profileID;
+		result = prime * result
+				+ ((m_pdpType == null) ? 0 : m_pdpType.hashCode());
+		result = prime * result
+				+ ((m_authType == null) ? 0 : m_authType.hashCode());
+        result = prime * result
+                + ((m_apn == null) ? 0 : m_apn.hashCode());
+		result = prime * result
+				+ ((m_username == null) ? 0 : m_username.hashCode());
+		result = prime * result
+				+ ((m_password == null) ? 0 : m_password.hashCode());
+		result = prime * result
+				+ ((m_ipAddress == null) ? 0 : m_ipAddress.hashCode());
+        result = prime * result
+                + m_pppNumber;
+		result = prime * result
+				+ m_dataCompression;
+		result = prime * result
+				+ m_headerCompression;
+		result = prime * result + (m_gpsEnabled? 1 : 0);
+		
+		return result;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (! (obj instanceof ModemConfig)) {
+			return false;
+		}
+		
+		ModemConfig otherConfig = (ModemConfig) obj;
+		
+		if (this.m_enabled != otherConfig.isEnabled()) {
+		    return false;
+		}
+        
+        if (this.m_pppNumber != otherConfig.getPppNumber()) {
+            return false;
+        }
+        
+        if (this.m_lcpEchoInterval != otherConfig.getLcpEchoInterval()) {
+        	return false;
+        }
+        
+        if (this.m_lcpEchoFailure != otherConfig.getLcpEchoFailure()) {
+        	return false;
+        }
+		
+		if (this.m_profileID != otherConfig.getProfileID()) {
+		    return false;
+		}
+		
+		if (this.m_pdpType != otherConfig.getPdpType()) {
+			return false;
+		}
+		
+		if (this.m_authType != otherConfig.getAuthType()) {
+			return false;
+		}
+		
+		if (this.m_dataCompression != otherConfig.getDataCompression()) {
+			return false;
+		}
+		
+		if (this.m_headerCompression != otherConfig.getHeaderCompression()) {
+			return false;
+		}
+		
+		if (this.m_gpsEnabled != otherConfig.isGpsEnabled()) {
+			return false;
+		}
+		
+		if (this.m_dialString != null) {
+			if (!this.m_dialString.equals(otherConfig.getDialString())) {
+				return false;
+			}
+		} else {
+			if (otherConfig.getDialString() != null) {
+				return false;
+			}
+		}
+        if (this.m_apn != null) {
+            if (!this.m_apn.equals(otherConfig.getApn())) {
+                return false;
+            }
+        } else {
+            if (otherConfig.getApn() != null) {
+                return false;
+            }
+        }
+
+		if ((this.m_username != null) && (this.m_username.length() > 0)) {
+			if (!this.m_username.equals(otherConfig.getUsername())) {
+				return false;
+			}
+		} else {
+			if ((otherConfig.getUsername() != null) && (otherConfig.getUsername().length() > 0)) {
+				return false;
+			}
+		}
+		
+		if ((this.m_password != null) && (this.m_password.length() > 0)) {
+			if (!this.m_password.equals(otherConfig.getPassword())) {
+				return false;
+			}
+		} else {
+			if ((otherConfig.getPassword() != null) && (otherConfig.getPassword().length() > 0)) {
+				return false;
+			}
+		}
+		
+		if (this.m_ipAddress != null) {
+			if (!this.m_ipAddress.equals(otherConfig)) {
+				return false;
+			}
+		} else {
+			if (otherConfig.getIpAddress() != null) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+	
+   
+	@Override
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append(super.toString());
+        
+        sb.append("ModemConfig - ");
+        
+        sb.append("Enabled: ").append(m_enabled);
+        sb.append(" - PPP Number: ").append(m_pppNumber);
+        sb.append(" - Dial String: ").append(m_dialString);
+       // sb.append(" - Provider: ").append(m_provider);
+        sb.append(" - Profile ID: ").append(m_profileID);
+        sb.append(" - PDP Type: ").append(m_pdpType);
+        sb.append(" - Auth Type: ").append(m_authType);
+        sb.append(" - APN: ").append(m_apn);
+        sb.append(" - Username: ").append(m_username);
+        sb.append(" - Password: ").append(m_password);
+        sb.append(" - IP Address: ").append((m_ipAddress == null) ? "null" : m_ipAddress.getHostAddress());
+        sb.append(" - Data Compression: ").append(m_dataCompression);
+        sb.append(" - Header Compression: ").append(m_headerCompression);
+        
+        return sb.toString();
+	}
+	
+	@Override
+	public boolean isValid() {
+	    if(m_pppNumber < 0) {
+	        return false;
+	    }
+	    
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConnectionStatus.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConnectionStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..c60ba0ad650789fd3733b4b211d661f46779c6f0
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConnectionStatus.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public enum ModemConnectionStatus {
+	/** UNKNOWN **/
+	UNKNOWN,
+	
+	/** DISCONNECTED **/
+	DISCONNECTED,
+	
+	/** CONNECTING **/
+	CONNECTING,
+	
+	/** CONNECTED **/
+	CONNECTED
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConnectionType.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConnectionType.java
new file mode 100644
index 0000000000000000000000000000000000000000..495a97834dd3fa4898545c25068e14be4773be57
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemConnectionType.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public enum ModemConnectionType {
+	/** Point to Point Protocol **/
+	PPP,
+	
+	/** Direct IP **/
+	DirectIP
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..91e1af9013aa363489f6d89f9a16f0503c6d22e4
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemDevice.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import java.util.List;
+
+public interface ModemDevice {
+	
+	public List<String> getSerialPorts();
+	
+	/**
+	 * The manufacturer name of the device
+	 * 
+	 * @return		The manufacturer name of the device
+	 */
+	public String getManufacturerName();
+	
+	/**
+	 * The product name of the device
+	 * 
+	 * @return		The product name of the device
+	 */
+	public String getProductName();
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterface.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..6835d3e9987ec8ec781c2c9b301c3532f0696c18
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterface.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.NetInterface;
+
+/**
+ * Network interface for modems. 
+ */
+public interface ModemInterface<T extends ModemInterfaceAddress> extends NetInterface<T> 
+{	
+    /**
+     * Reports ppp interface number for this modem
+     * 
+     * @return ppp interface number as {@link int}
+     */
+    public int getPppNum();
+    
+    /**
+     * Reports identifier string for this modem
+     * 
+     * @return modem identifier as {@link String}
+     */
+    public String getModemIdentifier();
+
+	/**
+	 * Reports modem's model
+	 * 
+	 * @return model, null if not known
+	 */
+	public String getModel();
+	
+	/**
+	 * Returns modem's manufacturer identification
+	 * 
+	 * @return manufacturer, null if not known
+	 */
+	public String getManufacturer();
+	
+	/**
+	 * Answers modem's serial number
+	 * 
+	 * @return ESN, null if not known
+	 */
+	public String getSerialNumber();
+	
+	/**
+	 * Reports modem's revision identification
+	 * 
+	 * @return array of revision ID's, null if not known
+	 */
+	public String[] getRevisionId();
+	
+	/**
+	 * Reports network technology (e.g. EVDO, HSDPA, etc)
+	 * 
+	 * @return - network technology as <code>ModemTechnologyType</code>
+	 */
+	public List<ModemTechnologyType> getTechnologyTypes();
+	
+	/**
+	 * Reports if modem is powered on
+	 * 
+	 * @return	
+	 * 			true - modem is on <br>
+	 * 			false - modem is off
+	 */
+	public boolean isPoweredOn();
+
+	/**
+	 * Reports modem's power mode. (e.g. ONLINE, OFFLINE, LOW_POWER)
+	 * 
+	 * @throws KuraException
+	 * @return modem power mode
+	 */
+	public ModemPowerMode getPowerMode();
+	
+	/**
+	 * Return's the associated ModemDevice for this modem
+	 * 
+	 * @return <code>ModemDevice</code>
+	 */
+	public ModemDevice getModemDevice();
+	
+	/**
+	 * Reports if GPS is supported
+	 * 
+	 * @return * @return	
+	 * 			true - GPS is supported <br>
+	 * 			false - GPS is not supported
+	 */
+	public boolean isGpsSupported();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterfaceAddress.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterfaceAddress.java
new file mode 100644
index 0000000000000000000000000000000000000000..b449f74859005e69ee641db8dd3fca8c0fbc9c7e
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterfaceAddress.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import org.eclipse.kura.net.NetInterfaceAddress;
+
+/**
+ * Modem Interface Address represents the modem state
+ *
+ */
+public interface ModemInterfaceAddress extends NetInterfaceAddress 
+{
+	/**
+	 * Reports signal strength in dBm
+	 * 
+	 * @return signal strength
+	 */
+	public int getSignalStrength();
+
+	/**
+	 * Reports roaming status
+	 * 
+	 * @return
+	 * 		true - modem is roaming
+	 * 		false - modem is not roaming
+	 */
+	public boolean isRoaming();
+	
+	/**
+	 * Reports connection status
+	 * 
+	 * @return connection status
+	 */
+	public ModemConnectionStatus getConnectionStatus();
+	
+	/**
+	 * Reports number of bytes transmitted during a call
+	 * 
+	 * @return number of bytes transmitted
+	 */
+	public long getBytesTransmitted();
+	
+	/**
+	 * Reports number of bytes received during a call
+	 * 
+	 * @return number of bytes received
+	 */
+	public long getBytesReceived();
+	
+	/**
+	 * Reports Connection Type 
+	 * 
+	 * @return connection type
+	 */
+	public ModemConnectionType getConnectionType();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterfaceAddressConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterfaceAddressConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..22797e9604b879eed28098153f57d0db06426732
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemInterfaceAddressConfig.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import java.util.List;
+
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+
+/**
+ * Modem Interface Address Config represents the modem status and the modem configuration
+ *
+ */
+public interface ModemInterfaceAddressConfig extends ModemInterfaceAddress, NetInterfaceAddressConfig {
+
+	/**
+	 * Returns a List of NetConfig Objects associated with a given ModemInterfaceAddressConfig
+	 * for a given ModemInterface
+	 * @return the NetConfig Objects associated with the ModemInterfaceAddressConfig
+	 */
+	public List<NetConfig> getConfigs();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemMonitorListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemMonitorListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9e55b495ab990ddd70802a0fccdc0c4becc9a76
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemMonitorListener.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public interface ModemMonitorListener {
+	
+	public void setCellularSignalLevel (int signalLevel);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemMonitorService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemMonitorService.java
new file mode 100644
index 0000000000000000000000000000000000000000..1957422e93a17400afa97c0351eb5a18ef3342fc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemMonitorService.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+
+/**
+ * Marker interface for the ModemMonitor
+ *
+ */
+public interface ModemMonitorService {
+	
+	public void registerListener(ModemMonitorListener listener);
+	public void unregisterListener(ModemMonitorListener listener);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemPowerMode.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemPowerMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..c46494d4da23ff48165b4d54782c00f2480a61fe
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemPowerMode.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public enum ModemPowerMode {
+	/** UNKNOWN Mode **/
+	UNKNOWN,
+	
+	/** OFFLINE Mode **/
+	OFFLINE,
+	
+	/** ONLINE Mode **/
+	ONLINE,
+	
+	/** LOW_POWER Mode **/
+	LOW_POWER
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemRegistrationStatus.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemRegistrationStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..96dc996b4f2223887f78aa8a95dd0fe418cdda5a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemRegistrationStatus.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public enum ModemRegistrationStatus {
+
+	UNKNOWN,
+	NOT_REGISTERED,
+	REGISTERED_HOME,
+	REGISTERED_ROAMING,
+	REGISTRATION_DENIED
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemRemovedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemRemovedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff516a930153cce0e06caf53e32663ad4db6244d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemRemovedEvent.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * Emitted when a modem is removed from the gateway
+ */
+public class ModemRemovedEvent extends Event {
+	
+    /** Topic of the ModemRemovedEvent */
+    public static final String MODEM_EVENT_REMOVED_TOPIC = "org/eclipse/kura/net/modem/REMOVED";
+
+    public ModemRemovedEvent(Map<String, ?> properties) {
+            super(MODEM_EVENT_REMOVED_TOPIC, properties);
+    }
+}
+
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemTechnologyType.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemTechnologyType.java
new file mode 100644
index 0000000000000000000000000000000000000000..a85a03a9e6071692a6a7bc29c5ba104302e3aede
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/ModemTechnologyType.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+public enum ModemTechnologyType {
+    NONE,
+    CDMA,
+    EVDO,
+    HSDPA,
+    GPS
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/SerialModemDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/SerialModemDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a899b59bb37ed2e154b13bb8de19d156ef7eb74
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/SerialModemDevice.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.modem;
+
+import java.util.List;
+
+public class SerialModemDevice implements ModemDevice {
+
+	private String m_productName;
+	private String m_manufacturerName;
+	private List<String> m_serialPorts;
+	
+	public SerialModemDevice (String product, String manufacturer, List<String> serialPorts) {
+		m_productName = product;
+		m_manufacturerName = manufacturer;
+		m_serialPorts = serialPorts;
+	}
+
+	public String getProductName() {
+		return m_productName;
+	}
+	
+	public String getManufacturerName() {
+		return m_manufacturerName;
+	}
+
+	@Override
+	public List<String> getSerialPorts() {
+		return m_serialPorts;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf32a4aea32ecc19a20bfa4d566e52a1699687eb
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/modem/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides interfaces for instances and configurations of modems.
+ *
+ */
+package org.eclipse.kura.net.modem;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..97a28726f802692df7f710d713188149f467fc17
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/package-info.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ *
+ */
+/**
+ * Contains interfaces and event model to manage and configure network interfaces on a given system. 
+ * <p>
+ * 
+ *
+ */
+package org.eclipse.kura.net;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..48c7e9912418cbc6dcc8cb66aebc8b9fca5084f9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.route;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+
+/**
+ * Route configuration interface
+ */
+public interface RouteConfig extends NetConfig {
+
+	/**
+	 * Gets the description of the route
+	 * 
+	 * @return		The description of the route
+	 */
+	public String getDescription();
+	
+	/**
+	 * Gets the destination of the route
+	 * 
+	 * @return		The destination of the route
+	 */
+	public IPAddress getDestination();
+
+	/**
+	 * Gets the gateway of the route
+	 * 
+	 * @return		The gateway of the route
+	 */
+	public IPAddress getGateway();
+	
+	/**
+	 * Gets the network mask of the route
+	 * 
+	 * @return		The network mask of the route
+	 */
+	public IPAddress getNetmask();
+	
+	/**
+	 * Gets the interface name associated with the route
+	 * 
+	 * @return		The interface name associated with the route
+	 */
+	public String getInterfaceName();
+
+	/**
+	 * Gets the metric of the route
+	 * 
+	 * @return		The metric of the route
+	 */
+	public int getMetric();
+	
+	/**
+	 * Compares one route to another
+	 * 
+	 * @return		Whether or not the two routes are equal
+	 */
+	public boolean equals(RouteConfig r);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig4.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f84eb61300043202afa641812fdc3b349e8a476
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig4.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.route;
+
+/**
+ * Marker interface for IPv4 route configs
+ */
+public interface RouteConfig4 extends RouteConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig6.java
new file mode 100644
index 0000000000000000000000000000000000000000..6dffd211b50970f892d245331093cf956f8e6c87
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfig6.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.route;
+
+/**
+ * Marker interface for IPv6 route configs
+ */
+public interface RouteConfig6 extends RouteConfig {
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP.java
new file mode 100644
index 0000000000000000000000000000000000000000..5276bd22b66150b5aab28d69b9a2437b99c40adc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.route;
+
+import org.eclipse.kura.net.IPAddress;
+
+/**
+ * Base class for Route configurations
+ *
+ * @param <T>
+ */
+public abstract class RouteConfigIP<T extends IPAddress> implements RouteConfig {
+
+	private T 		m_destination;
+	private T 		m_gateway;
+	private T 		m_netmask;
+	private String 	m_interfaceName;
+	private int		m_metric;
+	
+	public RouteConfigIP(T destination, T gateway, T netmask, String interfaceName, int metric) {
+		super();
+		
+		m_destination = destination;
+		m_gateway = gateway;
+		m_netmask = netmask;
+		m_interfaceName = interfaceName;
+		m_metric = metric;
+	}
+
+	@Override
+	public String getDescription() {
+		StringBuffer desc = new StringBuffer();
+		String gw;
+		if(m_gateway == null) {
+			gw = "default";
+		} else {
+			gw = m_gateway.getHostAddress();
+		}
+		desc.append("Destination: " + m_destination.getHostAddress() + ", " +
+				"Gateway: " + gw + ", " +
+				"Netmask: " + m_netmask.getHostAddress() + ", " +
+				"Interface: " + m_interfaceName + ", " +
+				"Metric: " + m_metric);
+		return desc.toString();
+	}
+
+	@Override
+	public T getDestination() {
+		return m_destination;
+	}
+
+	public void setDestination(T destination) {
+		m_destination = destination;
+	}
+
+	@Override
+	public T getGateway() {
+		return m_gateway;
+	}
+
+	public void setGateway(T gateway) {
+		m_gateway = gateway;
+	}
+
+	@Override
+	public T getNetmask() {
+		return m_netmask;
+	}
+
+	public void setNetmask(T netmask) {
+		m_netmask = netmask;
+	}
+
+	@Override
+	public String getInterfaceName() {
+		return m_interfaceName;
+	}
+
+	public void setInterfaceName(String interfaceName) {
+		m_interfaceName = interfaceName;
+	}
+
+	@Override
+	public int getMetric() {
+		return m_metric;
+	}
+
+	public void setMetric(int metric) {
+		m_metric = metric;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((m_destination == null) ? 0 : m_destination.hashCode());
+		result = prime * result
+				+ ((m_gateway == null) ? 0 : m_gateway.hashCode());
+		result = prime * result
+				+ ((m_interfaceName == null) ? 0 : m_interfaceName.hashCode());
+		result = prime * result + m_metric;
+		result = prime * result
+				+ ((m_netmask == null) ? 0 : m_netmask.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		@SuppressWarnings("rawtypes")
+		RouteConfigIP other = (RouteConfigIP) obj;
+		if (m_destination == null) {
+			if (other.m_destination != null)
+				return false;
+		} else if (!m_destination.equals(other.m_destination))
+			return false;
+		if (m_gateway == null) {
+			if (other.m_gateway != null)
+				return false;
+		} else if (!m_gateway.equals(other.m_gateway))
+			return false;
+		if (m_interfaceName == null) {
+			if (other.m_interfaceName != null)
+				return false;
+		} else if (!m_interfaceName.equals(other.m_interfaceName))
+			return false;
+		if (m_metric != other.m_metric)
+			return false;
+		if (m_netmask == null) {
+			if (other.m_netmask != null)
+				return false;
+		} else if (!m_netmask.equals(other.m_netmask))
+			return false;
+		return true;
+	}
+	
+	@Override
+	public boolean isValid() {
+		if(m_destination == null || m_gateway == null || m_netmask == null ||
+				m_interfaceName == null) {
+			return false;
+		}
+		
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("RouteConfigIP [m_destination=");
+		builder.append(m_destination);
+		builder.append(", m_gateway=");
+		builder.append(m_gateway);
+		builder.append(", m_netmask=");
+		builder.append(m_netmask);
+		builder.append(", m_interfaceName=");
+		builder.append(m_interfaceName);
+		builder.append(", m_metric=");
+		builder.append(m_metric);
+		builder.append("]");
+		return builder.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP4.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP4.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb2cf2366b0a306b698a328cbe9e968b135dcb51
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP4.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.route;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+
+/**
+ * Implementation of IPv4 route configurations
+ */
+public class RouteConfigIP4 extends RouteConfigIP<IP4Address> implements RouteConfig4 {
+
+	public RouteConfigIP4(IP4Address destination, IP4Address gateway,
+			IP4Address netmask, String interfaceName, int metric) {
+		super(destination, gateway, netmask, interfaceName, metric);
+	}
+
+	@Override
+	public boolean equals(RouteConfig route) {
+
+	    if(!this.compareHostAddress(this.getDestination(), route.getDestination())) {
+	        return false;
+	    } else if(!this.compareHostAddress(this.getGateway(), route.getGateway())) {
+	        return false;
+	    } else if(!this.compareHostAddress(this.getNetmask(), route.getNetmask())) {
+	        return false;
+	    } else if(!this.getInterfaceName().equals(route.getInterfaceName())) {
+	        return false;
+	    } else if(this.getMetric() != route.getMetric()) {
+	        return false;
+	    }
+	    
+	    return true;
+	}
+	
+	private boolean compareHostAddress(IPAddress adr1, IPAddress adr2) {
+        String host1 = (adr1 == null || adr1.getHostAddress() == null) ? "" : adr1.getHostAddress();
+        String host2 = (adr2 == null || adr2.getHostAddress() == null) ? "" : adr2.getHostAddress();
+        
+        return host1.equals(host2);
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("destination: ")
+		.append((this.getDestination() != null) ? this.getDestination().getHostAddress() : "null")
+		.append(", gateway: ")
+		.append((this.getGateway() != null) ? this.getGateway().getHostAddress() : "null")
+		.append(", netmask: ")
+		.append((this.getNetmask() != null) ? this.getNetmask().getHostAddress() : "null")
+		.append(", interfaceName: ")
+		.append(this.getInterfaceName())
+		.append(", metric: ")
+		.append(this.getMetric());
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP6.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP6.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4516257d7c4401fb25a8f4a9095e2c71a2dcae6
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RouteConfigIP6.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.route;
+
+import org.eclipse.kura.net.IP6Address;
+
+/**
+ * Implementation of IPv6 route configurations
+ */
+public class RouteConfigIP6 extends RouteConfigIP<IP6Address> implements RouteConfig6 {
+
+	public RouteConfigIP6(IP6Address destination, IP6Address gateway,
+			IP6Address netmask, String interfaceName, int metric) {
+		super(destination, gateway, netmask, interfaceName, metric);
+	}
+
+	@Override
+	public boolean equals(RouteConfig r) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RoutingAgentService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RoutingAgentService.java
new file mode 100644
index 0000000000000000000000000000000000000000..6950a9dbd41eb97df23f57bfecf79b4f5947a43c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/RoutingAgentService.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.route;
+
+import java.util.Map;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.NetInterfaceConfig;
+
+/**
+ * Routing agent service is used to control the static routing table.  The service is used to specify
+ * which interfaces should be used in considering routes and what their priorities should be.
+ */
+public interface RoutingAgentService {
+	
+	/**
+	 * Sets interface priorities
+	 * 
+	 * @param priorities - list of interface priorities as {@link Map<String, Integer>}
+	 */
+	public void setPriorities (Map<String, Integer> priorities);
+	
+	/**
+	 * Adds interface to RoutingAgent
+	 * 
+	 * @param netIfaceConfig - interface configuration as {@link NetInterfaceConfig}
+	 * @throws KuraException
+	 */
+	@SuppressWarnings("rawtypes")
+	public void addInterface (NetInterfaceConfig netIfaceConfig) throws KuraException;
+	
+	/**
+	 * Removes interface from RoutingAgent
+	 * 
+	 * @param interfaceName - interface name as {@link String}
+	 * @throws KuraException
+	 */
+	void removeInterface(String interfaceName) throws KuraException;
+	
+	/**
+	 * Get the default gateway
+	 * 
+	 * @return interfaceName - interface name as {@link String}
+	 * @throws KuraException
+	 */
+	public String getDefaultGateway() throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdfb8eeedb2b3c4ce75d65bc5e7e211a1a2a4f87
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/route/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides services to manage interfaces and their priorities in the static routing table.
+ *
+ */
+package org.eclipse.kura.net.route;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPoint.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPoint.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b545407f6dc5010104ed9095a16d4caaf9c9d44
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPoint.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import java.util.EnumSet;
+import java.util.List;
+
+/** 
+ * The WifiAccessPoint models an access point for a Wifi network.
+ */
+public interface WifiAccessPoint 
+{	
+	/**
+	 * The Service Set Identifier identifying the access point.
+	 * @return
+	 */
+	public String getSSID();
+	
+	/**
+	 * The hardware address (BSSID) of the access point.
+	 * @return
+	 */
+	public byte[] getHardwareAddress();
+	
+	/**
+	 * The radio channel frequency in use by the access point, in MHz.
+
+	 * @return
+	 */
+	public long getFrequency();
+
+	/**
+	 * Describes the operating mode of the access point.
+	 * @return
+	 */
+	public WifiMode getMode();
+	
+	/**
+	 * The bitrates this access point is capable of, in kilobits/second (Kb/s).
+	 * @return
+	 */
+	public List<Long> getBitrate();
+	
+	/**
+	 * The current signal quality of the access point, in percent.
+	 * @return
+	 */
+	public int getStrength();
+	
+	/**
+	 * Describes the access point's capabilities according to WPA (Wifi Protected Access).
+	 * @return
+	 */
+	public EnumSet<WifiSecurity> getWpaSecurity();
+
+	/**
+	 * Describes the access point's capabilities according to the RSN (Robust Secure Network) protocol.
+	 * @return
+	 */
+	public EnumSet<WifiSecurity> getRsnSecurity();
+	
+	/**
+	 *  Describes the access point's capabilities
+	 * @return
+	 */
+	public List<String> getCapabilities();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPointAddedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPointAddedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..07bd7e92f370b718c9d568b70e02b9b1c8c6b5c1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPointAddedEvent.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * Emitted when a new access point is found by the device.
+ */
+public class WifiAccessPointAddedEvent extends Event 
+{
+	/** Topic of the WifiAccessPointAddedEvent */
+	public static final String NETWORK_EVENT_ACCESSPOINT_ADDED_TOPIC = "org/eclipse/kura/net/NetworkEvent/AccessPoint/ADDED";
+	
+	/** Name of the property to access the network interface name */
+	public static final String NETWORK_EVENT_INTERFACE_PROPERTY  = "network.interface";
+
+	/** Name of the property to access the access point */
+	public static final String NETWORK_EVENT_ACCESS_POINT_PROPERTY = "network.access.point";
+
+	public WifiAccessPointAddedEvent(Map<String, ?> properties) {
+		super(NETWORK_EVENT_ACCESSPOINT_ADDED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the network interface name.
+	 * @return
+	 */
+	public String getInterfaceName() {
+		return (String) getProperty(NETWORK_EVENT_INTERFACE_PROPERTY);
+	}
+
+	/**
+	 * Returns the name of the added access point.
+	 * @return
+	 */
+	public WifiAccessPoint getAccessPoint() {
+		return (WifiAccessPoint) getProperty(NETWORK_EVENT_ACCESS_POINT_PROPERTY);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPointRemovedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPointRemovedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac4233785c250ec109a0f77f07d28ecd49f97661
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiAccessPointRemovedEvent.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/** 
+ * Emitted when an access point disappears from view of the device.
+ */
+public class WifiAccessPointRemovedEvent extends Event 
+{
+	/** Topic of the WifiAccessPointAddedEvent */
+	public static final String NETWORK_EVENT_ACCESSPOINT_REMOVED_TOPIC = "org/eclipse/kura/net/NetworkEvent/AccessPoint/REMOVED";
+	
+	/** Name of the property to access the network interface name */
+	public static final String NETWORK_EVENT_INTERFACE_PROPERTY  = "network.interface";
+
+	/** Name of the property to access the access point */
+	public static final String NETWORK_EVENT_ACCESS_POINT_PROPERTY = "network.access.point";
+
+	public WifiAccessPointRemovedEvent(Map<String, ?> properties) {
+		super(NETWORK_EVENT_ACCESSPOINT_REMOVED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the network interface name.
+	 * @return
+	 */
+	public String getInterfaceName() {
+		return (String) getProperty(NETWORK_EVENT_INTERFACE_PROPERTY);
+	}
+
+	/**
+	 * Returns the name of the removed access point.
+	 * @return
+	 */
+	public WifiAccessPoint getAccessPoint() {
+		return (WifiAccessPoint) getProperty(NETWORK_EVENT_ACCESS_POINT_PROPERTY);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiBgscan.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiBgscan.java
new file mode 100644
index 0000000000000000000000000000000000000000..332cfb94c0a995a4030310184ec53b671d97b521
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiBgscan.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Background Scan container class
+ */
+public class WifiBgscan {
+
+	private WifiBgscanModule m_module = null;
+	private int m_shortInterval = 0;
+	private int m_longInterval = 0;
+	private int m_rssiThreshold = 0;
+	
+	public WifiBgscan(WifiBgscanModule module, int shortInterval,
+			int rssiThreshold, int longInterval) {
+
+		m_module = module;
+		m_shortInterval = shortInterval;
+		m_rssiThreshold = rssiThreshold;
+		m_longInterval = longInterval;
+	}
+	
+	public WifiBgscan (WifiBgscan bgscan) {
+		
+		m_module = bgscan.m_module;
+		m_shortInterval = bgscan.m_shortInterval;
+		m_rssiThreshold = bgscan.m_rssiThreshold;
+		m_longInterval = bgscan.m_longInterval;
+	}
+	
+	public WifiBgscan(String str) {
+		
+		if ((str == null) || (str.length() == 0)) {
+			m_module = WifiBgscanModule.NONE;
+		} else {
+			String [] sa = str.split(":");
+			if(sa[0].equals("simple")) {
+				m_module = WifiBgscanModule.SIMPLE;
+			} else if (sa[0].equals("learn")) {
+				m_module = WifiBgscanModule.LEARN;
+			}
+			
+			m_shortInterval = Integer.parseInt(sa[1]);
+			m_rssiThreshold = Integer.parseInt(sa[2]);
+			m_longInterval = Integer.parseInt(sa[3]);
+		}
+	}
+	
+	public WifiBgscanModule getModule() {
+		return m_module;
+	}
+
+	public int getShortInterval() {
+		return m_shortInterval;
+	}
+
+	public int getLongInterval() {
+		return m_longInterval;
+	}
+
+	public int getRssiThreshold() {
+		return m_rssiThreshold;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals (Object obj) {
+		
+		if (!(obj instanceof WifiBgscan)) {
+			return false;
+		}
+		
+		WifiBgscan bgscan = (WifiBgscan)obj;
+		
+		if (this.m_module != bgscan.m_module) {
+			return false;
+		}
+		
+		if (this.m_rssiThreshold != bgscan.m_rssiThreshold) {
+			return false;
+		}
+		
+		if (this.m_shortInterval != bgscan.m_shortInterval) {
+			return false;
+		}
+		
+		if (this.m_longInterval != bgscan.m_longInterval) {
+			return false;
+		}
+		
+		return true;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString () {
+		
+		StringBuffer sb = new StringBuffer();
+		if (m_module == WifiBgscanModule.SIMPLE) {
+			sb.append("simple:");
+		} else if (m_module == WifiBgscanModule.LEARN) {
+			sb.append("learn:");
+		} else {
+			sb.append("");
+			return sb.toString();
+		}
+		
+		sb.append(m_shortInterval);
+		sb.append(':');
+		sb.append(m_rssiThreshold);
+		sb.append(':');
+		sb.append(m_longInterval);
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiBgscanModule.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiBgscanModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f508465c96502fe07578a3136e6a9ae616ed3e7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiBgscanModule.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Module for background scan
+ */
+public enum WifiBgscanModule {
+	
+	NONE(0x00), 
+	SIMPLE(0x01), 
+	LEARN(0x02);
+
+	private int m_code;
+	
+	private WifiBgscanModule(int code) {
+		m_code = code;
+	}
+	
+	public static WifiBgscanModule parseCode(int code) {
+		for (WifiBgscanModule module : WifiBgscanModule.values()) {
+			if (module.m_code == code) {
+				return module;
+			}
+		}
+		return null;
+	}
+
+	public static int getCode(WifiBgscanModule modules) {
+		for (WifiBgscanModule module : WifiBgscanModule.values()) {
+			if (module == modules) {
+				return module.m_code;
+			}
+		}
+		return -1;
+	}	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiCiphers.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiCiphers.java
new file mode 100644
index 0000000000000000000000000000000000000000..e49e0a0a63b3c427a598d6b0ae726d4b5526f0e0
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiCiphers.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Wifi Ciphers enum
+ */
+public enum WifiCiphers {
+	
+	CCMP_TKIP(0x00), 
+	TKIP(0x01), 
+	CCMP(0x02);
+	
+	private int m_code;
+	
+	private WifiCiphers(int code) {
+		m_code = code;
+	}
+
+	public static WifiCiphers parseCode(int code) {
+		for (WifiCiphers cipher : WifiCiphers.values()) {
+			if (cipher.m_code == code) {
+				return cipher;
+			}
+		}
+
+		return null;
+	}
+
+	public static int getCode(WifiCiphers ciphers) {
+		for (WifiCiphers cipher : WifiCiphers.values()) {
+			if (cipher == ciphers) {
+				return cipher.m_code;
+			}
+		}
+
+		return -1;
+	}
+	
+	public static String toString(WifiCiphers ciphers) {
+		
+		String ret = null;
+		for (WifiCiphers cipher : WifiCiphers.values()) {
+			if (cipher == ciphers) {
+				if (cipher == WifiCiphers.CCMP_TKIP) {
+					ret = "CCMP TKIP";
+				} else if (cipher == WifiCiphers.TKIP) {
+					ret = "TKIP";
+				} else if (cipher == WifiCiphers.CCMP) {
+					ret = "CCMP";
+				}
+			}
+		}
+
+		return ret;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiClientMonitorListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiClientMonitorListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..df8c9fe281fdbbbe2114ca948027cd1e7d7913d9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiClientMonitorListener.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+public interface WifiClientMonitorListener {
+
+	public void setWifiSignalLevel (int signalLevel);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiClientMonitorService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiClientMonitorService.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b466eedafa2f81ae602a7607343884211a42296
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiClientMonitorService.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Marker interface for wifi client monitoring service
+ */
+public interface WifiClientMonitorService {
+
+	public void registerListener(WifiClientMonitorListener listener);
+	public void unregisterListener(WifiClientMonitorListener listener);
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb76e6ed8f2f5630fc85b65cad11ee51f40c8eb5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiConfig.java
@@ -0,0 +1,377 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import java.util.Arrays;
+
+import org.eclipse.kura.net.NetConfig;
+
+/**
+ * Configuration for a wifi interface based on IPv4 addresses.
+ */
+public class WifiConfig implements NetConfig {
+
+	/** Mode for the configuration **/
+	private WifiMode m_mode;
+	
+	/** SSID of the the wifi interface **/
+	private String m_ssid;
+	
+	/** Channel(s) supported by the wifi interface **/
+	private int[] m_channels;
+	
+	/** Security mode of the interface **/
+	private WifiSecurity m_security;
+	
+	/** Supported pairwise ciphers **/
+	private WifiCiphers m_pairwiseCiphers;
+	
+	/** Supported group ciphers **/
+	private WifiCiphers m_groupCiphers;
+	
+	/** The passkey for the wifi interface **/
+	private String m_passkey;
+	
+	/** The hardware mode **/
+	private String m_hwMode;
+	
+	/** Radio mode **/
+	private WifiRadioMode m_radioMode;
+	
+	/** Whether or not to broadcast the SSID **/
+	private boolean m_broadcast;
+	
+	/** Background scan **/
+	private WifiBgscan m_bgscan;
+	
+	/** Ping Access Point **/
+	private boolean m_pingAccessPoint = false;
+	
+	/** The driver of the wifi interface **/
+	private String m_driver;
+	
+	public WifiConfig() {
+		super();
+	}
+	
+	public WifiConfig(WifiMode mode, String ssid, int[] channels,
+			WifiSecurity security, String passkey, String hwMode,
+			boolean broadcast, WifiBgscan bgscan) {
+		super();
+		
+		this.m_mode = mode;
+		this.m_ssid = ssid;
+		this.m_channels = channels;
+		this.m_security = security;
+		this.m_passkey = passkey;
+		this.m_hwMode = hwMode;
+		this.m_broadcast = broadcast;
+		this.m_bgscan = bgscan;
+	}
+	
+	public WifiMode getMode() {
+		return this.m_mode;
+	}
+	
+	public void setMode(WifiMode mode) {
+		this.m_mode = mode;
+	}
+	
+	public String getSSID() {
+		return this.m_ssid;
+	}
+	
+	public void setSSID(String ssid) {
+		this.m_ssid = ssid;
+	}
+	
+	public String getDriver() {
+	    return this.m_driver;
+	}
+	
+	public void setDriver(String driver) {
+	    this.m_driver = driver;
+	}
+	
+	public int[] getChannels() {
+		return this.m_channels;
+	}
+	
+	public void setChannels(int[] channels) {
+		this.m_channels = channels;
+	}
+	
+	public WifiSecurity getSecurity() {
+		return this.m_security;
+	}
+	
+	public void setSecurity(WifiSecurity security) {
+		this.m_security = security;
+	}
+	
+	public WifiCiphers getPairwiseCiphers() {
+		return this.m_pairwiseCiphers;
+	}
+	
+	public void setPairwiseCiphers(WifiCiphers pairwise) {
+		this.m_pairwiseCiphers = pairwise;
+	}
+	
+	public WifiCiphers getGroupCiphers() {
+		return this.m_groupCiphers;
+	}
+	
+	public void setGroupCiphers(WifiCiphers group) {
+		this.m_groupCiphers = group;
+	}
+	
+	public String getPasskey() {
+		return this.m_passkey;
+	}
+	
+	public void setPasskey(String key) {
+		this.m_passkey = key;
+	}
+	
+	public String getHardwareMode() {
+		return this.m_hwMode;
+	}
+	
+	public void setHardwareMode(String hwMode) {
+		this.m_hwMode = hwMode;
+	}
+	
+	public WifiRadioMode getRadioMode() {
+		return this.m_radioMode;
+	}
+	
+	public void setRadioMode(WifiRadioMode radioMode) {
+		this.m_radioMode = radioMode;
+	}
+	
+	public boolean getBroadcast() {
+		return this.m_broadcast;
+	}
+	
+	public void setBroadcast(boolean broadcast) {
+		this.m_broadcast = broadcast;
+	}
+	
+	public WifiBgscan getBgscan() {
+		return m_bgscan;
+	}
+
+	public void setBgscan(WifiBgscan m_bgscan) {
+		this.m_bgscan = m_bgscan;
+	}
+	
+	public boolean pingAccessPoint() {
+		return this.m_pingAccessPoint;
+	}
+	
+	public void setPingAccessPoint(boolean pingAP) {
+		this.m_pingAccessPoint = pingAP;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 29;
+		int result = super.hashCode();
+		
+		result = prime * result
+				+ ((m_mode == null) ? 0 : m_mode.hashCode());
+        result = prime * result
+                + ((m_ssid == null) ? 0 : m_ssid.hashCode());
+		result = prime * result
+				+ ((m_driver == null) ? 0 : m_driver.hashCode());
+		
+		if (m_channels != null) {
+			for (int channel : m_channels) {
+				result = prime * result + channel;
+			}
+		} else {
+			result = prime * result;
+		}
+		
+		result = prime * result
+				+ ((m_security == null) ? 0 : m_security.hashCode());
+		result = prime * result
+				+ ((m_passkey == null) ? 0 : m_passkey.hashCode());
+        result = prime * result
+                + ((m_hwMode == null) ? 0 : m_hwMode.hashCode());
+		result = prime * result
+				+ ((m_radioMode == null) ? 0 : m_radioMode.hashCode());
+		result = prime * result
+				+ ((m_broadcast) ? 1021 : 1031);
+		
+		result = prime
+				* result
+				+ ((m_pairwiseCiphers == null) ? 0 : WifiCiphers
+						.getCode(m_pairwiseCiphers));
+		
+		result = prime
+				* result
+				+ ((m_groupCiphers == null) ? 0 : WifiCiphers
+						.getCode(m_groupCiphers));
+		
+		if (m_bgscan != null) {
+
+			result = prime
+					* result
+					+ ((m_bgscan.getModule() == null) ? 0 : WifiBgscanModule
+							.getCode(m_bgscan.getModule()));
+
+			result = prime * result + m_bgscan.getRssiThreshold();
+
+			result = prime * result + m_bgscan.getShortInterval();
+
+			result = prime * result + m_bgscan.getLongInterval();
+		} else {
+			result = prime * result;
+		}
+		
+		result = prime * result + (m_pingAccessPoint? 1 : 0);
+		
+		return result;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+        if(!(obj instanceof WifiConfig)) {
+            return false;
+        }
+		
+		WifiConfig other = (WifiConfig)obj;
+		
+		if(!compare(this.m_mode, other.m_mode)) {
+		    return false;
+		}
+        if(!compare(this.m_ssid, other.m_ssid)) {
+            return false;
+        }
+        if(!compare(this.m_driver, other.m_driver)) {
+            return false;
+        }
+		if (!Arrays.equals(this.m_channels, other.m_channels)) {
+			return false;
+		}
+        if(!compare(this.m_security, other.m_security)) {
+            return false;
+        }
+        if(!compare(this.m_pairwiseCiphers, other.m_pairwiseCiphers)) {
+            return false;
+        }
+        if(!compare(this.m_groupCiphers, other.m_groupCiphers)) {
+            return false;
+        }
+        if(!compare(this.m_passkey, other.m_passkey)) {
+            return false;
+        }
+        if(!compare(this.m_hwMode, other.m_hwMode)) {
+            return false;
+        }
+        if(!compare(this.m_radioMode, other.m_radioMode)) {
+            return false;
+        }
+        if(!compare(this.m_bgscan, other.m_bgscan)) {
+            return false;
+        }
+		if (this.m_broadcast != other.m_broadcast) {
+			return false;
+		}
+		if (this.m_pingAccessPoint != other.pingAccessPoint()) {
+			return false;
+		}
+		
+		return true;
+	}
+	
+	private boolean compare(Object obj1, Object obj2) {
+        return (obj1 == null) ? (obj2 == null) : (obj1.equals(obj2));
+	}
+	
+	@Override
+	public boolean isValid() {
+		return (this.m_mode != null)? true : false;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("WifiConfig [");
+		if(m_mode != null) {
+			sb.append("mode: ")
+			.append(m_mode)
+			.append(" :: ");
+		}
+        if(m_ssid != null) {
+            sb.append("ssid: ")
+            .append(m_ssid)
+            .append(" :: ");
+        }
+		if(m_driver != null) {
+			sb.append("driver: ")
+			.append(m_driver)
+			.append(" :: ");
+		}
+		if(m_channels != null && m_channels.length > 0) {
+			sb.append("channels: ");
+			for(int i=0; i<m_channels.length; i++) {
+				sb.append(m_channels[i]);
+				if(i+i < m_channels.length) {
+					sb.append(",");
+				}
+			}
+			sb.append(" :: ");
+		}
+		if(m_security != null) {
+			sb.append("security: ")
+			.append(m_security)
+			.append(" :: ");
+		}
+		if(m_pairwiseCiphers != null) {
+			sb.append("pairwiseCiphers: ")
+			.append(m_pairwiseCiphers)
+			.append(" :: ");
+		}
+		if(m_groupCiphers != null) {
+			sb.append("groupCiphers: ")
+			.append(m_groupCiphers)
+			.append(" :: ");
+		}
+		if(m_passkey != null) {
+			sb.append("passkey: ")
+			.append(m_passkey)
+			.append(" :: ");
+		}
+        if(m_hwMode != null) {
+            sb.append("hwMode: ")
+            .append(m_hwMode)
+            .append(" :: ");
+        }
+		if(m_radioMode != null) {
+			sb.append("radioMode: ")
+			.append(m_radioMode)
+			.append(" :: ");
+		}
+		sb.append("broadcast: ")
+		.append(m_broadcast)
+		.append(" :: ");
+		if(m_bgscan != null) {
+			sb.append("bgscan: ")
+			.append(m_bgscan);
+		}
+		
+		sb.append("]");		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiHotspotInfo.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiHotspotInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..119a03a636aea2453b6ddc3941acdbf9710c77bc
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiHotspotInfo.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+public class WifiHotspotInfo {
+
+	private String m_ssid;
+	private String m_macAddress;
+	private int m_signalLevel;
+	private int m_channel;
+	private int m_frequency;
+	private WifiSecurity m_security;
+	
+	public WifiHotspotInfo(String ssid, String macAddress,
+			int signalLevel, int channel, int frequency, WifiSecurity security) {
+		super();
+		m_ssid = ssid;
+		m_macAddress = macAddress;
+		m_signalLevel = signalLevel;
+		m_channel = channel;
+		m_frequency = frequency;
+		m_security = security;
+	}
+
+	public String getSsid() {
+		return m_ssid;
+	}
+
+	public String getMacAddress() {
+		return m_macAddress;
+	}
+
+	public int getSignalLevel() {
+		return m_signalLevel;
+	}
+
+	public int getChannel() {
+		return m_channel;
+	}
+
+	public int getFrequency() {
+		return m_frequency;
+	}
+
+	public WifiSecurity getSecurity() {
+		return m_security;
+	}
+	
+	public String toString() {
+		
+		StringBuffer sb = new StringBuffer();
+		sb.append(m_macAddress);
+		sb.append(" :: ");
+		sb.append(m_ssid);
+		sb.append(" :: ");
+		sb.append(m_signalLevel);
+		sb.append(" :: ");
+		sb.append(m_channel);
+		sb.append(" :: ");
+		sb.append(m_frequency);
+		sb.append(" :: ");
+		sb.append(m_security);
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterface.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c8e6fb88811faa5c72a1bb077d672b429763799
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterface.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import java.util.EnumSet;
+import java.util.List;
+
+import org.eclipse.kura.net.NetInterface;
+
+/**
+ * Wifi interface
+ *
+ * @param <T>
+ */
+public interface WifiInterface<T extends WifiInterfaceAddress> extends NetInterface<T> 
+{
+	/**
+	 * Flags describing the capabilities of a wireless device.
+	 */
+	public enum Capability
+	{
+		/** no capabilities supported */
+		NONE,
+		/** The device supports the 40-bit WEP cipher. */
+		CIPHER_WEP40,
+		/** The device supports the 104-bit WEP cipher. */
+		CIPHER_WEP104,
+		/** The device supports the TKIP cipher. */
+		CIPHER_TKIP,
+		/** The device supports the CCMP cipher. */
+		CIPHER_CCMP,
+		/** The device supports the WPA encryption/authentication protocol. */
+		WPA,
+		/** The device supports the RSN encryption/authentication protocol. */
+		RSN;
+	}
+	
+	/**
+	 * Returns the the capabilities of the wireless device.
+	 * @return
+	 */
+	public EnumSet<Capability> getCapabilities();
+	
+	/**
+	 * Returns a List of all InterfaceAddresses of this network interface.
+	 * @return a List object with all or a subset of the InterfaceAddresss of this network interface
+	 */
+	public List<T> getNetInterfaceAddresses(); 
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterfaceAddress.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterfaceAddress.java
new file mode 100644
index 0000000000000000000000000000000000000000..95fa61eccba7224a7382090d79105f3420cf75f7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterfaceAddress.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import org.eclipse.kura.net.NetInterfaceAddress;
+
+/**
+ * Interface for wifi status information
+ *
+ */
+public interface WifiInterfaceAddress extends NetInterfaceAddress 
+{
+	/**
+	 * The operating mode of the wireless device.
+	 * @return
+	 */
+	public WifiMode getMode();	
+	
+	/**
+	 * The bit rate currently used by the wireless device, in kilobits/second (Kb/s).
+	 * @return
+	 */
+	public long getBitrate();
+
+	/**
+	 * Returns the WifiAccessPoint that this InterfaceAddress was acquired from when in managed mode.
+	 * Returns a WifiAccessPoint representing itself when in master mode.
+	 * @return the WifiAccessPoint
+	 */
+	public WifiAccessPoint getWifiAccessPoint();
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterfaceAddressConfig.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterfaceAddressConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..498c7e545d6043c22bcd29b6a277eff9bb2f86e9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiInterfaceAddressConfig.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+import java.util.List;
+
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+
+/**
+ * Contains both the wifi interface status as well as all current configurations
+ */
+public interface WifiInterfaceAddressConfig extends WifiInterfaceAddress, NetInterfaceAddressConfig {
+
+	/**
+	 * Returns a List of NetConfig Objects associated with a given WifiInterfaceAddressConfig
+	 * for a given WifiInterface
+	 * @return the NetConfig Objects associated with the WifiInterfaceAddressConfig
+	 */
+	public List<NetConfig> getConfigs();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiMode.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d3dd5d97817643cab31d8a5f8551c7f6b6dc086
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiMode.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Modes of operation for wifi interfaces
+ */
+public enum WifiMode {
+	/** Mode is unknown. */
+	UNKNOWN (0x00),
+	/** Uncoordinated network without central infrastructure. */
+	ADHOC (0x01),
+	/** Client mode - Coordinated network with one or more central controllers. */
+	INFRA (0x02),
+	/** Access Point Mode - Coordinated network with one or more central controllers. */
+	MASTER (0x03);
+	
+	private int m_code;
+	
+	private WifiMode(int code) {
+		m_code = code;
+	}
+	
+	public static WifiMode parseCode(int code) {
+		for(WifiMode mode : WifiMode.values()) {
+			if(mode.m_code == code) {
+				return mode;
+			}
+		}
+		
+		return null;
+	}
+	
+	public static int getCode(WifiMode wifiMode) {
+		for(WifiMode mode : WifiMode.values()) {
+			if(mode == wifiMode) {
+				return mode.m_code;
+			}
+		}
+		return -1;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiRadioMode.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiRadioMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c7d85c4f823de83fa8edfbb4b5460bb95bb2aa7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiRadioMode.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Types of wifi radio modes
+ */
+public enum WifiRadioMode {
+	
+	RADIO_MODE_80211a (0x00),
+	RADIO_MODE_80211b (0x01),
+	RADIO_MODE_80211g (0x02),
+	RADIO_MODE_80211nHT20 (0x03),
+	RADIO_MODE_80211nHT40below (0x04),
+	RADIO_MODE_80211nHT40above (0x05);
+
+	private int m_code;
+	
+	private WifiRadioMode(int code) {
+		m_code = code;
+	}
+	
+	public static WifiRadioMode parseCode(int code) {
+		for(WifiRadioMode mode : WifiRadioMode.values()) {
+			if(mode.m_code == code) {
+				return mode;
+			}
+		}
+		
+		return null;
+	}
+	
+	public static int getCode(WifiRadioMode radioMode) {
+		for(WifiRadioMode mode : WifiRadioMode.values()) {
+			if(mode == radioMode) {
+				return mode.m_code;
+			}
+		}
+		
+		return -1;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiSecurity.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiSecurity.java
new file mode 100644
index 0000000000000000000000000000000000000000..216f82b37983f633f9d6ad25f3f7d2f45b0ce465
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/WifiSecurity.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.wifi;
+
+/**
+ * Flags describing the security capabilities of an access point.
+ */
+public enum WifiSecurity {
+	/** None */
+	NONE(0x0),
+	/** Supports pairwise 40-bit WEP encryption. */
+	PAIR_WEP40(0x1),
+	/** Supports pairwise 104-bit WEP encryption. */
+	PAIR_WEP104(0x2),
+	/** Supports pairwise TKIP encryption. */
+	PAIR_TKIP(0x4),
+	/** Supports pairwise CCMP encryption. */
+	PAIR_CCMP(0x8),
+	/** Supports a group 40-bit WEP cipher. */
+	GROUP_WEP40(0x10),
+	/** Supports a group 104-bit WEP cipher. */
+	GROUP_WEP104(0x20),
+	/** Supports a group TKIP cipher. */
+	GROUP_TKIP(0x40),
+	/** Supports a group CCMP cipher. */
+	GROUP_CCMP(0x80),
+	/** Supports PSK key management. */
+	KEY_MGMT_PSK(0x100),
+	/** Supports 802.1x key management. */
+	KEY_MGMT_802_1X(0x200),
+	/** Supports no encryption. */
+	SECURITY_NONE(0x400),
+	/** Supports WEP encryption. */
+	SECURITY_WEP(0x800),
+	/** Supports WPA encryption. */
+	SECURITY_WPA(0x1000),
+	/** Supports WPA2 encryption. */
+	SECURITY_WPA2(0x2000),
+	/** Supports WPA and WPA2 encryption. */
+	SECURITY_WPA_WPA2(0x4000);
+	
+	private int m_code;
+	
+	private WifiSecurity(int code) {
+		m_code = code;
+	}
+	
+	public static WifiSecurity parseCode(int code) {
+		for(WifiSecurity mode : WifiSecurity.values()) {
+			if(mode.m_code == code) {
+				return mode;
+			}
+		}
+		
+		return null;
+	}
+	
+	public static int getCode(WifiSecurity security) {
+		for(WifiSecurity mode : WifiSecurity.values()) {
+			if(mode == security) {
+				return mode.m_code;
+			}
+		}
+		
+		return -1;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..90ba78d3c2fab363f963f30612e4f6f92894f80f
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/net/wifi/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides interfaces for instances and configurations of wifi devices.
+ *
+ */
+package org.eclipse.kura.net.wifi;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..15abf0c62b079bcfd7c165fa0135290264f57edb
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Contains objects necessary to manage framework exceptions.
+ *
+ */
+package org.eclipse.kura;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/NmeaPosition.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/NmeaPosition.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd6b6fa27511c120775566cae6106ee337dc9171
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/NmeaPosition.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.position;
+
+/**
+ * The NmeaPosition class is similar to org.osgi.util.position.Position but with different units 
+ * and more fields.<br>
+ * The following fields are equivalent to org.osgi.util.position.Position fields but in more typical 
+ * units (degrees instead of radians):<br>
+ * <li> Longitude in degrees </li>
+ * <li> Latitude in degrees </li>
+ * <li> Track in degrees </li>
+ * <li> Altitude in meters </li>
+ * <li> Speed in km/h </li>
+ * <li> Speed in mph </li>
+ * <br>
+ * It adds to the OSGI Position class the following fields :<br>
+ * <li> Fix Quality (from GPGGA)</li>
+ * <li> Number of Satellites (from GPGGA)</li>
+ * <li> DOP : Horizontal dilution of position (from GPGGA)</li>
+ * <li> 3D fix (from GPGSA)</li>
+ * <li> PRNs of sats used for fix (from GPGSA)</li>
+ * <li> PDOP : Dilution of precision (from GPGSA)</li>
+ * <li> HDOP : Horizontal Dilution of precision (from GPGSA)</li>
+ * <li> VDOP : Vertical Dilution of precision (from GPGSA)</li>
+ * 
+ */
+public class NmeaPosition {
+	
+	private double m_latitude;
+	private double m_longitude;					
+	private double m_altitude; 
+	private double m_speed;
+	private double m_track; 
+	private int m_fixQuality;
+	private int m_nrSatellites;
+	private double m_DOP;
+	private double m_PDOP;
+	private double m_HDOP;
+	private double m_VDOP;
+	private int m_3Dfix;
+
+	public NmeaPosition(double lat, 
+						double lon, 
+						double alt,			
+						double speed, 
+						double track) {
+		m_latitude = lat;
+		m_longitude = lon;
+		m_altitude = alt;
+		m_speed = speed;
+		m_track = track;
+	}
+
+	public NmeaPosition(double lat, 
+						double lon, 
+						double alt,			
+						double speed, 
+						double track,
+						int fixQuality,
+						int nrSatellites,
+						double DOP,
+						double PDOP,
+						double HDOP,
+						double VDOP,
+						int fix3D) {
+		m_latitude = lat;
+		m_longitude = lon;
+		m_altitude = alt;
+		m_speed = speed;
+		m_track = track;
+		m_fixQuality = fixQuality;
+		m_nrSatellites = nrSatellites;
+		m_DOP = DOP;
+		m_PDOP = PDOP;
+		m_HDOP = HDOP;
+		m_VDOP = VDOP;
+		m_3Dfix = fix3D;
+	}
+
+
+	/**
+	 * Return the latitude in degrees 
+	 */
+	public double getLatitude() {
+		return m_latitude;
+	}
+
+	public void setLatitude(double l_latitude) {
+		this.m_latitude = l_latitude;
+	}
+
+	/**
+	 * Return the longitude in degrees 
+	 */
+	public double getLongitude() {
+		return m_longitude;
+	}
+
+	public void setLongitude(double l_longitude) {
+		this.m_longitude = l_longitude;
+	}
+
+	/**
+	 * Return the altitude in meters 
+	 */
+	public double getAltitude() {
+		return m_altitude;
+	}
+
+	public void setAltitude(double l_altitude) {
+		this.m_altitude = l_altitude;
+	}
+
+	/**
+	 * Return the speed in km/h 
+	 */
+	public double getSpeedKmh() {
+		return (m_speed*3.6);
+	}
+
+	/**
+	 * Return the speed in mph
+	 */
+	public double getSpeedMph() {
+		return (m_speed*2.24);
+	}
+
+	/**
+	 * Return the speed in m/s
+	 */
+	public double getSpeed() {
+		return m_speed;
+	}
+
+	public void setSpeed(double l_speed) {
+		this.m_speed = l_speed;
+	}
+
+	/**
+	 * Return the track in degrees 
+	 */
+	public double getTrack() {
+		return m_track;
+	}
+
+	public void setTrack(double l_track) {
+		this.m_track = l_track;
+	}
+
+	public int getFixQuality() {
+		return m_fixQuality;
+	}
+
+	public void setFixQuality(int m_fixQuality) {
+		this.m_fixQuality = m_fixQuality;
+	}
+
+	public int getNrSatellites() {
+		return m_nrSatellites;
+	}
+
+	public void setNrSatellites(int m_nrSatellites) {
+		this.m_nrSatellites = m_nrSatellites;
+	}
+
+	public double getDOP() {
+		return m_DOP;
+	}
+
+	public void setDOP(double m_DOP) {
+		this.m_DOP = m_DOP;
+	}
+
+	public double getPDOP() {
+		return m_PDOP;
+	}
+
+	public void setPDOP(double m_PDOP) {
+		this.m_PDOP = m_PDOP;
+	}
+
+	public double getHDOP() {
+		return m_HDOP;
+	}
+
+	public void setHDOP(double m_HDOP) {
+		this.m_HDOP = m_HDOP;
+	}
+
+	public double getVDOP() {
+		return m_VDOP;
+	}
+
+	public void setVDOP(double m_VDOP) {
+		this.m_VDOP = m_VDOP;
+	}
+
+	public int get3Dfix() {
+		return m_3Dfix;
+	}
+
+	public void set3Dfix(int m_3Dfix) {
+		this.m_3Dfix = m_3Dfix;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionException.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionException.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6d43433ed548b220868f6630dddbceffe2dd7fb
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionException.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.position;
+
+public class PositionException extends Exception {
+
+	private static final long serialVersionUID = 2611760893640245224L;
+
+	public PositionException() {
+		// TODO Auto-generated constructor stub
+	}
+
+	public PositionException(String message) {
+		super(message);
+		// TODO Auto-generated constructor stub
+	}
+
+	public PositionException(Throwable cause) {
+		super(cause);
+		// TODO Auto-generated constructor stub
+	}
+
+	public PositionException(String message, Throwable cause) {
+		super(message, cause);
+		// TODO Auto-generated constructor stub
+	}
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionLockedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionLockedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..82877e7344eafd5465efdae849d3f688f9c27c5a
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionLockedEvent.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.position;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * PositionLockedEvent is raised when a valid GPS position has been acquired. 
+ */
+public class PositionLockedEvent extends Event {
+
+	/** Topic of the PositionLockedEvent */
+	public static final String POSITION_LOCKED_EVENT_TOPIC = "org/eclipse/kura/position/locked";
+	
+	public PositionLockedEvent(Map<String, ?> properties) {
+		super(POSITION_LOCKED_EVENT_TOPIC, properties);
+	}
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionLostEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionLostEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..b147a795f0199c54da82ebaf4e2be5360730af11
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionLostEvent.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.position;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * PositionLostEvent is raised when GPS position has been lost. 
+ */
+public class PositionLostEvent extends Event {
+
+	/** Topic of the PositionLostEvent */
+	public static final String POSITION_LOST_EVENT_TOPIC = "org/eclipse/kura/position/lost";
+	
+	public PositionLostEvent(Map<String, ?> properties) {
+		super(POSITION_LOST_EVENT_TOPIC, properties);
+	}
+
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java
new file mode 100644
index 0000000000000000000000000000000000000000..70ca88d5876c87e3ae2d259924ef39a7d6eef3b5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.position;
+
+import org.osgi.util.position.Position;
+
+/**
+ * This interface provides methods getting a geographic position.
+ * The OSGI Position class represents a geographic location, based on the WGS84 System 
+ * (World Geodetic System 1984).
+ * <p>
+ * Position(Measurement lat, Measurement lon, Measurement alt, Measurement speed, Measurement track) 
+ * <p>
+ * The interface also return a NmeaPosition, subclass of Position 
+ * @see org.eclipse.kura.position.NmeaPosition NmeaPosition
+ * @see org.osgi.util.position.Position Position 
+ * @see org.osgi.util.measurement.Measurement Measurement
+ * 
+ */
+public interface PositionService
+{
+	/**
+	 * Returns the current geographic position.<br>
+	 * The org.osgi.util.measurement.Measurement class is used to represent the values that make up a position :<br>
+	 * <li>getLongitude() : returns the longitude of this position in radians.</li>
+	 * <li>getLatitude() : returns the latitude of this position in radians. </li>
+	 * <li>getSpeed() : returns the ground speed of this position in meters per second.</li>
+	 * <li>getTrack() : Returns the track of this position in radians as a compass heading. The track is the extrapolation of 
+	 * previous previously measured positions to a future position.</li>
+	 * <br>
+	 * @see org.osgi.util.position.Position Position
+	 */
+	public Position getPosition();
+	
+	/**
+	 * Returns the current NMEA geographic position.
+	 * <li>getLongitude() : returns the longitude of this position in degrees.</li>
+	 * <li>getLatitude() : returns the latitude of this position in degrees. </li>
+	 * <li>getSpeedKmh() : returns the ground speed of this position in km/h.</li>
+	 * <li>getSpeedMph() : returns the ground speed of this position in mph.</li>
+	 * <li>getTrack() : Returns the track of this position in degrees as a compass heading. 
+	 * @see org.eclipse.kura.position.NmeaPosition NmeaPosition
+	 */
+	public NmeaPosition getNmeaPosition();
+
+	/**
+	 * Returns the current NMEA time from GGA or ZDA sentence
+	 */
+	public String getNmeaTime();
+	
+	/**
+	 * Returns the current NMEA date from ZDA sentence
+	 */
+	public String getNmeaDate();
+	
+	/**
+	 * Returns true if a valid geographic position has been received.
+	 */
+	public boolean isLocked();
+
+	/**
+	 * Returns the last sentence received from the gps.
+	 */
+	public String getLastSentence();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..d70dbab443492ad599ae94ded2b876ca1177910d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Contains service to acquire global position.
+ *
+ */
+package org.eclipse.kura.position;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/ssl/SslManagerService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/ssl/SslManagerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b81452735d142161c3669b04643bf8e2ec964507
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/ssl/SslManagerService.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.ssl;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.SSLSocketFactory;
+
+
+/**
+ * The SslManagerService is responsible to manage the configuration of the SSL connections.
+ * It provide APIs to manage the trust certificates and the private keys and public certificates
+ * and enforces best practices that are not enabled by default in the Java VM.
+ * For example, it enables Hostname Verification, disables the legacy SSL-2.0-compatible Client Hello, 
+ * and disable the Nagle algorithm.
+ * Its implementation is configurable exposing the possibility to express the allowed SSL protocols,
+ * the allowed cipher suites, and the location of the Trust Store and the Key Store files. 
+ */
+public interface SslManagerService
+{
+    /**
+     * Returns an SSLSocketFactory based on the current configuration of the SslManagerService and applying 
+     * best practices like Hostname Verification and disables the legacy SSL-2.0-compatible Client Hello.<br>
+     * If the SslManagerService configuration contains a path to a custom Trust store, then it will be used.
+     * If not, the Java VM default Trust Store will be used.<br>
+     * If the SslManagerService configuration contains a path to a custom Key store, then it will be used.
+     * If not, no Key store will be specified..<br>
+     * @return the SSLSocketFactory
+     */
+    public SSLSocketFactory getSSLSocketFactory() throws GeneralSecurityException, IOException;
+    
+
+    /**
+     * Returns an SSLSocketFactory based on the current configuration of the SslManagerService and applying 
+     * best practices like Hostname Verification and disables the legacy SSL-2.0-compatible Client Hello.<br>
+     * If the SslManagerService configuration contains a path to a custom Trust store, then it will be used.
+     * If not, the Java VM default Trust Store will be used.<br>
+     * If the SslManagerService configuration contains a path to a custom Key store, and such store contains 
+     * a KeyEntry with the alias "keyAlias" then a KeyStore with the only such KeyEntry will be used.
+     * If no custom store is configured or it does not contain the "keyAlias" specified, no Key store will be specified..<br>
+     * @param keyAlias alias of the entry in the KeyStore to be used for the returned SSLSocketFactory 
+     * @return the SSLSocketFactory
+     */
+    public SSLSocketFactory getSSLSocketFactory(String keyAlias) throws GeneralSecurityException, IOException;
+
+    
+    /**
+     * Returns an SSLSocketFactory based on the specified parameters and applying best practices 
+     * like Hostname Verification and disables the legacy SSL-2.0-compatible Client Hello.<br>
+     * @param protocol the protocol to use to initialize the SSLContext - e.g. TLSv1.2
+     * @param cipherSuites allowed cipher suites for the returned SSLSocketFactory
+     * @param trustStorePath Location of the Java keystore file containing the collection of CA certificates trusted by this application process (trust store). Key store type is expected to be JKS.
+     * @param keyStorePath Location of the Java keystore file containing an application process's own certificate and private key.  Key store type is expected to be JKS.
+     * @param keyStorePassword Password to access the private key from the keystore file. 
+     * @param keyAlias alias of the entry in the KeyStore to be used for the returned SSLSocketFactory 
+     * @return the SSLSocketFactory
+     */
+    public SSLSocketFactory getSSLSocketFactory(String protocol,
+                                                String cipherSuites,
+                                                String trustStorePath,
+                                                String keyStorePath,
+                                                char[] keyStorePassword,
+                                                String keyAlias)
+        throws GeneralSecurityException, IOException;
+
+    /**
+     * Returns the X509 Certificates installed in the currently configured trust store.
+     * If the SslManagerService configuration contains a path to a custom trust store, then the returned certificates are the ones installed in such store.
+     * Otherwise the default Java VM trust store will be listed.
+     * @return the X509Certificates
+     */
+    public X509Certificate[] getTrustCertificates() throws GeneralSecurityException, IOException;
+        
+    
+    /**
+     * Installs the specified X509 certificate in the currently configured trust store.
+     * If the SslManagerService configuration contains a path to a custom trust store, then the certificate will be installed in such store.
+     * Otherwise the certificate will be installed in the default Java VM trust store.
+     * @param x509crt certificate to be installed
+     */
+    public void installTrustCertificate(String alias, X509Certificate x509crt) throws GeneralSecurityException, IOException;
+
+    
+    /**
+     * Deletes the X509 certificate with the specified Common Name (cn) from the currently configured trust store.
+     * If the SslManagerService configuration contains a path to a custom trust store, then the certificate will be deleted from such store.
+     * Otherwise the certificate will be deleted from the default Java VM trust store.
+     * @param cn 
+     */
+    public void deleteTrustCertificate(String alias) throws GeneralSecurityException, IOException;
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/ssl/SslServiceListener.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/ssl/SslServiceListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6c5420ff33d201fcf7db0fc73f415b53103d7f7
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/ssl/SslServiceListener.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package org.eclipse.kura.ssl;
+
+/**
+ * Listener interface to be implemented by applications that needs to be notified of events in the {@link SslManagerService}.
+ * All registered listeners are called synchronously by the {@link SslManagerService} at the occurrence of the event.
+ * It expected that implementers of this interface do NOT perform long running tasks in the implementation of this interface.
+ */
+
+public interface SslServiceListener {
+
+	/**
+	 * Notifies the {@link SslManagerService} has received a configuration update and it has applied the new configuration
+	 */
+    public void onConfigurationUpdated();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/SystemAdminService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/SystemAdminService.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f111641ec84bea3de1a0180fcb92aa534405752
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/SystemAdminService.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.system;
+
+/**
+ * Service to perform basic system tasks.
+ * 
+ * Copyright (c) 2012 Eurotech Inc. All rights reserved.
+ */
+public interface SystemAdminService 
+{
+	/**
+	 * Gets the amount of time this device has been up in milliseconds.
+	 * 
+	 * @return				How long this device has been up in milliseconds.
+	 */
+	public String getUptime();
+	
+	/**
+	 * Reboots the device.
+	 */
+	public void reboot();
+	
+	/**
+	 * Synchronizes data on flash with memory.
+	 */
+	public void sync();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/SystemService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/SystemService.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ffc57e7f616555586397b64c1c43879e6286de0
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/SystemService.java
@@ -0,0 +1,380 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.system;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+import java.util.Properties;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * Service to provide basic system information including Operating System 
+ * information, JVM information and filesystem information.
+ */
+public interface SystemService 
+{
+	public static final String KURA_CONFIG      = "kura.configuration";
+	public static final String KURA_PROPS_FILE  = "kura.properties";
+	public static final String KURA_CUSTOM_CONFIG      = "kura.custom.configuration";
+	public static final String KURA_CUSTOM_PROPS_FILE  = "kura_custom.properties";
+	public static final String OS_CLOUDBEES    = "Linux (Cloudbees)";
+	public static final String OS_LINUX        = "Linux";
+	public static final String OS_MAC_OSX      = "Mac OS X";
+	public static final String UNKNOWN         = "UNKNOWN";
+	public static final String UNSUPPORTED     = "UNSUPPORTED";
+	
+	public static final String KEY_KURA_NAME                                = "kura.name";
+	public static final String KEY_KURA_VERSION                             = "kura.version";
+	public static final String KEY_DEVICE_NAME                             = "kura.device.name";
+	public static final String KEY_PLATFORM                                = "kura.platform";
+	public static final String KEY_MODEL_ID                                = "kura.model.id";
+	public static final String KEY_MODEL_NAME                              = "kura.model.name";
+	public static final String KEY_PART_NUMBER                             = "kura.partNumber";
+	public static final String KEY_SERIAL_NUM                              = "kura.serialNumber";
+	public static final String KEY_BIOS_VERSION                            = "kura.bios.version";
+	public static final String KEY_FIRMWARE_VERSION                        = "kura.firmware.version";
+	public static final String KEY_PRIMARY_NET_IFACE                       = "kura.primary.network.interface";
+	public static final String KEY_KURA_HOME_DIR                            = "kura.home";
+	public static final String KEY_KURA_PLUGINS_DIR                         = "kura.plugins";
+	public static final String KEY_KURA_DATA_DIR                            = "kura.data";
+	public static final String KEY_KURA_TMP_DIR                             = "kura.tmp";
+	public static final String KEY_KURA_SNAPSHOTS_DIR                       = "kura.snapshots";
+	public static final String KEY_KURA_SNAPSHOTS_COUNT                     = "kura.snapshots.count";
+	public static final String KEY_KURA_HAVE_NET_ADMIN                      = "kura.have.net.admin";
+	public static final String KEY_KURA_HAVE_WEB_INTER                      = "kura.have.web.inter";
+	public static final String KEY_KURA_STYLE_DIR	                       = "kura.style.dir";
+	public static final String KEY_KURA_WIFI_TOP_CHANNEL                    = "kura.wifi.top.channel";
+    public static final String KEY_KURA_KEY_STORE_PWD                       = "kura.ssl.keyStorePassword";
+    public static final String KEY_KURA_TRUST_STORE_PWD                     = "kura.ssl.trustStorePassword";
+	public static final String KEY_OS_ARCH                                 = "os.arch";
+	public static final String KEY_OS_NAME                                 = "os.name";
+	public static final String KEY_OS_VER                                  = "os.version";
+	public static final String KEY_OS_DISTRO                               = "os.distribution";
+	public static final String KEY_OS_DISTRO_VER                           = "os.distribution.version";
+	public static final String KEY_JAVA_VERSION                            = "java.runtime.version";
+	public static final String KEY_JAVA_VENDOR                             = "java.runtime.name";
+	public static final String KEY_JAVA_VM_NAME                            = "java.vm.name";
+	public static final String KEY_JAVA_VM_VERSION                         = "java.vm.version";
+	public static final String KEY_JAVA_VM_INFO                            = "java.vm.info";
+	public static final String KEY_OSGI_FW_NAME                            = "org.osgi.framework.vendor";
+	public static final String KEY_OSGI_FW_VERSION                         = "org.osgi.framework.version";
+	public static final String KEY_JAVA_HOME                               = "java.home";
+	public static final String KEY_FILE_SEP                                = "file.separator";
+	public static final String CONFIG_CONSOLE_DEVICE_MANAGE_SERVICE_IGNORE = "console.device.management.service.ignore";
+	
+	/**
+	 * Gets the primary MAC address of the system
+	 * 
+	 * @return
+	 */
+	public String getPrimaryMacAddress();
+	
+	/**
+	 * Gets the name of the 'primary' network interface. 
+	 * 
+	 * @return
+	 */
+	public String getPrimaryNetworkInterfaceName();
+	
+	/**
+	 * Gets the platform name Kura is running on.  This could be catalyst, duracor1200, helios, isis, proteus, etc.
+	 * 
+	 * @return	The platform name.
+	 */
+	public String getPlatform() ;
+	
+	/**
+	 * Gets the model identification of the device.
+	 * 
+	 * @return				Model ID.
+	 */
+	public String getModelId();
+	
+	/**
+	 * Gets the model name of the device.
+	 * 
+	 * @return				Model name.
+	 */
+	public String getModelName();
+
+	/**
+	 * Gets the part number.
+	 * 
+	 * @return				Part number.
+	 */	
+	public String getPartNumber();
+
+	/**
+	 * Gets the serial number of the device.
+	 * 
+	 * @return				Serial number.
+	 */	
+	public String getSerialNumber();
+
+	/**
+	 * Returns a friendly name assigned to this device.
+	 * @return
+	 */
+	public String getDeviceName();
+	
+	/**
+	 * Gets the BIOS version of the device.
+	 * 
+	 * @return	BIOS version.
+	 */
+	public String getBiosVersion();
+
+	/**
+	 * Gets the firmware version.
+	 * 
+	 * @return				Firmware version.
+	 */
+	public String getFirmwareVersion();
+
+	/**
+	 * Gets the Operating System architecture for the system.
+	 * 
+	 * @return	The Operating System architecture as defined by the Java System property os.arch.
+	 */
+	public String getOsArch();
+	
+	/**
+	 * Gets the Operating System name for the system.
+	 * 
+	 * @return The Operating System name as defined by the Java System property os.name.
+	 */
+	public String getOsName();
+	
+	/**
+	 * Gets the Operating System version for the system.
+	 * 
+	 * @return The Operating System version as defined by the Java System property os.version.
+	 */
+	public String getOsVersion();
+	
+	/**
+	 * Gets the Operating System Distribution name if appropriate.
+	 * 
+	 * @return	A String representing the Operating System Distribution name if appropriate.
+	 */
+	public String getOsDistro();
+	
+	/**
+	 * Gets the Operating System Distribution version if appropriate.
+	 * 
+	 * @return	A String representing the Operating System Distribution version if appropriate.
+	 */
+	public String getOsDistroVersion();
+	
+	/**
+	 * Gets the vendor of the Java VM that is currently being used.
+	 * 
+	 * @return	The Java Runtime version as defined by the Java System property java.vendor.
+	 */
+	public String getJavaVendor();
+
+	/**
+	 * Gets the Java version that is currently being used.
+	 * 
+	 * @return The Java version as defined by the Java System property java.version.
+	 */
+	public String getJavaVersion();
+
+	/**
+	 * Gets the Java Virtual Machine name that is currently being used.
+	 * 
+	 * @return	The Java Virtual Machine name as defined by the Java System property java.vm.name.
+	 */
+	public String getJavaVmName();
+	
+	/**
+	 * Gets the Java Virtual Machine version that is currently being used.
+	 * 
+	 * @return	The Java Virtual Machine version as defined by the Java System property java.vm.version.
+	 */
+	public String getJavaVmVersion();
+	
+	/**
+	 * Gets the Java Virtual Machine information that is currently being used.
+	 * 
+	 * @return	The Java Virtual Machine version as defined by the Java System property java.vm.version.
+	 */
+	public String getJavaVmInfo();
+	
+	/**
+	 * Gets the name of the OSGI Framework that is currently being used.
+	 * 
+	 * @return	The OSGI Framework Name as defined by the System property osgi.framework.name.
+	 */
+	public String getOsgiFwName();
+	
+	/**
+	 * Gets the version of the OSGI Framework that is currently being used.
+	 * 
+	 * @return	The OSGI Framework Version as defined by the System property osgi.framework.version.
+	 */
+	public String getOsgiFwVersion();
+	
+	/**
+	 * Gets the system file separator used by the filesystem.
+	 * 
+	 * @return	The system file separator used by the system.
+	 */
+	public String getFileSeparator();
+	
+	/**
+	 * Gets the location where the JVM is stored in the filesystem.
+	 * 
+	 * @return	The location of the root JVM directory.
+	 */
+	public String getJavaHome();
+	
+	/**
+	 * Gets the product version for this unit.
+	 * 
+	 * The product version is defined as the version in the release.xml file.
+	 * The release.xml file is stored in /etc/kura/ and has the format:
+	 * PRODUCT_NAME_release-VERSION-VERSION_NUMBER.xml
+	 * 
+	 * For example this is a valid product name: helios_denali_release-1.2.3.xml.  The version number would be 1.2.3.
+	 * This would be an invalid product name: my-product-name_release-1.2.3.xml.  This is because the product name has
+	 * '-' characters in it.  They should be '_' to be valid.  So, the correct representation would be:
+	 * my_product_name_release-1.2.3.xml.  It's version number would be 1.2.3.  The use of '-' characters should only
+	 * be used immediately before the version number and the use of '.' characters should only be used immediately after
+	 * the version number.
+	 * 
+	 * @return	The version number as denoted in the release.xml file.
+	 */
+	public String getKuraVersion();
+	
+	/**
+	 * Gets the location where the Kura root directory is stored in the filesystem.
+	 * 
+	 * @return	The root Kura directory.
+	 */
+	public String getKuraHome();
+	
+	/**
+	 * Gets the location where all volatile Kura specific configuration and status information should be stored.
+	 * 
+	 * The convention for each bundle that has filesystem dependencies is for those filesystem components 
+	 * to be stored in the configuration directory root followed by a file separator followed by the project
+	 * name that needs some configuration.  This will keep separate configuration components tied to their 
+	 * appropriate projects.
+	 * 
+	 * @return	The location of the volatile Kura configuration and status directory root.
+	 */
+	public String getKuraTemporaryConfigDirectory();
+
+	/**
+	 * Gets the location where all Configuration Snapshots will be stored. 
+	 * It is recommended for this directory not to be volatile so that the configuration 
+	 * information can survive reboots and service configuration can be restored.  
+	 * 
+	 * @return	The location of the volatile Kura configuration and status directory root.
+	 */
+	public String getKuraSnapshotsDirectory();
+	
+	/**
+	 * Returns the maximum number of snapshots to be retained in the file system.
+	 * When the maximum number is reached, a garbage collector will deleted the older snapshots.
+	 * 
+	 * @return maximum number of snapshots to be retained.
+	 */
+	public int getKuraSnapshotsCount();
+	
+	/**
+	 * Gets the location where all custom style information is stored.
+	 * 
+	 * @return The location of the custom style directory.
+	 */
+	public String getKuraStyleDirectory();
+	
+	/**
+	 * Gets the last wifi channel allowed for this device.  In the U.S. this should be
+	 * 11.  In most of Europe this should be 13.
+	 * 
+	 * @return The last wifi channel allowed for this device (usually 11 or 13)
+	 */
+	public int getKuraWifiTopChannel();
+	
+	public String getKuraWebEnabled();
+	
+	/**
+	 * Gets the location where all Kura persistent data should be stored.
+	 * 
+	 * @return	The location of the persistent Kura data directory root.
+	 */
+	public String getKuraDataDirectory();
+	
+	/**
+	 * Returns all KuraProperties for this system. The returned instances is 
+	 * initialized by loading the kura.properties file. Properties defined at 
+	 * the System level - for example using the java -D command line flag - 
+	 * are used to overwrite the values loaded from the kura.properties file
+	 * in a hierarchical configuration fashion.  
+	 */
+	public Properties getProperties();
+	
+	
+	/**
+	 * Returns the OSGi bundles currently installed
+	 * @return
+	 */
+	public Bundle[] getBundles();
+	
+
+	/**
+	 * Returns the number of processors visible to this Java platform.
+	 * @return
+	 */
+	public int getNumberOfProcessors();
+
+	
+	/**
+	 * Returns the total memory visible to this Java instance.
+	 * @return
+	 */
+	public long getTotalMemory();
+	
+	
+	/**
+	 * Returns the free memory for Java instance.
+	 * @return
+	 */
+	public long getFreeMemory();	
+
+	/**
+	 * Returns the password to access the private key from the keystore file.
+	 * @return
+	 */
+	public char[] getJavaKeyStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException;
+	
+    /**
+     * Returns the password to unlock the trust store keystore file.
+     * @return
+     */	
+    public char[] getJavaTrustStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException;
+
+	/**
+	 * Returns a list of services that should be ignored by the Everyware Cloud Console
+	 * @return
+	 */
+    public List<String> getDeviceManagementServiceIgnore();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..56a026d75562ca0e96c38d26dc092227e38ded3c
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/system/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Contains services to get system information and perform basic system tasks.
+ *
+ */
+package org.eclipse.kura.system;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/AbstractUsbDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/AbstractUsbDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..f44d72911a1d43119c5cec8906564cb0fb979bf1
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/AbstractUsbDevice.java
@@ -0,0 +1,146 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+/**
+ * Base class for USB devices
+ */
+public abstract class AbstractUsbDevice implements UsbDevice {
+
+	/** The vendor ID of the USB device **/
+	private String m_vendorId;
+	
+	/** The product ID of the USB device **/
+	private String m_productId;
+	
+	/** The manufacturer name **/
+	private String m_manufacturerName;
+	
+	/** The product name **/
+	private String m_productName;
+
+	private String m_usbBusNumber;
+	private String m_usbDevicePath;
+
+	public AbstractUsbDevice(String vendorId, String productId,
+			String manufacturerName, String productName, String usbBusNumber,
+			String usbDevicePath) {
+		m_vendorId = vendorId;
+		m_productId = productId;
+		m_manufacturerName = manufacturerName;
+		m_productName = productName;
+		m_usbBusNumber = usbBusNumber;
+		m_usbDevicePath = usbDevicePath;
+	}
+	
+	public AbstractUsbDevice(AbstractUsbDevice usbDevice) {
+	    m_vendorId = usbDevice.getVendorId();
+        m_productId = usbDevice.getProductId();
+        m_manufacturerName = usbDevice.getManufacturerName();
+        m_productName = usbDevice.getProductName();
+        m_usbBusNumber = usbDevice.getUsbBusNumber();
+        m_usbDevicePath = usbDevice.getUsbDevicePath();
+	}
+
+	public String getVendorId() {
+		return m_vendorId;
+	}
+
+	public String getProductId() {
+		return m_productId;
+	}
+
+	public String getManufacturerName() {
+		return m_manufacturerName;
+	}
+
+	public String getProductName() {
+		return m_productName;
+	}
+
+	public String getUsbBusNumber() {
+		return m_usbBusNumber;
+	}
+
+	public String getUsbDevicePath() {
+		return m_usbDevicePath;
+	}
+
+	public String getUsbPort() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(m_usbBusNumber).append("-").append(m_usbDevicePath);
+		return sb.toString();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime
+				* result
+				+ ((m_manufacturerName == null) ? 0 : m_manufacturerName
+						.hashCode());
+		result = prime * result
+				+ ((m_productId == null) ? 0 : m_productId.hashCode());
+		result = prime * result
+				+ ((m_productName == null) ? 0 : m_productName.hashCode());
+		result = prime * result
+				+ ((m_usbBusNumber == null) ? 0 : m_usbBusNumber.hashCode());
+		result = prime * result
+				+ ((m_usbDevicePath == null) ? 0 : m_usbDevicePath.hashCode());
+		result = prime * result
+				+ ((m_vendorId == null) ? 0 : m_vendorId.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		AbstractUsbDevice other = (AbstractUsbDevice) obj;
+		if (m_manufacturerName == null) {
+			if (other.m_manufacturerName != null)
+				return false;
+		} else if (!m_manufacturerName.equals(other.m_manufacturerName))
+			return false;
+		if (m_productId == null) {
+			if (other.m_productId != null)
+				return false;
+		} else if (!m_productId.equals(other.m_productId))
+			return false;
+		if (m_productName == null) {
+			if (other.m_productName != null)
+				return false;
+		} else if (!m_productName.equals(other.m_productName))
+			return false;
+		if (m_usbBusNumber == null) {
+			if (other.m_usbBusNumber != null)
+				return false;
+		} else if (!m_usbBusNumber.equals(other.m_usbBusNumber))
+			return false;
+		if (m_usbDevicePath == null) {
+			if (other.m_usbDevicePath != null)
+				return false;
+		} else if (!m_usbDevicePath.equals(other.m_usbDevicePath))
+			return false;
+		if (m_vendorId == null) {
+			if (other.m_vendorId != null)
+				return false;
+		} else if (!m_vendorId.equals(other.m_vendorId))
+			return false;
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbBlockDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbBlockDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f487d4b787cb6890756e20d54bf3e25d61db0b2
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbBlockDevice.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+/**
+ * Representation of a USB block device.  This includes storage type USB devices.
+ */
+public class UsbBlockDevice extends AbstractUsbDevice {
+
+	private String m_deviceNode;
+
+	public UsbBlockDevice(String vendorId, String productId, String manufacturerName, String productName, String usbBusNumber, String usbDevicePath, String deviceNode) {
+		super(vendorId, productId, manufacturerName, productName, usbBusNumber, usbDevicePath);
+		m_deviceNode = deviceNode;
+	}
+
+	public String getDeviceNode() {
+		return m_deviceNode;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result
+				+ ((m_deviceNode == null) ? 0 : m_deviceNode.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		UsbBlockDevice other = (UsbBlockDevice) obj;
+		if (m_deviceNode == null) {
+			if (other.m_deviceNode != null)
+				return false;
+		} else if (!m_deviceNode.equals(other.m_deviceNode))
+			return false;
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..0835498dc294127230caa6643e100d4be0adc068
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDevice.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+/**
+ * Interface for all USB devices
+ */
+public interface UsbDevice {
+	
+	/**
+	 * The vendor ID of the device
+	 * 
+	 * @return		The vendor ID of the device
+	 */
+	public String getVendorId();
+	
+	/**
+	 * The product ID of the device
+	 * 
+	 * @return		The product ID of the device
+	 */
+	public String getProductId();
+	
+	/**
+	 * The manufacturer name of the device
+	 * 
+	 * @return		The manufacturer name of the device
+	 */
+	public String getManufacturerName();
+	
+	/**
+	 * The product name of the device
+	 * 
+	 * @return		The product name of the device
+	 */
+	public String getProductName();
+	
+	/**
+	 * The USB bus number of the device
+	 * 
+	 * @return		The USB bus number of the device
+	 */
+	public String getUsbBusNumber();
+	
+	/**
+	 * The USB device path
+	 * 
+	 * @return		The USB device path
+	 */
+	public String getUsbDevicePath();
+	
+	/**
+	 * The complete USB port (USB bus number plus USB device path)
+	 * 
+	 * @return		The complete USB port (USB bus number plus USB device path)
+	 */
+	public String getUsbPort();
+	
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceAddedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceAddedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c76d79358eb8bc2bcf1927a4332835d2798c1b8
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceAddedEvent.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * An event raised when a new USB device has been added to the system. 
+ */
+public class UsbDeviceAddedEvent extends Event implements UsbDeviceEvent {
+
+	/** Topic of the UsbDeviceAddedEvent */
+	public static final String USB_EVENT_DEVICE_ADDED_TOPIC = "org/eclipse/kura/usb/NetworkEvent/device/ADDED";
+	
+	
+	public UsbDeviceAddedEvent(Map<String, ?> properties) {
+		super(USB_EVENT_DEVICE_ADDED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the name of the USB port.
+	 * @return
+	 */
+	public String getUsbPort() {
+		return (String) getProperty(USB_EVENT_USB_PORT_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB resource associated with this device.
+	 * @return
+	 */
+	public String getUsbResource() {
+		return (String) getProperty(USB_EVENT_RESOURCE_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB vendor ID associated with this device.
+	 * @return
+	 */
+	public String getUsbVendorId() {
+		return (String) getProperty(USB_EVENT_VENDOR_ID_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB product ID associated with this device.
+	 * @return
+	 */
+	public String getUsbProductId() {
+		return (String) getProperty(USB_EVENT_PRODUCT_ID_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB manufacturer name associated with this device.
+	 * @return
+	 */
+	public String getUsbManufacturerName() {
+		return (String) getProperty(USB_EVENT_MANUFACTURER_NAME_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB product name associated with this device.
+	 * @return
+	 */
+	public String getUsbProductName() {
+		return (String) getProperty(USB_EVENT_PRODUCT_NAME_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB bus number associated with this device.
+	 * @return
+	 */
+	public String getUsbBusNumber() {
+		return (String) getProperty(USB_EVENT_BUS_NUMBER_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB device path associated with this device.
+	 * @return
+	 */
+	public String getUsbDevicePath() {
+		return (String) getProperty(USB_EVENT_DEVICE_PATH_PROPERTY);
+	}
+}
+
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..5fe3b8dae3970c97203f4401d87cb911a4ecd164
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceEvent.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+public interface UsbDeviceEvent {
+    /** Name of the property to access the USB port of this device **/
+    public static final String USB_EVENT_USB_PORT_PROPERTY = "usb.port";
+    
+    /** Name of the property to access the resource name associated with this USB device (e.g. /dev/ttyUSB3, eth3, etc depending on the device type) */
+    public static final String USB_EVENT_RESOURCE_PROPERTY = "usb.resource";
+    
+    /** Name of the property to access the vendor id **/
+    public static final String USB_EVENT_VENDOR_ID_PROPERTY = "usb.vendor.id";
+
+    /** Name of the property to access the product id **/
+    public static final String USB_EVENT_PRODUCT_ID_PROPERTY = "usb.product.id";
+    
+    /** Name of the property to access the manufacturer name **/
+    public static final String USB_EVENT_MANUFACTURER_NAME_PROPERTY = "usb.manufacturer.name";
+    
+    /** Name of the property to access the product name **/
+    public static final String USB_EVENT_PRODUCT_NAME_PROPERTY = "usb.product.name";
+    
+    /** Name of the property to access the USB bus number **/
+    public static final String USB_EVENT_BUS_NUMBER_PROPERTY = "usb.bus.number";
+    
+    /** Name of the property to access the USB device path **/
+    public static final String USB_EVENT_DEVICE_PATH_PROPERTY = "usb.device.path";
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceRemovedEvent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceRemovedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..24f5afbd436d7917faa7ac3838d1d5eeaa898c72
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbDeviceRemovedEvent.java
@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+/**
+ * An event raised when a USB device has been removed from the system. 
+ */
+public class UsbDeviceRemovedEvent extends Event implements UsbDeviceEvent {
+	
+	/** Topic of the UsbDeviceRemovedEvent */
+	public static final String USB_EVENT_DEVICE_REMOVED_TOPIC = "org/eclipse/kura/usb/NetworkEvent/device/REMOVED";
+	
+
+	public UsbDeviceRemovedEvent(Map<String, ?> properties) {
+		super(USB_EVENT_DEVICE_REMOVED_TOPIC, properties);
+	}
+	
+	/**
+	 * Returns the name of the USB port.
+	 * @return
+	 */
+	public String getUsbPort() {
+		return (String) getProperty(USB_EVENT_USB_PORT_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB resource associated with this device.
+	 * @return
+	 */
+	public String getUsbResource() {
+		return (String) getProperty(USB_EVENT_RESOURCE_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB vendor ID associated with this device.
+	 * @return
+	 */
+	public String getUsbVendorId() {
+		return (String) getProperty(USB_EVENT_VENDOR_ID_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB product ID associated with this device.
+	 * @return
+	 */
+	public String getUsbProductId() {
+		return (String) getProperty(USB_EVENT_PRODUCT_ID_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB manufacturer name associated with this device.
+	 * @return
+	 */
+	public String getUsbManufacturerName() {
+		return (String) getProperty(USB_EVENT_MANUFACTURER_NAME_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB product name associated with this device.
+	 * @return
+	 */
+	public String getUsbProductName() {
+		return (String) getProperty(USB_EVENT_PRODUCT_NAME_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB bus number associated with this device.
+	 * @return
+	 */
+	public String getUsbBusNumber() {
+		return (String) getProperty(USB_EVENT_BUS_NUMBER_PROPERTY);
+	}
+	
+	/**
+	 * Returns the name of the USB device path associated with this device.
+	 * @return
+	 */
+	public String getUsbDevicePath() {
+		return (String) getProperty(USB_EVENT_DEVICE_PATH_PROPERTY);
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbModemDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbModemDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..638e16adf131b198fd31e25b4f45a5c0916222d6
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbModemDevice.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.kura.net.modem.ModemDevice;
+
+/**
+ * Representation of USB modem devices
+ */
+public class UsbModemDevice extends AbstractUsbDevice implements ModemDevice {
+
+	/** The TTY devices associated with modem **/
+	private ArrayList<String> m_ttyDevs;
+	
+	/** The block devices associated with the modem **/
+	private ArrayList<String> m_blockDevs;
+
+	public UsbModemDevice(String vendorId, String productId, String manufacturerName, String productName, String usbBusNumber, String usbDevicePath) {
+		super(vendorId, productId, manufacturerName, productName, usbBusNumber, usbDevicePath);
+		
+		m_ttyDevs = new ArrayList<String>();
+		m_blockDevs = new ArrayList<String>();
+	}
+	
+	public UsbModemDevice(AbstractUsbDevice usbDevice) {
+	    super(usbDevice);
+	    
+        m_ttyDevs = new ArrayList<String>();
+        m_blockDevs = new ArrayList<String>();	    
+	}
+	
+	@Override
+	public List<String> getSerialPorts() {
+        return Collections.unmodifiableList(m_ttyDevs);
+    }
+
+	/**
+	 * @return sorted list of tty devs
+	 */
+    public List<String> getTtyDevs() {
+        return Collections.unmodifiableList(m_ttyDevs);
+    }
+
+    /**
+     * @return sorted list of block devs
+     */
+	public List<String> getBlockDevs() {
+		return Collections.unmodifiableList(m_blockDevs);
+	}
+    
+    public void addTtyDev(String ttyDev) {
+        if(!m_ttyDevs.contains(ttyDev)) {
+            m_ttyDevs.add(ttyDev);
+            Collections.sort(m_ttyDevs, new DevNameComparator());
+        }
+    }
+	
+	public void addBlockDev(String blockDev) {
+	    if(!m_blockDevs.contains(blockDev)) {
+    	    m_blockDevs.add(blockDev);
+    	    Collections.sort(m_blockDevs, new DevNameComparator());
+	    }
+	}
+    
+    public boolean removeTtyDev(String ttyDev) {
+        return m_ttyDevs.remove(ttyDev);
+    }
+	
+	public boolean removeBlockDev(String blockDev) {
+	    return m_blockDevs.remove(blockDev);
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 37;
+		int result = super.hashCode();
+        result = prime * result
+                + ((m_ttyDevs == null) ? 0 : m_ttyDevs.hashCode());
+		result = prime * result
+				+ ((m_blockDevs == null) ? 0 : m_blockDevs.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		UsbModemDevice other = (UsbModemDevice) obj;
+        if (m_ttyDevs == null) {
+            if (other.m_ttyDevs != null)
+                return false;
+        } else if (!m_ttyDevs.equals(other.m_ttyDevs))
+            return false;
+		if (m_blockDevs == null) {
+			if (other.m_blockDevs != null)
+				return false;
+		} else if (!m_blockDevs.equals(other.m_blockDevs))
+			return false;
+		return true;
+	}
+	
+	@Override
+	public String toString() {
+	    StringBuffer sb = new StringBuffer();
+	    sb.append("UsbModem [");
+	    sb.append("vendorId=").append(getVendorId());
+	    sb.append(", productId=").append(getProductId());
+	    sb.append(", manufName=").append(getManufacturerName());
+	    sb.append(", productName=").append(getProductName());
+	    sb.append(", usbPort=").append(getUsbPort());
+	    sb.append(", ttyDevs=").append(m_ttyDevs.toString());
+	    sb.append(", blockDevs=").append(m_blockDevs.toString());
+	    sb.append("]");
+
+	    return sb.toString();
+	}
+	
+	private class DevNameComparator implements Comparator<String> {
+	    @Override
+	    /**
+	     * Split the device name into the digit and non-digit portions and compare separately
+	     * i.e. for "/dev/ttyUSB9" and "/dev/ttyUSB10", the "/dev/ttyUSB" parts are first compared
+	     * then the "9" and "10" are compared numerically. 
+	     */
+	    public int compare(String dev1, String dev2) {
+	        int digitPos1 = getDigitPosition(dev1);
+	        int digitPos2 = getDigitPosition(dev2);
+	        
+	        String text1 = dev1.substring(0, digitPos1);
+	        String text2 = dev2.substring(0, digitPos2);
+	        
+	        String num1 = dev1.substring(digitPos1, dev1.length());
+	        String num2 = dev2.substring(digitPos2, dev2.length());
+	        
+	        // Compare text portion
+	        int textCompare = text1.compareTo(text2);
+	        if(textCompare != 0) {
+	            return textCompare;
+	        }
+	        
+	        // Compare numerical portion
+	        if(num1 == null || num1.isEmpty()) {
+	            if(num2 == null || num2.isEmpty()) {
+	                return 0;
+	            } else {
+	                return -1;
+	            }
+	        } else if (num2 == null || num2.isEmpty()) {
+	            return 1;
+	        }
+	        
+	        Integer int1 = Integer.parseInt(num1);
+	        Integer int2 = Integer.parseInt(num2);
+	        return int1.compareTo(int2);
+	    }
+	    
+	    private int getDigitPosition(String devName) {
+	        int pos = devName.length();
+	        
+	        for(int i=devName.length()-1; i>=0; i--) {
+	            if(Character.isDigit(devName.charAt(i))) {
+	                pos = i;
+	            } else {
+	                break;
+	            }
+	        }
+	        
+	        return pos;
+	    }
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbNetDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbNetDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..256ce3a16cb0d8ea2b6a6ab3fc1f36a86de2c6a5
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbNetDevice.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+/**
+ * Representation of USB network devices
+ */
+public class UsbNetDevice extends AbstractUsbDevice {
+
+	/** The interface name associated with this device **/
+	private String m_interfaceName;
+
+	public UsbNetDevice(String vendorId, String productId, String manufacturerName, String productName, String usbBusNumber, String usbDevicePath, String interfaceName) {
+		super(vendorId, productId, manufacturerName, productName, usbBusNumber, usbDevicePath);
+		m_interfaceName = interfaceName;
+	}
+
+	public String getInterfaceName() {
+		return m_interfaceName;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result
+				+ ((m_interfaceName == null) ? 0 : m_interfaceName.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		UsbNetDevice other = (UsbNetDevice) obj;
+		if (m_interfaceName == null) {
+			if (other.m_interfaceName != null)
+				return false;
+		} else if (!m_interfaceName.equals(other.m_interfaceName))
+			return false;
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbService.java
new file mode 100644
index 0000000000000000000000000000000000000000..23db1842583f7d5a7ff186433852a26ced0d614d
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbService.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+import java.util.List;
+
+import javax.usb.UsbServices;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * OSGi interface for getting JSR-80 javax.usb.UsbServices currently available in the system.
+ */
+public interface UsbService {
+
+	/**
+	 * Gets the UsbServices currently available as specified by JSR-80 in the javax.usb
+	 * 
+	 * @return	The currently available javax.usb.UsbServices
+	 * @throws 	KuraException
+	 */
+	public UsbServices getUsbServices() throws KuraException;
+
+	/**
+	 * Gets the USB devices on the gateway
+	 * 
+	 * @return	The currently attached USB devices
+	 */
+	public List<? extends UsbDevice> getUsbDevices();
+
+	/**
+	 * Gets the USB block devices on the gateway
+	 * 
+	 * @return	The currently attached USB block devices
+	 */
+	public List<UsbBlockDevice> getUsbBlockDevices();
+
+	/**
+	 * Gets the USB network devices on the gateway
+	 * 
+	 * @return	The currently attached USB network devices
+	 */
+	public List<UsbNetDevice> getUsbNetDevices();
+
+	/**
+	 * Gets the USB TTY devices on the gateway
+	 * 
+	 * @return	The currently attached USB TTY devices
+	 */
+	public List<UsbTtyDevice> getUsbTtyDevices();
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbTtyDevice.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbTtyDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..a09d1db10db8290ce28f60b69aa52c93aa3f7268
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/UsbTtyDevice.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.usb;
+
+/**
+ * Representation of USB TTY devices
+ */
+public class UsbTtyDevice extends AbstractUsbDevice {
+
+	/** The device node of the TTY device **/
+	private String m_deviceNode;
+
+	public UsbTtyDevice(String vendorId, String productId, String manufacturerName, String productName, String usbBusNumber, String usbDevicePath, String deviceNode) {
+		super(vendorId, productId, manufacturerName, productName, usbBusNumber, usbDevicePath);
+		m_deviceNode = deviceNode;
+	}
+
+	public String getDeviceNode() {
+		return m_deviceNode;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result
+				+ ((m_deviceNode == null) ? 0 : m_deviceNode.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		UsbTtyDevice other = (UsbTtyDevice) obj;
+		if (m_deviceNode == null) {
+			if (other.m_deviceNode != null)
+				return false;
+		} else if (!m_deviceNode.equals(other.m_deviceNode))
+			return false;
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ba3e6c5fc0503ffcbb63f9dc827dffd972dd626
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/usb/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides services and interfaces for finding and managing USB devices within the system.
+ *
+ */
+package org.eclipse.kura.usb;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/CriticalComponent.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/CriticalComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..7dd7c1f2e11ecbce1fb10a68db4144558a3aacf9
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/CriticalComponent.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.watchdog;
+
+
+/**
+ * CriticalComponent is an interface that can be used to denote a component of functionality that is
+ * 'critical' to the nature of the system.  If a component implements CriticalComponent then it must
+ * state its name as well as its criticalComponentTimeout.  The name is a unique identifier in the 
+ * system.  The timeout is a length of time in milliseconds that the CriticalComponent must check in
+ * with the {@link WatchdogService}.  If the CriticalComponent goes for a time period of greater
+ * than this timeout, based on the (@link WatchdogService } configuration it will perform some action
+ *  (such as rebooting the system).
+ * 
+ */
+public interface CriticalComponent {
+
+	/**
+	 * The unique identifier for this CriticalComponent
+	 * 
+	 * @return	a identifier unique to the {@link WatchdogService }
+	 */
+	public String getCriticalComponentName();
+	
+	/**
+	 * The maximum amount of time in milliseconds that the CriticalComponent should check in 
+	 * with the {@link WatchdogService} before the WatchdogService reboots the device.
+	 * 
+	 * @return	the timeout in milliseconds
+	 */
+	public int getCriticalComponentTimeout();
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/WatchdogService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/WatchdogService.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb19a6046975590505a338631475e6961a8cdb32
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/WatchdogService.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.watchdog;
+
+import java.util.List;
+
+/* 
+ * Copyright (c) 2009 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * This interface provides methods for starting, stopping, and updating a
+ * hardware watchdog present on the system.  Updating the watchdog, once 
+ * started, prevents the system from rebooting.
+ */
+public interface WatchdogService {
+	
+	/**
+	 * Starts the hardware watchdog on the device.  If a timeout value has not been
+	 * set, the watchdog will use its default timeout.<br>
+	 * This call is no longer used. The life-cycle of the watchdog is controlled
+	 * by the configuration parameters of the WatchdogSerivce. The API call
+	 * is retained for compatibility reasons.
+	 */
+    @Deprecated
+	public void startWatchdog();
+	
+	/**
+	 * Stops the hardware Watchdog on the device
+     * This call is no longer used. The life-cycle of the watchdog is controlled
+     * by the configuration parameters of the WatchdogSerivce. The API call
+     * is retained for compatibility reasons.
+	 */
+    @Deprecated
+	public void stopWatchdog();
+	
+	/**
+	 * Returns the timeout value for the hardware watchdog in increments of milliseconds.
+	 * 
+	 * @return		An int representing the hardware timeout value in milliseconds. 
+	 */
+	public int getHardwareTimeout();
+	
+	/**
+	 * Register a critical service with the Critical Service Check-in. 
+	 * Once registered, the critical service must call the checkin() 
+	 * method (at a frequency higher than 1/timeout) to prevent a system reboot.
+	 * 
+	 * @param criticalService	A <code>CriticalService</code> to be registered.
+	 * @param timeout			A timeout value that the critical service cannot exceed
+	 * 							between updates without generating a system reboot.  The
+	 * 							time is expressed in seconds.
+	 */
+	@Deprecated
+	public void registerCriticalService(CriticalComponent criticalComponent);
+	
+	/**
+	 * Unregister a critical service with the Critical Service Check-in.
+	 * Once unregistered, the critical service will no longer call the 
+	 * checkin() method.
+	 * 
+	 * @param criticalService	A <code>CriticalService</code> to be unregistered.
+	 */
+    @Deprecated
+	public void unregisterCriticalService(CriticalComponent criticalComponent);
+	
+    /**
+     * Register a critical component with the WatchdogService Check-in. 
+     * Once registered, the critical component must call the checkin() 
+     * method (at a frequency higher than 1/timeout) to prevent a system reboot.
+     * 
+     * @param CriticalComponent The CriticalComponent to be registered.
+     * @param timeout           A timeout value that the critical service cannot exceed
+     *                          between updates without generating a system reboot.  The
+     *                          time is expressed in seconds.
+     */
+    public void registerCriticalComponent(CriticalComponent criticalComponent);
+    
+    /**
+     * Unregister a critical component with the WatchdogService Check-in.
+     * Once unregistered, the critical component will no longer call the 
+     * checkin() method.
+     * 
+     * @param CriticalComponent  The CriticalComponent to be unregistered.
+     */
+    public void unregisterCriticalComponent(CriticalComponent criticalComponent);
+
+    /**
+	 * Returns the list of the currently registered CriticalComponents
+	 * 
+	 * @return	A List of CriticalComponents
+	 */
+	public List<CriticalComponent> getCriticalComponents();
+	
+	/**
+	 * This method is used to notify the Watchdog Service that a critical service
+	 * has 'checked in' and the reboot timer should be reset.
+	 * 
+	 * @param criticalComponent	The criticalComponent to be updated.
+	 */
+	public void checkin(CriticalComponent criticalComponent);
+	
+}
diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/package-info.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..4006e87e25e42a128fe654f47aa46a8d9e43108e
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/watchdog/package-info.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/**
+ * 
+ */
+/**
+ * Provides service for controlling hardware watchdog timer.
+ *
+ */
+package org.eclipse.kura.watchdog;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.api/src/main/resources/org/eclipse/kura/core/messages/KuraExceptionMessagesBundle.properties b/kura/org.eclipse.kura.api/src/main/resources/org/eclipse/kura/core/messages/KuraExceptionMessagesBundle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4e39f539d2d6241a0017cbb6ebb66b85990c9e79
--- /dev/null
+++ b/kura/org.eclipse.kura.api/src/main/resources/org/eclipse/kura/core/messages/KuraExceptionMessagesBundle.properties
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+CONFIGURATION_ERROR=Configuration Error: {0}
+INTERNAL_ERROR=An internal error occurred. {0}
+PORT_IN_USE=The port is in use. {0}
+SECURITY_EXCEPTION=The current subject is not authorized to perform this operation. {0}
+CONFIGURATION_ATTRIBUTE_UNDEFINED=The configuration attribute {0} is undefined.
+CONFIGURATION_ATTRIBUTE_INVALID=The configuration attribute {0} cannot accept value {1}: {2}.
+CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING=The configuration attribute {0} is required and no value has been specified.
+CONFIGURATION_UPDATE=Error updating Configuration of ConfigurableComponent {0}
+CONFIGURATION_SNAPSHOT_NOT_FOUND=Configuration snapshot {0} was not found.
+CONFIGURATION_SNAPSHOT_LISTING=Error Listing Snapshots.
+CONFIGURATION_SNAPSHOT_LOADING=Error Loading Snapshot
+CONFIGURATION_SNAPSHOT_TAKING=Error Taking Snapshot.
+CONFIGURATION_ROLLBACK=Error rolling back to snapshot.
+PARTIAL_SUCCESS=The operation succeeded only partially.
+NOT_CONNECTED=Not connected.
+TIMED_OUT=Timeout occurred while waiting for the operation to complete.
+CONNECTION_FAILED="Connection failed. {0}"
+TOO_MANY_INFLIGHT_MESSAGES="Too many in-flight messages."
+STORE_ERROR="Error performing operation on store. {0}"
+ENCODE_ERROR="Error encoding message. {0}."
+INVALID_METRIC_EXCEPTION=Metric {0} is invalid.
+INVALID_MESSAGE_EXCEPTION=Message or its encoding is invalid.
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/.gitignore b/kura/org.eclipse.kura.core.cloud/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.core.cloud/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.cloud/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..1377f7afe65808e4313aaa6a0d814a5c18aad340
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.cloud
+Bundle-SymbolicName: org.eclipse.kura.core.cloud;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: com.google.protobuf;version="2.4.1",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.data; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+
diff --git a/kura/org.eclipse.kura.core.cloud/OSGI-INF/cloud.xml b/kura/org.eclipse.kura.core.cloud/OSGI-INF/cloud.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c881a9076136614cd5a8c47dcd1b72963c9f8de5
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/OSGI-INF/cloud.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.cloud.CloudService">
+   <implementation class="org.eclipse.kura.core.cloud.CloudServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.cloud.CloudService"/>
+      <provide interface="org.eclipse.kura.data.DataServiceListener"/>
+      <provide interface="org.eclipse.kura.configuration.ConfigurableComponent"/>
+      <provide interface="org.eclipse.kura.cloud.CloudPayloadProtoBufEncoder"/>
+      <provide interface="org.eclipse.kura.cloud.CloudPayloadProtoBufDecoder"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.cloud.CloudService"/>
+   <reference name="DataService" 
+              interface="org.eclipse.kura.data.DataService" 
+              policy="static" 
+              cardinality="1..1" 
+              bind="setDataService" 
+              unbind="unsetDataService"/>
+   <reference name="SystemService" 
+              policy="static"
+              cardinality="1..1"
+              bind="setSystemService"
+              unbind="unsetSystemService"
+              interface="org.eclipse.kura.system.SystemService"/>
+   <reference name="SystemAdminService" 
+              policy="static"
+              cardinality="1..1"
+              bind="setSystemAdminService"
+              unbind="unsetSystemAdminService"
+              interface="org.eclipse.kura.system.SystemAdminService"/>
+   <reference name="NetworkService" 
+              policy="static" 
+              cardinality="1..1" 
+              bind="setNetworkService" 
+              unbind="unsetNetworkService"
+              interface="org.eclipse.kura.net.NetworkService"/>
+   <reference name="PositionService" 
+              cardinality="0..1" 
+              bind="setPositionService" 
+              interface="org.eclipse.kura.position.PositionService" 
+              policy="static" 
+              unbind="unsetPositionService"/>
+   <reference name="EventAdmin"              
+              cardinality="1..1" 
+              policy="static" 
+              bind="setEventAdmin" 
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.cloud/OSGI-INF/cloudCall.xml b/kura/org.eclipse.kura.core.cloud/OSGI-INF/cloudCall.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0516a8395c2d93d1b1d1b62662a95a104f447035
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/OSGI-INF/cloudCall.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+               name="org.eclipse.kura.cloud.CloudCallService"
+               activate="activate" deactivate="deactivate">
+   <implementation class="org.eclipse.kura.core.cloud.call.CloudCallServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.cloud.CloudCallService"/>
+      <provide interface="org.eclipse.kura.data.DataServiceListener"/>
+   </service>
+   <property name="service.pid" type="String" value="org.eclipse.kura.cloud.CloudCallService"/>
+   <reference name="DataService"
+              policy="static" 
+              cardinality="1..1" 
+              bind="setDataService" 
+              unbind="unsetDataService"
+              interface="org.eclipse.kura.data.DataService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.cloud/OSGI-INF/commandCloudApp.xml b/kura/org.eclipse.kura.core.cloud/OSGI-INF/commandCloudApp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..10c17bc1e44a60f49f766e2f90fc0571f4d48a4f
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/OSGI-INF/commandCloudApp.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.cloud.app.command.CommandCloudApp">
+   <implementation class="org.eclipse.kura.cloud.app.command.CommandCloudApp"/>
+   <reference bind="setCloudService" cardinality="1..1" interface="org.eclipse.kura.cloud.CloudService" name="CloudService" policy="static" unbind="unsetCloudService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.cloud/OSGI-INF/metatype/org.eclipse.kura.cloud.CloudService.xml b/kura/org.eclipse.kura.core.cloud/OSGI-INF/metatype/org.eclipse.kura.cloud.CloudService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d4a5f28c4ec37760c79610f69dfb4b757f027d11
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/OSGI-INF/metatype/org.eclipse.kura.cloud.CloudService.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.cloud.CloudService" 
+         name="CloudService" 
+         description="The CloudService allows for setting a user friendly name for the current device. It also provides the option to compress message payloads to reduce network traffic.">
+
+        <Icon resource="CloudService" size="32"/>
+        
+        <AD id="device.display-name"
+            name="device.display-name"
+            type="String"
+            cardinality="0"
+            required="false"
+            default="device-name"
+            description="Friendly name of the device. Device name is the common name of the device (eg: Reliagate 50-21, Raspberry Pi, etc.). Hostname will use the linux hostname utility. 
+            				Custom allows for defining a unique string. Server defined relies on Eurotech Everware Cloud to define a name.">
+        	<Option label="Set display name as device name" value="device-name" />
+        	<Option label="Set display name from hostname" value="hostname" />
+        	<Option label="Custom" value="custom" />
+        	<Option label="Server defined" value="server" />
+        </AD>
+        
+        <AD id="device.custom-name"
+        	name="device.custom-name"
+        	type="String"
+        	cardinality="0"
+        	required="false"
+        	default=""
+        	description='Custom name for the device. This value is applied ONLY if device.display-name is set to "Custom"'>
+        </AD>
+                    
+        <AD id="encode.gzip"
+            name="encode.gzip"
+            type="Boolean"
+            cardinality="0"
+            required="false"
+            default="true"
+            description="Compress message payloads before sending them to the remote server to reduce the network traffic.">
+        </AD>
+        
+        <AD id="republish.mqtt.birth.cert.on.gps.lock"
+            name="republish.mqtt.birth.cert.on.gps.lock"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="false"
+            description="Whether or not to republish the MQTT Birth Certificate on GPS lock event"/>
+
+    </OCD>
+    
+    <Designate pid="org.eclipse.kura.cloud.CloudService">
+        <Object ocdref="org.eclipse.kura.cloud.CloudService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.core.cloud/about.html b/kura/org.eclipse.kura.core.cloud/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/about_files/epl-v10.html b/kura/org.eclipse.kura.core.cloud/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/build.properties b/kura/org.eclipse.kura.core.cloud/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a02ca933de33ddded73141bdefb6239944d112e5
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.cloud/pom.xml b/kura/org.eclipse.kura.core.cloud/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b99d7897c70feb2e674f00a5bf2c19348c30f0e0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.cloud</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/RequestIdGenerator.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/RequestIdGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5aa376a76918291ee92e1b5ccbc73a6ae750fe7
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/RequestIdGenerator.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app;
+
+import java.util.Random;
+
+public class RequestIdGenerator {
+	
+	private static RequestIdGenerator s_instance = new RequestIdGenerator();
+	
+	private Random m_random;
+	
+	private RequestIdGenerator() {
+		super();
+		m_random = new Random();
+	}
+	
+	public static RequestIdGenerator getInstance() {
+		return s_instance;
+	}
+	
+	public String next() {
+		long timestamp = System.currentTimeMillis();
+		
+		long random;
+		synchronized (m_random) {
+			 random = m_random.nextLong();
+		}
+		
+		return timestamp + "-" + random;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/CommandCloudApp.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/CommandCloudApp.java
new file mode 100644
index 0000000000000000000000000000000000000000..fcdec7f98881dbf08639247a6c32f7788c4d1550
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/CommandCloudApp.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.Cloudlet;
+import org.eclipse.kura.cloud.CloudletTopic;
+import org.eclipse.kura.message.KuraRequestPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CommandCloudApp extends Cloudlet {
+	private static final Logger s_logger = LoggerFactory.getLogger(CommandCloudApp.class);
+
+	public static final String APP_ID = "CMD-V1";
+
+	/* EXEC */
+	public static final String RESOURCE_COMMAND = "command";
+
+
+	public CommandCloudApp() {
+		super(APP_ID);
+	}
+
+	// ----------------------------------------------------------------
+	//
+	// Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	// This component inherits the required dependencies from the parent
+	// class CloudApp.
+	
+
+	// ----------------------------------------------------------------
+	//
+	// Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	// This component inherits the activation methods from the parent
+	// class CloudApp.
+	
+	@Override
+	protected void doExec(CloudletTopic reqTopic, KuraRequestPayload reqPayload, KuraResponsePayload respPayload)
+			throws KuraException {
+
+		String[] resources = reqTopic.getResources();
+
+		if (resources == null || resources.length != 1) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString());
+			s_logger.error("Expected one resource but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+
+		if (!resources[0].equals(RESOURCE_COMMAND)) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString());
+			s_logger.error("Cannot find resource with name: {}", resources[0]);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+			return;
+		}
+
+		s_logger.info("EXECuting resource: {}", RESOURCE_COMMAND);
+
+		KuraCommandRequestPayload commandReq = new KuraCommandRequestPayload(reqPayload);
+		KuraCommandResponsePayload commandResp = new KuraCommandResponsePayload(KuraResponsePayload.RESPONSE_CODE_OK);
+
+		KuraCommandHandler.handleRequest(commandReq, commandResp);
+
+		for (String name : commandResp.metricNames()) {
+			Object value = commandResp.getMetric(name);
+			respPayload.addMetric(name, value);
+		}
+		respPayload.setBody(commandResp.getBody());
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/InterruptTimerTask.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/InterruptTimerTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb2c9d1d2505ea90630e62cb40cebb29c247cbb8
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/InterruptTimerTask.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import java.util.TimerTask;
+
+/**
+ * Just a simple TimerTask that interrupts the specified thread when run.
+ */
+class InterruptTimerTask extends TimerTask {
+	private Thread thread;
+
+	public InterruptTimerTask(Thread t) {
+		this.thread = t;
+	}
+
+	public void run() {
+		thread.interrupt();
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandHandler.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c4c7a8d1356fb68c2f3f1ff60c1a2749074305b
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandHandler.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class KuraCommandHandler
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(KuraCommandHandler.class);
+
+
+	public static void handleRequest(KuraCommandRequestPayload req, KuraCommandResponsePayload resp)
+	{
+		String command = req.getCommand();
+		if (command == null) {
+			s_logger.error("null command");
+			resp.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+
+		String[] args = req.getArguments();
+		int argsCount = args != null ? args.length : 0;
+		String[] cmdarray = new String[1 + argsCount];
+
+		cmdarray[0] = command;
+		for (int i = 0; i < argsCount; i++) {
+			cmdarray[1 + i] = args[i];
+		}
+
+		for (int i = 0; i < cmdarray.length; i++) {
+			s_logger.debug("cmdarray: {}", cmdarray[i]);
+		}
+
+		String[] envp = req.getEnvironmentPairs();
+		String    dir = req.getWorkingDir();
+		if (dir != null && dir.isEmpty()) {
+			dir = null;
+		}
+		byte[] zipBytes = req.getZipBytes();
+		if (zipBytes != null) {
+			try {				
+				UnZip.unZipBytes(zipBytes, dir);
+			} 
+			catch (IOException e) {
+				s_logger.error("Error unzipping command zip bytes", e);
+
+				resp.setException(e);
+				return;
+			}
+		}
+
+		Runtime rt = Runtime.getRuntime();
+		Process  proc = null;
+		try {
+
+			File fileDir = dir == null ? null : new File(dir);
+
+			proc = rt.exec(cmdarray, envp, fileDir);
+		} catch (Throwable t) {
+			s_logger.error("Error executing command {}", t);
+			resp.setResponseCode(KuraResponsePayload.RESPONSE_CODE_ERROR);
+			resp.setException(t);
+			return;
+		}
+		
+		ProcessMonitorThread pmt = null;
+		boolean runAsync = req.isRunAsync() != null ? req.isRunAsync() : false;
+		// Whether to timeout process termination
+		// 0: wait until process terminates
+		// > 0: timed out wait
+		int timeout = req.getTimeout() != null ? req.getTimeout() : 0;
+
+		// TODO: rewrite this using ThreadPoolExecutor and Future
+		pmt = new ProcessMonitorThread(proc, req.getStdin(), timeout);
+		pmt.start();
+		
+		if (!runAsync) {
+			try {
+				pmt.join();
+				if (pmt.getException() != null) {
+					resp.setResponseCode(KuraResponsePayload.RESPONSE_CODE_ERROR);
+					resp.setException(pmt.getException());
+					resp.setStderr(pmt.getStderr());
+					resp.setStdout(pmt.getStdout());
+				} else {
+					resp.setStderr(pmt.getStderr());
+					resp.setStdout(pmt.getStdout());
+					resp.setTimedout(pmt.isTimedOut());
+
+					if (!pmt.isTimedOut()) {
+						resp.setExitCode(pmt.getExitValue());
+					}
+				}
+			} catch (InterruptedException e) {
+				Thread.interrupted();
+				pmt.interrupt();
+
+				resp.setStderr(pmt.getStderr());
+				resp.setStdout(pmt.getStdout());
+				resp.setTimedout(true);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandRequestPayload.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandRequestPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..30e0a429bc188a87145bed71806779949d8ad023
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandRequestPayload.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import java.util.Vector;
+
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraRequestPayload;
+
+public class KuraCommandRequestPayload extends KuraRequestPayload 
+{
+	public static final String METRIC_CMD     = "command.command";
+	public static final String METRIC_ARG     = "command.argument";
+	public static final String METRIC_ENVP    = "command.environment.pair";
+	public static final String METRIC_DIR     = "command.working.directory";
+	public static final String METRIC_STDIN   = "command.stdin";
+	public static final String METRIC_TOUT    = "command.timeout";
+	public static final String METRIC_ASYNC   = "command.run.async";
+	
+	public KuraCommandRequestPayload(KuraPayload kuraPayload) 
+	{
+		super();
+		
+		for (String name : kuraPayload.metricNames()) {
+			Object value = kuraPayload.getMetric(name);
+			addMetric(name, value);
+		}
+		setBody(kuraPayload.getBody());
+	}
+
+	public KuraCommandRequestPayload(String command) {
+		super();
+		addMetric(METRIC_CMD, command);
+	}
+	
+	public String[] getArguments() {
+		Vector<String> v = new Vector<String>();
+		
+		for (int i = 0; ; i++) {
+			String value = (String) getMetric(METRIC_ARG + i);
+			if (value != null && !value.isEmpty()) {
+				v.add(value);
+			} else {
+				break;
+			}
+		}
+				
+		if (v.size() == 0) {
+			return null;
+		} else {
+			return v.toArray(new String[v.size()]);
+		}
+	}
+
+	public void setArguments(String[] arguments) {
+		if (arguments != null) {
+			for (int i = 0; i < arguments.length; i++) {
+				addMetric(METRIC_ARG + i, arguments[i]);
+			}
+		}
+	}
+
+	public String[] getEnvironmentPairs() {
+		Vector<String> v = new Vector<String>();
+		
+		for (int i = 0; ; i++) {
+			String value = (String) getMetric(METRIC_ENVP + i);
+			if (value != null) {
+				v.add(value);
+			} else {
+				break;
+			}
+		}
+				
+		if (v.size() == 0) {
+			return null;
+		} else {
+			return v.toArray(new String[v.size()]);
+		}
+	}
+
+	public void setEnvironmentPairs(String[] environmentPairs) {
+		if (environmentPairs != null) {
+			for (int i = 0; i < environmentPairs.length; i++) {
+				addMetric(METRIC_ENVP + i, environmentPairs[i]);
+			}
+		}
+	}
+
+	public String getWorkingDir() {
+		return (String) getMetric(METRIC_DIR);
+	}
+
+	public void setWorkingDir(String workingDir) {
+		if (workingDir != null) {
+			addMetric(METRIC_DIR, workingDir);
+		}
+	}
+
+	public String getStdin() {
+		return (String) getMetric(METRIC_STDIN);
+	}
+
+	public void setStdin(String stdin) {
+		if (stdin != null) {
+			addMetric(METRIC_STDIN, stdin);
+		}
+	}
+
+	public Integer getTimeout() {
+		return (Integer) getMetric(METRIC_TOUT);
+	}
+
+	public void setTimeout(int timeout) {
+		addMetric(METRIC_TOUT, Integer.valueOf(timeout));
+	}
+
+	public Boolean isRunAsync() {
+		return (Boolean) getMetric(METRIC_ASYNC);
+	}
+
+	public void setRunAsync(boolean runAsync) {
+		addMetric(METRIC_ASYNC, Boolean.valueOf(runAsync));
+	}
+
+	public String getCommand() {
+		return (String) getMetric(METRIC_CMD);
+	}
+
+	public byte[] getZipBytes() {
+		return getBody();
+	}
+	
+	public void setZipBytes(byte[] zipBytes) {
+		if (zipBytes != null) {
+			setBody(zipBytes);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandResponsePayload.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandResponsePayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..af160e019a0c1494f0a4505c23aa5947f50783a6
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/KuraCommandResponsePayload.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+
+public class KuraCommandResponsePayload extends KuraResponsePayload 
+{
+	public static final String METRIC_STDERR    = "command.stderr";
+	public static final String METRIC_STDOUT    = "command.stdout";
+	public static final String METRIC_EXIT_CODE = "command.exit.code";
+	public static final String METRIC_TIMEDOUT  = "command.timedout";
+
+	public KuraCommandResponsePayload(KuraPayload kuraPayload) {
+		super(kuraPayload);
+	}
+	
+	public KuraCommandResponsePayload(int responseCode, Throwable t) {
+		super(responseCode, t);
+	}
+
+	public KuraCommandResponsePayload(int responseCode) {
+		super(responseCode);
+	}
+
+	public KuraCommandResponsePayload(Throwable t) {
+		super(t);
+	}
+
+	public String getStderr() {
+		return (String) getMetric(METRIC_STDERR);
+	}
+	public void setStderr(String stderr) {
+		if (stderr != null) {
+			addMetric(METRIC_STDERR, stderr);
+		}
+	}
+	public String getStdout() {
+		return (String) getMetric(METRIC_STDOUT);
+	}
+	public void setStdout(String stdout) {
+		if (stdout != null) {
+			addMetric(METRIC_STDOUT, stdout);
+		}
+	}
+	public Integer getExitCode() {
+		return (Integer) getMetric(METRIC_EXIT_CODE);
+	}
+	public void setExitCode(Integer exitCode) {
+		if (exitCode != null) {
+			addMetric(METRIC_EXIT_CODE, exitCode);
+		}
+	}
+	public Boolean isTimedout() {
+		return (Boolean) getMetric(METRIC_TIMEDOUT);
+	}
+	public void setTimedout(boolean timedout) {
+		addMetric(METRIC_TIMEDOUT, timedout);
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/ProcessMonitorThread.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/ProcessMonitorThread.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d642bfa4021f877448674d58dc305a8eaac37db
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/ProcessMonitorThread.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Timer;
+
+public class ProcessMonitorThread extends Thread 
+{
+	private Process proc;
+	private String stdin;
+	private int procTout;
+	private String stdout;
+	private String stderr;
+	private boolean timedOut;
+	private Exception exception;
+	private Integer exitValue;
+
+	
+	public ProcessMonitorThread(Process proc, String stdin, int procTout) {
+		this.proc = proc;
+		this.stdin = stdin;
+		this.procTout = procTout;
+		this.timedOut = false;
+	}
+
+	
+	public String getStdout() {
+		return stdout;
+	}
+
+
+	public String getStderr() {
+		return stderr;
+	}
+
+
+	public Integer getExitValue() {
+		return exitValue;
+	}
+
+	
+	public boolean isTimedOut() {
+		return timedOut;
+	}
+	
+	
+	public Exception getException() {
+		return exception;
+	}
+
+
+	public void setException(Exception exception) {
+		this.exception = exception;
+	}
+
+	
+	public void run() {
+
+		// Resources that should be cleaned up
+		InputStream is = null;
+		InputStream es = null;
+		OutputStream os = null;
+		BufferedWriter obw = null;
+		
+		StreamGobbler isg = null;
+		StreamGobbler esg = null;
+		Timer timer = null;
+
+		try {
+			if (procTout > 0) {
+				timer = new Timer(true);
+				InterruptTimerTask interrupter = new InterruptTimerTask(Thread.currentThread());
+				timer.schedule(interrupter, procTout /*seconds*/ * 1000 /*milliseconds per second*/);
+			}
+
+			is = proc.getInputStream();
+			es = proc.getErrorStream();
+
+			os = proc.getOutputStream();
+			OutputStreamWriter osw = new OutputStreamWriter(os);
+			obw = new BufferedWriter(osw);
+
+			// Spawn a couple of StreamGobbler to consume output streams
+			isg = new StreamGobbler(is, "stdout");
+			esg = new StreamGobbler(es, "stderr");
+			isg.start();
+			esg.start();
+
+			if (stdin != null) {
+				try {
+					obw.write(stdin);
+					obw.newLine();
+					obw.flush();
+				} catch (IOException e) {
+					throw e;
+				}
+			}
+
+			proc.waitFor();
+			isg.join(1000);
+			esg.join(1000);
+			exitValue = proc.exitValue();
+		} catch (IOException e) {
+			exception = e;
+		} catch (InterruptedException e) {
+			timedOut  = true;
+		} finally {
+			if (timer != null) {
+				timer.cancel();
+			}
+
+			if (isg != null) {
+				isg.interrupt();
+				try {
+					isg.join(1000);
+				} catch (InterruptedException e) {
+					// Ignore
+				}
+				stdout = isg.getStreamAsString();
+			}
+
+			if (esg != null) {
+				esg.interrupt();
+				try {
+					esg.join(1000);
+				} catch (InterruptedException e) {
+					// Ignore
+				}
+				stderr = esg.getStreamAsString();
+			}
+
+			// See http://kylecartmell.com/?p=9
+			if (is != null) {
+				try {
+					is.close();
+				} catch (IOException e) {
+					// Ignore
+				}
+			}
+			if (es != null) {
+				try {
+					es.close();
+				} catch (IOException e) {
+					// Ignore
+				}
+			}
+			if (obw != null) {
+				try {
+					obw.close();
+				} catch (IOException e) {
+					// Ignore
+				}				
+			}
+			if (os != null) {
+				try {
+					os.close();
+				} catch (IOException e) {
+					// Ignore
+				}				
+			}			
+			if (proc != null) {
+				proc.destroy();
+			}
+
+			Thread.interrupted(); // See http://kylecartmell.com/?p=9
+		}
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/StreamGobbler.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/StreamGobbler.java
new file mode 100644
index 0000000000000000000000000000000000000000..c096dda36cb8fab87ba4a10636fc71bc3150e69a
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/StreamGobbler.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import java.io.*;
+
+class StreamGobbler extends Thread {
+	InputStream is;
+	String type;
+	StringBuilder sb;
+
+	public StreamGobbler(InputStream is, String type) {
+		this.is = is;
+		this.type = type;
+		this.sb = new StringBuilder();
+	}
+
+	public String getStreamAsString() {
+		return sb.toString();
+	}
+
+	public void run() {
+		InputStreamReader isr = new InputStreamReader(is);
+		BufferedReader br = new BufferedReader(isr);
+
+		try	{
+			final int BUF_LEN = 1024;
+			final int MAX_BYTES = 100 * BUF_LEN;
+			int count = 0;
+			char[] cbuf = new char[BUF_LEN];
+			int read = -1;
+
+			while ((read = br.read(cbuf)) != -1) {
+				//System.out.println(type + ">number of bytes read: " + read);
+				
+				if (count < MAX_BYTES) {
+					count += read; // might slightly exceed MAX_BYTES
+					sb.append(cbuf, 0, read);
+				}
+			}
+		} catch (IOException ioe) {
+			// ioe.printStackTrace();
+		} finally {
+			try {
+				br.close();
+				is.close(); // Just in case...
+			} catch (IOException e) {
+				// Ignore
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/UnZip.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/UnZip.java
new file mode 100644
index 0000000000000000000000000000000000000000..09dbb41764708abb0e3bbcffccc4a4be686bbc1c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/cloud/app/command/UnZip.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.cloud.app.command;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+public class UnZip
+{
+    private static final String INPUT_ZIP_FILE = "/tmp/test.zip";
+	//private static final String INPUT_ZIP_FILE = "/tmp/zip_with_script.zip";
+	private static final String OUTPUT_FOLDER = "/tmp/";
+
+	public static void main( String[] args )
+	{
+		//UnZip unZip = new UnZip();
+		//unZip.unZipIt(INPUT_ZIP_FILE,OUTPUT_FOLDER);
+		
+		// Create a ZipInputStream from the bag of bytes of the file
+		byte[] zipBytes = null;
+		try {
+			zipBytes = getFileBytes(new File(INPUT_ZIP_FILE));
+			unZipBytes(zipBytes, OUTPUT_FOLDER);
+		} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+		
+		try {
+			unZipFile(INPUT_ZIP_FILE, OUTPUT_FOLDER);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	static public void unZipBytes(byte[] bytes, String outputFolder) throws IOException {
+		ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(bytes));
+		unZipZipInputStream(zis, outputFolder);
+	}
+	
+	static public void unZipFile(String filename, String outputFolder) throws IOException {
+		//get the zip file content
+		File file = new File(filename);
+		ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
+		unZipZipInputStream(zis, outputFolder);
+	}
+	
+	static private void unZipZipInputStream(ZipInputStream zis, String outFolder) throws IOException {
+		String outputFolder = outFolder;
+		if (outputFolder == null) {
+			outputFolder = System.getProperty("user.dir");
+		}
+		
+		//create output directory is not exists
+		File folder = new File(outputFolder);
+		if(!folder.exists()){
+			folder.mkdirs();
+		}
+
+		ZipEntry ze = zis.getNextEntry();
+
+		while(ze!=null){
+			byte[] buffer = new byte[1024];
+
+			String fileName = ze.getName();
+			File newFile = new File(outputFolder + File.separator + fileName);
+
+			//System.out.println("file unzip : "+ newFile.getAbsoluteFile());
+
+			//create all non exists folders
+			//else you will hit FileNotFoundException for compressed folder
+			//new File(newFile.getParent()).mkdirs();
+			
+			if (newFile.isDirectory()) {
+				newFile.mkdirs();
+				ze = zis.getNextEntry();
+				continue;
+			}
+			
+			if (newFile.getParent() != null) {
+				File parent = new File(newFile.getParent());
+				parent.mkdirs();
+			}
+
+			FileOutputStream fos = new FileOutputStream(newFile);
+
+			int len;
+			while ((len = zis.read(buffer)) > 0) {
+				fos.write(buffer, 0, len);
+			}
+
+			fos.close();   
+			ze = zis.getNextEntry();
+		}
+
+		zis.closeEntry();
+		zis.close();
+
+		//System.out.println("Done");
+	}
+
+	private static byte[] getFileBytes(File file) throws IOException {
+		ByteArrayOutputStream ous = null;
+		InputStream ios = null;
+		try {
+			byte[] buffer = new byte[4096];
+			ous = new ByteArrayOutputStream();
+			ios = new FileInputStream(file);
+			int read = 0;
+			while ((read = ios.read(buffer)) != -1)
+				ous.write(buffer, 0, read);
+		} finally {
+			try {
+				if (ous != null)
+					ous.close();
+			} catch (IOException e) {
+				// swallow, since not that important
+			}
+			try {
+				if (ios != null)
+					ios.close();
+			} catch (IOException e) {
+				// swallow, since not that important
+			}
+		}
+		return ous.toByteArray();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudClientImpl.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudClientImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..303bc310e94bf4c9e3cdebf793c632803db07139
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudClientImpl.java
@@ -0,0 +1,353 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.core.cloud;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.message.KuraPayload;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of the CloudClient interface.  
+ */
+public class CloudClientImpl implements CloudClient, CloudClientListener 
+{
+	@SuppressWarnings("unused")
+	private static final Logger s_logger = LoggerFactory.getLogger(CloudClientImpl.class);
+	
+	private String 			           m_applicationId;
+	private DataService                m_dataService;
+	private CloudServiceImpl           m_cloudServiceImpl;
+
+	private List<CloudClientListenerAdapter> m_listeners;
+	
+	protected CloudClientImpl(String applicationId,
+						      DataService dataService,
+						      CloudServiceImpl cloudServiceImpl)
+	{
+		m_applicationId    = applicationId;
+		m_dataService      = dataService;
+		m_cloudServiceImpl = cloudServiceImpl;
+		m_listeners        = new CopyOnWriteArrayList<CloudClientListenerAdapter>();
+	}
+
+
+	/**
+	 * Returns the applicationId of this CloudApplicationClient 
+	 * @return applicationId
+	 */
+	public String getApplicationId() {
+		return m_applicationId;
+	}
+	
+	
+	/**
+	 * Releases this CloudClient handle.  This instance should no longer be used.
+	 * Note: CloudClient does not unsubscribes all subscriptions incurred by this client,
+	 * this responsibility is left to the application developer
+	 */
+	public void release() 
+	{
+		// remove this from being a callback handler
+		m_cloudServiceImpl.removeCloudClient(this);
+	}
+
+	
+	// --------------------------------------------------------------------
+	//
+	//  CloudCallbackHandler API
+	//
+	// --------------------------------------------------------------------
+
+	public void addCloudClientListener(CloudClientListener cloudClientListener) 
+	{
+		m_listeners.add( new CloudClientListenerAdapter(cloudClientListener));
+	}
+
+	
+	public void removeCloudClientListener(CloudClientListener cloudClientListener) 
+	{
+		// create a copy to avoid concurrent modification exceptions
+		List<CloudClientListenerAdapter> adapters = new ArrayList<CloudClientListenerAdapter>(m_listeners);
+		for (CloudClientListenerAdapter adapter : adapters) {
+			if (adapter.getCloudClientListenerAdapted() == cloudClientListener) {
+				m_listeners.remove(adapter);
+				break;
+			}
+		}
+	}
+
+	
+	// --------------------------------------------------------------------
+	//
+	//  CloudClient API
+	//
+	// --------------------------------------------------------------------
+
+	public boolean isConnected() {
+		return m_dataService.isConnected();
+	}	
+	
+	
+	public int publish(String topic, KuraPayload payload, int qos, boolean retain) 
+		throws KuraException 
+	{
+		boolean isControl = false;
+		String   appTopic = encodeTopic(topic, isControl);
+		byte[] appPayload = m_cloudServiceImpl.encodePayload(payload);
+		return m_dataService.publish(appTopic, 
+									 appPayload, 
+								     qos, 
+								     retain,
+								     5);
+	}
+
+	
+	public int publish(String topic, KuraPayload payload, int qos, boolean retain, int priority) 
+		throws KuraException 
+	{
+		boolean isControl = false;
+		String   appTopic = encodeTopic(topic, isControl);
+		byte[] appPayload = m_cloudServiceImpl.encodePayload(payload);
+		return m_dataService.publish(appTopic, 
+									 appPayload, 
+								     qos, 
+								     retain,
+								     priority);
+	}
+
+	
+	public int publish(String topic, byte[] payload, int qos, boolean retain, int priority) 
+		throws KuraException 
+	{
+		boolean isControl = false;
+		String   appTopic = encodeTopic(topic, isControl);
+		return m_dataService.publish(appTopic, 
+									 payload, 
+								     qos, 
+								     retain,
+								     priority);
+	}
+
+	
+	public int controlPublish(String topic, KuraPayload payload, int qos, boolean retain, int priority) 
+		throws KuraException 
+	{
+		boolean isControl = true;
+		String   appTopic = encodeTopic(topic, isControl);
+		byte[] appPayload = m_cloudServiceImpl.encodePayload(payload);
+		return m_dataService.publish(appTopic, 
+									 appPayload, 
+									 qos, 
+									 retain,
+									 priority);
+	}
+	
+	
+	public int controlPublish(String deviceId, String topic, KuraPayload payload, int qos, boolean retain, int priority)
+		throws KuraException 
+	{
+		boolean isControl = true;
+		String   appTopic = encodeTopic(deviceId, topic, isControl);
+		byte[] appPayload = m_cloudServiceImpl.encodePayload(payload);
+		return m_dataService.publish(appTopic, 
+								     appPayload, 
+								     qos, 
+								     retain,
+								     priority);
+	}
+
+
+	public int controlPublish(String deviceId, String topic, byte[] payload, int qos, boolean retain, int priority) 
+		throws KuraException 
+	{
+		boolean isControl = true;
+		String   appTopic = encodeTopic(deviceId, topic, isControl);
+		return m_dataService.publish(appTopic, 
+								     payload, 
+								     qos, 
+								     retain,
+								     priority);
+	}
+	
+
+	public void subscribe(String topic, int qos) 
+		throws KuraException 
+	{
+		boolean isControl = false;
+		String   appTopic = encodeTopic(topic, isControl);
+		m_dataService.subscribe(appTopic, qos);
+	}
+
+	
+	public void controlSubscribe(String topic, int qos) 
+		throws KuraException 
+	{
+		boolean isControl = true;
+		String   appTopic = encodeTopic(topic, isControl);
+		m_dataService.subscribe(appTopic, qos);
+	}
+
+	
+	public void unsubscribe(String topic) 
+		throws KuraException 
+	{
+		boolean isControl = false;
+		String   appTopic = encodeTopic(topic, isControl);
+		m_dataService.unsubscribe(appTopic);
+	}
+
+
+	public void controlUnsubscribe(String topic) 
+		throws KuraException 
+	{
+		boolean isControl = true;
+		String   appTopic = encodeTopic(topic, isControl);
+		m_dataService.unsubscribe(appTopic);
+	}
+		
+	@Override
+	public List<Integer> getUnpublishedMessageIds() throws KuraException {
+		String topicRegex = getAppTopicRegex();
+		return m_dataService.getUnpublishedMessageIds(topicRegex);
+	}
+	
+	@Override
+	public List<Integer> getInFlightMessageIds() throws KuraException {
+		String topicRegex = getAppTopicRegex();
+		return m_dataService.getInFlightMessageIds(topicRegex);
+	}
+	
+	@Override
+	public List<Integer> getDroppedInFlightMessageIds() throws KuraException {
+		String topicRegex = getAppTopicRegex();
+		return m_dataService.getDroppedInFlightMessageIds(topicRegex);
+	}
+
+	// --------------------------------------------------------------------
+	//
+	//  CloudCallbackHandler API
+	//
+	// --------------------------------------------------------------------	
+
+	public void onMessageArrived(String deviceId, String appTopic, KuraPayload payload, int qos, boolean retain) 
+	{
+		for (CloudClientListener listener : m_listeners) {
+			listener.onMessageArrived(deviceId, appTopic, payload, qos, retain);
+		}
+	}
+
+	
+	public void onControlMessageArrived(String deviceId, String appTopic, KuraPayload payload, int qos, boolean retain) 
+	{
+		for (CloudClientListener listener : m_listeners) {
+			listener.onControlMessageArrived(deviceId, appTopic, payload, qos, retain);
+		}
+	}
+
+
+	public void onMessageConfirmed(int pubId, String appTopic) {
+		for (CloudClientListener listener : m_listeners) {
+			listener.onMessageConfirmed(pubId, appTopic);
+		}
+	}
+
+
+	public void onMessagePublished(int pubId, String appTopic) {
+		for (CloudClientListener listener : m_listeners) {
+			listener.onMessagePublished(pubId, appTopic);
+		}
+	}
+
+	public void onConnectionEstablished() {
+		for (CloudClientListener listener : m_listeners) {
+			listener.onConnectionEstablished();
+		}
+	}
+
+	public void onConnectionLost() {
+		for (CloudClientListener listener : m_listeners) {
+			listener.onConnectionLost();
+		}
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private methods
+	//
+	// ----------------------------------------------------------------
+
+	private String encodeTopic(String topic, boolean isControl)
+	{
+		CloudServiceOptions options = m_cloudServiceImpl.getCloudServiceOptions();
+		return encodeTopic(options.getTopicClientIdToken(), topic, isControl);
+	}
+	
+	
+	private String encodeTopic(String deviceId, String topic, boolean isControl)
+	{
+		CloudServiceOptions options = m_cloudServiceImpl.getCloudServiceOptions();
+		StringBuilder sb = new StringBuilder();
+		if (isControl) {
+			sb.append(options.getTopicControlPrefix())
+			  .append(options.getTopicSeparator());
+		}
+		
+		sb.append(options.getTopicAccountToken())
+		  .append(options.getTopicSeparator())
+		  .append(deviceId)
+		  .append(options.getTopicSeparator())
+		  .append(m_applicationId);
+		  
+		  if (topic != null && !topic.isEmpty()) {
+			  sb.append(options.getTopicSeparator())
+			    .append(topic);
+		  }
+		
+		return sb.toString();
+	}
+	
+	private String getAppTopicRegex() {
+		CloudServiceOptions options = m_cloudServiceImpl.getCloudServiceOptions();
+		StringBuilder sb = new StringBuilder();
+
+		//String regexExample = "^(\\$EDC/)?eurotech/.+/conf-v1(/.+)?";
+		
+		// Optional control prefix
+		sb.append("^(")
+		//.append(options.getTopicControlPrefix())
+		.append("\\$EDC")
+		.append(options.getTopicSeparator())
+		.append(")?")
+
+		.append(options.getTopicAccountToken())
+		.append(options.getTopicSeparator())
+		.append(".+") // Any device ID
+		.append(options.getTopicSeparator())
+		.append(m_applicationId)
+		.append("(/.+)?");
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudClientListenerAdapter.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudClientListenerAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..ede6a90891966e85e93657a1268a94cc2caa423c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudClientListenerAdapter.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.message.KuraPayload;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to invoke CloudClientListeners catching and ignoring possible raised exceptions.
+ */
+public class CloudClientListenerAdapter implements CloudClientListener  
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(CloudClientListenerAdapter.class);
+	
+	private CloudClientListener m_listener;
+	
+	CloudClientListenerAdapter(CloudClientListener listener) {
+		m_listener = listener;
+	}
+	
+	public CloudClientListener getCloudClientListenerAdapted() {
+		return m_listener;
+	}
+	
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+										KuraPayload msg, int qos, boolean retain) 
+	{
+		try {
+			m_listener.onControlMessageArrived(deviceId, appTopic, msg, qos, retain);
+		}
+		catch (Exception e) {
+			s_logger.error("IGNORED - Error notifying "+m_listener+" for onControlMessageArrived", e);			
+		}
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+							     KuraPayload msg, int qos, boolean retain) 
+	{
+		try {
+			m_listener.onMessageArrived(deviceId, appTopic, msg, qos, retain);
+		}
+		catch (Exception e) {
+			s_logger.error("IGNORED - Error notifying "+m_listener+" for onMessageArrived", e);			
+		}
+	}
+
+	@Override
+	public void onConnectionLost() 
+	{
+		try {
+			m_listener.onConnectionLost();
+		}
+		catch (Exception e) {
+			s_logger.error("IGNORED - Error notifying "+m_listener+" for onConnectionLost", e);			
+		}
+	}
+
+	@Override
+	public void onConnectionEstablished() 
+	{
+		try {
+			m_listener.onConnectionEstablished();
+		}
+		catch (Exception e) {
+			s_logger.error("IGNORED - Error notifying "+m_listener+" for onConnectionEstablished", e);			
+		}
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) 
+	{
+		try {
+			m_listener.onMessageConfirmed(messageId, appTopic);
+		}
+		catch (Exception e) {
+			s_logger.error("IGNORED - Error notifying "+m_listener+" for onMessageConfirmed", e);			
+		}
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) 
+	{
+		try {
+			m_listener.onMessagePublished(messageId, appTopic);
+		}
+		catch (Exception e) {
+			s_logger.error("IGNORED - Error notifying "+m_listener+" for onMessagePublished", e);			
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadEncoder.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadEncoder.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea5b9a61511c7256b4529d597125357d6db47185
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadEncoder.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import java.io.IOException;
+
+/**
+ * Common interface for the PayloadEncoders
+ */
+public interface CloudPayloadEncoder 
+{
+	public byte[] getBytes() throws IOException;
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadGZipEncoder.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadGZipEncoder.java
new file mode 100644
index 0000000000000000000000000000000000000000..b39856f16a401a7d12da2b71da45778eab4034be
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadGZipEncoder.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import java.io.IOException;
+
+import org.eclipse.kura.core.util.GZipUtil;
+
+public class CloudPayloadGZipEncoder implements CloudPayloadEncoder {
+
+	private CloudPayloadEncoder m_decorated;
+	
+	public CloudPayloadGZipEncoder(CloudPayloadEncoder decorated) {
+		m_decorated = decorated;
+	}
+	
+	public byte[] getBytes() throws IOException {
+		byte[] source = m_decorated.getBytes();
+		return GZipUtil.compress(source);
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadProtoBufDecoderImpl.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadProtoBufDecoderImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..893893b180514b671cbd4cc8e568c58601f440f1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadProtoBufDecoderImpl.java
@@ -0,0 +1,169 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import java.io.IOException;
+import java.util.Date;
+
+import org.eclipse.kura.KuraInvalidMessageException;
+import org.eclipse.kura.KuraInvalidMetricTypeException;
+import org.eclipse.kura.core.message.protobuf.KuraPayloadProto;
+import org.eclipse.kura.core.util.GZipUtil;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraPosition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+
+public class CloudPayloadProtoBufDecoderImpl 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(CloudPayloadProtoBufDecoderImpl.class); 
+		
+	private byte[] m_bytes;
+	
+	public CloudPayloadProtoBufDecoderImpl(byte[] bytes) {
+		m_bytes = bytes;
+	}
+	
+	/**
+	 * Factory method to build an KuraPayload instance from a byte array.
+	 * 
+	 * @param bytes
+	 * @return
+	 * @throws InvalidProtocolBufferException
+	 * @throws IOException
+	 */
+	public KuraPayload buildFromByteArray()
+		throws KuraInvalidMessageException, IOException 
+	{
+		// Check if a compressed payload and try to decompress it
+		if (GZipUtil.isCompressed(m_bytes)) {
+			try {
+				m_bytes = GZipUtil.decompress(m_bytes);
+			} catch (IOException e) {
+				s_logger.info("Decompression failed");
+				// do not rethrow the exception here as isCompressed may return some false positives
+			}
+		}
+
+		// build the KuraPayloadProto.KuraPayload
+		KuraPayloadProto.KuraPayload protoMsg = null;
+		try {
+			protoMsg = KuraPayloadProto.KuraPayload.parseFrom(m_bytes);
+		} catch (InvalidProtocolBufferException ipbe) {
+			throw new KuraInvalidMessageException(ipbe);
+		}
+
+		// build the KuraPayload
+		KuraPayload kuraMsg = new KuraPayload();
+
+		// set the timestamp
+		if (protoMsg.hasTimestamp()) {
+			kuraMsg.setTimestamp( new Date(protoMsg.getTimestamp()));
+		}
+
+		// set the position
+		if (protoMsg.hasPosition()) {
+			kuraMsg.setPosition( buildFromProtoBuf(protoMsg.getPosition()));
+		}
+
+		// set the metrics
+		for (int i = 0; i < protoMsg.getMetricCount(); i++) {
+			String name = protoMsg.getMetric(i).getName();
+			try {
+				Object value = getProtoKuraMetricValue(protoMsg.getMetric(i),
+						protoMsg.getMetric(i).getType());
+				kuraMsg.addMetric(name, value);
+			} catch (KuraInvalidMetricTypeException ihte) {
+				s_logger.warn("During deserialization, ignoring metric named: "+name+". Unrecognized value type: "+protoMsg.getMetric(i).getType(), ihte);
+			}
+		}
+
+		// set the body
+		if (protoMsg.hasBody()) {
+			kuraMsg.setBody(protoMsg.getBody().toByteArray());
+		}
+
+		return kuraMsg;
+	}
+
+
+	private KuraPosition buildFromProtoBuf(KuraPayloadProto.KuraPayload.KuraPosition protoPosition) 
+	{
+		KuraPosition position = new KuraPosition();
+
+		if (protoPosition.hasLatitude()) {
+			position.setLatitude(protoPosition.getLatitude());
+		}
+		if (protoPosition.hasLongitude()) {
+			position.setLongitude(protoPosition.getLongitude());
+		}
+		if (protoPosition.hasAltitude()) {
+			position.setAltitude(protoPosition.getAltitude());
+		}
+		if (protoPosition.hasPrecision()) {
+			position.setPrecision(protoPosition.getPrecision());
+		}
+		if (protoPosition.hasHeading()) {
+			position.setHeading(protoPosition.getHeading());
+		}
+		if (protoPosition.hasSpeed()) {
+			position.setSpeed(protoPosition.getSpeed());
+		}
+		if (protoPosition.hasSatellites()) {
+			position.setSatellites(protoPosition.getSatellites());
+		}
+		if (protoPosition.hasStatus()) {
+			position.setStatus(protoPosition.getStatus());
+		}
+		if (protoPosition.hasTimestamp()) {
+			position.setTimestamp(new Date(protoPosition.getTimestamp()));
+		}
+		return position;
+	}	
+	
+	
+	private Object getProtoKuraMetricValue(KuraPayloadProto.KuraPayload.KuraMetric metric,
+										  KuraPayloadProto.KuraPayload.KuraMetric.ValueType type)
+		throws KuraInvalidMetricTypeException 
+	{
+		switch (type) {
+
+		case DOUBLE:
+			return metric.getDoubleValue();
+
+		case FLOAT:
+			return metric.getFloatValue();
+
+		case INT64:
+			return metric.getLongValue();
+
+		case INT32:
+			return metric.getIntValue();
+
+		case BOOL:
+			return metric.getBoolValue();
+
+		case STRING:
+			return metric.getStringValue();
+
+		case BYTES:
+			ByteString bs = metric.getBytesValue();
+			return bs.toByteArray();
+
+		default:
+			throw new KuraInvalidMetricTypeException(type);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadProtoBufEncoderImpl.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadProtoBufEncoderImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7619fe6d2437356b3f586dd80efaff2fc130ec1d
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudPayloadProtoBufEncoderImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import java.io.IOException;
+
+import org.eclipse.kura.KuraInvalidMetricTypeException;
+import org.eclipse.kura.core.message.protobuf.KuraPayloadProto;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraPosition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.protobuf.ByteString;
+
+/**
+ * Encodes an KuraPayload class using the Google ProtoBuf binary format.
+ */
+public class CloudPayloadProtoBufEncoderImpl implements CloudPayloadEncoder 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(CloudPayloadProtoBufEncoderImpl.class);
+	
+	private KuraPayload m_kuraPayload;
+	
+	public CloudPayloadProtoBufEncoderImpl(KuraPayload KuraPayload) {
+		m_kuraPayload = KuraPayload;
+	}
+	
+	/**
+	 * Conversion method to serialize an KuraPayload instance into a byte array.
+	 * @return
+	 */
+	public byte[] getBytes() throws IOException 
+	{
+		// Build the message
+		KuraPayloadProto.KuraPayload.Builder protoMsg = KuraPayloadProto.KuraPayload.newBuilder();
+		
+		// set the timestamp
+		if (m_kuraPayload.getTimestamp() != null) {
+			protoMsg.setTimestamp(m_kuraPayload.getTimestamp().getTime());
+		}
+		
+		// set the position
+		if (m_kuraPayload.getPosition() != null) {
+			protoMsg.setPosition(buildPositionProtoBuf());
+		}
+		
+		// set the metrics
+		for (String name : m_kuraPayload.metricNames()) {
+
+			// build a metric
+			Object value = m_kuraPayload.getMetric(name);
+			try {
+				KuraPayloadProto.KuraPayload.KuraMetric.Builder metricB = KuraPayloadProto.KuraPayload.KuraMetric.newBuilder();
+				metricB.setName(name);
+				
+				setProtoKuraMetricValue(metricB, value);
+				metricB.build();
+				
+				// add it to the message
+				protoMsg.addMetric(metricB);
+			}
+			catch (KuraInvalidMetricTypeException eihte) {
+				try {
+					s_logger.error("During serialization, ignoring metric named: {}. Unrecognized value type: {}.", name, value.getClass().getName());
+				} catch(NullPointerException npe) {
+					s_logger.error("During serialization, ignoring metric named: {}. The value is null.", name);
+				}
+				throw new RuntimeException(eihte);
+			}
+		}
+
+		// set the body
+		if (m_kuraPayload.getBody() != null) {
+			protoMsg.setBody(ByteString.copyFrom(m_kuraPayload.getBody()));
+		}
+
+		return protoMsg.build().toByteArray();
+	}
+
+	
+	//
+	// Helper methods to convert the KuraMetrics 
+	//
+	
+	private KuraPayloadProto.KuraPayload.KuraPosition buildPositionProtoBuf() 
+	{
+		KuraPayloadProto.KuraPayload.KuraPosition.Builder protoPos = null;
+		protoPos = KuraPayloadProto.KuraPayload.KuraPosition.newBuilder();
+		
+		KuraPosition position = m_kuraPayload.getPosition();
+		if (position.getLatitude() != null) {
+			protoPos.setLatitude(position.getLatitude());
+		}
+		if (position.getLongitude() != null) {
+			protoPos.setLongitude(position.getLongitude());
+		}
+		if (position.getAltitude() != null) {
+			protoPos.setAltitude(position.getAltitude());
+		}
+		if (position.getPrecision() != null) {
+			protoPos.setPrecision(position.getPrecision());
+		}
+		if (position.getHeading()!= null) {
+			protoPos.setHeading(position.getHeading());
+		}
+		if (position.getSpeed() != null) {
+			protoPos.setSpeed(position.getSpeed());
+		}
+		if (position.getTimestamp() != null) {
+			protoPos.setTimestamp(position.getTimestamp().getTime());
+		}
+		if (position.getSatellites() != null) {
+			protoPos.setSatellites(position.getSatellites());
+		}
+		if (position.getStatus()!= null) {
+			protoPos.setStatus(position.getStatus());
+		}
+		return protoPos.build();
+	}
+
+
+	private static void setProtoKuraMetricValue(KuraPayloadProto.KuraPayload.KuraMetric.Builder metric, 
+											   Object o)
+		throws KuraInvalidMetricTypeException
+	{
+
+		if (o instanceof String){
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.STRING);
+			metric.setStringValue((String)o);
+		} 
+		else if (o instanceof Double){
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.DOUBLE);
+			metric.setDoubleValue((Double)o);
+		}
+		else if (o instanceof Integer){
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.INT32);
+			metric.setIntValue((Integer)o);
+		}
+		else if (o instanceof Float){
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.FLOAT);
+			metric.setFloatValue((Float)o);
+		}
+		else if (o instanceof Long){
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.INT64);
+			metric.setLongValue((Long)o);
+		}
+		else if (o instanceof Boolean){
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.BOOL);
+			metric.setBoolValue((Boolean)o);
+		}
+		else if (o instanceof byte[]) {
+			metric.setType(KuraPayloadProto.KuraPayload.KuraMetric.ValueType.BYTES);
+			metric.setBytesValue(ByteString.copyFrom((byte[])o));
+		}
+		else if (o == null) {
+			throw new KuraInvalidMetricTypeException("null value");			
+		}
+		else {
+			throw new KuraInvalidMetricTypeException(o.getClass().getName());			
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudServiceImpl.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..c65333857e1b929954c9828cc3279a44ed811683
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudServiceImpl.java
@@ -0,0 +1,584 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.core.cloud;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraInvalidMessageException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudConnectionEstablishedEvent;
+import org.eclipse.kura.cloud.CloudConnectionLostEvent;
+import org.eclipse.kura.cloud.CloudPayloadProtoBufDecoder;
+import org.eclipse.kura.cloud.CloudPayloadProtoBufEncoder;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.data.DataServiceListener;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraTopic;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.position.PositionLockedEvent;
+import org.eclipse.kura.position.PositionService;
+import org.eclipse.kura.system.SystemAdminService;
+import org.eclipse.kura.system.SystemService;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudServiceImpl implements CloudService, DataServiceListener, ConfigurableComponent, EventHandler, CloudPayloadProtoBufEncoder, CloudPayloadProtoBufDecoder
+{	
+	private static final Logger s_logger = LoggerFactory.getLogger(CloudServiceImpl.class);
+	
+	private static final String     TOPIC_BA_APP = "BA";
+	
+	private ComponentContext        m_ctx;
+
+	private CloudServiceOptions     m_options;
+
+	private DataService             m_dataService;
+	private SystemService           m_systemService;
+	private SystemAdminService      m_systemAdminService;
+	private NetworkService          m_networkService;
+	private PositionService		    m_positionService;
+	private EventAdmin              m_eventAdmin;
+
+	// use a synchronized implementation for the list
+	private List<CloudClientImpl>   m_cloudClients;
+
+	
+	public CloudServiceImpl() {
+		m_cloudClients = new CopyOnWriteArrayList<CloudClientImpl>();
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setDataService(DataService dataService) {
+		this.m_dataService = dataService;
+	}
+
+	public void unsetDataService(DataService dataService) {
+		this.m_dataService = null;
+	}
+	
+	public DataService getDataService() {
+		return m_dataService;
+	}
+
+	public void setSystemAdminService(SystemAdminService systemAdminService) {
+		this.m_systemAdminService = systemAdminService;
+	}
+
+	public void unsetSystemAdminService(SystemAdminService systemAdminService) {
+		this.m_systemAdminService = null;
+	}
+
+	public SystemAdminService getSystemAdminService() {
+		return m_systemAdminService;
+	}
+
+	public void setSystemService(SystemService systemService) {
+		this.m_systemService = systemService;
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+		this.m_systemService = null;
+	}
+
+	public SystemService getSystemService() {
+		return m_systemService;
+	}
+
+	public void setNetworkService(NetworkService networkService) {
+		this.m_networkService = networkService;
+	}
+	
+	public void unsetNetworkService(NetworkService networkService) {
+		this.m_networkService = null;
+	}
+	
+	public NetworkService getNetworkService() {
+		return m_networkService;
+	}
+
+	public void setPositionService(PositionService positionService) {
+		this.m_positionService = positionService;
+	}
+	
+	public void unsetPositionService(PositionService positionService) {
+		this.m_positionService = null;
+	}
+
+	public PositionService getPositionService() {
+		return m_positionService;
+	}
+	
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = eventAdmin;
+	}
+	
+	public void unsetEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = null;
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.info("activate...");
+		
+		//
+		// save the bundle context and the properties
+		m_ctx = componentContext;
+		m_options = new CloudServiceOptions(properties, m_systemService);
+
+		//
+		// install event listener for GPS locked event
+		Dictionary<String,Object> props = new Hashtable<String,Object>();
+		String[] eventTopic = {PositionLockedEvent.POSITION_LOCKED_EVENT_TOPIC};
+		props.put(EventConstants.EVENT_TOPIC, eventTopic);
+		m_ctx.getBundleContext().registerService(EventHandler.class.getName(), this, props);
+	}
+		
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("updated...: " + properties);
+
+		// Update properties and re-publish Birth certificate
+		m_options = new CloudServiceOptions(properties, m_systemService);
+		if (m_dataService != null && m_dataService.isConnected()) {
+			publishBirthCertificate();
+		}
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("deactivate...");
+
+		if (m_dataService != null && m_dataService.isConnected()) {
+			publishDisconnectCertificate();
+		}
+
+		// no need to release the cloud clients as the updated app 
+		// certificate is already published due the missing dependency
+		// we only need to empty our CloudClient list
+		m_cloudClients.clear();
+
+		m_dataService        = null;
+		m_systemService      = null;
+		m_systemAdminService = null;
+		m_networkService     = null;
+		m_positionService    = null;
+		m_eventAdmin         = null;
+	}
+	
+	
+	public void handleEvent(Event event) 
+	{
+		if (PositionLockedEvent.POSITION_LOCKED_EVENT_TOPIC.contains(event.getTopic())) {
+			// if we get a position locked event, 
+			// republish the birth certificate only if we are configured to
+			if (m_dataService != null && m_dataService.isConnected() && m_options != null && m_options.getRepubBirthCertOnGpsLock()) {
+				publishBirthCertificate();
+			}
+		}
+	}
+	
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+
+	@Override
+	public CloudClient newCloudClient(String applicationId)
+		throws KuraException 
+	{
+		// create new instance
+		CloudClientImpl cloudClient = new CloudClientImpl(applicationId,
+														  m_dataService,
+													      this);
+		m_cloudClients.add(cloudClient);
+		
+		// publish updated birth certificate with list of active apps
+		if (m_dataService != null && m_dataService.isConnected()) {
+			publishAppCertificate();
+		}
+		
+		// return 
+		return cloudClient;
+	}
+	
+	
+	@Override
+	public String[] getCloudApplicationIdentifiers() 
+	{
+		List<String> appIds = new ArrayList<String>();
+		for (CloudClientImpl cloudClient : m_cloudClients) {
+			appIds.add(cloudClient.getApplicationId());
+		}		
+		return appIds.toArray(new String[0]);
+	}
+
+	@Override
+	public boolean isConnected() 
+	{
+		return (m_dataService != null && m_dataService.isConnected());
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Package APIs
+	//
+	// ----------------------------------------------------------------
+
+	public CloudServiceOptions getCloudServiceOptions() {
+		return m_options;
+	}
+	
+	
+	public void removeCloudClient(CloudClientImpl cloudClient) 
+	{
+		// remove the client		
+		m_cloudClients.remove(cloudClient);
+		
+		// publish updated birth certificate with updated list of active apps
+		if (m_dataService != null && m_dataService.isConnected()) {
+			publishAppCertificate();
+		}
+	}
+	
+	
+	byte[] encodePayload(KuraPayload payload)
+		throws KuraException
+	{
+		byte[] bytes = new byte[0];
+		if (payload == null) {
+			return bytes;
+		}
+		
+		CloudPayloadEncoder encoder = new CloudPayloadProtoBufEncoderImpl(payload);
+		if (m_options.getEncodeGzip()) {
+			encoder = new CloudPayloadGZipEncoder(encoder);
+		}
+		
+		try {
+			bytes = encoder.getBytes();
+			return bytes;
+		}
+		catch (IOException e) {
+			throw new KuraException(KuraErrorCode.ENCODE_ERROR, e);
+		}
+	}
+
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   DataServiceListener API
+	//
+	// ----------------------------------------------------------------
+
+	@Override
+	public void onConnectionEstablished() 
+	{
+		// publish birth certificate
+		publishBirthCertificate();
+		
+		// raise event
+		m_eventAdmin.postEvent( new CloudConnectionEstablishedEvent( new HashMap<String,Object>()));		
+		
+		// restore default subscriptions
+		activateDeviceSubscriptions();
+		
+		// notify listeners
+		for (CloudClientImpl cloudClient : m_cloudClients) {
+			cloudClient.onConnectionEstablished();
+		}
+	}
+	
+
+	private void activateDeviceSubscriptions()		
+	{
+		StringBuilder sbDeviceSubscription = new StringBuilder();
+		sbDeviceSubscription.append(m_options.getTopicControlPrefix())
+  						    .append(m_options.getTopicSeparator())
+						    .append(m_options.getTopicAccountToken())
+						    .append(m_options.getTopicSeparator())
+						    .append(m_options.getTopicClientIdToken())
+						    .append(m_options.getTopicSeparator())
+						    .append(m_options.getTopicWildCard());
+
+		// restore default subscriptions
+		try {
+			m_dataService.subscribe(sbDeviceSubscription.toString(), 1);
+		}
+		catch (KuraException e) {
+			s_logger.error("Error - Cannot activate default subscriptions", e);
+		}
+	}
+
+	
+	@Override
+	public void onDisconnecting() 
+	{
+		// publish disconnect certificate
+		publishDisconnectCertificate();
+	}
+
+	@Override
+	public void onDisconnected() {
+		// raise event
+		m_eventAdmin.postEvent( new CloudConnectionLostEvent( new HashMap<String,Object>()));
+	}
+
+	@Override
+	public void onConnectionLost(Throwable cause) 
+	{
+		// raise event
+		m_eventAdmin.postEvent( new CloudConnectionLostEvent( new HashMap<String,Object>()));
+		
+		// notify listeners
+		for (CloudClientImpl cloudClient : m_cloudClients) {
+			cloudClient.onConnectionLost();
+		}
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos, boolean retained) 
+	{
+		s_logger.debug("Message arrived on topic: {}", topic);		
+			
+		// notify listeners			
+		KuraTopic kuraTopic = new KuraTopic(topic);
+		if (TOPIC_BA_APP.equals(kuraTopic.getApplicationId())) {
+			s_logger.info("Ignoring feedback message from "+topic);
+		}
+		else {
+			KuraPayload kuraPayload = null;
+			try {
+				// try to decode the message into an KuraPayload					
+				kuraPayload = (new CloudPayloadProtoBufDecoderImpl(payload)).buildFromByteArray(); 
+			}
+			catch (Exception e) {
+				// Wrap the received bytes payload into an KuraPayload					
+				s_logger.debug("Received message on topic "+topic+" that could not be decoded. Wrapping it into an KuraPayload.");
+				kuraPayload = new KuraPayload();
+				kuraPayload.setBody(payload);
+			}
+			for (CloudClientImpl cloudClient : m_cloudClients) {
+				if (cloudClient.getApplicationId().equals(kuraTopic.getApplicationId())) {
+					try {
+						if (m_options.getTopicControlPrefix().equals(kuraTopic.getPrefix())) {
+							cloudClient.onControlMessageArrived(kuraTopic.getDeviceId(), 
+																kuraTopic.getApplicationTopic(), 
+																kuraPayload, 
+														        qos, 
+														        retained);
+						}
+						else {
+							cloudClient.onMessageArrived(kuraTopic.getDeviceId(), 
+													     kuraTopic.getApplicationTopic(), 
+													     kuraPayload, 
+													     qos, 
+													     retained);
+						}
+					}
+					catch (Exception e) {
+						s_logger.error("Error during CloudClientListener notification.", e);
+					}
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		// notify listeners			
+		KuraTopic kuraTopic = new KuraTopic(topic);
+		for (CloudClientImpl cloudClient : m_cloudClients) {
+			if (cloudClient.getApplicationId().equals(kuraTopic.getApplicationId())) {
+				cloudClient.onMessagePublished(messageId, kuraTopic.getApplicationTopic());
+			}
+		}
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		// notify listeners			
+		KuraTopic kuraTopic = new KuraTopic(topic);
+		for (CloudClientImpl cloudClient : m_cloudClients) {
+			if (cloudClient.getApplicationId().equals(kuraTopic.getApplicationId())) {
+				cloudClient.onMessageConfirmed(messageId, kuraTopic.getApplicationTopic());
+			}
+		}
+	}
+
+	// ----------------------------------------------------------------
+	//
+	//   CloudPayloadProtoBufEncoder API
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public byte[] getBytes(KuraPayload kuraPayload, boolean gzipped) throws KuraException {		
+		CloudPayloadEncoder encoder = new CloudPayloadProtoBufEncoderImpl(kuraPayload);
+		if (gzipped) {
+			encoder = new CloudPayloadGZipEncoder(encoder);
+		}
+		
+		byte[] bytes;
+		try {
+			bytes = encoder.getBytes();
+			return bytes;
+		}
+		catch (IOException e) {
+			throw new KuraException(KuraErrorCode.ENCODE_ERROR, e);
+		}
+	}
+
+	// ----------------------------------------------------------------
+	//
+	//   CloudPayloadProtoBufDecoder API
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public KuraPayload buildFromByteArray(byte[] payload) throws KuraException {
+		CloudPayloadProtoBufDecoderImpl encoder = new CloudPayloadProtoBufDecoderImpl(payload);
+		KuraPayload kuraPayload;
+		
+		try {
+			kuraPayload = encoder.buildFromByteArray();
+			return kuraPayload;
+		} catch (KuraInvalidMessageException e) {
+			throw new KuraException(KuraErrorCode.DECODER_ERROR, e);
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.DECODER_ERROR, e);
+		}
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Birth and Disconnect Certificates
+	//
+	// ----------------------------------------------------------------
+		
+	
+	private void publishBirthCertificate() 
+	{
+		StringBuilder sbTopic = new StringBuilder();
+		sbTopic.append(m_options.getTopicControlPrefix())
+		  	   .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicAccountToken())
+		       .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicClientIdToken())
+		       .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicBirthSuffix());
+		
+		String topic = sbTopic.toString();
+		KuraPayload payload = createBirthPayload();
+		publishLifeCycleMessage(topic, payload);
+	}
+
+	
+	private void publishDisconnectCertificate() 
+	{
+		StringBuilder sbTopic = new StringBuilder();
+		sbTopic.append(m_options.getTopicControlPrefix())
+		  	   .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicAccountToken())
+		       .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicClientIdToken())
+		       .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicDisconnectSuffix());
+		
+		String topic = sbTopic.toString();
+		KuraPayload payload = createDisconnectPayload();
+		publishLifeCycleMessage(topic, payload);
+	}
+	
+	
+	private void publishAppCertificate() 
+	{
+		StringBuilder sbTopic = new StringBuilder();
+		sbTopic.append(m_options.getTopicControlPrefix())
+		  	   .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicAccountToken())
+		       .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicClientIdToken())
+		       .append(m_options.getTopicSeparator())
+		       .append(m_options.getTopicAppsSuffix());
+		
+		String topic = sbTopic.toString();
+		KuraPayload payload = createBirthPayload();
+		publishLifeCycleMessage(topic, payload);
+	}
+
+	
+	private KuraPayload createBirthPayload()
+	{		
+		LifeCyclePayloadBuilder payloadBuilder = new LifeCyclePayloadBuilder(this);
+		return payloadBuilder.buildBirthPayload();
+	}
+	
+	
+	private KuraPayload createDisconnectPayload() 
+	{
+		LifeCyclePayloadBuilder payloadBuilder = new LifeCyclePayloadBuilder(this);
+		return payloadBuilder.buildDisconnectPayload();
+	}
+		
+	
+	private void publishLifeCycleMessage(String topic, KuraPayload payload) 
+	{
+		try {			
+			byte[] encodedPayload = encodePayload(payload);
+			m_dataService.publish(topic, 
+								  encodedPayload, 
+							      m_options.getLifeCycleMessageQos(), 
+							      m_options.getLifeCycleMessageRetain(), 
+							      m_options.getLifeCycleMessagePriority());
+		}
+		catch (Exception e) {
+			s_logger.error("Error publishing life-cycle message on topic: "+topic, e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudServiceOptions.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudServiceOptions.java
new file mode 100644
index 0000000000000000000000000000000000000000..62681f728dacc00357fe440234a63e4329e6f4ed
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/CloudServiceOptions.java
@@ -0,0 +1,213 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Map;
+
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.system.SystemService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudServiceOptions 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(CloudServiceOptions.class);
+	
+	private static final String  TOPIC_SEPARATOR              = "/";
+	private static final String  TOPIC_ACCOUNT_TOKEN          = "#account-name";
+	private static final String  TOPIC_CLIENT_ID_TOKEN        = "#client-id";
+	private static final String  TOPIC_BIRTH_SUFFIX           = "MQTT/BIRTH";
+	private static final String  TOPIC_DISCONNECT_SUFFIX      = "MQTT/DC";	
+	private static final String  TOPIC_APPS_SUFFIX            = "MQTT/APPS";
+	private static final String  TOPIC_CONTROL_PREFIX         = "topic.control-prefix";
+	private static final String  TOPIC_CONTROL_PREFIX_DEFAULT = "$EDC";
+	private static final String  TOPIC_WILD_CARD              = "#";
+	
+	private static final String  DEVICE_DISPLAY_NAME          = "device.display-name";
+	private static final String  DEVICE_CUSTOM_NAME			  = "device.custom-name";
+	private static final String  ENCODE_GZIP                  = "encode.gzip";
+	private static final String  REPUB_BIRTH_ON_GPS_LOCK	  = "republish.mqtt.birth.cert.on.gps.lock";
+	
+	private static final int     LIFECYCLE_QOS                = 0;
+	private static final int     LIFECYCLE_PRIORITY           = 0;
+	private static final boolean LIFECYCLE_RETAIN             = false;
+	
+	
+	private Map<String,Object> m_properties;
+	private SystemService	   m_systemService;
+	
+	CloudServiceOptions(Map<String,Object> properties, SystemService systemService) {
+		m_properties = properties;
+		m_systemService = systemService;
+	}
+	
+	/**
+	 * Returns the display name for the device.
+	 * @return
+	 */
+	public String getDeviceDisplayName() {
+		String displayName = "";
+		if (m_properties != null) {
+			String deviceDisplayNameOption = (String) m_properties.get(DEVICE_DISPLAY_NAME);
+			
+			// Use the device name from SystemService. This should be kura.device.name from 
+			// the properties file.
+			if (deviceDisplayNameOption.equals("device-name")) {
+				displayName = m_systemService.getDeviceName();
+				return displayName;
+			}
+			// Try to get the device hostname
+			else if (deviceDisplayNameOption.equals("hostname")) {
+				displayName = "UNKNOWN";
+				if(SystemService.OS_MAC_OSX.equals(m_systemService.getOsName())) {
+					String displayTmp = getHostname("scutil --get ComputerName");
+					if(displayTmp.length() > 0) {
+						displayName = displayTmp;
+					}
+				}
+				else if (SystemService.OS_LINUX.equals(m_systemService.getOsName()) || SystemService.OS_CLOUDBEES.equals(m_systemService.getOsName())) {
+					String displayTmp = getHostname("hostname");
+					if(displayTmp.length() > 0) {
+						displayName = displayTmp;
+					}
+				}	
+				return displayName;
+			}
+			// Return the custom field defined by the user
+			else if (deviceDisplayNameOption.equals("custom")) {
+				if (m_properties.get(DEVICE_CUSTOM_NAME) != null &&
+					m_properties.get(DEVICE_CUSTOM_NAME) instanceof String) {
+						displayName = (String) m_properties.get(DEVICE_CUSTOM_NAME);
+				}
+				return displayName;
+			}
+			// Return empty string to the server
+			else if (deviceDisplayNameOption.equals("server")) {
+				displayName = "";
+				return displayName;
+			}
+		}
+		
+		return displayName;
+	}
+		
+	/**
+	 * Returns true if the current CloudService configuration 
+	 * specifies Gzip compression enabled for outgoing payloads. 
+	 * @return
+	 */
+	public boolean getEncodeGzip() {
+		boolean encodeGzip = false;
+		if (m_properties != null &&
+			m_properties.get(ENCODE_GZIP) != null &&
+			m_properties.get(ENCODE_GZIP) instanceof Boolean) {
+			encodeGzip = (Boolean) m_properties.get(ENCODE_GZIP);
+		}
+		return encodeGzip;
+	}	
+	
+	/**
+	 * Returns true if the current CloudService configuration 
+	 * specifies the cloud client should republish the MQTT birth
+	 * certificate on GPS lock events 
+	 * @return
+	 */
+	public boolean getRepubBirthCertOnGpsLock() {
+		boolean repubBirth = false;
+		if (m_properties != null &&
+			m_properties.get(REPUB_BIRTH_ON_GPS_LOCK) != null &&
+			m_properties.get(REPUB_BIRTH_ON_GPS_LOCK) instanceof Boolean) {
+			repubBirth = (Boolean) m_properties.get(REPUB_BIRTH_ON_GPS_LOCK);
+		}
+		return repubBirth;
+	}	
+
+	/**
+	 * Returns the prefix to be used when publishing messages to control topics.
+	 * @return
+	 */
+	public String getTopicControlPrefix() {
+		String prefix = TOPIC_CONTROL_PREFIX_DEFAULT;
+		if (m_properties != null &&
+			m_properties.get(TOPIC_CONTROL_PREFIX) != null &&
+			m_properties.get(TOPIC_CONTROL_PREFIX) instanceof String) {
+			prefix = (String) m_properties.get(TOPIC_CONTROL_PREFIX);
+		}
+		return prefix;
+	}
+
+	public String getTopicSeparator() {
+		return TOPIC_SEPARATOR;
+	}
+
+	public String getTopicAccountToken() {
+		return TOPIC_ACCOUNT_TOKEN;
+	}
+
+	public String getTopicClientIdToken() {
+		return TOPIC_CLIENT_ID_TOKEN;
+	}
+
+	public String getTopicBirthSuffix() {
+		return TOPIC_BIRTH_SUFFIX;
+	}
+	
+	public String getTopicDisconnectSuffix() {
+		return TOPIC_DISCONNECT_SUFFIX;
+	}
+	
+	public String getTopicAppsSuffix() {
+		return TOPIC_APPS_SUFFIX;
+	}
+
+	public String getTopicWildCard() {
+		return TOPIC_WILD_CARD;
+	}
+
+	public int getLifeCycleMessageQos() {
+		return LIFECYCLE_QOS;
+	}
+
+	public int getLifeCycleMessagePriority() {
+		return LIFECYCLE_PRIORITY;
+	}
+
+	public boolean getLifeCycleMessageRetain() {
+		return LIFECYCLE_RETAIN;
+	}
+	
+	private String getHostname(String command) {
+		StringBuffer response = new StringBuffer(); 
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec(command);
+			proc.waitFor();
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			String newLine = "";
+			while ((line = br.readLine()) != null) {
+				response.append(newLine);
+				response.append(line);
+				newLine = "\n";
+			}
+		} catch(Exception e) {
+			s_logger.error("failed to run commands " + command, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		return response.toString();
+	}
+}
+
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/LifeCyclePayloadBuilder.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/LifeCyclePayloadBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbe860708b5c91bd788d79022f0d6e77977d4d6e
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/LifeCyclePayloadBuilder.java
@@ -0,0 +1,308 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud;
+
+import java.util.List;
+
+import org.eclipse.kura.core.message.KuraBirthPayload;
+import org.eclipse.kura.core.message.KuraDeviceProfile;
+import org.eclipse.kura.core.message.KuraDisconnectPayload;
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.message.KuraPosition;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.position.NmeaPosition;
+import org.eclipse.kura.position.PositionService;
+import org.eclipse.kura.system.SystemAdminService;
+import org.eclipse.kura.system.SystemService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to build lifecycle payload messages.
+ */
+public class LifeCyclePayloadBuilder 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(LifeCyclePayloadBuilder.class);
+	
+	private static final String UNKNOWN = "UNKNOWN";
+
+	private CloudServiceImpl m_cloudServiceImpl;
+	
+	LifeCyclePayloadBuilder(CloudServiceImpl cloudServiceImpl) {
+		m_cloudServiceImpl = cloudServiceImpl;
+	}
+	
+	
+	public KuraBirthPayload buildBirthPayload()
+	{
+		// build device profile
+		KuraDeviceProfile deviceProfile = buildDeviceProfile();
+
+		// build application IDs
+		String appIds = buildApplicationIDs();
+		
+		// build accept encoding
+		String acceptEncoding = buildAcceptEncoding();
+        
+		// build device name
+		CloudServiceOptions cso = m_cloudServiceImpl.getCloudServiceOptions();
+		String deviceName = cso.getDeviceDisplayName();
+		if (deviceName == null) {
+			deviceName =  m_cloudServiceImpl.getSystemService().getDeviceName();
+		}		
+		
+		// build birth certificate
+		KuraBirthPayload birthPayload = new KuraBirthPayload(
+	        deviceProfile.getUptime(),
+	        deviceName,
+	        deviceProfile.getModelName(),
+	        deviceProfile.getModelId(),
+	        deviceProfile.getPartNumber(),
+	        deviceProfile.getSerialNumber(),
+	        deviceProfile.getFirmwareVersion(),
+	        deviceProfile.getBiosVersion(),
+	        deviceProfile.getOs(),
+	        deviceProfile.getOsVersion(),
+	        deviceProfile.getJvmName(),
+	        deviceProfile.getJvmVersion(),
+	        deviceProfile.getJvmProfile(),
+	        deviceProfile.getKuraVersion(),
+	        deviceProfile.getConnectionInterface(),
+	        deviceProfile.getConnectionIp(),
+	        acceptEncoding,
+	        appIds,
+			deviceProfile.getAvailableProcessors(),
+			deviceProfile.getTotalMemory(),
+			deviceProfile.getOsArch(),
+			deviceProfile.getOsgiFramework(),
+			deviceProfile.getOsgiFrameworkVersion()
+		);        
+        if (deviceProfile.getLatitude() != null &&
+            deviceProfile.getLongitude() != null) {
+            KuraPosition KuraPosition = new KuraPosition();
+            KuraPosition.setLatitude(deviceProfile.getLatitude());
+            KuraPosition.setLongitude(deviceProfile.getLongitude());
+            KuraPosition.setAltitude(deviceProfile.getAltitude());
+            birthPayload.setPosition(KuraPosition);
+        }
+        return birthPayload;
+	}
+	
+	
+	public KuraDisconnectPayload buildDisconnectPayload()
+	{
+		SystemService        systemService = m_cloudServiceImpl.getSystemService();
+		SystemAdminService sysAdminService = m_cloudServiceImpl.getSystemAdminService();
+		CloudServiceOptions   cloudOptions = m_cloudServiceImpl.getCloudServiceOptions();
+
+		// build device name
+		String deviceName = cloudOptions.getDeviceDisplayName();
+		if (deviceName == null) {
+			deviceName =  systemService.getDeviceName();
+		}		
+		
+		// build payload
+		KuraDisconnectPayload payload = new KuraDisconnectPayload(sysAdminService.getUptime(), 
+															    deviceName);
+		return payload;		
+	}
+
+	
+	public KuraDeviceProfile buildDeviceProfile() 
+	{
+		SystemService        systemService = m_cloudServiceImpl.getSystemService();
+		SystemAdminService sysAdminService = m_cloudServiceImpl.getSystemAdminService();
+		NetworkService      networkService = m_cloudServiceImpl.getNetworkService();
+		PositionService    positionService = m_cloudServiceImpl.getPositionService();		
+
+		//
+		// get the network information
+		StringBuilder sbConnectionIp        = null;
+		StringBuilder sbConnectionInterface = null;
+		try {		
+			List<NetInterface<? extends NetInterfaceAddress>> nis = networkService.getActiveNetworkInterfaces();
+			if (!nis.isEmpty()) {
+				sbConnectionIp        = new StringBuilder();
+				sbConnectionInterface = new StringBuilder();
+
+				for (NetInterface<? extends NetInterfaceAddress> ni : nis) {
+					List<? extends NetInterfaceAddress> nias = ni.getNetInterfaceAddresses();
+					if (nias != null && !nias.isEmpty()) {
+						sbConnectionInterface.append(buildConnectionInterface(ni)).append(",");
+						sbConnectionIp.append(buildConnectionIp(ni)).append(",");
+					}
+				}
+				
+				// Remove trailing comma
+				sbConnectionIp.deleteCharAt(sbConnectionIp.length() - 1);
+				sbConnectionInterface.deleteCharAt(sbConnectionInterface.length() - 1);
+			}
+		}
+		catch (Exception se) {
+			s_logger.warn("Error while getting ConnetionIP and ConnectionInterface", se);
+		}
+
+		String connectionIp        = sbConnectionIp != null ? sbConnectionIp.toString() : "UNKNOWN";
+		String connectionInterface = sbConnectionInterface != null ? sbConnectionInterface.toString() : "UNKNOWN";
+		
+		//
+		// get the network information
+//		String primaryNetInterface = systemService.getPrimaryNetworkInterfaceName();
+//		String connectionIp        = UNKNOWN;
+//		String connectionInterface = UNKNOWN;
+//		try {		
+//			List<NetInterface<? extends NetInterfaceAddress>> nis = networkService.getActiveNetworkInterfaces();
+//			if (!nis.isEmpty()) {
+//				
+//				// look for the primary network interface first
+//				for (NetInterface<? extends NetInterfaceAddress> ni : nis) {
+//					if (ni.getName().equals(primaryNetInterface)) {
+//						List<? extends NetInterfaceAddress> nias = ni.getNetInterfaceAddresses();
+//						if (nias != null && !nias.isEmpty()) {
+//							connectionInterface = buildConnectionInterface(ni);				
+//							connectionIp = buildConnectionIp(ni);
+//							break;
+//						}
+//					}
+//				}
+//
+//				// if not resolved, loop through all network interfaces until we find one with an address
+//				if (UNKNOWN.equals(connectionIp) || UNKNOWN.equals(connectionInterface)) {			
+//					s_logger.warn("Unresolved connectionIp for primary Network Interface. Looping through all interfaces...");
+//					for (NetInterface<? extends NetInterfaceAddress> ni : nis) {
+//						List<? extends NetInterfaceAddress> nias = ni.getNetInterfaceAddresses();
+//						if (nias != null && !nias.isEmpty()) {
+//							connectionInterface = buildConnectionInterface(ni);				
+//							connectionIp = buildConnectionIp(ni);
+//							break;
+//						}
+//					}
+//				}
+//			}
+//			
+//			if (UNKNOWN.equals(connectionIp) || UNKNOWN.equals(connectionInterface)) {			
+//				s_logger.warn("Unresolved NetworkService reference or IP address. Defaulting to JVM Networking Information.");
+//					InetAddress addr = NetUtil.getCurrentInetAddress();
+//					if (addr != null) {   
+//						connectionIp = addr.getHostAddress();
+//						NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
+//						if (netInterface != null) {
+//							connectionInterface = NetUtil.hardwareAddressToString(netInterface.getHardwareAddress());
+//						}
+//					}
+//				}
+//		}
+//		catch (Exception se) {
+//			s_logger.warn("Error while getting ConnetionIP and ConnectionInterface", se);
+//		}			
+		
+		//
+		// get the position information
+		double latitude  = 0.0;
+		double longitude = 0.0;
+		double altitude  = 0.0;
+		if (positionService != null) {
+			NmeaPosition position = positionService.getNmeaPosition();
+			if (position != null) {
+				latitude  = position.getLatitude();
+				longitude = position.getLongitude();
+				altitude  = position.getAltitude();
+			}
+			else {
+				s_logger.warn("Unresolved PositionService reference.");
+			}
+		}
+		
+		//
+		// build the profile
+		KuraDeviceProfile KuraDeviceProfile = new KuraDeviceProfile(
+				sysAdminService.getUptime(),
+				systemService.getDeviceName(),
+				systemService.getModelName(),
+				systemService.getModelId(),
+				systemService.getPartNumber(),
+				systemService.getSerialNumber(),
+				systemService.getFirmwareVersion(),
+				systemService.getBiosVersion(),
+				systemService.getOsName(),
+				systemService.getOsVersion(),
+				systemService.getJavaVmName(),
+				systemService.getJavaVmVersion() + " " + systemService.getJavaVmInfo(),
+				systemService.getJavaVendor() + " " + systemService.getJavaVersion(),
+				systemService.getKuraVersion(),
+				connectionInterface, 
+				connectionIp,
+				latitude,
+				longitude,
+				altitude,
+				String.valueOf(systemService.getNumberOfProcessors()),
+				String.valueOf(systemService.getTotalMemory()),
+				systemService.getOsArch(),
+				systemService.getOsgiFwName(),
+				systemService.getOsgiFwVersion()
+		);		        
+		return KuraDeviceProfile;		
+	}
+
+
+	private String buildConnectionIp(NetInterface<? extends NetInterfaceAddress> ni) 
+	{
+		String connectionIp = UNKNOWN;
+		List<? extends NetInterfaceAddress> nias = ni.getNetInterfaceAddresses();
+		if (nias != null && !nias.isEmpty()) {
+			if (nias.get(0).getAddress() != null) {
+				connectionIp = nias.get(0).getAddress().getHostAddress();
+			}
+		}
+		return connectionIp;
+	}
+
+
+	private String buildConnectionInterface(NetInterface<? extends NetInterfaceAddress> ni) 
+	{
+		String connectionInterface = UNKNOWN;
+		StringBuilder sb = new StringBuilder();
+		sb.append(ni.getName())
+		  .append(" (")
+		  .append(NetUtil.hardwareAddressToString(ni.getHardwareAddress()))
+		  .append(")");					
+		connectionInterface = sb.toString();
+		return connectionInterface;
+	}
+	
+	
+	private String buildApplicationIDs() 
+	{
+		String[] appIdArray = m_cloudServiceImpl.getCloudApplicationIdentifiers();
+		StringBuilder sbAppIDs = new StringBuilder();
+		for (int i=0; i<appIdArray.length; i++) {
+			if (i != 0) {
+				sbAppIDs.append(",");
+			}
+			sbAppIDs.append(appIdArray[i]);
+		}
+		return sbAppIDs.toString();
+	}
+
+
+	private String buildAcceptEncoding() 
+	{
+		String acceptEncoding = "";
+		CloudServiceOptions options = m_cloudServiceImpl.getCloudServiceOptions();
+		if (options.getEncodeGzip()) {
+			acceptEncoding = "gzip";
+		}
+		return acceptEncoding;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/call/CloudCallServiceImpl.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/call/CloudCallServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce5b414af19d9d685ac0303e66fe1aa238bb802f
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/cloud/call/CloudCallServiceImpl.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.cloud.call;
+
+import java.io.IOException;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraInvalidMessageException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.KuraTimeoutException;
+import org.eclipse.kura.cloud.CloudCallService;
+import org.eclipse.kura.cloud.app.RequestIdGenerator;
+import org.eclipse.kura.core.cloud.CloudPayloadProtoBufDecoderImpl;
+import org.eclipse.kura.core.cloud.CloudPayloadProtoBufEncoderImpl;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.data.DataServiceListener;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraRequestPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.eclipse.kura.message.KuraTopic;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudCallServiceImpl implements CloudCallService, DataServiceListener 
+{
+	private static final Logger s_logger = LoggerFactory
+			.getLogger(CloudCallServiceImpl.class);
+
+	private static RequestIdGenerator s_generator = RequestIdGenerator
+			.getInstance();
+
+	private static final int DFLT_PUB_QOS = 0;
+	private static final boolean DFLT_RETAIN = false;
+	private static final int DFLT_PRIORITY = 1;
+
+	private static final String ACCOUNT_NAME_VAR_NAME = "#account-name";
+	private static final String CLIENT_ID_VAR_NAME = "#client-id";
+
+	private DataService m_dataService;
+
+	private Object m_lock;
+	private String m_respTopic;
+	private KuraResponsePayload m_resp;
+
+	// ----------------------------------------------------------------
+	//
+	// Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setDataService(DataService dataService) {
+		m_dataService = dataService;
+	}
+
+	public void unsetDataService(DataService dataService) {
+		m_dataService = null;
+	}
+
+	// ----------------------------------------------------------------
+	//
+	// Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext) {
+		s_logger.info("Activating...");
+		m_lock = new Object();
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		s_logger.info("Deactivating...");
+		synchronized (m_lock) {
+			m_lock.notifyAll();
+		}
+	}
+
+	@Override
+	public synchronized KuraResponsePayload call(String appId, String appTopic,
+			KuraPayload appPayload, int timeout) throws KuraConnectException,
+			KuraTimeoutException, KuraStoreException, KuraException {
+		return call(CLIENT_ID_VAR_NAME, appId, appTopic, appPayload, timeout);
+	}
+
+	@Override
+	public synchronized KuraResponsePayload call(String deviceId, String appId,
+			String appTopic, KuraPayload appPayload, int timeout)
+			throws KuraConnectException, KuraTimeoutException, KuraStoreException,
+			KuraException {
+		// Generate the request ID
+		String requestId = s_generator.next();
+
+		StringBuilder sbReqTopic = new StringBuilder("$EDC").append("/")
+				.append(ACCOUNT_NAME_VAR_NAME).append("/").append(deviceId)
+				.append("/").append(appId).append("/").append(appTopic);
+
+		StringBuilder sbRespTopic = new StringBuilder("$EDC").append("/")
+				.append(ACCOUNT_NAME_VAR_NAME).append("/")
+				.append(CLIENT_ID_VAR_NAME).append("/").append(appId)
+				.append("/").append("REPLY").append("/").append(requestId);
+
+		KuraRequestPayload req = null;
+		if (appPayload != null) {
+			// Construct a request payload
+			req = new KuraRequestPayload(appPayload);
+		} else {
+			req = new KuraRequestPayload();
+		}
+
+		req.setRequestId(requestId);
+		req.setRequesterClientId(CLIENT_ID_VAR_NAME);
+
+		CloudPayloadProtoBufEncoderImpl encoder = new CloudPayloadProtoBufEncoderImpl(req);
+		byte[] rawPayload;
+		try {
+			rawPayload = encoder.getBytes();
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e,
+					"Cannot encode request");
+		}
+
+		m_respTopic = sbRespTopic.toString();
+		m_resp = null;
+
+		m_dataService.subscribe(m_respTopic, 0);
+
+		synchronized (m_lock) {
+			try {
+				m_dataService.publish(sbReqTopic.toString(), rawPayload,
+						DFLT_PUB_QOS, DFLT_RETAIN, DFLT_PRIORITY);
+				m_lock.wait(timeout);
+			} catch (KuraStoreException e) {
+				throw e;
+			} catch (InterruptedException e) {
+				// Avoid re-throwing this exception which should not normally happen
+				s_logger.warn("Interrupted while waiting for the response");
+				Thread.interrupted();
+			} finally {
+				try {
+					m_dataService.unsubscribe(m_respTopic);
+				} catch (KuraException e) {
+					s_logger.error("Cannot unsubscribe");
+				}
+				m_respTopic = null;
+			}
+		}
+
+		if (m_resp == null) {
+			throw new KuraTimeoutException(
+					"Timed out while waiting for the response");
+		}
+
+		return m_resp;
+	}
+	
+	public void cancel() {
+		synchronized (m_lock) {
+			notifyAll();
+		}
+	}
+	
+	@Override
+	public void onConnectionEstablished() {
+		// Ignore
+	}
+
+	@Override
+	public void onDisconnecting() {
+		// Ignore
+	}
+
+	@Override
+	public void onDisconnected() {
+		// Ignore
+	}
+
+	@Override
+	public void onConnectionLost(Throwable cause) {
+		// Ignore
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos,
+			boolean retained) {
+		
+		s_logger.debug("Message arrived on topic: '{}'", topic);
+		
+		if (m_respTopic != null) {
+			// Filter on application ID and topic
+			KuraTopic kuraTopic = new KuraTopic(topic);
+			KuraTopic kuraRespTopic = new KuraTopic(m_respTopic);
+			
+			if (kuraTopic.getApplicationId().equals(kuraRespTopic.getApplicationId()) &&
+					kuraTopic.getApplicationTopic().equals(kuraRespTopic.getApplicationTopic())) {
+				
+				s_logger.debug("Got response");
+				
+				CloudPayloadProtoBufDecoderImpl decoder = new CloudPayloadProtoBufDecoderImpl(
+						payload);
+
+				KuraResponsePayload resp = null;
+				try {
+					KuraPayload kuraPayload = decoder.buildFromByteArray();
+					resp = new KuraResponsePayload(kuraPayload);
+				} catch (KuraInvalidMessageException e) {
+					s_logger.error("Cannot decode protobuf", e);
+				} catch (IOException e) {
+					s_logger.error("Cannot decode protobuf", e);
+				}
+
+				synchronized (m_lock) {
+					m_resp = resp; // Can be null
+					m_lock.notifyAll();
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		// Ignore
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		// Ignore
+	}
+	
+	@Override
+	public boolean isConnected() {
+		return m_dataService.isConnected();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraBirthPayload.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraBirthPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e98a5fe00492e2f56cef8a9efd777398528c12e
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraBirthPayload.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.message;
+
+import java.util.Iterator;
+
+import org.eclipse.kura.message.KuraPayload;
+
+public class KuraBirthPayload extends KuraPayload 
+{
+	private final static String UPTIME = "uptime";
+	private final static String DISPLAY_NAME = "display_name";
+	private final static String MODEL_NAME = "model_name";
+	private final static String MODEL_ID = "model_id";
+	private final static String PART_NUMBER = "part_number";
+	private final static String SERIAL_NUMBER = "serial_number";
+	private final static String AVAILABLE_PROCESSORS = "available_processors";
+	private final static String TOTAL_MEMORY = "total_memory";
+	private final static String FIRMWARE_VERSION = "firmware_version";
+	private final static String BIOS_VERSION = "bios_version";
+	private final static String OS = "os";
+	private final static String OS_VERSION = "os_version";
+	private final static String OS_ARCH = "os_arch";
+	private final static String JVM_NAME = "jvm_name";
+	private final static String JVM_VERSION = "jvm_version";
+	private final static String JVM_PROFILE = "jvm_profile";
+	private final static String KURA_VERSION = "kura_version";
+	private final static String OSGI_FRAMEWORK = "osgi_framework";
+	private final static String OSGI_FRAMEWORK_VERSION = "osgi_framework_version";
+	private final static String CONNECTION_INTERFACE = "connection_interface";
+	private final static String CONNECTION_IP = "connection_ip";
+	private final static String ACCEPT_ENCODING = "accept_encoding";
+	private final static String APPLICATION_IDS = "application_ids";
+	
+	public KuraBirthPayload(String uptime, String displayName,
+			String modelName, String modelId, String partNumber,
+			String serialNumber, String firmwareVersion, String biosVersion,
+			String os, String osVersion, String jvmName, String jvmVersion,
+			String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp) {
+		
+		this(uptime, displayName, modelName, modelId, partNumber,
+			serialNumber, firmwareVersion, biosVersion,
+			os, osVersion, jvmName, jvmVersion,
+			jvmProfile, kuraVersion, connectionInterface, connectionIp,
+			null, null, null, null, null, null, null);
+	}
+	
+	public KuraBirthPayload(String uptime, String displayName,
+			String modelName, String modelId, String partNumber,
+			String serialNumber, String firmwareVersion, String biosVersion,
+			String os, String osVersion, String jvmName, String jvmVersion,
+			String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp,
+			String acceptEncoding) {
+		
+		this(uptime, displayName, modelName, modelId, partNumber,
+			serialNumber, firmwareVersion, biosVersion,
+			os, osVersion, jvmName, jvmVersion,
+			jvmProfile, kuraVersion, connectionInterface, connectionIp,
+			acceptEncoding, null, null, null, null, null, null);
+	}
+	
+	public KuraBirthPayload(String uptime, String displayName,
+			String modelName, String modelId, String partNumber,
+			String serialNumber, String firmwareVersion, String biosVersion,
+			String os, String osVersion, String jvmName, String jvmVersion,
+			String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp,
+			String acceptEncoding, String applicationIdentifiers) {
+		
+		this(uptime, displayName, modelName, modelId, partNumber,
+				serialNumber, firmwareVersion, biosVersion,
+				os, osVersion, jvmName, jvmVersion,
+				jvmProfile, kuraVersion, connectionInterface, connectionIp,
+				acceptEncoding, applicationIdentifiers,
+				null, null, null, null, null);
+	}
+	
+	public KuraBirthPayload(String uptime, String displayName,
+			String modelName, String modelId, String partNumber,
+			String serialNumber, String firmwareVersion, String biosVersion,
+			String os, String osVersion, String jvmName, String jvmVersion,
+			String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp,
+			String acceptEncoding, String applicationIdentifiers,
+			String availableProcessors, String totalMemory, String osArch,
+			String osgiFramework, String osgiFrameworkVersion) {
+		super();
+		
+		if (uptime != null) {
+			addMetric(UPTIME, uptime);
+		}
+		if (displayName != null) {
+			addMetric(DISPLAY_NAME, displayName);
+		}
+		if (modelName != null) {
+			addMetric(MODEL_NAME, modelName);
+		}
+		if (modelId != null) {
+			addMetric(MODEL_ID, modelId);
+		}
+		if (partNumber != null) {
+			addMetric(PART_NUMBER, partNumber);
+		}
+		if (serialNumber != null) {
+			addMetric(SERIAL_NUMBER, serialNumber);
+		}
+		if (firmwareVersion != null) {
+			addMetric(FIRMWARE_VERSION, firmwareVersion);
+		}
+		if (biosVersion != null) {
+			addMetric(BIOS_VERSION, biosVersion);
+		}
+		if (os != null) {
+			addMetric(OS, os);
+		}
+		if (osVersion != null) {
+			addMetric(OS_VERSION, osVersion);
+		}
+		if (jvmName != null) {
+			addMetric(JVM_NAME, jvmName);
+		}
+		if (jvmVersion != null) {
+			addMetric(JVM_VERSION, jvmVersion);
+		}
+		if (jvmProfile != null) {
+			addMetric(JVM_PROFILE, jvmProfile);
+		}
+		if (kuraVersion != null) {
+			addMetric(KURA_VERSION, kuraVersion);
+		}
+		if (connectionInterface != null) {
+			addMetric(CONNECTION_INTERFACE, connectionInterface);
+		}
+		if (connectionIp != null) {
+			addMetric(CONNECTION_IP, connectionIp);
+		}
+		if (acceptEncoding != null) {
+			addMetric(ACCEPT_ENCODING, acceptEncoding);
+		}
+		if (applicationIdentifiers != null) {
+			addMetric(APPLICATION_IDS, applicationIdentifiers);
+		}
+		if (availableProcessors != null) {
+			addMetric(AVAILABLE_PROCESSORS, availableProcessors);
+		}
+		if (totalMemory != null) {
+			addMetric(TOTAL_MEMORY, totalMemory);
+		}
+		if (osArch != null) {
+			addMetric(OS_ARCH, osArch);
+		}
+		if (osgiFramework != null) {
+			addMetric(OSGI_FRAMEWORK, osgiFramework);
+		}
+		if (osgiFrameworkVersion != null) {
+			addMetric(OSGI_FRAMEWORK_VERSION, osgiFrameworkVersion);
+		}
+	}
+	
+	public KuraBirthPayload(KuraPayload edcMessage) {	    
+		Iterator<String> hdrIterator = edcMessage.metricsIterator();		
+		while (hdrIterator.hasNext()) {
+			String hdrName = hdrIterator.next();
+			String hdrVal = (String)edcMessage.getMetric(hdrName);			
+			addMetric(hdrName, hdrVal);
+		}		
+		setBody(edcMessage.getBody());
+		setPosition(edcMessage.getPosition());
+	}
+
+	public String getUptime() {
+		return (String) getMetric(UPTIME);
+	}
+	public String getDisplayName() {
+		return (String) getMetric(DISPLAY_NAME);
+	}
+	public String getModelName() {
+		return (String) getMetric(MODEL_NAME);
+	}
+	public String getModelId() {
+		return (String) getMetric(MODEL_ID);
+	}
+	public String getPartNumber() {
+		return (String) getMetric(PART_NUMBER);
+	}
+	public String getSerialNumber() {
+		return (String) getMetric(SERIAL_NUMBER);
+	}
+	public String getFirmwareVersion() {
+		return (String) getMetric(FIRMWARE_VERSION);
+	}
+	public String getBiosVersion() {
+		return (String) getMetric(BIOS_VERSION);
+	}
+	public String getOs() {
+		return (String) getMetric(OS);
+	}
+	public String getOsVersion() {
+		return (String) getMetric(OS_VERSION);
+	}
+	public String getJvmName() {
+		return (String) getMetric(JVM_NAME);
+	}
+	public String getJvmVersion() {
+		return (String) getMetric(JVM_VERSION);
+	}
+	public String getJvmProfile() {
+		return (String) getMetric(JVM_PROFILE);
+	}
+	public String getKuraVersion() {
+		return (String) getMetric(KURA_VERSION);
+	}
+	public String getConnectionInterface() {
+		return (String) getMetric(CONNECTION_INTERFACE);
+	}
+	public String getConnectionIp() {
+		return (String) getMetric(CONNECTION_IP);
+	}
+	public String getAcceptEncoding() {
+		return (String) getMetric(ACCEPT_ENCODING);
+	}
+	public String getApplicationIdentifiers() {
+		return (String) getMetric(APPLICATION_IDS);
+	}
+
+	public String getAvailableProcessors() {
+		return (String) getMetric(AVAILABLE_PROCESSORS);
+	}
+
+	public String getTotalMemory() {
+		return (String) getMetric(TOTAL_MEMORY);
+	}
+
+	public String getOsArch() {
+		return (String) getMetric(OS_ARCH);
+	}
+
+	public String getOsgiFramework() {
+		return (String) getMetric(OSGI_FRAMEWORK);
+	}
+
+	public String getOsgiFrameworkVersion() {
+		return (String) getMetric(OSGI_FRAMEWORK_VERSION);
+	}
+
+	@Override
+	public String toString() {
+		return "EdcBirthMessage [getUptime()=" + getUptime() + ", getDisplayName()="
+				+ getDisplayName() + ", getModelName()=" + getModelName()
+				+ ", getModelId()=" + getModelId() + ", getPartNumber()="
+				+ getPartNumber() + ", getSerialNumber()=" + getSerialNumber()
+				+ ", getFirmwareVersion()=" + getFirmwareVersion()
+				+ ", getAvailableProcessors()=" + getAvailableProcessors()
+				+ ", getTotalMemory()=" + getTotalMemory()
+				+ ", getBiosVersion()=" + getBiosVersion() + ", getOs()="
+				+ getOs() + ", getOsVersion()=" + getOsVersion()
+				+ ", getOsArch()=" + getOsArch()
+				+ ", getJvmName()=" + getJvmName() + ", getJvmVersion()="
+				+ getJvmVersion() + ", getJvmProfile()=" + getJvmProfile()
+				+ ", getKuraVersion()=" + getKuraVersion()
+				+ ", getOsgiFramework()=" + getOsgiFramework()
+				+ ", getOsgiFrameworkVersion()=" + getOsgiFrameworkVersion()
+				+ ", getConnectionInterface()=" + getConnectionInterface()
+				+ ", getConnectionIp()=" + getConnectionIp()
+				+ ", getAcceptEncoding()=" + getAcceptEncoding()
+				+ ", getApplicationIdentifiers()=" + getApplicationIdentifiers() + "]";
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraDeviceProfile.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraDeviceProfile.java
new file mode 100644
index 0000000000000000000000000000000000000000..2eba462ebf2dec200713dd28322b53026104a655
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraDeviceProfile.java
@@ -0,0 +1,664 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.message;
+
+import java.util.Properties;
+
+/**
+ * The KuraDeviceProfile is a container class that holds the parameters that make up the from of a device.
+ * This information is used to build the birth and disconnect certificates that are published when
+ * connecting to and disconnecting from the broker.
+ *
+ */
+public class KuraDeviceProfile 
+{	
+	private final static String UPTIME 					= "uptime";
+	private final static String DISPLAY_NAME 			= "display_name";
+	private final static String MODEL_NAME 				= "model_name";
+	private final static String MODEL_ID 				= "model_id";
+	private final static String PART_NUMBER 			= "part_number";
+	private final static String SERIAL_NUMBER 			= "serial_number";
+	private final static String AVAILABLE_PROCESSORS	= "available_processors";
+	private final static String TOTAL_MEMORY			= "total_memory";
+	private final static String FIRMWARE_VERSION 		= "firmware_version";
+	private final static String BIOS_VERSION 			= "bios_version";
+	private final static String OS 						= "os";
+	private final static String OS_VERSION 				= "os_version";
+	private final static String OS_ARCH 				= "os_arch";
+	private final static String JVM_NAME 				= "jvm_name";
+	private final static String JVM_VERSION 			= "jvm_version";
+	private final static String JVM_PROFILE 			= "jvm_profile";
+	private final static String KURA_VERSION			= "kura_version";
+	private final static String OSGI_FRAMEWORK 			= "osgi_framework";
+	private final static String OSGI_FRAMEWORK_VERSION	= "osgi_framework_version";
+	private final static String CONNECTION_INTERFACE 	= "connection_interface";
+	private final static String CONNECTION_IP 			= "connection_ip";
+	
+	private String uptime;
+	private String displayName;
+	private String modelName;
+	private	String modelId;
+	private String partNumber;
+	private String serialNumber;
+	private String availableProcessors;
+	private String totalMemory;
+	private String firmwareVersion;
+	private String biosVersion;
+	private String os;
+	private String osVersion;
+	private String osArch;
+	private String jvmName;
+	private String jvmVersion;
+	private String jvmProfile;
+	private String kuraVersion;
+	private String osgiFramework;
+	private String osgiFrameworkVersion;
+	private String connectionInterface;
+	private String connectionIp;
+	private Double latitude;
+    private Double longitude;
+    private Double altitude;
+	
+    /**
+     * Empty constructor for an KuraDeviceProfile.
+     */
+    public KuraDeviceProfile() 
+    {}
+
+    /**
+     * Constructs an KuraDeviceProfile from a Properties object that contains all the parameters 
+     * that make up the profile.  
+     * 
+     * @param props		A Properties object containing all the device parameters.
+     */
+    public KuraDeviceProfile(Properties props) {
+		this(props.getProperty(UPTIME),
+				props.getProperty(DISPLAY_NAME),
+				props.getProperty(MODEL_NAME),
+				props.getProperty(MODEL_ID),
+				props.getProperty(PART_NUMBER),
+				props.getProperty(SERIAL_NUMBER),
+				props.getProperty(FIRMWARE_VERSION),
+				props.getProperty(BIOS_VERSION),
+				props.getProperty(OS),
+				props.getProperty(OS_VERSION),
+				props.getProperty(JVM_NAME),
+				props.getProperty(JVM_VERSION),
+				props.getProperty(JVM_PROFILE),
+				props.getProperty(KURA_VERSION),
+				props.getProperty(CONNECTION_INTERFACE),
+				props.getProperty(CONNECTION_IP),
+				props.getProperty(AVAILABLE_PROCESSORS),
+				props.getProperty(TOTAL_MEMORY),
+				props.getProperty(OS_ARCH),
+				props.getProperty(OSGI_FRAMEWORK),
+				props.getProperty(OSGI_FRAMEWORK_VERSION)
+				);
+	}
+
+    /**
+     * Creates an KuraDeviceProfile using the values of the supplied parameters.  This constructor
+     * also contains values for the GPS location of the device.
+     * 
+     * @param uptime				The length of time the unit has been powered on.
+     * @param displayName			A readable display name for the device.
+     * @param modelName				The device model name.
+     * @param modelId				The device model ID.
+     * @param partNumber			The part number of the device.
+     * @param serialNumber			The serial number of the device.
+     * @param firmwareVersion		The version of firmware running on the device.
+     * @param biosVersion			The version of the BIOS on the device.
+     * @param os					The name of the operating system
+     * @param osVersion				The version of the operating system
+     * @param jvmName				The name of the JVM
+     * @param jvmVersion			The version of the JVM
+     * @param jvmProfile			The profile of the JVM
+     * @param kuraVersion			The Kura version
+     * @param connectionInterface	The name of the interface used to connect to the cloud
+     * @param connectionIp			The IP address of the interface used to connect to the cloud
+     * @param latitude				The latitude of the device's location
+     * @param longitude				The longitude of the device's location
+     * @param altitude				The altitude of the device's location
+     */
+    public KuraDeviceProfile(String uptime, String displayName,
+                            String modelName, String modelId, String partNumber,
+                            String serialNumber, String firmwareVersion, String biosVersion,
+                            String os, String osVersion, String jvmName, String jvmVersion,
+                            String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp,
+                            Double latitude, Double longitude, Double altitude) {
+        this(uptime, displayName,
+             modelName, modelId, partNumber,
+             serialNumber, firmwareVersion, biosVersion,
+             os, osVersion, jvmName, jvmVersion,
+             jvmProfile, kuraVersion, connectionInterface, connectionIp);
+        this.latitude = latitude;
+        this.longitude = longitude;
+        this.altitude = altitude;
+    }
+    
+    /**
+     * Creates an KuraDeviceProfile using the values of the supplied parameters.
+     * 
+     * @param uptime				The length of time the unit has been powered on.
+     * @param displayName			A readable display name for the device.
+     * @param modelName				The device model name.
+     * @param modelId				The device model ID.
+     * @param partNumber			The part number of the device.
+     * @param serialNumber			The serial number of the device.
+     * @param firmwareVersion		The version of firmware running on the device.
+     * @param biosVersion			The version of the BIOS on the device.
+     * @param os					The name of the operating system
+     * @param osVersion				The version of the operating system
+     * @param jvmName				The name of the JVM
+     * @param jvmVersion			The version of the JVM
+     * @param jvmProfile			The profile of the JVM
+     * @param kuraVersion			The Kura version
+     * @param connectionInterface	The name of the interface used to connect to the cloud
+     * @param connectionIp			The IP address of the interface used to connect to the cloud
+     */
+    public KuraDeviceProfile(String uptime, String displayName,
+			String modelName, String modelId, String partNumber,
+			String serialNumber, String firmwareVersion, String biosVersion,
+			String os, String osVersion, String jvmName, String jvmVersion,
+			String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp) {
+		super();
+		this.uptime = uptime;
+		this.displayName = displayName;
+		this.modelName = modelName;
+		this.modelId = modelId;
+		this.partNumber = partNumber;
+		this.serialNumber = serialNumber;
+		this.firmwareVersion = firmwareVersion;
+		this.biosVersion = biosVersion;
+		this.os = os;
+		this.osVersion = osVersion;
+		this.jvmName = jvmName;
+		this.jvmVersion = jvmVersion;
+		this.jvmProfile = jvmProfile;
+		this.kuraVersion = kuraVersion;
+		this.connectionInterface = connectionInterface;
+		this.connectionIp = connectionIp;
+	}
+    
+    /**
+     * Creates an KuraDeviceProfile using the values of the supplied parameters.
+     * 
+     * @param uptime				The length of time the unit has been powered on.
+     * @param displayName			A readable display name for the device.
+     * @param modelName				The device model name.
+     * @param modelId				The device model ID.
+     * @param partNumber			The part number of the device.
+     * @param serialNumber			The serial number of the device.
+     * @param firmwareVersion		The version of firmware running on the device.
+     * @param biosVersion			The version of the BIOS on the device.
+     * @param os					The name of the operating system
+     * @param osVersion				The version of the operating system
+     * @param jvmName				The name of the JVM
+     * @param jvmVersion			The version of the JVM
+     * @param jvmProfile			The profile of the JVM
+     * @param kuraVersion			The Kura version
+     * @param connectionInterface	The name of the interface used to connect to the cloud
+     * @param connectionIp			The IP address of the interface used to connect to the cloud
+     * @param availableProcessors	The number of available processors for the JVM
+     * @param totalMemory			The total memory available for the JVM
+     * @param osArch				The architecture of the JVM (32 or 64)
+     * @param osgiFramework			The OSGI Framework in use
+     * @param osgiFrameworkVersion	The version of the OSGI Framework in use
+     */
+    public KuraDeviceProfile(String uptime, String displayName,
+			String modelName, String modelId, String partNumber,
+			String serialNumber, String firmwareVersion, String biosVersion,
+			String os, String osVersion, String jvmName, String jvmVersion,
+			String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp,
+			String availableProcessors, String totalMemory, String osArch,
+			String osgiFramework, String osgiFrameworkVersion) {
+		super();
+		this.uptime = uptime;
+		this.displayName = displayName;
+		this.modelName = modelName;
+		this.modelId = modelId;
+		this.partNumber = partNumber;
+		this.serialNumber = serialNumber;
+		this.firmwareVersion = firmwareVersion;
+		this.biosVersion = biosVersion;
+		this.os = os;
+		this.osVersion = osVersion;
+		this.jvmName = jvmName;
+		this.jvmVersion = jvmVersion;
+		this.jvmProfile = jvmProfile;
+		this.kuraVersion = kuraVersion;
+		this.connectionInterface = connectionInterface;
+		this.connectionIp = connectionIp;
+		this.setAvailableProcessors(availableProcessors);
+		this.setTotalMemory(totalMemory);
+		this.setOsArch(osArch);
+		this.setOsgiFramework(osgiFramework); 
+		this.setOsgiFrameworkVersion(osgiFrameworkVersion);
+	}
+    
+    /**
+     * Creates an KuraDeviceProfile using the values of the supplied parameters.  This constructor
+     * also contains values for the GPS location of the device.
+     * 
+     * @param uptime				The length of time the unit has been powered on.
+     * @param displayName			A readable display name for the device.
+     * @param modelName				The device model name.
+     * @param modelId				The device model ID.
+     * @param partNumber			The part number of the device.
+     * @param serialNumber			The serial number of the device.
+     * @param firmwareVersion		The version of firmware running on the device.
+     * @param biosVersion			The version of the BIOS on the device.
+     * @param os					The name of the operating system
+     * @param osVersion				The version of the operating system
+     * @param jvmName				The name of the JVM
+     * @param jvmVersion			The version of the JVM
+     * @param jvmProfile			The profile of the JVM
+     * @param kuraVersion			The Kura version
+     * @param connectionInterface	The name of the interface used to connect to the cloud
+     * @param connectionIp			The IP address of the interface used to connect to the cloud
+     * @param latitude				The latitude of the device's location
+     * @param longitude				The longitude of the device's location
+     * @param altitude				The altitude of the device's location
+     */
+    public KuraDeviceProfile(String uptime, String displayName,
+                            String modelName, String modelId, String partNumber,
+                            String serialNumber, String firmwareVersion, String biosVersion,
+                            String os, String osVersion, String jvmName, String jvmVersion,
+                            String jvmProfile, String kuraVersion, String connectionInterface, String connectionIp,
+                            Double latitude, Double longitude, Double altitude,
+                            String availableProcessors, String totalMemory, String osArch,
+                			String osgiFramework, String osgiFrameworkVersion) {
+        this(uptime, displayName,
+             modelName, modelId, partNumber,
+             serialNumber, firmwareVersion, biosVersion,
+             os, osVersion, jvmName, jvmVersion,
+             jvmProfile, kuraVersion, connectionInterface, connectionIp,
+             availableProcessors, totalMemory, osArch,
+             osgiFramework, osgiFrameworkVersion);
+        this.latitude = latitude;
+        this.longitude = longitude;
+        this.altitude = altitude;
+    }
+    
+    /**
+     * Returns The length of time the unit has been powered on.
+     * 
+     * @return	A String representing the length of time the device has been powered on.
+     */
+	public String getUptime() {
+		return uptime;
+	}
+	
+	/**
+	 * Returns the readable display name for the device.
+	 * 
+     * @return	A String representing the readable display name for the device.
+	 */
+	public String getDisplayName() {
+		return displayName;
+	}
+	
+	/**
+	 * Returns the device model name
+	 * 
+     * @return	A String representing the device model name
+	 */
+	public String getModelName() {
+		return modelName;
+	}
+	
+	/**
+	 * Returns the device model ID.
+	 * 
+     * @return	A String representing the device model ID.
+	 */
+	public String getModelId() {
+		return modelId;
+	}
+	
+	/**
+	 * Returns the part number of the device.
+	 * 
+     * @return	A String representing the part number of the device.
+	 */
+	public String getPartNumber() {
+		return partNumber;
+	}
+	
+	/**
+	 * Returns the serial number of the device.
+	 * 
+     * @return	A String representing the serial number of the device.
+	 */
+	public String getSerialNumber() {
+		return serialNumber;
+	}
+	
+	/**
+	 * Returns the version of firmware running on the device.
+	 * 
+     * @return	A String representing the version of firmware running on the device.
+	 */
+	public String getFirmwareVersion() {
+		return firmwareVersion;
+	}
+	
+	/**
+	 * Returns the version of the BIOS on the device.
+	 * 
+     * @return	A String representing the version of the BIOS on the device.
+	 */
+	public String getBiosVersion() {
+		return biosVersion;
+	}
+	
+	/**
+	 * Returns the name of the operating system.
+	 * 
+     * @return	A String representing the name of the operating system.
+	 */
+	public String getOs() {
+		return os;
+	}
+	
+	/**
+	 * Returns the version of the operating system.
+	 * 
+     * @return	A String representing the version of the operating system.
+	 */
+	public String getOsVersion() {
+		return osVersion;
+	}
+	
+	/**
+	 * Returns the name of the JVM.
+	 * 
+     * @return	A String representing the name of the JVM.
+	 */
+	public String getJvmName() {
+		return jvmName;
+	}
+	
+	/**
+	 * Returns the version of the JVM.
+	 * 
+     * @return	A String representing the version of the JVM.
+	 */
+	public String getJvmVersion() {
+		return jvmVersion;
+	}
+	
+	/**
+	 * Returns the profile of the JVM.
+	 * 
+     * @return	A String representing the profile of the JVM.
+	 */
+	public String getJvmProfile() {
+		return jvmProfile;
+	}
+	
+	/**
+	 * Returns the Kura version.
+	 * 
+     * @return	A String representing the Kura version
+	 */
+	public String getKuraVersion() {
+		return kuraVersion;
+	}
+	
+	/**
+	 * Returns the name of the interface used to connect to the cloud.
+	 * 
+     * @return	A String representing the name of the interface used to connect to the cloud.
+	 */
+	public String getConnectionInterface() {
+		return connectionInterface;
+	}
+	
+	/**
+	 * Returns the IP address of the interface used to connect to the cloud.
+	 * 
+     * @return	A String representing the IP address of the interface used to connect to the cloud.
+	 */
+	public String getConnectionIp() {
+		return connectionIp;
+	}
+	
+	/**
+	 * Returns the latitude of the device's location.
+	 * 
+     * @return	A String representing the latitude of the device's location.
+	 */
+	public Double getLatitude() {
+        return latitude;
+    }
+	
+	/**
+	 * Returns the longitude of the device's location.
+	 * 
+     * @return	A String representing the longitude of the device's location.
+	 */
+    public Double getLongitude() {
+        return longitude;
+    }
+	
+	/**
+	 * Returns the altitude of the device's location.
+	 * 
+     * @return	A String representing thealtitude of the device's location.
+	 */
+    public Double getAltitude() {
+        return altitude;
+    }
+
+	/**
+	 * Sets the length of time the unit has been powered on.
+	 * 
+     * @param uptime	A String representing the length of time the unit has been powered on.
+	 */ 
+    public void setUptime(String uptime) {
+        this.uptime = uptime;
+    }
+
+	/**
+	 * Sets the readable display name for the device
+	 * 
+     * @param displayName	A String representing the readable display name for the device
+	 */
+    public void setDisplayName(String displayName) {
+        this.displayName = displayName;
+    }
+
+	/**
+	 * Sets the device model name.
+	 * 
+     * @param modelName	A String representing the device model name.
+	 */
+    public void setModelName(String modelName) {
+        this.modelName = modelName;
+    }
+
+	/**
+	 * Sets the device model ID.
+	 * 
+     * @param modelId	A String representing the device model ID.
+	 */
+    public void setModelId(String modelId) {
+        this.modelId = modelId;
+    }
+
+	/**
+	 * Sets the part number of the device.
+	 * 
+     * @param partNumber	A String representing the part number of the device.
+	 */
+    public void setPartNumber(String partNumber) {
+        this.partNumber = partNumber;
+    }
+
+	/**
+	 * Sets the serial number of the device.
+	 * 
+     * @param serialNumber	A String representing the serial number of the device.
+	 */
+    public void setSerialNumber(String serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+	/**
+	 * Sets the version of firmware running on the device.
+	 * 
+     * @param firmwareVersion	A String representing the version of firmware running on the device.
+	 */
+    public void setFirmwareVersion(String firmwareVersion) {
+        this.firmwareVersion = firmwareVersion;
+    }
+
+	/**
+	 * Sets the version of the BIOS on the device.
+	 * 
+     * @param biosVersion	A String representing the version of the BIOS on the device.
+	 */
+    public void setBiosVersion(String biosVersion) {
+        this.biosVersion = biosVersion;
+    }
+
+	/**
+	 * Sets the name of the operating system.
+	 * 
+     * @param os	A String representing the name of the operating system.
+	 */
+    public void setOs(String os) {
+        this.os = os;
+    }
+
+	/**
+	 * Sets the version of the operating system.
+	 * 
+     * @param osVersion	A String representing the version of the operating system.
+	 */
+    public void setOsVersion(String osVersion) {
+        this.osVersion = osVersion;
+    }
+
+	/**
+	 * Sets the name of the JVM.
+	 * 
+     * @param jvmName	A String representing the name of the JVM.
+	 */
+    public void setJvmName(String jvmName) {
+        this.jvmName = jvmName;
+    }
+
+	/**
+	 * Sets the version of the JVM.
+	 * 
+     * @param jvmVersion	A String representing the version of the JVM.
+	 */
+    public void setJvmVersion(String jvmVersion) {
+        this.jvmVersion = jvmVersion;
+    }
+
+	/**
+	 * Sets the profile of the JVM.
+	 * 
+     * @param jvmProfile	A String representing the profile of the JVM.
+	 */
+    public void setJvmProfile(String jvmProfile) {
+        this.jvmProfile = jvmProfile;
+    }
+
+	/**
+	 * Sets the name of the interface used to connect to the cloud.
+	 * 
+     * @param connectionInterface	A String representing the name of the interface used to connect to the cloud.
+	 */
+    public void setConnectionInterface(String connectionInterface) {
+        this.connectionInterface = connectionInterface;
+    }
+
+	/**
+	 * Sets the IP address of the interface used to connect to the cloud.
+	 * 
+     * @param connectionIp	A String representing the IP address of the interface used to connect to the cloud.
+	 */
+    public void setConnectionIp(String connectionIp) {
+        this.connectionIp = connectionIp;
+    }
+
+	/**
+	 * Sets the latitude of the device's location.
+	 * 
+     * @param latitude	A String representing the latitude of the device's location.
+	 */
+    public void setLatitude(Double latitude) {
+        this.latitude = latitude;
+    }
+
+	/**
+	 * Sets the longitude of the device's location.
+	 * 
+     * @param longitude	A String representing the  longitude of the device's location.
+	 */
+    public void setLongitude(Double longitude) {
+        this.longitude = longitude;
+    }
+
+	/**
+	 * Sets the altitude of the device's location.
+	 * 
+     * @param altitude	A String representing the  altitude of the device's location.
+	 */
+    public void setAltitude(Double altitude) {
+        this.altitude = altitude;
+    }
+
+	public String getAvailableProcessors() {
+		return availableProcessors;
+	}
+
+	public void setAvailableProcessors(String availableProcessors) {
+		this.availableProcessors = availableProcessors;
+	}
+
+	public String getTotalMemory() {
+		return totalMemory;
+	}
+
+	public void setTotalMemory(String totalMemory) {
+		this.totalMemory = totalMemory;
+	}
+
+	public String getOsArch() {
+		return osArch;
+	}
+
+	public void setOsArch(String osArch) {
+		this.osArch = osArch;
+	}
+
+	public String getOsgiFramework() {
+		return osgiFramework;
+	}
+
+	public void setOsgiFramework(String osgiFramework) {
+		this.osgiFramework = osgiFramework;
+	}
+
+	public String getOsgiFrameworkVersion() {
+		return osgiFrameworkVersion;
+	}
+
+	public void setOsgiFrameworkVersion(String osgiFrameworkVersion) {
+		this.osgiFrameworkVersion = osgiFrameworkVersion;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraDisconnectPayload.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraDisconnectPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..915262948917a0357c9179e2768b4d1dc8692b86
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/KuraDisconnectPayload.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.message;
+
+import java.util.Iterator;
+
+import org.eclipse.kura.message.KuraPayload;
+
+public class KuraDisconnectPayload extends KuraPayload 
+{
+	private final static String UPTIME = "uptime";
+	private final static String DISPLAY_NAME = "display_name";
+	
+	
+	public KuraDisconnectPayload(String uptime, String displayName) {
+		super();
+		
+		addMetric(UPTIME, uptime);
+		addMetric(DISPLAY_NAME, displayName);
+	}
+	
+	public KuraDisconnectPayload(KuraPayload KuraMessage) 
+	{
+		Iterator<String> hdrIterator = KuraMessage.metricsIterator();		
+		while (hdrIterator.hasNext()) {
+			String hdrName = hdrIterator.next();
+			String hdrVal = (String)KuraMessage.getMetric(hdrName);			
+			addMetric(hdrName, hdrVal);
+		}		
+		setBody(KuraMessage.getBody());
+	}
+	
+	public String getUptime() {
+		return (String) getMetric(UPTIME);
+	}
+	public String getDisplayName() {
+		return (String) getMetric(DISPLAY_NAME);
+	}
+	
+	@Override
+	public String toString() {
+		return "KuraBirthMessage [getUptime()=" + getUptime() + ", getDisplayName()=" + getDisplayName() + "]";
+	}
+}
diff --git a/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/protobuf/KuraPayloadProto.java b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/protobuf/KuraPayloadProto.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e97309ce7af542bf422ab5d209891f9aa365098
--- /dev/null
+++ b/kura/org.eclipse.kura.core.cloud/src/main/java/org/eclipse/kura/core/message/protobuf/KuraPayloadProto.java
@@ -0,0 +1,2749 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: kurapayload.proto
+
+package org.eclipse.kura.core.message.protobuf;
+
+public final class KuraPayloadProto {
+  private KuraPayloadProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface KuraPayloadOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<KuraPayload> {
+    
+    // optional int64 timestamp = 1;
+    boolean hasTimestamp();
+    long getTimestamp();
+    
+    // optional .kuradatatypes.KuraPayload.KuraPosition position = 2;
+    boolean hasPosition();
+    org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition getPosition();
+    org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder getPositionOrBuilder();
+    
+    // repeated .kuradatatypes.KuraPayload.KuraMetric metric = 5000;
+    java.util.List<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric> 
+        getMetricList();
+    org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric getMetric(int index);
+    int getMetricCount();
+    java.util.List<? extends org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder> 
+        getMetricOrBuilderList();
+    org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder getMetricOrBuilder(
+        int index);
+    
+    // optional bytes body = 5001;
+    boolean hasBody();
+    com.google.protobuf.ByteString getBody();
+  }
+  public static final class KuraPayload extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        KuraPayload> implements KuraPayloadOrBuilder {
+    // Use KuraPayload.newBuilder() to construct.
+    private KuraPayload(Builder builder) {
+      super(builder);
+    }
+    private KuraPayload(boolean noInit) {}
+    
+    private static final KuraPayload defaultInstance;
+    public static KuraPayload getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public KuraPayload getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_fieldAccessorTable;
+    }
+    
+    public interface KuraMetricOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // required .kuradatatypes.KuraPayload.KuraMetric.ValueType type = 2;
+      boolean hasType();
+      org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType getType();
+      
+      // optional double double_value = 3;
+      boolean hasDoubleValue();
+      double getDoubleValue();
+      
+      // optional float float_value = 4;
+      boolean hasFloatValue();
+      float getFloatValue();
+      
+      // optional int64 long_value = 5;
+      boolean hasLongValue();
+      long getLongValue();
+      
+      // optional int32 int_value = 6;
+      boolean hasIntValue();
+      int getIntValue();
+      
+      // optional bool bool_value = 7;
+      boolean hasBoolValue();
+      boolean getBoolValue();
+      
+      // optional string string_value = 8;
+      boolean hasStringValue();
+      String getStringValue();
+      
+      // optional bytes bytes_value = 9;
+      boolean hasBytesValue();
+      com.google.protobuf.ByteString getBytesValue();
+    }
+    public static final class KuraMetric extends
+        com.google.protobuf.GeneratedMessage
+        implements KuraMetricOrBuilder {
+      // Use KuraMetric.newBuilder() to construct.
+      private KuraMetric(Builder builder) {
+        super(builder);
+      }
+      private KuraMetric(boolean noInit) {}
+      
+      private static final KuraMetric defaultInstance;
+      public static KuraMetric getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public KuraMetric getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraMetric_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraMetric_fieldAccessorTable;
+      }
+      
+      public enum ValueType
+          implements com.google.protobuf.ProtocolMessageEnum {
+        DOUBLE(0, 0),
+        FLOAT(1, 1),
+        INT64(2, 2),
+        INT32(3, 3),
+        BOOL(4, 4),
+        STRING(5, 5),
+        BYTES(6, 6),
+        ;
+        
+        public static final int DOUBLE_VALUE = 0;
+        public static final int FLOAT_VALUE = 1;
+        public static final int INT64_VALUE = 2;
+        public static final int INT32_VALUE = 3;
+        public static final int BOOL_VALUE = 4;
+        public static final int STRING_VALUE = 5;
+        public static final int BYTES_VALUE = 6;
+        
+        
+        public final int getNumber() { return value; }
+        
+        public static ValueType valueOf(int value) {
+          switch (value) {
+            case 0: return DOUBLE;
+            case 1: return FLOAT;
+            case 2: return INT64;
+            case 3: return INT32;
+            case 4: return BOOL;
+            case 5: return STRING;
+            case 6: return BYTES;
+            default: return null;
+          }
+        }
+        
+        public static com.google.protobuf.Internal.EnumLiteMap<ValueType>
+            internalGetValueMap() {
+          return internalValueMap;
+        }
+        private static com.google.protobuf.Internal.EnumLiteMap<ValueType>
+            internalValueMap =
+              new com.google.protobuf.Internal.EnumLiteMap<ValueType>() {
+                public ValueType findValueByNumber(int number) {
+                  return ValueType.valueOf(number);
+                }
+              };
+        
+        public final com.google.protobuf.Descriptors.EnumValueDescriptor
+            getValueDescriptor() {
+          return getDescriptor().getValues().get(index);
+        }
+        public final com.google.protobuf.Descriptors.EnumDescriptor
+            getDescriptorForType() {
+          return getDescriptor();
+        }
+        public static final com.google.protobuf.Descriptors.EnumDescriptor
+            getDescriptor() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.getDescriptor().getEnumTypes().get(0);
+        }
+        
+        private static final ValueType[] VALUES = {
+          DOUBLE, FLOAT, INT64, INT32, BOOL, STRING, BYTES, 
+        };
+        
+        public static ValueType valueOf(
+            com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+          if (desc.getType() != getDescriptor()) {
+            throw new java.lang.IllegalArgumentException(
+              "EnumValueDescriptor is not for this type.");
+          }
+          return VALUES[desc.getIndex()];
+        }
+        
+        private final int index;
+        private final int value;
+        
+        private ValueType(int index, int value) {
+          this.index = index;
+          this.value = value;
+        }
+        
+        // @@protoc_insertion_point(enum_scope:kuradatatypes.KuraPayload.KuraMetric.ValueType)
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // required .kuradatatypes.KuraPayload.KuraMetric.ValueType type = 2;
+      public static final int TYPE_FIELD_NUMBER = 2;
+      private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType type_;
+      public boolean hasType() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType getType() {
+        return type_;
+      }
+      
+      // optional double double_value = 3;
+      public static final int DOUBLE_VALUE_FIELD_NUMBER = 3;
+      private double doubleValue_;
+      public boolean hasDoubleValue() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public double getDoubleValue() {
+        return doubleValue_;
+      }
+      
+      // optional float float_value = 4;
+      public static final int FLOAT_VALUE_FIELD_NUMBER = 4;
+      private float floatValue_;
+      public boolean hasFloatValue() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public float getFloatValue() {
+        return floatValue_;
+      }
+      
+      // optional int64 long_value = 5;
+      public static final int LONG_VALUE_FIELD_NUMBER = 5;
+      private long longValue_;
+      public boolean hasLongValue() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      public long getLongValue() {
+        return longValue_;
+      }
+      
+      // optional int32 int_value = 6;
+      public static final int INT_VALUE_FIELD_NUMBER = 6;
+      private int intValue_;
+      public boolean hasIntValue() {
+        return ((bitField0_ & 0x00000020) == 0x00000020);
+      }
+      public int getIntValue() {
+        return intValue_;
+      }
+      
+      // optional bool bool_value = 7;
+      public static final int BOOL_VALUE_FIELD_NUMBER = 7;
+      private boolean boolValue_;
+      public boolean hasBoolValue() {
+        return ((bitField0_ & 0x00000040) == 0x00000040);
+      }
+      public boolean getBoolValue() {
+        return boolValue_;
+      }
+      
+      // optional string string_value = 8;
+      public static final int STRING_VALUE_FIELD_NUMBER = 8;
+      private java.lang.Object stringValue_;
+      public boolean hasStringValue() {
+        return ((bitField0_ & 0x00000080) == 0x00000080);
+      }
+      public String getStringValue() {
+        java.lang.Object ref = stringValue_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            stringValue_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getStringValueBytes() {
+        java.lang.Object ref = stringValue_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          stringValue_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // optional bytes bytes_value = 9;
+      public static final int BYTES_VALUE_FIELD_NUMBER = 9;
+      private com.google.protobuf.ByteString bytesValue_;
+      public boolean hasBytesValue() {
+        return ((bitField0_ & 0x00000100) == 0x00000100);
+      }
+      public com.google.protobuf.ByteString getBytesValue() {
+        return bytesValue_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        type_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType.DOUBLE;
+        doubleValue_ = 0D;
+        floatValue_ = 0F;
+        longValue_ = 0L;
+        intValue_ = 0;
+        boolValue_ = false;
+        stringValue_ = "";
+        bytesValue_ = com.google.protobuf.ByteString.EMPTY;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        if (!hasType()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeEnum(2, type_.getNumber());
+        }
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          output.writeDouble(3, doubleValue_);
+        }
+        if (((bitField0_ & 0x00000008) == 0x00000008)) {
+          output.writeFloat(4, floatValue_);
+        }
+        if (((bitField0_ & 0x00000010) == 0x00000010)) {
+          output.writeInt64(5, longValue_);
+        }
+        if (((bitField0_ & 0x00000020) == 0x00000020)) {
+          output.writeInt32(6, intValue_);
+        }
+        if (((bitField0_ & 0x00000040) == 0x00000040)) {
+          output.writeBool(7, boolValue_);
+        }
+        if (((bitField0_ & 0x00000080) == 0x00000080)) {
+          output.writeBytes(8, getStringValueBytes());
+        }
+        if (((bitField0_ & 0x00000100) == 0x00000100)) {
+          output.writeBytes(9, bytesValue_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(2, type_.getNumber());
+        }
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(3, doubleValue_);
+        }
+        if (((bitField0_ & 0x00000008) == 0x00000008)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeFloatSize(4, floatValue_);
+        }
+        if (((bitField0_ & 0x00000010) == 0x00000010)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt64Size(5, longValue_);
+        }
+        if (((bitField0_ & 0x00000020) == 0x00000020)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(6, intValue_);
+        }
+        if (((bitField0_ & 0x00000040) == 0x00000040)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBoolSize(7, boolValue_);
+        }
+        if (((bitField0_ & 0x00000080) == 0x00000080)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(8, getStringValueBytes());
+        }
+        if (((bitField0_ & 0x00000100) == 0x00000100)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(9, bytesValue_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraMetric_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraMetric_fieldAccessorTable;
+        }
+        
+        // Construct using org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          type_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType.DOUBLE;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          doubleValue_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000004);
+          floatValue_ = 0F;
+          bitField0_ = (bitField0_ & ~0x00000008);
+          longValue_ = 0L;
+          bitField0_ = (bitField0_ & ~0x00000010);
+          intValue_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000020);
+          boolValue_ = false;
+          bitField0_ = (bitField0_ & ~0x00000040);
+          stringValue_ = "";
+          bitField0_ = (bitField0_ & ~0x00000080);
+          bytesValue_ = com.google.protobuf.ByteString.EMPTY;
+          bitField0_ = (bitField0_ & ~0x00000100);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.getDescriptor();
+        }
+        
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric getDefaultInstanceForType() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.getDefaultInstance();
+        }
+        
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric build() {
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric buildPartial() {
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric result = new org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.type_ = type_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000004;
+          }
+          result.doubleValue_ = doubleValue_;
+          if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+            to_bitField0_ |= 0x00000008;
+          }
+          result.floatValue_ = floatValue_;
+          if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+            to_bitField0_ |= 0x00000010;
+          }
+          result.longValue_ = longValue_;
+          if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+            to_bitField0_ |= 0x00000020;
+          }
+          result.intValue_ = intValue_;
+          if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+            to_bitField0_ |= 0x00000040;
+          }
+          result.boolValue_ = boolValue_;
+          if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+            to_bitField0_ |= 0x00000080;
+          }
+          result.stringValue_ = stringValue_;
+          if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
+            to_bitField0_ |= 0x00000100;
+          }
+          result.bytesValue_ = bytesValue_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric) {
+            return mergeFrom((org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric other) {
+          if (other == org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (other.hasType()) {
+            setType(other.getType());
+          }
+          if (other.hasDoubleValue()) {
+            setDoubleValue(other.getDoubleValue());
+          }
+          if (other.hasFloatValue()) {
+            setFloatValue(other.getFloatValue());
+          }
+          if (other.hasLongValue()) {
+            setLongValue(other.getLongValue());
+          }
+          if (other.hasIntValue()) {
+            setIntValue(other.getIntValue());
+          }
+          if (other.hasBoolValue()) {
+            setBoolValue(other.getBoolValue());
+          }
+          if (other.hasStringValue()) {
+            setStringValue(other.getStringValue());
+          }
+          if (other.hasBytesValue()) {
+            setBytesValue(other.getBytesValue());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          if (!hasType()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 16: {
+                int rawValue = input.readEnum();
+                org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType value = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType.valueOf(rawValue);
+                if (value == null) {
+                  unknownFields.mergeVarintField(2, rawValue);
+                } else {
+                  bitField0_ |= 0x00000002;
+                  type_ = value;
+                }
+                break;
+              }
+              case 25: {
+                bitField0_ |= 0x00000004;
+                doubleValue_ = input.readDouble();
+                break;
+              }
+              case 37: {
+                bitField0_ |= 0x00000008;
+                floatValue_ = input.readFloat();
+                break;
+              }
+              case 40: {
+                bitField0_ |= 0x00000010;
+                longValue_ = input.readInt64();
+                break;
+              }
+              case 48: {
+                bitField0_ |= 0x00000020;
+                intValue_ = input.readInt32();
+                break;
+              }
+              case 56: {
+                bitField0_ |= 0x00000040;
+                boolValue_ = input.readBool();
+                break;
+              }
+              case 66: {
+                bitField0_ |= 0x00000080;
+                stringValue_ = input.readBytes();
+                break;
+              }
+              case 74: {
+                bitField0_ |= 0x00000100;
+                bytesValue_ = input.readBytes();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // required .kuradatatypes.KuraPayload.KuraMetric.ValueType type = 2;
+        private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType type_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType.DOUBLE;
+        public boolean hasType() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType getType() {
+          return type_;
+        }
+        public Builder setType(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          bitField0_ |= 0x00000002;
+          type_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearType() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          type_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.ValueType.DOUBLE;
+          onChanged();
+          return this;
+        }
+        
+        // optional double double_value = 3;
+        private double doubleValue_ ;
+        public boolean hasDoubleValue() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        public double getDoubleValue() {
+          return doubleValue_;
+        }
+        public Builder setDoubleValue(double value) {
+          bitField0_ |= 0x00000004;
+          doubleValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearDoubleValue() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          doubleValue_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // optional float float_value = 4;
+        private float floatValue_ ;
+        public boolean hasFloatValue() {
+          return ((bitField0_ & 0x00000008) == 0x00000008);
+        }
+        public float getFloatValue() {
+          return floatValue_;
+        }
+        public Builder setFloatValue(float value) {
+          bitField0_ |= 0x00000008;
+          floatValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearFloatValue() {
+          bitField0_ = (bitField0_ & ~0x00000008);
+          floatValue_ = 0F;
+          onChanged();
+          return this;
+        }
+        
+        // optional int64 long_value = 5;
+        private long longValue_ ;
+        public boolean hasLongValue() {
+          return ((bitField0_ & 0x00000010) == 0x00000010);
+        }
+        public long getLongValue() {
+          return longValue_;
+        }
+        public Builder setLongValue(long value) {
+          bitField0_ |= 0x00000010;
+          longValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLongValue() {
+          bitField0_ = (bitField0_ & ~0x00000010);
+          longValue_ = 0L;
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 int_value = 6;
+        private int intValue_ ;
+        public boolean hasIntValue() {
+          return ((bitField0_ & 0x00000020) == 0x00000020);
+        }
+        public int getIntValue() {
+          return intValue_;
+        }
+        public Builder setIntValue(int value) {
+          bitField0_ |= 0x00000020;
+          intValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearIntValue() {
+          bitField0_ = (bitField0_ & ~0x00000020);
+          intValue_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // optional bool bool_value = 7;
+        private boolean boolValue_ ;
+        public boolean hasBoolValue() {
+          return ((bitField0_ & 0x00000040) == 0x00000040);
+        }
+        public boolean getBoolValue() {
+          return boolValue_;
+        }
+        public Builder setBoolValue(boolean value) {
+          bitField0_ |= 0x00000040;
+          boolValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearBoolValue() {
+          bitField0_ = (bitField0_ & ~0x00000040);
+          boolValue_ = false;
+          onChanged();
+          return this;
+        }
+        
+        // optional string string_value = 8;
+        private java.lang.Object stringValue_ = "";
+        public boolean hasStringValue() {
+          return ((bitField0_ & 0x00000080) == 0x00000080);
+        }
+        public String getStringValue() {
+          java.lang.Object ref = stringValue_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            stringValue_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setStringValue(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000080;
+          stringValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearStringValue() {
+          bitField0_ = (bitField0_ & ~0x00000080);
+          stringValue_ = getDefaultInstance().getStringValue();
+          onChanged();
+          return this;
+        }
+        void setStringValue(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000080;
+          stringValue_ = value;
+          onChanged();
+        }
+        
+        // optional bytes bytes_value = 9;
+        private com.google.protobuf.ByteString bytesValue_ = com.google.protobuf.ByteString.EMPTY;
+        public boolean hasBytesValue() {
+          return ((bitField0_ & 0x00000100) == 0x00000100);
+        }
+        public com.google.protobuf.ByteString getBytesValue() {
+          return bytesValue_;
+        }
+        public Builder setBytesValue(com.google.protobuf.ByteString value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000100;
+          bytesValue_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearBytesValue() {
+          bitField0_ = (bitField0_ & ~0x00000100);
+          bytesValue_ = getDefaultInstance().getBytesValue();
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:kuradatatypes.KuraPayload.KuraMetric)
+      }
+      
+      static {
+        defaultInstance = new KuraMetric(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:kuradatatypes.KuraPayload.KuraMetric)
+    }
+    
+    public interface KuraPositionOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required double latitude = 1;
+      boolean hasLatitude();
+      double getLatitude();
+      
+      // required double longitude = 2;
+      boolean hasLongitude();
+      double getLongitude();
+      
+      // optional double altitude = 3;
+      boolean hasAltitude();
+      double getAltitude();
+      
+      // optional double precision = 4;
+      boolean hasPrecision();
+      double getPrecision();
+      
+      // optional double heading = 5;
+      boolean hasHeading();
+      double getHeading();
+      
+      // optional double speed = 6;
+      boolean hasSpeed();
+      double getSpeed();
+      
+      // optional int64 timestamp = 7;
+      boolean hasTimestamp();
+      long getTimestamp();
+      
+      // optional int32 satellites = 8;
+      boolean hasSatellites();
+      int getSatellites();
+      
+      // optional int32 status = 9;
+      boolean hasStatus();
+      int getStatus();
+    }
+    public static final class KuraPosition extends
+        com.google.protobuf.GeneratedMessage
+        implements KuraPositionOrBuilder {
+      // Use KuraPosition.newBuilder() to construct.
+      private KuraPosition(Builder builder) {
+        super(builder);
+      }
+      private KuraPosition(boolean noInit) {}
+      
+      private static final KuraPosition defaultInstance;
+      public static KuraPosition getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public KuraPosition getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraPosition_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraPosition_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required double latitude = 1;
+      public static final int LATITUDE_FIELD_NUMBER = 1;
+      private double latitude_;
+      public boolean hasLatitude() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public double getLatitude() {
+        return latitude_;
+      }
+      
+      // required double longitude = 2;
+      public static final int LONGITUDE_FIELD_NUMBER = 2;
+      private double longitude_;
+      public boolean hasLongitude() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public double getLongitude() {
+        return longitude_;
+      }
+      
+      // optional double altitude = 3;
+      public static final int ALTITUDE_FIELD_NUMBER = 3;
+      private double altitude_;
+      public boolean hasAltitude() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public double getAltitude() {
+        return altitude_;
+      }
+      
+      // optional double precision = 4;
+      public static final int PRECISION_FIELD_NUMBER = 4;
+      private double precision_;
+      public boolean hasPrecision() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public double getPrecision() {
+        return precision_;
+      }
+      
+      // optional double heading = 5;
+      public static final int HEADING_FIELD_NUMBER = 5;
+      private double heading_;
+      public boolean hasHeading() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      public double getHeading() {
+        return heading_;
+      }
+      
+      // optional double speed = 6;
+      public static final int SPEED_FIELD_NUMBER = 6;
+      private double speed_;
+      public boolean hasSpeed() {
+        return ((bitField0_ & 0x00000020) == 0x00000020);
+      }
+      public double getSpeed() {
+        return speed_;
+      }
+      
+      // optional int64 timestamp = 7;
+      public static final int TIMESTAMP_FIELD_NUMBER = 7;
+      private long timestamp_;
+      public boolean hasTimestamp() {
+        return ((bitField0_ & 0x00000040) == 0x00000040);
+      }
+      public long getTimestamp() {
+        return timestamp_;
+      }
+      
+      // optional int32 satellites = 8;
+      public static final int SATELLITES_FIELD_NUMBER = 8;
+      private int satellites_;
+      public boolean hasSatellites() {
+        return ((bitField0_ & 0x00000080) == 0x00000080);
+      }
+      public int getSatellites() {
+        return satellites_;
+      }
+      
+      // optional int32 status = 9;
+      public static final int STATUS_FIELD_NUMBER = 9;
+      private int status_;
+      public boolean hasStatus() {
+        return ((bitField0_ & 0x00000100) == 0x00000100);
+      }
+      public int getStatus() {
+        return status_;
+      }
+      
+      private void initFields() {
+        latitude_ = 0D;
+        longitude_ = 0D;
+        altitude_ = 0D;
+        precision_ = 0D;
+        heading_ = 0D;
+        speed_ = 0D;
+        timestamp_ = 0L;
+        satellites_ = 0;
+        status_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasLatitude()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        if (!hasLongitude()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeDouble(1, latitude_);
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeDouble(2, longitude_);
+        }
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          output.writeDouble(3, altitude_);
+        }
+        if (((bitField0_ & 0x00000008) == 0x00000008)) {
+          output.writeDouble(4, precision_);
+        }
+        if (((bitField0_ & 0x00000010) == 0x00000010)) {
+          output.writeDouble(5, heading_);
+        }
+        if (((bitField0_ & 0x00000020) == 0x00000020)) {
+          output.writeDouble(6, speed_);
+        }
+        if (((bitField0_ & 0x00000040) == 0x00000040)) {
+          output.writeInt64(7, timestamp_);
+        }
+        if (((bitField0_ & 0x00000080) == 0x00000080)) {
+          output.writeInt32(8, satellites_);
+        }
+        if (((bitField0_ & 0x00000100) == 0x00000100)) {
+          output.writeInt32(9, status_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(1, latitude_);
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(2, longitude_);
+        }
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(3, altitude_);
+        }
+        if (((bitField0_ & 0x00000008) == 0x00000008)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(4, precision_);
+        }
+        if (((bitField0_ & 0x00000010) == 0x00000010)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(5, heading_);
+        }
+        if (((bitField0_ & 0x00000020) == 0x00000020)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(6, speed_);
+        }
+        if (((bitField0_ & 0x00000040) == 0x00000040)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt64Size(7, timestamp_);
+        }
+        if (((bitField0_ & 0x00000080) == 0x00000080)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(8, satellites_);
+        }
+        if (((bitField0_ & 0x00000100) == 0x00000100)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(9, status_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraPosition_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_KuraPosition_fieldAccessorTable;
+        }
+        
+        // Construct using org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          latitude_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000001);
+          longitude_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          altitude_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000004);
+          precision_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000008);
+          heading_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000010);
+          speed_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000020);
+          timestamp_ = 0L;
+          bitField0_ = (bitField0_ & ~0x00000040);
+          satellites_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000080);
+          status_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000100);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDescriptor();
+        }
+        
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition getDefaultInstanceForType() {
+          return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance();
+        }
+        
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition build() {
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition buildPartial() {
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition result = new org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.latitude_ = latitude_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.longitude_ = longitude_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000004;
+          }
+          result.altitude_ = altitude_;
+          if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+            to_bitField0_ |= 0x00000008;
+          }
+          result.precision_ = precision_;
+          if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+            to_bitField0_ |= 0x00000010;
+          }
+          result.heading_ = heading_;
+          if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+            to_bitField0_ |= 0x00000020;
+          }
+          result.speed_ = speed_;
+          if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+            to_bitField0_ |= 0x00000040;
+          }
+          result.timestamp_ = timestamp_;
+          if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+            to_bitField0_ |= 0x00000080;
+          }
+          result.satellites_ = satellites_;
+          if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
+            to_bitField0_ |= 0x00000100;
+          }
+          result.status_ = status_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition) {
+            return mergeFrom((org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition other) {
+          if (other == org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance()) return this;
+          if (other.hasLatitude()) {
+            setLatitude(other.getLatitude());
+          }
+          if (other.hasLongitude()) {
+            setLongitude(other.getLongitude());
+          }
+          if (other.hasAltitude()) {
+            setAltitude(other.getAltitude());
+          }
+          if (other.hasPrecision()) {
+            setPrecision(other.getPrecision());
+          }
+          if (other.hasHeading()) {
+            setHeading(other.getHeading());
+          }
+          if (other.hasSpeed()) {
+            setSpeed(other.getSpeed());
+          }
+          if (other.hasTimestamp()) {
+            setTimestamp(other.getTimestamp());
+          }
+          if (other.hasSatellites()) {
+            setSatellites(other.getSatellites());
+          }
+          if (other.hasStatus()) {
+            setStatus(other.getStatus());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasLatitude()) {
+            
+            return false;
+          }
+          if (!hasLongitude()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 9: {
+                bitField0_ |= 0x00000001;
+                latitude_ = input.readDouble();
+                break;
+              }
+              case 17: {
+                bitField0_ |= 0x00000002;
+                longitude_ = input.readDouble();
+                break;
+              }
+              case 25: {
+                bitField0_ |= 0x00000004;
+                altitude_ = input.readDouble();
+                break;
+              }
+              case 33: {
+                bitField0_ |= 0x00000008;
+                precision_ = input.readDouble();
+                break;
+              }
+              case 41: {
+                bitField0_ |= 0x00000010;
+                heading_ = input.readDouble();
+                break;
+              }
+              case 49: {
+                bitField0_ |= 0x00000020;
+                speed_ = input.readDouble();
+                break;
+              }
+              case 56: {
+                bitField0_ |= 0x00000040;
+                timestamp_ = input.readInt64();
+                break;
+              }
+              case 64: {
+                bitField0_ |= 0x00000080;
+                satellites_ = input.readInt32();
+                break;
+              }
+              case 72: {
+                bitField0_ |= 0x00000100;
+                status_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required double latitude = 1;
+        private double latitude_ ;
+        public boolean hasLatitude() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public double getLatitude() {
+          return latitude_;
+        }
+        public Builder setLatitude(double value) {
+          bitField0_ |= 0x00000001;
+          latitude_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLatitude() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          latitude_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // required double longitude = 2;
+        private double longitude_ ;
+        public boolean hasLongitude() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public double getLongitude() {
+          return longitude_;
+        }
+        public Builder setLongitude(double value) {
+          bitField0_ |= 0x00000002;
+          longitude_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLongitude() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          longitude_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // optional double altitude = 3;
+        private double altitude_ ;
+        public boolean hasAltitude() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        public double getAltitude() {
+          return altitude_;
+        }
+        public Builder setAltitude(double value) {
+          bitField0_ |= 0x00000004;
+          altitude_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearAltitude() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          altitude_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // optional double precision = 4;
+        private double precision_ ;
+        public boolean hasPrecision() {
+          return ((bitField0_ & 0x00000008) == 0x00000008);
+        }
+        public double getPrecision() {
+          return precision_;
+        }
+        public Builder setPrecision(double value) {
+          bitField0_ |= 0x00000008;
+          precision_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearPrecision() {
+          bitField0_ = (bitField0_ & ~0x00000008);
+          precision_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // optional double heading = 5;
+        private double heading_ ;
+        public boolean hasHeading() {
+          return ((bitField0_ & 0x00000010) == 0x00000010);
+        }
+        public double getHeading() {
+          return heading_;
+        }
+        public Builder setHeading(double value) {
+          bitField0_ |= 0x00000010;
+          heading_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearHeading() {
+          bitField0_ = (bitField0_ & ~0x00000010);
+          heading_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // optional double speed = 6;
+        private double speed_ ;
+        public boolean hasSpeed() {
+          return ((bitField0_ & 0x00000020) == 0x00000020);
+        }
+        public double getSpeed() {
+          return speed_;
+        }
+        public Builder setSpeed(double value) {
+          bitField0_ |= 0x00000020;
+          speed_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearSpeed() {
+          bitField0_ = (bitField0_ & ~0x00000020);
+          speed_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // optional int64 timestamp = 7;
+        private long timestamp_ ;
+        public boolean hasTimestamp() {
+          return ((bitField0_ & 0x00000040) == 0x00000040);
+        }
+        public long getTimestamp() {
+          return timestamp_;
+        }
+        public Builder setTimestamp(long value) {
+          bitField0_ |= 0x00000040;
+          timestamp_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearTimestamp() {
+          bitField0_ = (bitField0_ & ~0x00000040);
+          timestamp_ = 0L;
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 satellites = 8;
+        private int satellites_ ;
+        public boolean hasSatellites() {
+          return ((bitField0_ & 0x00000080) == 0x00000080);
+        }
+        public int getSatellites() {
+          return satellites_;
+        }
+        public Builder setSatellites(int value) {
+          bitField0_ |= 0x00000080;
+          satellites_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearSatellites() {
+          bitField0_ = (bitField0_ & ~0x00000080);
+          satellites_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 status = 9;
+        private int status_ ;
+        public boolean hasStatus() {
+          return ((bitField0_ & 0x00000100) == 0x00000100);
+        }
+        public int getStatus() {
+          return status_;
+        }
+        public Builder setStatus(int value) {
+          bitField0_ |= 0x00000100;
+          status_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearStatus() {
+          bitField0_ = (bitField0_ & ~0x00000100);
+          status_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:kuradatatypes.KuraPayload.KuraPosition)
+      }
+      
+      static {
+        defaultInstance = new KuraPosition(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:kuradatatypes.KuraPayload.KuraPosition)
+    }
+    
+    private int bitField0_;
+    // optional int64 timestamp = 1;
+    public static final int TIMESTAMP_FIELD_NUMBER = 1;
+    private long timestamp_;
+    public boolean hasTimestamp() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public long getTimestamp() {
+      return timestamp_;
+    }
+    
+    // optional .kuradatatypes.KuraPayload.KuraPosition position = 2;
+    public static final int POSITION_FIELD_NUMBER = 2;
+    private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition position_;
+    public boolean hasPosition() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition getPosition() {
+      return position_;
+    }
+    public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder getPositionOrBuilder() {
+      return position_;
+    }
+    
+    // repeated .kuradatatypes.KuraPayload.KuraMetric metric = 5000;
+    public static final int METRIC_FIELD_NUMBER = 5000;
+    private java.util.List<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric> metric_;
+    public java.util.List<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric> getMetricList() {
+      return metric_;
+    }
+    public java.util.List<? extends org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder> 
+        getMetricOrBuilderList() {
+      return metric_;
+    }
+    public int getMetricCount() {
+      return metric_.size();
+    }
+    public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric getMetric(int index) {
+      return metric_.get(index);
+    }
+    public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder getMetricOrBuilder(
+        int index) {
+      return metric_.get(index);
+    }
+    
+    // optional bytes body = 5001;
+    public static final int BODY_FIELD_NUMBER = 5001;
+    private com.google.protobuf.ByteString body_;
+    public boolean hasBody() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public com.google.protobuf.ByteString getBody() {
+      return body_;
+    }
+    
+    private void initFields() {
+      timestamp_ = 0L;
+      position_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance();
+      metric_ = java.util.Collections.emptyList();
+      body_ = com.google.protobuf.ByteString.EMPTY;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (hasPosition()) {
+        if (!getPosition().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getMetricCount(); i++) {
+        if (!getMetric(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeInt64(1, timestamp_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeMessage(2, position_);
+      }
+      extensionWriter.writeUntil(5000, output);
+      for (int i = 0; i < metric_.size(); i++) {
+        output.writeMessage(5000, metric_.get(i));
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeBytes(5001, body_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt64Size(1, timestamp_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, position_);
+      }
+      for (int i = 0; i < metric_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5000, metric_.get(i));
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(5001, body_);
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload, Builder> implements org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayloadOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.internal_static_kuradatatypes_KuraPayload_fieldAccessorTable;
+      }
+      
+      // Construct using org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getPositionFieldBuilder();
+          getMetricFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        timestamp_ = 0L;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (positionBuilder_ == null) {
+          position_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance();
+        } else {
+          positionBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000002);
+        if (metricBuilder_ == null) {
+          metric_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          metricBuilder_.clear();
+        }
+        body_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000008);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.getDescriptor();
+      }
+      
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload getDefaultInstanceForType() {
+        return org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.getDefaultInstance();
+      }
+      
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload build() {
+        org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload buildPartial() {
+        org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload result = new org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.timestamp_ = timestamp_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        if (positionBuilder_ == null) {
+          result.position_ = position_;
+        } else {
+          result.position_ = positionBuilder_.build();
+        }
+        if (metricBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004)) {
+            metric_ = java.util.Collections.unmodifiableList(metric_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.metric_ = metric_;
+        } else {
+          result.metric_ = metricBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.body_ = body_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload) {
+          return mergeFrom((org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload other) {
+        if (other == org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.getDefaultInstance()) return this;
+        if (other.hasTimestamp()) {
+          setTimestamp(other.getTimestamp());
+        }
+        if (other.hasPosition()) {
+          mergePosition(other.getPosition());
+        }
+        if (metricBuilder_ == null) {
+          if (!other.metric_.isEmpty()) {
+            if (metric_.isEmpty()) {
+              metric_ = other.metric_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureMetricIsMutable();
+              metric_.addAll(other.metric_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.metric_.isEmpty()) {
+            if (metricBuilder_.isEmpty()) {
+              metricBuilder_.dispose();
+              metricBuilder_ = null;
+              metric_ = other.metric_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              metricBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getMetricFieldBuilder() : null;
+            } else {
+              metricBuilder_.addAllMessages(other.metric_);
+            }
+          }
+        }
+        if (other.hasBody()) {
+          setBody(other.getBody());
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (hasPosition()) {
+          if (!getPosition().isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getMetricCount(); i++) {
+          if (!getMetric(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              timestamp_ = input.readInt64();
+              break;
+            }
+            case 18: {
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder subBuilder = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.newBuilder();
+              if (hasPosition()) {
+                subBuilder.mergeFrom(getPosition());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setPosition(subBuilder.buildPartial());
+              break;
+            }
+            case 40002: {
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder subBuilder = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addMetric(subBuilder.buildPartial());
+              break;
+            }
+            case 40010: {
+              bitField0_ |= 0x00000008;
+              body_ = input.readBytes();
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional int64 timestamp = 1;
+      private long timestamp_ ;
+      public boolean hasTimestamp() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public long getTimestamp() {
+        return timestamp_;
+      }
+      public Builder setTimestamp(long value) {
+        bitField0_ |= 0x00000001;
+        timestamp_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearTimestamp() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        timestamp_ = 0L;
+        onChanged();
+        return this;
+      }
+      
+      // optional .kuradatatypes.KuraPayload.KuraPosition position = 2;
+      private org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition position_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder> positionBuilder_;
+      public boolean hasPosition() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition getPosition() {
+        if (positionBuilder_ == null) {
+          return position_;
+        } else {
+          return positionBuilder_.getMessage();
+        }
+      }
+      public Builder setPosition(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition value) {
+        if (positionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          position_ = value;
+          onChanged();
+        } else {
+          positionBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        return this;
+      }
+      public Builder setPosition(
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder builderForValue) {
+        if (positionBuilder_ == null) {
+          position_ = builderForValue.build();
+          onChanged();
+        } else {
+          positionBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        return this;
+      }
+      public Builder mergePosition(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition value) {
+        if (positionBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) == 0x00000002) &&
+              position_ != org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance()) {
+            position_ =
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.newBuilder(position_).mergeFrom(value).buildPartial();
+          } else {
+            position_ = value;
+          }
+          onChanged();
+        } else {
+          positionBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        return this;
+      }
+      public Builder clearPosition() {
+        if (positionBuilder_ == null) {
+          position_ = org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.getDefaultInstance();
+          onChanged();
+        } else {
+          positionBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder getPositionBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getPositionFieldBuilder().getBuilder();
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder getPositionOrBuilder() {
+        if (positionBuilder_ != null) {
+          return positionBuilder_.getMessageOrBuilder();
+        } else {
+          return position_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder> 
+          getPositionFieldBuilder() {
+        if (positionBuilder_ == null) {
+          positionBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPositionOrBuilder>(
+                  position_,
+                  getParentForChildren(),
+                  isClean());
+          position_ = null;
+        }
+        return positionBuilder_;
+      }
+      
+      // repeated .kuradatatypes.KuraPayload.KuraMetric metric = 5000;
+      private java.util.List<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric> metric_ =
+        java.util.Collections.emptyList();
+      private void ensureMetricIsMutable() {
+        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
+          metric_ = new java.util.ArrayList<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric>(metric_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder> metricBuilder_;
+      
+      public java.util.List<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric> getMetricList() {
+        if (metricBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(metric_);
+        } else {
+          return metricBuilder_.getMessageList();
+        }
+      }
+      public int getMetricCount() {
+        if (metricBuilder_ == null) {
+          return metric_.size();
+        } else {
+          return metricBuilder_.getCount();
+        }
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric getMetric(int index) {
+        if (metricBuilder_ == null) {
+          return metric_.get(index);
+        } else {
+          return metricBuilder_.getMessage(index);
+        }
+      }
+      public Builder setMetric(
+          int index, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric value) {
+        if (metricBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMetricIsMutable();
+          metric_.set(index, value);
+          onChanged();
+        } else {
+          metricBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setMetric(
+          int index, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder builderForValue) {
+        if (metricBuilder_ == null) {
+          ensureMetricIsMutable();
+          metric_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          metricBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addMetric(org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric value) {
+        if (metricBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMetricIsMutable();
+          metric_.add(value);
+          onChanged();
+        } else {
+          metricBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addMetric(
+          int index, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric value) {
+        if (metricBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMetricIsMutable();
+          metric_.add(index, value);
+          onChanged();
+        } else {
+          metricBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addMetric(
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder builderForValue) {
+        if (metricBuilder_ == null) {
+          ensureMetricIsMutable();
+          metric_.add(builderForValue.build());
+          onChanged();
+        } else {
+          metricBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addMetric(
+          int index, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder builderForValue) {
+        if (metricBuilder_ == null) {
+          ensureMetricIsMutable();
+          metric_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          metricBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllMetric(
+          java.lang.Iterable<? extends org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric> values) {
+        if (metricBuilder_ == null) {
+          ensureMetricIsMutable();
+          super.addAll(values, metric_);
+          onChanged();
+        } else {
+          metricBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearMetric() {
+        if (metricBuilder_ == null) {
+          metric_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          metricBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeMetric(int index) {
+        if (metricBuilder_ == null) {
+          ensureMetricIsMutable();
+          metric_.remove(index);
+          onChanged();
+        } else {
+          metricBuilder_.remove(index);
+        }
+        return this;
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder getMetricBuilder(
+          int index) {
+        return getMetricFieldBuilder().getBuilder(index);
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder getMetricOrBuilder(
+          int index) {
+        if (metricBuilder_ == null) {
+          return metric_.get(index);  } else {
+          return metricBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder> 
+           getMetricOrBuilderList() {
+        if (metricBuilder_ != null) {
+          return metricBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(metric_);
+        }
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder addMetricBuilder() {
+        return getMetricFieldBuilder().addBuilder(
+            org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.getDefaultInstance());
+      }
+      public org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder addMetricBuilder(
+          int index) {
+        return getMetricFieldBuilder().addBuilder(
+            index, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.getDefaultInstance());
+      }
+      public java.util.List<org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder> 
+           getMetricBuilderList() {
+        return getMetricFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder> 
+          getMetricFieldBuilder() {
+        if (metricBuilder_ == null) {
+          metricBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder, org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetricOrBuilder>(
+                  metric_,
+                  ((bitField0_ & 0x00000004) == 0x00000004),
+                  getParentForChildren(),
+                  isClean());
+          metric_ = null;
+        }
+        return metricBuilder_;
+      }
+      
+      // optional bytes body = 5001;
+      private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY;
+      public boolean hasBody() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public com.google.protobuf.ByteString getBody() {
+        return body_;
+      }
+      public Builder setBody(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000008;
+        body_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearBody() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        body_ = getDefaultInstance().getBody();
+        onChanged();
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:kuradatatypes.KuraPayload)
+    }
+    
+    static {
+      defaultInstance = new KuraPayload(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:kuradatatypes.KuraPayload)
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_kuradatatypes_KuraPayload_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_kuradatatypes_KuraPayload_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_kuradatatypes_KuraPayload_KuraMetric_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_kuradatatypes_KuraPayload_KuraMetric_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_kuradatatypes_KuraPayload_KuraPosition_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_kuradatatypes_KuraPayload_KuraPosition_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\020kurapayload.proto\022\014kuradatatypes\"\227\005\n\nKura" +
+      "Payload\022\021\n\ttimestamp\030\001 \001(\003\0226\n\010position\030\002" +
+      " \001(\0132$.kuradatatypes.KuraPayload.KuraPositi" +
+      "on\0223\n\006metric\030\210\' \003(\0132\".kuradatatypes.KuraPa" +
+      "yload.KuraMetric\022\r\n\004body\030\211\' \001(\014\032\301\002\n\tKuraMe" +
+      "tric\022\014\n\004name\030\001 \002(\t\022:\n\004type\030\002 \002(\0162,.kurada" +
+      "tatypes.KuraPayload.KuraMetric.ValueType\022\024" +
+      "\n\014double_value\030\003 \001(\001\022\023\n\013float_value\030\004 \001(" +
+      "\002\022\022\n\nlong_value\030\005 \001(\003\022\021\n\tint_value\030\006 \001(\005" +
+      "\022\022\n\nbool_value\030\007 \001(\010\022\024\n\014string_value\030\010 \001",
+      "(\t\022\023\n\013bytes_value\030\t \001(\014\"Y\n\tValueType\022\n\n\006" +
+      "DOUBLE\020\000\022\t\n\005FLOAT\020\001\022\t\n\005INT64\020\002\022\t\n\005INT32\020" +
+      "\003\022\010\n\004BOOL\020\004\022\n\n\006STRING\020\005\022\t\n\005BYTES\020\006\032\256\001\n\013E" +
+      "sfPosition\022\020\n\010latitude\030\001 \002(\001\022\021\n\tlongitud" +
+      "e\030\002 \002(\001\022\020\n\010altitude\030\003 \001(\001\022\021\n\tprecision\030\004" +
+      " \001(\001\022\017\n\007heading\030\005 \001(\001\022\r\n\005speed\030\006 \001(\001\022\021\n\t" +
+      "timestamp\030\007 \001(\003\022\022\n\nsatellites\030\010 \001(\005\022\016\n\006s" +
+      "tatus\030\t \001(\005*\005\010\003\020\210\'B?\n,org.eclipse.kura" +
+      ".core.message.protobufB\017KuraPayloadPr" +
+      "oto"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_kuradatatypes_KuraPayload_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_kuradatatypes_KuraPayload_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_kuradatatypes_KuraPayload_descriptor,
+              new java.lang.String[] { "Timestamp", "Position", "Metric", "Body", },
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.class,
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.Builder.class);
+          internal_static_kuradatatypes_KuraPayload_KuraMetric_descriptor =
+            internal_static_kuradatatypes_KuraPayload_descriptor.getNestedTypes().get(0);
+          internal_static_kuradatatypes_KuraPayload_KuraMetric_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_kuradatatypes_KuraPayload_KuraMetric_descriptor,
+              new java.lang.String[] { "Name", "Type", "DoubleValue", "FloatValue", "LongValue", "IntValue", "BoolValue", "StringValue", "BytesValue", },
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.class,
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraMetric.Builder.class);
+          internal_static_kuradatatypes_KuraPayload_KuraPosition_descriptor =
+            internal_static_kuradatatypes_KuraPayload_descriptor.getNestedTypes().get(1);
+          internal_static_kuradatatypes_KuraPayload_KuraPosition_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_kuradatatypes_KuraPayload_KuraPosition_descriptor,
+              new java.lang.String[] { "Latitude", "Longitude", "Altitude", "Precision", "Heading", "Speed", "Timestamp", "Satellites", "Status", },
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.class,
+              org.eclipse.kura.core.message.protobuf.KuraPayloadProto.KuraPayload.KuraPosition.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/kura/org.eclipse.kura.core.comm/.gitignore b/kura/org.eclipse.kura.core.comm/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.core.comm/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.comm/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..c789ca421d50d706023cf643d60be608fde1db65
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.comm
+Bundle-SymbolicName: org.eclipse.kura.core.comm;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.comm;version="1.2.0",
+ javax.microedition.io,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.comm; version="[0.2,0.3)",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.io;version="1.0.0",
+ org.slf4j;version="1.6.4"
+
diff --git a/kura/org.eclipse.kura.core.comm/OSGI-INF/comm.xml b/kura/org.eclipse.kura.core.comm/OSGI-INF/comm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c77e68b9c6097e9ef88488fcd2ba54010e57fa2c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/OSGI-INF/comm.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" name="org.eclipse.kura.core.comm.CommConnectionFactory">
+   <implementation class="org.eclipse.kura.core.comm.CommConnectionFactory"/>
+   <service>
+      <provide interface="org.osgi.service.io.ConnectionFactory"/>
+   </service>
+   <property name="io.scheme">comm</property>
+   <property name="service.pid" value="org.eclipse.kura.core.comm.CommConnectionFactory"/>   
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.comm/about.html b/kura/org.eclipse.kura.core.comm/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.comm/about_files/epl-v10.html b/kura/org.eclipse.kura.core.comm/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.comm/build.properties b/kura/org.eclipse.kura.core.comm/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..050f093bb58b1d610e0d1059cdd0996b63ae5243
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/build.properties
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.apache.commons.io,\
+                     org.eclipse.equinox.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.comm/pom.xml b/kura/org.eclipse.kura.core.comm/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..382d1ea0260be7d42fb343f1a98dc22e6d3c8d4e
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.comm</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.comm/src/main/java/org/eclipse/kura/core/comm/CommConnectionFactory.java b/kura/org.eclipse.kura.core.comm/src/main/java/org/eclipse/kura/core/comm/CommConnectionFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..857811c653165704bb761c591bf3ec045a695324
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/src/main/java/org/eclipse/kura/core/comm/CommConnectionFactory.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.comm;
+
+import java.io.IOException;
+
+import javax.microedition.io.Connection;
+
+import org.eclipse.kura.comm.CommURI;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.io.ConnectionFactory;
+
+public class CommConnectionFactory implements ConnectionFactory 
+{
+	@SuppressWarnings("unused")
+	private ComponentContext      m_ctx;
+
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) 
+	{			
+		//
+		// save the bundle context
+		m_ctx = componentContext;
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		m_ctx = null;
+	}
+	
+	public Connection createConnection(String name, int mode, boolean timeouts)
+		throws IOException
+	{
+		try {
+			CommURI uri = CommURI.parseString(name);
+			return new CommConnectionImpl(uri, mode, timeouts);
+		}
+		catch (Throwable t) {
+			throw new IOException(t);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.comm/src/main/java/org/eclipse/kura/core/comm/CommConnectionImpl.java b/kura/org.eclipse.kura.core.comm/src/main/java/org/eclipse/kura/core/comm/CommConnectionImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..44b4a44d30365c648d8fb101ea80a3235c100b01
--- /dev/null
+++ b/kura/org.eclipse.kura.core.comm/src/main/java/org/eclipse/kura/core/comm/CommConnectionImpl.java
@@ -0,0 +1,304 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.comm;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+import javax.comm.CommPort;
+import javax.comm.CommPortIdentifier;
+import javax.comm.NoSuchPortException;
+import javax.comm.PortInUseException;
+import javax.comm.SerialPort;
+import javax.comm.UnsupportedCommOperationException;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CommConnectionImpl implements CommConnection 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(CommConnectionImpl.class);
+
+	//set up the appropriate ext dir for RXTX extra device nodes
+	static {
+		String kuraExtDir = System.getProperty("kura.ext.dir");
+		if(kuraExtDir != null) {
+			StringBuffer sb = new StringBuffer();
+			String existingDirs = System.getProperty("java.ext.dirs");
+			if(existingDirs != null) {
+				if(!existingDirs.contains(kuraExtDir)) {
+					sb.append(existingDirs)
+					.append(":")
+					.append(kuraExtDir);
+					System.setProperty("java.ext.dirs", sb.toString());
+				}
+			} else {
+				sb.append(kuraExtDir);
+				System.setProperty("java.ext.dirs", sb.toString());
+			}
+		}
+	}
+	
+	private String	   m_port;
+	private int		   m_baudRate;
+	private int 	   m_dataBits;
+	private int		   m_stopBits;
+	private int	 	   m_parity;
+	private int        m_flowControl;
+	private int		   m_timeout;
+	
+	private CommURI      m_commUri;
+	private SerialPort   m_serialPort;
+	private InputStream  m_inputStream;
+	private OutputStream m_outputStream;
+
+	public CommConnectionImpl(CommURI commUri, int mode, boolean timeouts)
+		throws IOException, NoSuchPortException, PortInUseException
+	{
+		m_commUri 	  = commUri;
+		m_serialPort  = null;
+		m_port        = m_commUri.getPort();
+		m_baudRate    = m_commUri.getBaudRate();
+		m_dataBits    = m_commUri.getDataBits();
+		m_stopBits    = m_commUri.getStopBits();
+		m_parity      = m_commUri.getParity();
+		m_flowControl = m_commUri.getFlowControl();
+		m_timeout	  = m_commUri.getTimeout();
+
+		CommPortIdentifier commPortIdentifier = CommPortIdentifier.getPortIdentifier(m_port);
+		
+		CommPort commPort = commPortIdentifier.open(this.getClass().getName(), m_timeout);
+
+		if (commPort instanceof SerialPort) {
+			m_serialPort = (SerialPort) commPort;
+			try {
+				m_serialPort.setSerialPortParams(m_baudRate, m_dataBits, m_stopBits, m_parity);
+				m_serialPort.setFlowControlMode(m_flowControl);
+			} catch (UnsupportedCommOperationException e) {
+				e.printStackTrace();
+			}
+		} else {
+			throw new IOException("Unsupported Port Type");
+		}
+	}
+
+	@Override
+	public CommURI getURI() {
+		return m_commUri;
+	}
+
+	@Override
+	public DataInputStream openDataInputStream() throws IOException {	
+		return new DataInputStream(openInputStream());
+	}
+
+	@Override
+	public synchronized InputStream openInputStream() throws IOException {
+		 if (m_inputStream == null) {
+			 m_inputStream = m_serialPort.getInputStream();
+		 }
+		 return m_inputStream;
+	}
+
+	@Override
+	public DataOutputStream openDataOutputStream() throws IOException {
+		return new DataOutputStream(openOutputStream());
+	}
+
+	@Override
+	public synchronized OutputStream openOutputStream() throws IOException {
+		if (m_outputStream == null) {
+			m_outputStream = m_serialPort.getOutputStream();
+		 }
+		 return m_outputStream;
+	}
+
+	@Override
+	public synchronized void close() throws IOException {
+	    if(m_serialPort != null) {
+    		m_serialPort.notifyOnDataAvailable(false);
+    		m_serialPort.removeEventListener();
+    		if (m_inputStream != null) {
+    			m_inputStream.close();
+    			m_inputStream = null;
+    		}
+    		if (m_outputStream != null) {
+    			m_outputStream.close();
+    			m_outputStream = null;
+    		}
+    
+    		m_serialPort.close();
+    		m_serialPort = null;
+	    }
+	}
+
+	@Override
+	public synchronized void sendMessage(byte[] message) throws KuraException, IOException {
+		if (message != null) {
+			s_logger.debug("sendMessage() - " + getBytesAsString(message));
+			
+			if(m_outputStream == null) {
+				openOutputStream();
+			}
+			
+			m_outputStream.write(message, 0, message.length);
+			m_outputStream.flush();
+		} else {
+			throw new NullPointerException("Serial message is null");
+		}
+	}
+
+	@Override
+	public synchronized byte[] sendCommand(byte[] command, int timeout) throws KuraException, IOException {
+		if (command != null) {
+			s_logger.debug("sendMessage() - " + getBytesAsString(command));
+
+			if(m_outputStream == null) {
+				openOutputStream();
+			}
+			if(m_inputStream == null) {
+				openInputStream();
+			}
+
+			byte[] dataInBuffer = flushSerialBuffer();
+			if(dataInBuffer != null && dataInBuffer.length > 0) {
+				s_logger.warn("eating bytes in the serial buffer input stream before sending command: " + getBytesAsString(dataInBuffer));
+			}
+			m_outputStream.write(command, 0, command.length);
+			m_outputStream.flush();
+
+			ByteBuffer buffer = getResponse(timeout);
+			if(buffer != null) {
+				byte[] response = new byte[buffer.limit()];
+				buffer.get(response, 0, response.length);
+				return response;
+			} else {
+				return null;
+			}
+		} else {
+			throw new NullPointerException("Serial command is null");
+		}
+	}
+	
+	@Override
+	public synchronized byte[] sendCommand(byte[] command, int timeout, int demark) throws KuraException, IOException {
+		if (command != null) {
+			s_logger.debug("sendMessage() - " + getBytesAsString(command));
+
+			if(m_outputStream == null) {
+				openOutputStream();
+			}
+			if(m_inputStream == null) {
+				openInputStream();
+			}
+
+			byte[] dataInBuffer = flushSerialBuffer();
+			if(dataInBuffer != null && dataInBuffer.length > 0) {
+				s_logger.warn("eating bytes in the serial buffer input stream before sending command: " + getBytesAsString(dataInBuffer));
+			}
+			m_outputStream.write(command, 0, command.length);
+			m_outputStream.flush();
+
+			ByteBuffer buffer = getResponse(timeout, demark);
+			if(buffer != null) {
+				byte[] response = new byte[buffer.limit()];
+				buffer.get(response, 0, response.length);
+				return response;
+			} else {
+				return null;
+			}
+		} else {
+			throw new NullPointerException("Serial command is null");
+		}
+	}
+
+
+	@Override
+	public synchronized byte[] flushSerialBuffer() throws KuraException, IOException {
+		ByteBuffer buffer = getResponse(50);
+		if(buffer != null) {
+			byte[] response = new byte[buffer.limit()];
+			buffer.get(response, 0, response.length);
+			return response;
+		} else {
+			return null;
+		}
+	}
+	
+	private synchronized ByteBuffer getResponse(int timeout) throws IOException {
+		ByteBuffer buffer = ByteBuffer.allocate(4096);
+		Date start = new Date();
+		
+        while(m_inputStream.available() < 1 && ((new Date()).getTime() - start.getTime()) < timeout) {
+            try {
+                Thread.sleep(10);
+            } catch (InterruptedException e) {
+                // ignore
+            }
+        }
+
+		while (m_inputStream.available() >= 1) {
+            int c = m_inputStream.read();
+            buffer.put((byte) c);
+		}
+
+		buffer.flip();
+		
+		return (buffer.limit() > 0) ? buffer : null;
+	}
+	
+	private synchronized ByteBuffer getResponse(int timeout, int demark) throws IOException {
+		ByteBuffer buffer = ByteBuffer.allocate(4096);
+		long start = System.currentTimeMillis();
+		
+		while ((m_inputStream.available() < 1)
+				&& ((System.currentTimeMillis() - start) < timeout)) {
+			try {Thread.sleep(10);}catch (InterruptedException e) {}
+		}
+
+		start = System.currentTimeMillis();
+		do {
+			if (m_inputStream.available() > 0) {
+				start = System.currentTimeMillis();
+				int c = m_inputStream.read();
+	            buffer.put((byte) c);
+			} 
+		} while ((System.currentTimeMillis() - start) < demark);
+
+		buffer.flip();
+		
+		return (buffer.limit() > 0) ? buffer : null;
+	}
+
+	private String getBytesAsString(byte[] bytes) {
+		if(bytes == null) {
+			return null;
+		} else {
+			StringBuffer sb = new StringBuffer();
+			for(byte b : bytes) {
+				sb.append("0x")
+				.append(Integer.toHexString(b))
+				.append(" ");
+			}
+			
+			return sb.toString();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/.gitignore b/kura/org.eclipse.kura.core.configuration/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.core.configuration/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.configuration/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..21da8f5f9f8a7ddc995f143d1ca75ef5a58497e2
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/META-INF/MANIFEST.MF
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.configuration
+Bundle-SymbolicName: org.eclipse.kura.core.configuration;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.crypto,
+ javax.xml.bind,
+ javax.xml.bind.annotation,
+ javax.xml.bind.annotation.adapters,
+ javax.xml.bind.util,
+ javax.xml.namespace,
+ javax.xml.stream,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.configuration.metatype; version="[0.2,1.0)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.crypto; version="[0.2,1.0)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.cm;version="1.4.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.metatype;version="1.2.0",
+ org.osgi.util.tracker;version="[1.5.0,2.0.0)",
+ org.slf4j;version="1.6.4",
+ org.w3c.dom
+Export-Package: org.eclipse.kura.core.configuration; version="0.2.0",o
+ rg.eclipse.kura.core.configuration.metatype; version="0.2.0",org.ecli
+ pse.kura.core.configuration.util; version="0.2.0"
+
diff --git a/kura/org.eclipse.kura.core.configuration/OSGI-INF/configuration.xml b/kura/org.eclipse.kura.core.configuration/OSGI-INF/configuration.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b7c0608879c22552d7c1ed165eb346b1ac743d0a
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/OSGI-INF/configuration.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" enabled="true" immediate="true" name="org.eclipse.kura.configuration.ConfigurationService">
+   <implementation class="org.eclipse.kura.core.configuration.ConfigurationServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.configuration.ConfigurationService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.configuration.ConfigurationService"/>   
+   <reference name="ConfigurationAdmin"
+              bind="setConfigurationAdmin"
+              unbind="unsetConfigurationAdmin"
+              cardinality="1..1"
+              policy="static"
+              interface="org.osgi.service.cm.ConfigurationAdmin"/>
+   <reference name="MetaTypeService"
+              bind="setMetaTypeService"
+              unbind="unsetMetaTypeService"
+              cardinality="1..1"
+              policy="static"
+              interface="org.osgi.service.metatype.MetaTypeService"/>   
+   <reference name="SystemService"
+              bind="setSystemService"
+              unbind="unsetSystemService"
+              cardinality="1..1"
+              policy="static"
+              interface="org.eclipse.kura.system.SystemService"/>
+   <reference name="CryptoService" 
+              interface="org.eclipse.kura.crypto.CryptoService" 
+              bind="setCryptoService" 
+              unbind="unsetCryptoService"
+              cardinality="1..1" 
+              policy="static"/>   
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.configuration/about.html b/kura/org.eclipse.kura.core.configuration/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.configuration/about_files/epl-v10.html b/kura/org.eclipse.kura.core.configuration/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.configuration/build.properties b/kura/org.eclipse.kura.core.configuration/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a02ca933de33ddded73141bdefb6239944d112e5
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.configuration/pom.xml b/kura/org.eclipse.kura.core.configuration/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0578d0f67b4e6b3146037ca0db54565c15b66793
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.configuration</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/CloudConfigurationHandler.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/CloudConfigurationHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..719865c4679ad4b9a7718ab0830872bafa49b22d
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/CloudConfigurationHandler.java
@@ -0,0 +1,532 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.xml.bind.JAXBException;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.cloud.Cloudlet;
+import org.eclipse.kura.cloud.CloudletTopic;
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraRequestPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.eclipse.kura.system.SystemService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudConfigurationHandler extends Cloudlet 
+{
+	private static Logger s_logger = LoggerFactory.getLogger(CloudConfigurationHandler.class);
+	
+	public static final String APP_ID = "CONF-V1";
+	
+	/* GET or PUT */
+	public static final String RESOURCE_CONFIGURATIONS = "configurations";
+	/* GET */
+	public static final String RESOURCE_SNAPSHOTS      = "snapshots";
+	/* EXEC */
+	public static final String RESOURCE_SNAPSHOT       = "snapshot";
+	public static final String RESOURCE_ROLLBACK       = "rollback";
+
+	private SystemService m_systemService;
+	
+	private ScheduledExecutorService m_executor;
+	
+	//
+	// ServiceTracker to track the CloudService
+	private class ServiceTrackerAdapter extends ServiceTracker<CloudService,CloudService> 
+	{
+		private ServiceTrackerAdapter(BundleContext context) {
+			super(context, CloudService.class, null);
+		}
+		
+		public CloudService addingService(ServiceReference<CloudService> ref) {
+			CloudService cloudService = (CloudService) context.getService(ref);
+			
+			// Explicitly call dependency injection
+			setCloudService(cloudService);
+			activate(null);
+
+			return cloudService;
+		}
+
+		public void removedService(ServiceReference<CloudService> ref, CloudService service) {
+			// Explicitly call dependency injection
+			deactivate(null);
+			unsetCloudService(null);
+		}
+		
+		public void close() {
+			// Explicitly call dependency injection
+			deactivate(null);
+			unsetCloudService(null);
+			super.close();
+		}
+	}
+	
+	private ServiceTrackerAdapter m_serviceTrackerAdapter;
+	private ConfigurationServiceImpl m_configService;
+	
+	public CloudConfigurationHandler(BundleContext context,
+			ConfigurationServiceImpl configService,
+			SystemService systemService) 
+	{
+		super(APP_ID);
+		m_serviceTrackerAdapter = new ServiceTrackerAdapter(context);
+		m_configService = configService;
+		m_systemService = systemService;
+	}
+
+	public void open() {
+		m_executor = Executors.newSingleThreadScheduledExecutor();
+		m_serviceTrackerAdapter.open();
+	}
+
+	public void close() {
+		m_serviceTrackerAdapter.close();
+		m_executor.shutdownNow();
+	}
+	
+	@Override
+	protected void doGet(CloudletTopic reqTopic, KuraRequestPayload reqPayload,
+			KuraResponsePayload respPayload) throws KuraException {
+		
+		String resources[] = reqTopic.getResources();
+		
+		if (resources == null || resources.length == 0) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected one resource but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+			
+		if (resources[0].equals(RESOURCE_CONFIGURATIONS)) {
+			doGetConfigurations(reqTopic, reqPayload, respPayload);
+		} else if (resources[0].equals(RESOURCE_SNAPSHOTS)) {
+			doGetSnapshots(reqTopic, reqPayload, respPayload);
+		} else {
+			s_logger.error("Bad request topic: {}", reqTopic.toString());
+			s_logger.error("Cannot find resource with name: {}", resources[0]);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+			return;
+		}
+	}
+
+	@Override
+	protected void doPut(CloudletTopic reqTopic, KuraRequestPayload reqPayload,
+			KuraResponsePayload respPayload) throws KuraException {
+		
+		String resources[] = reqTopic.getResources();
+		
+		if (resources == null || resources.length == 0) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected one resource but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+
+		if (resources[0].equals(RESOURCE_CONFIGURATIONS)) {
+			doPutConfigurations(reqTopic, reqPayload, respPayload);
+		} else {
+			s_logger.error("Bad request topic: {}", reqTopic.toString());
+			s_logger.error("Cannot find resource with name: {}", resources[0]);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+			return;
+		}
+	}
+
+	@Override
+	protected void doExec(CloudletTopic reqTopic, KuraRequestPayload reqPayload,
+			KuraResponsePayload respPayload) throws KuraException {
+		
+		String[] resources = reqTopic.getResources();
+		
+		if (resources == null || resources.length == 0) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected one resource but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		
+		
+		if (resources[0].equals(RESOURCE_SNAPSHOT)) {
+			doExecSnapshot(reqTopic, reqPayload, respPayload);
+		} else if (resources[0].equals(RESOURCE_ROLLBACK)) {
+			doExecRollback(reqTopic, reqPayload, respPayload);
+		} else {
+			s_logger.error("Bad request topic: {}", reqTopic.toString());
+			s_logger.error("Cannot find resource with name: {}", resources[0]);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+			return;
+		}
+	}	
+	
+	private void doGetSnapshots(CloudletTopic reqTopic,
+			KuraPayload reqPayload, KuraResponsePayload respPayload) throws KuraException {
+
+		String[] resources = reqTopic.getResources();
+		
+		if (resources.length > 2) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected one or two resource(s) but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		
+		String snapshotId = resources.length == 2 ? resources[1] : null;
+		
+		if (snapshotId != null) {
+			long sid = Long.parseLong(snapshotId);
+			XmlComponentConfigurations configs = m_configService.loadSnapshot(sid);
+			//
+			// marshall the response		
+			byte[] body = toResponseBody(configs);
+			
+			//
+			// Build payload
+			respPayload.setBody(body);
+		} 
+		else {		
+			// get the list of snapshot IDs and put them into a response object
+			Set<Long> sids = null;
+			try {
+				sids = m_configService.getSnapshots();
+			} catch (KuraException e) {
+				s_logger.error("Error listing snapshots: {}", e);
+				throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_LISTING, e);
+			}
+			List<Long> snapshotIds = new ArrayList<Long>(sids);
+			XmlSnapshotIdResult xmlResult = new XmlSnapshotIdResult();
+			xmlResult.setSnapshotIds(snapshotIds);
+
+			//
+			// marshall the response		
+			byte[] body = toResponseBody(xmlResult);
+
+			//
+			// Build payload
+			respPayload.setBody(body);
+		}
+	}
+
+	private void doGetConfigurations(CloudletTopic reqTopic,
+							         KuraPayload reqPayload, 
+							         KuraResponsePayload respPayload) 
+		throws KuraException 
+	{	
+		String[] resources = reqTopic.getResources();		
+		if (resources.length > 2) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected at most two resource(s) but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		String pid = resources.length == 2 ? resources[1] : null;
+		
+		//
+		// get current configuration with descriptors
+		List<ComponentConfigurationImpl> configs = new ArrayList<ComponentConfigurationImpl>();		
+		try {
+			
+			if (pid == null) {
+				List<String> pidsToIgnore = m_systemService.getDeviceManagementServiceIgnore();
+				
+				// the configuration for all components has been requested
+				Set<String> componentPids = m_configService.getConfigurableComponentPids();
+				for(String componentPid : componentPids) {
+					boolean skip = false;
+					if(pidsToIgnore != null && !pidsToIgnore.isEmpty()) {
+						for(String pidToIgnore : pidsToIgnore) {
+							if(componentPid.equals(pidToIgnore)) {
+								skip=true;
+								break;
+							}
+						}
+					}
+					if(skip) {
+						continue;
+					}
+					
+					ComponentConfiguration cc = m_configService.getComponentConfiguration(componentPid);
+					
+					// TODO: define a validate method for ComponentConfiguration
+					if (cc == null) {
+						s_logger.error("null ComponentConfiguration");
+						continue;
+					}
+					if (cc.getPid() == null || cc.getPid().isEmpty()) {
+						s_logger.error("null or empty ComponentConfiguration PID");
+						continue;
+					}
+					if (cc.getDefinition() == null) {
+						s_logger.error("null OCD for ComponentConfiguration PID {}", cc.getPid());
+						continue;
+					}
+					if (cc.getDefinition().getId() == null || cc.getDefinition().getId().isEmpty()) {
+						
+						s_logger.error("null or empty OCD ID for ComponentConfiguration PID {}. OCD ID: {}", cc.getPid(), cc.getDefinition().getId());
+						continue;
+					}
+					configs.add((ComponentConfigurationImpl) cc);
+				}
+			}
+			else {
+
+				// the configuration for a specific component has been requested.
+				ComponentConfiguration cc = m_configService.getComponentConfiguration(pid);
+				if (cc != null) {
+					configs.add((ComponentConfigurationImpl) cc);
+				}
+			}
+		} catch (KuraException e) {
+			s_logger.error("Error getting component configurations: {}", e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e, "Error getting component configurations");
+		}
+		
+		XmlComponentConfigurations xmlConfigs = new XmlComponentConfigurations();
+		xmlConfigs.setConfigurations(configs);
+		
+		//
+		// marshall
+		byte[] body = toResponseBody(xmlConfigs);
+		
+		//
+		// Build response payload
+		respPayload.setBody(body);	
+	}
+
+
+	private void doPutConfigurations(CloudletTopic reqTopic,
+			KuraPayload reqPayload, KuraResponsePayload respPayload) 
+	{
+		String[] resources = reqTopic.getResources();
+		
+		if (resources.length > 2) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected at most two resource(s) but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		
+		String pid = resources.length == 2 ? resources[1] : null;
+		
+		XmlComponentConfigurations xmlConfigs = null;
+		try {
+
+			// unmarshall the response
+			if (reqPayload.getBody() == null || reqPayload.getBody().length == 0) {
+				throw new IllegalArgumentException("body"); 
+			}
+
+			String s = new String(reqPayload.getBody(), "UTF-8");
+			s_logger.info("Received new Configuration...");
+			s_logger.info(s);
+			
+			StringReader sr = new StringReader(s);
+			xmlConfigs = XmlUtil.unmarshal(sr, XmlComponentConfigurations.class);
+		}
+		catch (Exception e) {
+			s_logger.error("Error unmarshalling the request body: {}", e);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			respPayload.setException(e);
+			return;
+		}
+
+		m_executor.schedule(new UpdateConfigurationsCallable(pid, xmlConfigs, m_configService),
+				            1000, TimeUnit.MILLISECONDS);
+	}
+
+
+	
+	private void doExecRollback(CloudletTopic reqTopic,
+			KuraPayload reqPayload, KuraResponsePayload respPayload) throws KuraException {
+		
+		String[] resources = reqTopic.getResources();
+
+		if (resources.length > 2) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected at most two resource(s) but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		
+		String snapshotId = resources.length == 2 ? resources[1] : null;
+		Long sid;
+		try {
+			sid = snapshotId != null ? Long.parseLong(snapshotId) : null;
+		} catch (NumberFormatException e) {
+			s_logger.error("Bad numeric numeric format for snapshot ID: {}", snapshotId);
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		
+		m_executor.schedule(new RollbackCallable(sid, m_configService),
+				            1000, TimeUnit.MILLISECONDS);
+	}
+
+	private void doExecSnapshot(CloudletTopic reqTopic,
+			KuraPayload reqPayload, KuraResponsePayload respPayload) throws KuraException {
+		
+		String[] resources = reqTopic.getResources(); 
+		
+		if (resources.length > 1) {
+			s_logger.error("Bad request topic: {}", reqTopic.toString()); 
+			s_logger.error("Expected one resource(s) but found {}", resources !=null ? resources.length: "none");
+			respPayload.setResponseCode(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			return;
+		}
+		
+		// take a new snapshot and get the id
+		long snapshotId;
+		try {
+			snapshotId = m_configService.snapshot();
+		} catch (KuraException e) {
+			s_logger.error("Error taking snapshot: {}", e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_TAKING, e);
+		}
+		List<Long> snapshotIds = new ArrayList<Long>();
+		snapshotIds.add(snapshotId);
+		XmlSnapshotIdResult xmlResult = new XmlSnapshotIdResult();
+		xmlResult.setSnapshotIds(snapshotIds);
+		
+		byte[] body = toResponseBody(xmlResult);
+		
+		respPayload.setBody(body);
+	}
+
+	private static byte[] toResponseBody(Object o) throws KuraException {
+		//
+		// marshall the response
+		StringWriter sw = new StringWriter();
+		try {
+			XmlUtil.marshal(o, sw);
+		} catch (JAXBException e) {
+			s_logger.error("Error marshalling snapshots: {}", e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_LOADING, e);
+		}
+		
+		byte[] body = null;
+		try {
+			body = sw.toString().getBytes("UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			s_logger.error("Error encoding response body: {}", e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_LOADING, e);
+		}
+		
+		return body;
+	}
+}
+
+class UpdateConfigurationsCallable implements Callable<Void> {
+	
+	private static Logger s_logger = LoggerFactory.getLogger(UpdateConfigurationsCallable.class);
+	
+	private String m_pid;
+	private XmlComponentConfigurations m_xmlConfigurations;
+	private ConfigurationServiceImpl m_configurationService;
+	
+	public UpdateConfigurationsCallable(String pid,
+			                            XmlComponentConfigurations xmlConfigurations,
+			                            ConfigurationServiceImpl configurationService) {
+		m_pid = pid;
+		m_xmlConfigurations = xmlConfigurations;
+		m_configurationService = configurationService;
+	}
+	
+	@Override
+	public Void call() throws Exception {
+		
+		s_logger.info("Updating configurations");
+		Thread.currentThread().setName(getClass().getSimpleName());
+		//                                                                                                                      
+		// update the configuration
+		try {
+			List<ComponentConfigurationImpl> configImpls = m_xmlConfigurations != null ? m_xmlConfigurations.getConfigurations() : null;
+			if (configImpls == null) {
+				return null;
+			}
+
+			List<ComponentConfiguration> configs = new ArrayList<ComponentConfiguration>();
+			configs.addAll(configImpls);
+
+			if (m_pid == null) {
+				// update all the configurations provided
+				m_configurationService.updateConfigurations(configs);
+			}
+			else {
+				// update only the configuration with the provided id                                                           
+				for (ComponentConfiguration config : configs) {
+					if (m_pid.equals(config.getPid())) {
+						m_configurationService.updateConfiguration(m_pid, config.getConfigurationProperties());
+					}
+				}
+			}
+		} catch (KuraException e) {
+			s_logger.error("Error updating configurations: {}", e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_UPDATE, e);
+		}
+		
+		return null;
+	}
+}
+
+class RollbackCallable implements Callable<Void> {
+	
+	private static Logger s_logger = LoggerFactory.getLogger(RollbackCallable.class);
+	
+	private Long m_snapshotId;
+	private ConfigurationServiceImpl m_configurationService;
+	
+	public RollbackCallable(Long snapshotId, ConfigurationServiceImpl configurationService) {
+		super();
+		m_snapshotId = snapshotId;
+		m_configurationService = configurationService;
+	}
+
+	@Override
+	public Void call() throws Exception {
+		Thread.currentThread().setName(getClass().getSimpleName());
+		// rollback to the specified snapshot if any
+		try {
+			if (m_snapshotId == null) {
+				m_configurationService.rollback();
+			}
+			else {
+				m_configurationService.rollback(m_snapshotId);
+			}
+		} catch (KuraException e) {
+			s_logger.error("Error rolling back to snapshot: {}", e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ROLLBACK, e);
+		}
+		
+		return null;
+	}
+	
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ComponentConfigurationImpl.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ComponentConfigurationImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4b0ce5ab7d9832a0af5de88ca0850a0cc3158c2
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ComponentConfigurationImpl.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.core.configuration.metatype.Tocd;
+
+@XmlRootElement(name="configuration")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ComponentConfigurationImpl implements ComponentConfiguration 
+{
+	@XmlAttribute(name="pid")
+	protected String pid;
+	
+	@XmlElementRef
+	protected Tocd definition;
+
+	@XmlElement(name="properties")
+	@XmlJavaTypeAdapter(XmlConfigPropertiesAdapter.class)
+	protected Map<String,Object> properties;
+
+	// Required by JAXB
+	public ComponentConfigurationImpl()
+	{}
+	
+	public ComponentConfigurationImpl(String pid,
+									  Tocd  definition, 
+									  Map<String,Object> properties)
+	{
+		super();
+		this.pid = pid;
+		this.definition = definition;
+		this.properties = properties;
+	}
+
+	public String getPid() {
+		return pid;
+	}
+
+	public Tocd  getDefinition() {
+		return definition;
+	}
+
+	public Map<String,Object> getConfigurationProperties() {
+		return properties;
+	}
+
+	public void setPid(String pid) {
+		this.pid = pid;
+	}
+
+	public void setDefinition(Tocd definition) {
+		this.definition = definition;
+	}
+
+	public void setProperties(Map<String, Object> properties) {
+		this.properties = properties;
+	}	
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ComponentMetaTypeBundleTracker.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ComponentMetaTypeBundleTracker.java
new file mode 100644
index 0000000000000000000000000000000000000000..55ddc10f781541cc3f8e52e65f2c156ac060a76a
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ComponentMetaTypeBundleTracker.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.eclipse.kura.core.configuration.util.CollectionsUtil;
+import org.eclipse.kura.core.configuration.util.ComponentUtil;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.util.tracker.BundleTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * BundleTracker to track all the Service which have defaults in MetaType.
+ * When the ConfigurableComponet is found it is then registered to the ConfigurationService.
+ */
+public class ComponentMetaTypeBundleTracker extends BundleTracker<Bundle>
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ComponentMetaTypeBundleTracker.class);
+
+	private BundleContext m_context;
+	private ConfigurationAdmin m_configurationAdmin;
+	private ConfigurationServiceImpl m_configurationService;
+
+	public ComponentMetaTypeBundleTracker(BundleContext context,
+										  ConfigurationAdmin configurationAdmin,
+										  ConfigurationServiceImpl configurationService) 
+		throws InvalidSyntaxException 
+	{
+		super(context, Bundle.ACTIVE, null);		
+		m_context = context;
+		m_configurationAdmin = configurationAdmin;
+		m_configurationService = configurationService;
+	}
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Override APIs
+	//
+	// ----------------------------------------------------------------
+
+	@Override
+	public void open() 
+	{
+		s_logger.info("Opening ComponentMetaTypeBundleTracker...");
+		super.open();
+				
+		Bundle[] bundles = m_context.getBundles();
+		if (bundles != null) {
+			for (Bundle bundle : bundles) {
+				processBundleMetaType(bundle);	
+			}
+		}
+	};
+	
+	@Override
+	public Bundle addingBundle(Bundle bundle, BundleEvent event) 
+	{
+		Bundle bnd = super.addingBundle(bundle, event);
+		processBundleMetaType(bundle);
+		return bnd;
+	}
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Private APIs
+	//
+	// ----------------------------------------------------------------
+	
+	private void processBundleMetaType(Bundle bundle) 
+	{
+		// Push the latest configuration merging the properties in ConfigAdmin
+		// with the default properties read from the component's meta-type.
+		// This allows components to incrementally add new configuration
+		// properties in the meta-type.
+		// Only the new default properties are merged with the configuration 
+		// properties in ConfigurationAdmin.
+		// Note: configuration properties in snapshots no longer present in 
+		// the meta-type are not purged.
+
+		Map<String,OCD> ocds = ComponentUtil.getObjectClassDefinition(m_context, bundle);
+		for (String pid : ocds.keySet()) {			
+			try {
+
+				OCD ocd = ocds.get(pid);
+				Configuration config = m_configurationAdmin.getConfiguration(pid);
+				if (config != null) {
+
+					// get the properties from ConfigurationAdmin if any are present
+					Map<String, Object> props = new HashMap<String, Object>(); 
+					if (config.getProperties() != null) {
+						props = CollectionsUtil.dictionaryToMap(config.getProperties(), ocd);
+					}
+				
+					// merge the current properties, if any, with the defaults from metatype
+					boolean mergeDone = m_configurationService.mergeWithDefaults(ocds.get(pid), props); 
+					if (mergeDone) {					
+
+						// there was a merge with the defaults
+						// so notify the updated configuration to ConfigurationAdmin
+						config.update(CollectionsUtil.mapToDictionary(props));
+						s_logger.info("Seeding updated configuration for pid: {}", pid);
+					}
+				}
+			}
+			catch (Exception e) {
+				s_logger.error("Error seeding configuration for pid: "+pid, e);
+			}
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ConfigurableComponentTracker.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ConfigurableComponentTracker.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b3043e878c877966d20723f9065fc18044335da
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ConfigurableComponentTracker.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.configuration.SelfConfiguringComponent;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ServiceTracker to track all the ConfigurabaleComponents.
+ * When the ConfigurableComponet is found it is then registered to the ConfigurationService.
+ */
+
+@SuppressWarnings("rawtypes")
+public class ConfigurableComponentTracker extends ServiceTracker
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ConfigurableComponentTracker.class);
+
+	private ConfigurationServiceImpl m_confService;	
+
+	@SuppressWarnings("unchecked")
+	public ConfigurableComponentTracker(BundleContext context,
+									    ConfigurationServiceImpl confService) 
+		throws InvalidSyntaxException 
+	{
+		//super(context, (String) null, null); // Wrong: throws an exception
+		//super(context, "", null); // Wrong: does not track anything
+		//super(context, "org.eclipse.kura..example.publisher.ExamplePublisher", null); // tracks the specified class but of course we cannot use this
+		//super(context, (ServiceReference) null, null); // Wrong: throws an exception
+		//super(context, SelfConfiguringComponent.class, null); // Wrong: does not track anything
+		//super(context, context.createFilter("(" + Constants.OBJECTCLASS + "="+SelfConfiguringComponent.class.getName()+")"), null); // No
+		//super(context, context.createFilter("(" + Constants.SERVICE_EXPORTED_INTERFACES + "="+SelfConfiguringComponent.class.getName()+")"), null); // Track nothing. Export the interface?
+
+		// TODO: find a better filter
+		super(context, context.createFilter("(" + Constants.OBJECTCLASS + "=*)"), null); // This works but we track everything
+		
+		m_confService = confService;
+	}
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Override APIs
+	//
+	// ----------------------------------------------------------------
+
+	@SuppressWarnings({ "unchecked" })
+	@Override
+	public void open(boolean trackAllServices) 
+	{
+		s_logger.info("Opening ServiceTracker");
+		super.open(trackAllServices);
+		try {
+
+			s_logger.info("Getting ServiceReferences");
+			ServiceReference[] refs = context.getServiceReferences((String) null, null);
+			if (refs != null) {
+				for (ServiceReference ref : refs) {
+					String pid = (String) ref.getProperty("component.name");
+					if (pid != null && !m_confService.hasConfigurableComponent(pid)) {
+
+						Object obj = context.getService(ref);
+						try {
+							if (obj == null) {
+								s_logger.info("Could not find service for: {}", ref);
+							}
+							else if (obj instanceof ConfigurableComponent) {
+								s_logger.info("Adding ConfigurableComponent {}", pid);
+								m_confService.registerComponentConfiguration(ref.getBundle(), pid);
+							}
+							else if (obj instanceof SelfConfiguringComponent) {
+								s_logger.info("Adding SelfConfiguringComponent {}", pid);
+								m_confService.registerSelfConfiguringComponent(pid);			    		
+							}
+						}
+						finally {
+							context.ungetService(ref);
+						}
+					}
+				}
+			}
+		}
+		catch (InvalidSyntaxException ise) {
+			s_logger.error("Error in addingBundle", ise);
+		}
+		catch (KuraException e) {
+			s_logger.error("Error in addingBundle", e);
+		}
+	};
+
+	
+	@SuppressWarnings({ "unchecked" })
+	@Override 
+	public Object addingService(ServiceReference ref) 
+	{
+		Object service = super.addingService(ref);
+		
+		String pid = (String) ref.getProperty("component.name");
+		if (pid != null) {
+
+			if (service instanceof ConfigurableComponent) {
+				s_logger.info("Adding ConfigurableComponent {}", pid);
+				try {
+					m_confService.registerComponentConfiguration(ref.getBundle(), pid);
+				} 
+				catch (KuraException e) {
+					s_logger.info("Error adding ConfigurableComponent {} {}", pid, e);
+				}
+			} else if (service instanceof SelfConfiguringComponent) {
+				s_logger.info("Adding SelfConfiguringComponent {}", pid);
+				try {
+					m_confService.registerSelfConfiguringComponent(pid);
+				} 
+				catch (KuraException e) {
+					s_logger.info("Error adding SelfConfiguringComponent {} {}", pid, e);
+				}
+			}
+		}
+
+		return service;
+	};
+
+	
+	@SuppressWarnings({ "unchecked" })
+	@Override
+	public void removedService(ServiceReference reference, Object service) 
+	{
+		super.removedService(reference, service);
+
+		String pid = (String) reference.getProperty("component.name");
+		if (pid != null) {
+			if (service instanceof ConfigurableComponent) {
+				s_logger.info("Removed  ConfigurableComponent {}", pid);
+				m_confService.unregisterComponentConfiguration(pid);
+			} else if (service instanceof SelfConfiguringComponent) {
+				s_logger.info("Removed  SelfConfiguringComponent {}", pid);
+				m_confService.unregisterComponentConfiguration(pid);
+			}
+		}
+	};
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ConfigurationServiceImpl.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ConfigurationServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f24f224e6b0a832f0487245a05827864e503b04e
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/ConfigurationServiceImpl.java
@@ -0,0 +1,1077 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.stream.FactoryConfigurationError;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraPartialSuccessException;
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.configuration.SelfConfiguringComponent;
+import org.eclipse.kura.configuration.metatype.AD;
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.eclipse.kura.configuration.metatype.Scalar;
+import org.eclipse.kura.core.configuration.metatype.Tocd;
+import org.eclipse.kura.core.configuration.util.CollectionsUtil;
+import org.eclipse.kura.core.configuration.util.ComponentUtil;
+import org.eclipse.kura.core.configuration.util.StringUtil;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.crypto.CryptoService;
+import org.eclipse.kura.system.SystemService;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.osgi.service.metatype.AttributeDefinition;
+import org.osgi.service.metatype.MetaTypeService;
+import org.osgi.service.metatype.ObjectClassDefinition;
+import org.osgi.util.tracker.BundleTracker;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of ConfigurationService. 
+ */
+public class ConfigurationServiceImpl implements ConfigurationService, ConfigurationListener
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ConfigurationServiceImpl.class);
+	
+	private ComponentContext             m_ctx;
+	private CloudConfigurationHandler    m_cloudHandler;
+	private ServiceTracker<?,?>          m_serviceTracker;
+	private BundleTracker<Bundle>        m_bundleTracker;
+
+	@SuppressWarnings("unused")
+	private MetaTypeService     m_metaTypeService;
+	private ConfigurationAdmin  m_configurationAdmin;
+	private SystemService 		m_systemService;
+	@SuppressWarnings("unused")
+	private CryptoService		m_cryptoService;
+	
+	// contains all the PIDs - both of regular and self components 
+	private Set<String> m_allPids;
+	
+	// contains the self configuring components ONLY!
+	private Set<String> m_selfConfigComponents;
+	
+	// contains the current configuration of regular components ONLY
+	private Map<String,Tocd> m_ocds;
+	
+	// contains all pids which have been configured and for which we have not received the corresponding ConfigurationEvent yet
+	private Set<String> m_pendingConfigurationPids;
+
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setConfigurationAdmin(ConfigurationAdmin configAdmin) {
+		this.m_configurationAdmin = configAdmin;
+	}
+
+	public void unsetConfigurationAdmin(ConfigurationAdmin configAdmin) {
+		this.m_configurationAdmin = null;
+	}
+
+	public void setMetaTypeService(MetaTypeService metaTypeService) {
+		this.m_metaTypeService = metaTypeService;
+	}
+
+	public void unsetMetaTypeService(MetaTypeService metaTypeService) {
+		this.m_metaTypeService = null;
+	}
+
+	public void setSystemService(SystemService systemService) {
+		this.m_systemService = systemService;
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+		this.m_systemService = null;
+	}
+	
+	public void setCryptoService(CryptoService cryptoService) {
+		this.m_cryptoService = cryptoService;
+	}
+
+	public void unsetCryptoService(CryptoService cryptoService) {
+		this.m_cryptoService = null;
+	}
+
+	public ConfigurationServiceImpl()
+	{
+		m_allPids                  = new HashSet<String>();
+		m_selfConfigComponents     = new HashSet<String>();
+		m_pendingConfigurationPids = new HashSet<String>();
+		m_ocds                     = new HashMap<String,Tocd>();
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) throws InvalidSyntaxException 
+	{
+		s_logger.info("activate...");
+
+		// save the bundle context
+		m_ctx = componentContext;
+
+		// 1. Register the ConfigurationListener to 
+		// monitor Configuration updates
+		m_ctx.getBundleContext().registerService(ConfigurationListener.class.getName(), this, null); 
+
+		// 2. Load the latest snapshot and push it to ConfigurationAdmin
+		try {
+			loadLatestSnapshotInConfigAdmin();
+		}
+		catch (Exception e) {
+			throw new ComponentException("Error loading latest snapshot", e);
+		}
+		
+		//
+		// start the trackers
+		s_logger.info("Trackers being opened...");
+		m_cloudHandler = new CloudConfigurationHandler(m_ctx.getBundleContext(), this, m_systemService);
+		m_cloudHandler.open();
+				
+		m_serviceTracker = new ConfigurableComponentTracker(m_ctx.getBundleContext(), this);
+		m_serviceTracker.open(true);
+
+		m_bundleTracker = new ComponentMetaTypeBundleTracker(m_ctx.getBundleContext(),m_configurationAdmin, this);
+		m_bundleTracker.open();
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("deactivate...");
+		
+		//
+		// stop the trackers
+		if (m_cloudHandler != null) {
+			m_cloudHandler.close();
+		}
+		if (m_serviceTracker != null) {
+			m_serviceTracker.close();
+		}
+		if (m_bundleTracker != null) {
+			m_bundleTracker.close();
+		}
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   ConfigurationListener
+	//
+	// ----------------------------------------------------------------
+
+	@Override
+	public synchronized void configurationEvent(ConfigurationEvent event) 
+	{
+		// Called every time a new service configuration is invoked
+		// we need to take a new snapshot every time this happens
+		String pid = event.getPid();		
+		if (m_pendingConfigurationPids.contains(pid)) {
+
+			// ignore the ConfigurationEvent for those PIDs whose 
+			// configuration update was by the ConfigurationService itself
+			m_pendingConfigurationPids.remove(pid);
+			return;
+		}
+		try {
+			if (m_allPids.contains(pid)) {			
+				// Take a new snapshot
+				s_logger.info("ConfigurationEvent for tracked ConfigurableComponent with pid: {}", pid);
+				snapshot();
+			}
+		}
+		catch (Exception e) { 
+			s_logger.error("Error taking snapshot after ConfigurationEvent", e);
+		}
+	}
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+
+	public boolean hasConfigurableComponent(String pid) {
+		return m_allPids.contains(pid);
+	}
+
+	
+	@Override
+	public Set<String> getConfigurableComponentPids() {
+		if (m_allPids.isEmpty()) {
+			return Collections.emptySet();
+		}
+		return Collections.unmodifiableSet(m_allPids);
+	}
+
+	
+	@Override
+	public List<ComponentConfiguration> getComponentConfigurations()
+		throws KuraException
+	{
+		List<ComponentConfiguration> configs = new ArrayList<ComponentConfiguration>();
+
+		// assemble all the configurations we have
+		// clone the list to avoid concurrent modifications
+		List<String> allPids = new ArrayList<String>(m_allPids);
+		ComponentConfiguration cc = null;
+ 		for (String pid : allPids) { 
+			try {
+				cc = null;
+				if (!m_selfConfigComponents.contains(pid)) {
+					cc = getConfigurableComponentConfiguration(pid);
+				}
+				else {
+					cc = getSelfConfiguringComponentConfiguration(pid);
+				}
+				if (cc != null) {
+					configs.add(cc);
+				}
+			} 
+			catch (Exception e) {
+				s_logger.error("Error getting configuration for component "+pid, e);
+				throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e, "Error getting configuration for component "+pid);
+			}
+		}
+		return configs;
+	}
+
+	
+	@Override
+	public ComponentConfiguration getComponentConfiguration(String pid) 
+		throws KuraException
+	{
+		ComponentConfiguration cc = null;
+		if (!m_selfConfigComponents.contains(pid)) {
+			cc = getConfigurableComponentConfiguration(pid);
+		}
+		else {
+			cc = getSelfConfiguringComponentConfiguration(pid);
+		}
+		return cc;
+	}
+
+	
+	@Override
+	public synchronized void updateConfiguration(String pidToUpdate, 
+			                                     Map<String,Object> propertiesToUpdate)
+		throws KuraException
+	{		
+		// Update the component configuration
+		boolean snapshotOnConfirmation = false;
+		
+		updateConfigurationInternal(pidToUpdate, propertiesToUpdate, snapshotOnConfirmation);
+
+		// Build the current configuration
+		ComponentConfiguration cc = null; 
+		ComponentConfigurationImpl cci = null; 
+		Map<String,Object> props = null;
+		List<ComponentConfigurationImpl> configs = new ArrayList<ComponentConfigurationImpl>();
+
+		// clone the list to avoid concurrent modifications
+		List<String> allPids = new ArrayList<String>(m_allPids);
+		for (String pid : allPids) {
+			if(pid.equals(pidToUpdate)) {
+				cci   = new ComponentConfigurationImpl(pid, null, propertiesToUpdate);
+				configs.add((ComponentConfigurationImpl) cci);
+			} else {
+				if (!m_selfConfigComponents.contains(pid)) {
+					cc = getConfigurableComponentConfiguration(pid);
+				}
+				else {
+					cc = getSelfConfiguringComponentConfiguration(pid);
+				}
+				if (cc != null && cc.getPid() != null && cc.getPid().equals(pid)) {
+					props = cc.getConfigurationProperties();
+					cci   = new ComponentConfigurationImpl(pid, null, props);
+					configs.add((ComponentConfigurationImpl) cci);
+				}
+			}
+		}
+
+		saveSnapshot(configs);
+	}
+
+
+	@Override
+	public long snapshot() 
+		throws KuraException
+	{
+		s_logger.info("Writing snapshot - Getting component configurations...");
+
+		//
+		// Build the current configuration
+		ComponentConfiguration cc = null; 
+		ComponentConfigurationImpl cci = null; 
+		Map<String,Object> props = null;
+		List<ComponentConfigurationImpl> configs = new ArrayList<ComponentConfigurationImpl>();
+
+		// clone the list to avoid concurrent modifications
+		List<String> allPids = new ArrayList<String>(m_allPids);
+		for (String pid : allPids) {
+
+			if (!m_selfConfigComponents.contains(pid)) {
+				cc = getConfigurableComponentConfiguration(pid);
+			}
+			else {
+				cc = getSelfConfiguringComponentConfiguration(pid);
+			}
+			if (cc != null && cc.getPid() != null && cc.getPid().equals(pid)) {
+				props = cc.getConfigurationProperties();
+				cci   = new ComponentConfigurationImpl(pid, null, props);
+				configs.add((ComponentConfigurationImpl) cci);
+			}
+		}
+
+		return saveSnapshot(configs);
+	}
+	
+	
+		
+	@Override
+	public long rollback() 
+		throws KuraException
+	{	
+		// get the second-last most recent snapshot
+		// and rollback to that one.
+		Set<Long> ids = getSnapshots();
+		if (ids.size() < 2) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_NOT_FOUND, null, "No Snapshot Available");
+		}
+		
+		// rollback to the second last snapshot
+		Long[] snapshots = ids.toArray( new Long[]{});
+		Long   id = snapshots[ids.size()-2];
+		
+		rollback(id); 
+		return id;
+	}
+
+	
+	@Override
+	public synchronized void rollback(long id) 
+		throws KuraException
+	{
+		// load the snapshot we need to rollback to
+		XmlComponentConfigurations xmlConfigs = loadSnapshot(id);
+
+		//
+		// restore configuration
+		s_logger.info("Rolling back to snapshot {}...", id);
+
+		Set<String> snapshotPids = new HashSet<String>();
+		boolean snapshotOnConfirmation = false;
+		List<Throwable> causes = new ArrayList<Throwable>();
+		List<ComponentConfigurationImpl> configs = xmlConfigs.getConfigurations();
+		for (ComponentConfigurationImpl config : configs) {
+			if (config != null) {
+				try {
+					updateConfigurationInternal(config.getPid(), 
+											    config.getConfigurationProperties(),
+											    snapshotOnConfirmation);
+				}
+				catch (Throwable t) {
+					s_logger.warn("Error during rollback for component "+config.getPid(), t);
+					causes.add(t);
+				}
+				// Track the pid of the component
+				snapshotPids.add(config.getPid());
+			}
+		}
+		
+		// rollback to the default configuration for those configurable components
+		// whose configuration is not present in the snapshot
+		Set<String> pids = new HashSet<String>(m_allPids);
+		pids.removeAll(m_selfConfigComponents);
+		pids.removeAll(snapshotPids);
+		
+		for (String pid : pids) {
+			s_logger.info("Rolling back to default configuration for component pid: '{}'", pid);
+			Bundle bundle = m_ctx.getBundleContext().getServiceReference(pid).getBundle();
+			try {
+				OCD ocd = ComponentUtil.readObjectClassDefinition(bundle, pid);
+				Map<String, Object> defaults = ComponentUtil.getDefaultProperties(ocd);
+				updateConfigurationInternal(pid, defaults, snapshotOnConfirmation);
+			} catch (Throwable t) {
+				s_logger.warn("Error during rollback for component "+pid, t);
+				causes.add(t);
+			}
+		}
+		if (causes.size() > 0) {
+			throw new KuraPartialSuccessException("Rollback", causes);
+		}
+
+		// Do not call snapshot() here because it gets the configurations of SelfConfiguringComponents
+		// using SelfConfiguringComponent.getConfiguration() and the configuration returned
+		// might be the old one not the one just loaded from the snapshot and updated through
+		// the Configuration Admin. Instead just make a copy of the snapshot.
+		saveSnapshot(configs);
+	}
+
+
+	
+	@Override
+	public Set<Long> getSnapshots() throws KuraException 
+	{
+		return getSnapshotsInternal();
+	}
+
+	
+	public List<ComponentConfiguration> getSnapshot(long sid)
+		throws KuraException
+	{
+		List<ComponentConfiguration> configs = new ArrayList<ComponentConfiguration>();		
+		XmlComponentConfigurations xmlConfigs = loadSnapshot(sid);
+		if (xmlConfigs != null) {
+			configs.addAll(xmlConfigs.getConfigurations());
+		}
+		
+		return configs;
+	}
+	
+	
+	public synchronized void updateConfigurations(List<ComponentConfiguration> configsToUpdate)
+		throws KuraException
+	{	
+		boolean snapshotOnConfirmation = false;
+		List<Throwable> causes = new ArrayList<Throwable>();
+		for (ComponentConfiguration config : configsToUpdate) {
+			if (config != null) {
+				try {
+					updateConfigurationInternal(config.getPid(), 
+												config.getConfigurationProperties(),
+												snapshotOnConfirmation);
+				}
+				catch (KuraException e) {
+					s_logger.warn("Error during updateConfigurations for component "+config.getPid(), e);
+					causes.add(e);
+				}
+			}
+		}
+		
+		// Build the current configuration
+		ComponentConfiguration cc = null; 
+		ComponentConfigurationImpl cci = null; 
+		Map<String,Object> props = null;
+		List<ComponentConfiguration> configs = new ArrayList<ComponentConfiguration>();
+
+		// clone the list to avoid concurrent modifications
+		List<String> allPids = new ArrayList<String>(m_allPids);
+		for (String pid : allPids) {
+			boolean isConfigToUpdate = false;
+			for(ComponentConfiguration configToUpdate : configsToUpdate) {
+				if(configToUpdate.getPid().equals(pid)) {
+					//found a match
+					isConfigToUpdate = true;
+					configs.add(configToUpdate);
+					break;
+				}
+			}
+			
+			if(!isConfigToUpdate) {
+				if (!m_selfConfigComponents.contains(pid)) {
+					cc = getConfigurableComponentConfiguration(pid);
+				}
+				else {
+					cc = getSelfConfiguringComponentConfiguration(pid);
+				}
+				if (cc != null && cc.getPid() != null && cc.getPid().equals(pid)) {
+					props = cc.getConfigurationProperties();
+					cci   = new ComponentConfigurationImpl(pid, null, props);
+					configs.add((ComponentConfigurationImpl) cci);
+				}
+			}
+		}
+
+		saveSnapshot(configs);
+		
+		if (causes.size() > 0) {
+			throw new KuraPartialSuccessException("updateConfigurations", causes);
+		}
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Package APIs
+	//
+	// ----------------------------------------------------------------
+
+	
+	synchronized void registerComponentConfiguration(Bundle bundle, String pid)
+		throws KuraException
+	{
+		if (!m_allPids.contains(pid)) {
+			
+			s_logger.info("Registration of ConfigurableComponent {} by {}...", pid, this);
+			try {
+				
+				// register it
+				m_allPids.add(pid);	
+
+				// Get the ocd
+				Tocd ocd = null;		
+				try {
+					ocd = ComponentUtil.readObjectClassDefinition(bundle, pid);
+					if (ocd != null) {						
+						s_logger.info("Registering {} with ocd: {} ...", pid, ocd);
+						m_ocds.put(pid,  ocd);
+					}
+				}
+				catch (Throwable t) {
+					s_logger.error("Error reading ObjectClassDefinition for "+pid, t);
+				}
+				s_logger.info("Registration Completed for Component {}.", pid);				
+			}
+			catch (Exception e) {
+				s_logger.error("Error initializing Component Configuration", e);
+			}
+		}
+	}
+
+
+	synchronized void registerSelfConfiguringComponent(String pid)
+		throws KuraException
+	{
+		if (pid == null) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR);
+		}
+		
+		m_allPids.add(pid);
+		m_selfConfigComponents.add(pid);
+	}
+
+	
+	void unregisterComponentConfiguration(String pid)
+	{
+		if (pid == null) {
+			return;
+		}
+		
+		s_logger.debug("Removing component configuration for " + pid);
+		m_allPids.remove(pid);
+		m_ocds.remove(pid);
+		m_selfConfigComponents.remove(pid);
+	}
+		
+	void updateConfigurationInternal(String pid, 
+									 Map<String,Object> properties,
+									 boolean snapshotOnConfirmation)
+		throws KuraException
+	{
+		s_logger.debug("Attempting update configuration for {}", pid);
+				
+		if (!m_allPids.contains(pid)) {
+			s_logger.info("UpdatingConfiguration ignored as ConfigurableComponent {} is NOT tracked.", pid);
+			return;
+		}
+		if (properties == null) {
+			s_logger.info("UpdatingConfiguration ignored as properties for ConfigurableComponent {} are NULL.", pid);
+			return;
+		}
+		
+		Map<String, Object> mergedProperties = new HashMap<String, Object>(properties);
+		
+		// Try to get the OCD from the registered ConfigurableComponents
+		OCD registerdOCD = m_ocds.get(pid);
+		// Otherwise try to get it from the registered SelfConfiguringComponents
+		// (whose OCD is not tracked in the m_ocds map - why?).
+		if (registerdOCD == null) {
+			ComponentConfiguration config = getSelfConfiguringComponentConfiguration(pid);
+			if (config != null) {
+				registerdOCD = config.getDefinition();
+			}
+		}
+		
+		if (registerdOCD != null) {
+			boolean changed = mergeWithDefaults(registerdOCD, mergedProperties);
+			if (changed) {
+				s_logger.info("mergeWithDefaults returned "+changed);
+			}
+		}
+		
+		try {
+			
+			if (!m_selfConfigComponents.contains(pid)) {
+
+				// load the ocd to do the validation
+				BundleContext ctx = m_ctx.getBundleContext();
+				ObjectClassDefinition ocd = null;
+				ocd = ComponentUtil.getObjectClassDefinition(ctx, pid);
+
+				// Validate the properties to be applied and set them
+				validateProperties(pid, ocd, mergedProperties);
+			}
+			else {				
+				// FIXME: validation of properties for self-configuring components 
+			}		
+
+			if (!snapshotOnConfirmation) {
+				m_pendingConfigurationPids.add(pid);
+			}
+			else {
+				s_logger.info("Snapshot on EventAdmin configuration will be taken for {}.", pid);
+			}
+
+			// Update the new properties
+			// use ConfigurationAdmin to do the update
+			Configuration config = m_configurationAdmin.getConfiguration(pid);
+			config.update(CollectionsUtil.mapToDictionary(mergedProperties));
+
+			s_logger.info("Updating Configuration of ConfigurableComponent {} ... Done.", pid);
+		}
+		catch (IOException e) {
+			s_logger.error("Error updating Configuration of ConfigurableComponent "+pid, e);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_UPDATE, e, pid);
+		}
+	}
+
+	
+	
+	XmlComponentConfigurations loadSnapshot(long id)
+			throws KuraException, FactoryConfigurationError 
+	{
+		// Get the snapshot file to rollback to
+		File fSnapshot = getSnapshotFile(id);
+		if (!fSnapshot.exists()) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_NOT_FOUND, fSnapshot.getAbsolutePath());
+		}
+
+		// Unmarshall
+		XmlComponentConfigurations xmlConfigs = null;
+		try {			
+			FileReader fr = new FileReader(fSnapshot);
+			xmlConfigs = XmlUtil.unmarshal(fr, XmlComponentConfigurations.class);			
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		return xmlConfigs;
+	}
+
+	
+		
+	// ----------------------------------------------------------------
+	//
+	//   Private APIs
+	//
+	// ----------------------------------------------------------------
+	
+	private synchronized long saveSnapshot(List<? extends ComponentConfiguration> configs)
+		throws KuraException 
+	{
+		List<ComponentConfigurationImpl> configImpls = new ArrayList<ComponentConfigurationImpl>();
+		for (ComponentConfiguration config : configs) {
+			if (config instanceof ComponentConfigurationImpl) {
+				configImpls.add((ComponentConfigurationImpl) config);
+			}
+		}
+
+		//
+		// Build the XML structure
+		XmlComponentConfigurations conf = new XmlComponentConfigurations();
+		conf.setConfigurations(configImpls);
+
+		//
+		// Write it to disk: marshall
+		long sid = (new Date()).getTime();
+
+		//
+		// Do not save the snapshot in the past
+		Set<Long> snapshotIDs = getSnapshots();
+		if (snapshotIDs != null && snapshotIDs.size() > 0) {
+			Long[] snapshots = snapshotIDs.toArray( new Long[]{});
+			Long   lastestID = snapshots[snapshotIDs.size()-1];
+
+			if (lastestID != null && sid <= lastestID) {
+				s_logger.warn("Snapshot ID: {} is in the past. Adjusting ID to: {} + 1", sid, lastestID);
+				sid = lastestID + 1;
+			}
+		}
+		
+		File fSnapshot = getSnapshotFile(sid);
+		s_logger.info("Writing snapshot - Saving {}...", fSnapshot.getAbsolutePath());
+		try {
+		
+			FileOutputStream fos = new FileOutputStream(fSnapshot);
+			OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
+			XmlUtil.marshal(conf, osw);
+			osw.flush();
+			fos.flush();
+			fos.getFD().sync();
+			osw.close();
+			fos.close();
+		}
+		catch (Throwable t) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, t);
+		}
+		s_logger.info("Writing snapshot - Saving {}... Done.", fSnapshot.getAbsolutePath());
+		
+		//
+		// Garbage Collector for number of Snapshots Saved
+		garbageCollectionOldSnapshots();
+		return sid;
+	}
+
+	
+	private ComponentConfiguration getConfigurableComponentConfiguration(String pid)
+	{
+		ComponentConfiguration cc = null;
+		try {
+
+			Tocd ocd = m_ocds.get(pid);
+		
+			Configuration cfg = m_configurationAdmin.getConfiguration(pid);
+			Map<String,Object> props = CollectionsUtil.dictionaryToMap(cfg.getProperties(), ocd);
+			
+			cc = new ComponentConfigurationImpl(pid, ocd, props);
+		}
+		catch (Exception e) {
+			s_logger.error("Error getting Configuration for component: "+pid+". Ignoring it.", e);
+		}
+		return cc;
+	}
+
+	
+	private ComponentConfiguration getSelfConfiguringComponentConfiguration(String pid)
+	{
+		ComponentConfiguration cc = null;
+		ServiceReference<?> ref = m_ctx.getBundleContext().getServiceReference(pid);
+		if (ref != null) {
+			Object obj = m_ctx.getBundleContext().getService(ref);
+			try {
+				if (obj instanceof SelfConfiguringComponent) {
+					SelfConfiguringComponent selfConfigComp = null;
+					selfConfigComp = (SelfConfiguringComponent) obj;
+					try {
+						
+						cc = selfConfigComp.getConfiguration();
+						if (cc.getPid() == null || !cc.getPid().equals(pid)) {
+							s_logger.error("Invalid pid for returned Configuration of SelfConfiguringComponent with pid: "+pid+". Ignoring it.");
+							cc = null; // do not return the invalid configuration
+							return cc;
+						}
+						
+						OCD ocd = cc.getDefinition();
+						if (ocd != null) {
+							List<AD> ads = ocd.getAD();
+							
+							if (ads != null) {
+								for (AD ad : ads) {
+									String adId = ad.getId();
+									String adType = ad.getType().value();
+									
+									if (adId == null) {
+										s_logger.error("null required id for AD for returned Configuration of SelfConfiguringComponent with pid: {}", pid);
+										cc = null;
+										return cc;  // do not return the invalid configuration										
+									}
+									if (adType == null) {
+										s_logger.error("null required type for AD id: {} for returned Configuration of SelfConfiguringComponent with pid: {}", adId, pid);
+										cc = null;
+										return cc;  // do not return the invalid configuration
+									}
+
+									Map<String, Object> props = cc.getConfigurationProperties();
+									if (props != null) {
+										for (String propName : props.keySet()) {
+											if (propName.equals(adId)) {
+												Object value = props.get(propName);
+												if (value != null) {
+													String propType = value.getClass().getSimpleName();
+													try {
+														s_logger.debug("pid: {}, property name: {}, type: {}, value: {}", new Object[] {pid, propName, propType, value});
+														Scalar.fromValue(propType);
+														if (!propType.equals(adType)) {
+															s_logger.error("Type: {} for property named: {} does not match the AD type: {} for returned Configuration of SelfConfiguringComponent with pid: {}",
+																	new Object[] {propType, propName, adType, pid});
+															cc = null;
+															return cc;  // do not return the invalid configuration															
+														}
+													} catch (IllegalArgumentException e) {
+														s_logger.error("Invalid class: {} for property named: {} for returned Configuration of SelfConfiguringComponent with pid: " + pid, propType, propName);
+														cc = null;
+														return cc;  // do not return the invalid configuration
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}						
+					} 
+					catch (KuraException e) {
+						s_logger.error("Error getting Configuration for component: "+pid+". Ignoring it.", e);
+					}
+				}
+				else {
+					s_logger.error("Component "+obj+" is not a SelfConfiguringComponent. Ignoring it.");			
+				}
+			}
+			finally {
+				m_ctx.getBundleContext().ungetService(ref);
+			}
+		}
+		return cc;
+	}
+	
+
+	private TreeSet<Long> getSnapshotsInternal() 
+	{
+		// keeps the list of snapshots ordered
+		TreeSet<Long> ids = new TreeSet<Long>();		
+		String configDir = getSnapshotsDirectory();
+		if(configDir != null) {
+			File  fConfigDir = new File(configDir);
+			File[] files = fConfigDir.listFiles();
+			if (files != null) {
+				
+				Pattern p = Pattern.compile("snapshot_([0-9]+)\\.xml");
+				for (File file : files) {
+					Matcher m = p.matcher(file.getName());
+					if (m.matches()) {
+						ids.add(Long.parseLong(m.group(1)));
+					}
+				}
+			}
+		}
+		return ids;
+	}
+
+	
+	String getSnapshotsDirectory() 
+	{
+		String configDirs = m_systemService.getKuraSnapshotsDirectory();
+		return configDirs;
+	}
+	
+	
+	private File getSnapshotFile(long id) 
+	{
+		String configDir = getSnapshotsDirectory();
+		StringBuilder sbSnapshot = new StringBuilder(configDir);
+		sbSnapshot.append(File.separator)
+				  .append("snapshot_")
+				  .append(id)
+				  .append(".xml");
+
+		String snapshot = sbSnapshot.toString();		
+		return new File(snapshot);
+	}
+
+	
+	private void garbageCollectionOldSnapshots()
+	{
+		// get the current snapshots and compared with the maximum number we need to keep 
+		TreeSet<Long> sids = getSnapshotsInternal();
+
+		int currCount = sids.size(); 
+		int maxCount  = m_systemService.getKuraSnapshotsCount();
+		while (currCount > maxCount) {
+			
+			// preserve snapshot ID 0 as this will be considered the seeding one.
+			long sid = sids.pollFirst();			
+			if (sid != 0) {
+				File fSnapshot = getSnapshotFile(sid);
+				if (fSnapshot.exists()) {
+					s_logger.info("Snapshots Garbage Collector. Deleting {}", fSnapshot.getAbsolutePath());
+					fSnapshot.delete();
+					currCount--;
+				}
+			}
+		}
+	}
+
+	
+	private void loadLatestSnapshotInConfigAdmin() 
+		throws KuraException 
+	{
+		//
+		// Get the latest snapshot file to use as initialization
+		Set<Long> snapshotIDs = getSnapshots();
+		if (snapshotIDs == null || snapshotIDs.size() == 0) {
+			return;
+		}
+		
+		Long[] snapshots = snapshotIDs.toArray( new Long[]{});
+		Long   lastestID = snapshots[snapshotIDs.size()-1];
+		String configDir = getSnapshotsDirectory();
+		StringBuilder sbSnapshot = new StringBuilder(configDir);
+		sbSnapshot.append(File.separator)
+				  .append("snapshot_")
+				  .append(lastestID)
+				  .append(".xml");
+
+		String snapshot = sbSnapshot.toString();
+		File fSnapshot = new File(snapshot);
+		if (!fSnapshot.exists()) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_SNAPSHOT_NOT_FOUND, snapshot);
+		}
+
+		//
+		// Unmarshall
+		s_logger.info("Loading init configurations from: {}...", snapshot);
+		XmlComponentConfigurations xmlConfigs = null;
+		try {
+			
+			FileReader  fr = new FileReader(fSnapshot);
+			xmlConfigs = XmlUtil.unmarshal(fr, XmlComponentConfigurations.class);			
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+
+		//
+		// save away initial configuration
+		List<ComponentConfigurationImpl> configs = xmlConfigs.getConfigurations();
+		for (ComponentConfigurationImpl config : configs) {
+			if (config != null) {				
+				Configuration cfg;
+				try {
+					s_logger.debug("Pushing config to config admin: {}", config.getPid());
+
+					// push it to the ConfigAdmin
+					cfg = m_configurationAdmin.getConfiguration(config.getPid());
+					cfg.update(CollectionsUtil.mapToDictionary(config.getConfigurationProperties()));
+
+					// track it as a pending Configuration
+					// for which we are expecting a confirmation
+					m_pendingConfigurationPids.add(config.getPid());
+				} 
+				catch (IOException e) {
+					s_logger.warn("Error seeding initial properties to ConfigAdmin for service: "+config.getPid(), e);
+				}
+			}
+		}
+	}
+	
+	
+	private void validateProperties(String pid,
+									ObjectClassDefinition ocd,
+	        					    Map<String, Object> updatedProps) 
+	    throws KuraException 
+	{
+		if (ocd != null) {
+
+			// build a map of all the attribute definitions
+			Map<String,AttributeDefinition> attrDefs = new HashMap<String,AttributeDefinition>();				
+			AttributeDefinition[] defs = ocd.getAttributeDefinitions(ObjectClassDefinition.ALL);
+			for (AttributeDefinition def : defs) {
+				attrDefs.put(def.getID(), def);					
+			}
+
+			// loop over the proposed property values
+			// and validate them against the definition
+			Iterator<String> keys = updatedProps.keySet().iterator();
+			while (keys.hasNext()) {
+
+				String key = keys.next();
+				AttributeDefinition attrDef = attrDefs.get(key);
+
+				// is attribute undefined?
+				if (attrDef == null) {
+					// we do not have an attribute descriptor to the validation against
+					// As OSGI insert attributes at runtime like service.pid, component.name,
+					// for the attribute for which we do not have a definition, 
+					// just accept them.
+					continue;
+				}
+
+				// validate the attribute value
+				Object objectValue = updatedProps.get(key);
+				String stringValue = StringUtil.valueToString(objectValue);
+				if (stringValue != null) {
+					String result = attrDef.validate(stringValue);
+					if (result != null && !result.isEmpty()) {
+						throw new KuraException(KuraErrorCode.CONFIGURATION_ATTRIBUTE_INVALID, attrDef.getID()+": "+result);					
+					}
+				}
+			}
+			
+			// make sure all required properties are set
+			OCD ocdFull = m_ocds.get(pid);
+			if (ocdFull != null) {
+				for (AD attrDef : ocdFull.getAD()) {					
+					// to the required attributes make sure a value is defined.
+					if (attrDef.isRequired()) {						
+						if (updatedProps.get(attrDef.getId()) == null) {	
+							// if the default one is not defined, throw exception.							
+							throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, attrDef.getId());
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	boolean mergeWithDefaults(OCD ocd, Map<String,Object> properties) 
+		throws KuraException
+	{
+		boolean changed = false;
+		Set<String> keys = properties.keySet();
+		
+		Map<String, Object> defaults = ComponentUtil.getDefaultProperties(ocd);		
+		Set<String> defaultsKeys = defaults.keySet();
+		defaultsKeys.removeAll(keys);
+		if (!defaultsKeys.isEmpty()) {
+			
+			changed = true;
+			s_logger.info("Merging configuration for pid: {}", ocd.getId());
+			for (String key : defaultsKeys) {
+
+				Object value = defaults.get(key);
+			    properties.put(key, value);			    
+				s_logger.debug("Merged configuration properties with property with name: {} and default value {}", key, value);
+			}
+		}		
+		return changed;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/Password.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/Password.java
new file mode 100644
index 0000000000000000000000000000000000000000..3969a98343837b6c2d4a2aa96705f6d384c87949
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/Password.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+public class Password 
+{
+	private String password;
+
+	public Password(String password) {
+		super();
+		this.password = password;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+	
+	public String toString() {
+		return password;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlComponentConfigurations.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlComponentConfigurations.java
new file mode 100644
index 0000000000000000000000000000000000000000..2401944e6a6860602047f66c16a68c16512b6be9
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlComponentConfigurations.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Utility class to serialize a set of configurations.
+ * This is used to serialize a full snapshot.
+ */
+@XmlRootElement(name="configurations")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlComponentConfigurations 
+{
+	@XmlElement(name="configuration")
+	private List<ComponentConfigurationImpl> configurations;
+	
+	public XmlComponentConfigurations()
+	{}
+
+	public List<ComponentConfigurationImpl> getConfigurations() {
+		return configurations;
+	}
+
+	public void setConfigurations(List<ComponentConfigurationImpl> configurations) {
+		this.configurations = configurations;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertiesAdapted.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertiesAdapted.java
new file mode 100644
index 0000000000000000000000000000000000000000..528aaa016496f5c2cb85e85a047b9c8909e77d05
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertiesAdapted.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Helper class to serialize a property in XML.
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlConfigPropertiesAdapted 
+{
+	@XmlElement(name="property")
+	private XmlConfigPropertyAdapted[] properties;
+	
+	public XmlConfigPropertiesAdapted()
+	{}
+
+	public XmlConfigPropertyAdapted[] getProperties() {
+		return properties;
+	}
+
+	public void setProperties(XmlConfigPropertyAdapted[] properties) {
+		this.properties = properties;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertiesAdapter.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertiesAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..692cb7c9f0cd5e9988049919ae3aa43bb9928b46
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertiesAdapter.java
@@ -0,0 +1,429 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import org.eclipse.kura.core.configuration.XmlConfigPropertyAdapted.ConfigPropertyType;
+import org.eclipse.kura.crypto.CryptoService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Helper class to serialize a set of properties in XML.
+ */
+public class XmlConfigPropertiesAdapter extends XmlAdapter<XmlConfigPropertiesAdapted,Map<String,Object>> 
+{
+	@Override
+	public XmlConfigPropertiesAdapted marshal(Map<String,Object> props) 
+		throws Exception 
+	{
+		List<XmlConfigPropertyAdapted> adaptedValues = new ArrayList<XmlConfigPropertyAdapted>();
+		if (props != null) {
+			Iterator<String> keys = props.keySet().iterator();
+			while (keys.hasNext()) {
+	
+				XmlConfigPropertyAdapted adaptedValue = new XmlConfigPropertyAdapted();
+				adaptedValues.add(adaptedValue);
+				
+				String key = keys.next();			
+				adaptedValue.setName(key);
+	
+				Object value = props.get(key);
+				if (value instanceof String) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.stringType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Long) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.longType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Double) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.doubleType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Float) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.floatType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Integer) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.integerType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Byte) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.byteType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Character) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.charType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Boolean) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.booleanType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Short) {
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setType(ConfigPropertyType.shortType);
+		    		adaptedValue.setValues( new String[] { value.toString() });
+		    	}
+		    	else if (value instanceof Password) {
+		    		BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+		    		ServiceReference<CryptoService> cryptoServiceRef = bundleContext.getServiceReference(CryptoService.class);
+		    		CryptoService cryptoService = bundleContext.getService(cryptoServiceRef);
+		    		
+		    		adaptedValue.setArray(false);
+		    		adaptedValue.setEncrypted(true);
+		    		adaptedValue.setType(ConfigPropertyType.passwordType);
+		    		adaptedValue.setValues( new String[] { cryptoService.encodeBase64(value.toString()) });
+		    	}
+		    	else if (value instanceof String[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.stringType);
+		    		adaptedValue.setValues((String[]) value);
+		    	}
+		    	else if (value instanceof Long[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.longType);
+		    		Long[]   nativeValues = (Long[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Double[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.doubleType);
+		    		Double[] nativeValues = (Double[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Float[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.floatType);
+		    		Float[] nativeValues = (Float[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Integer[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.integerType);
+		    		Integer[] nativeValues = (Integer[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Byte[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.byteType);
+		    		Byte[] nativeValues = (Byte[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Character[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.charType);
+		    		Character[] nativeValues = (Character[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Boolean[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.booleanType);
+		    		Boolean[] nativeValues = (Boolean[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Short[]) {
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setType(ConfigPropertyType.shortType);
+		    		Short[] nativeValues = (Short[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = nativeValues[i].toString();
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+		    	else if (value instanceof Password[]) {
+		    		BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+		    		ServiceReference<CryptoService> cryptoServiceRef = bundleContext.getServiceReference(CryptoService.class);
+		    		CryptoService cryptoService = bundleContext.getService(cryptoServiceRef);
+		    		
+		    		adaptedValue.setArray(true);
+		    		adaptedValue.setEncrypted(true);
+		    		adaptedValue.setType(ConfigPropertyType.passwordType);
+		    		Password[] nativeValues = (Password[]) value;
+		    		String[] stringValues = new String[nativeValues.length];
+		    		for (int i=0;i <nativeValues.length; i++) {
+		    			if (nativeValues[i] != null) {
+		    				stringValues[i] = cryptoService.encodeBase64(nativeValues[i].toString());
+		    			}
+		    		}
+		    		adaptedValue.setValues(stringValues);
+		    	}
+			}
+		}
+		
+		XmlConfigPropertiesAdapted result = new XmlConfigPropertiesAdapted();
+		result.setProperties(adaptedValues.toArray( new XmlConfigPropertyAdapted[]{}));
+		return result;
+	}
+
+	
+	@Override
+	public Map<String,Object> unmarshal(XmlConfigPropertiesAdapted adaptedPropsAdapted) 
+		throws Exception 
+	{
+		Map<String,Object> properties = new HashMap<String, Object>();
+		XmlConfigPropertyAdapted[] adaptedProps = adaptedPropsAdapted.getProperties();
+		if (adaptedProps == null) {
+			return properties;
+		}
+		for (XmlConfigPropertyAdapted adaptedProp : adaptedProps) {
+			String propName  = adaptedProp.getName();
+			ConfigPropertyType type = adaptedProp.getType();
+			if (type != null) {
+				Object propvalue = null;
+				if (adaptedProp.getArray() == false) {
+					switch (adaptedProp.getType()) {
+					case stringType:
+						propvalue = (String) adaptedProp.getValues()[0];
+						break;
+					case longType:
+						propvalue = Long.parseLong(adaptedProp.getValues()[0]);
+						break;
+					case doubleType:
+						propvalue = Double.parseDouble(adaptedProp.getValues()[0]);
+						break;
+					case floatType:
+						propvalue = Float.parseFloat(adaptedProp.getValues()[0]);
+						break;
+					case integerType:
+						propvalue = Integer.parseInt(adaptedProp.getValues()[0]);
+						break;
+					case byteType:
+						propvalue = Byte.parseByte(adaptedProp.getValues()[0]);
+						break;
+					case charType:
+						String s = adaptedProp.getValues()[0];
+						propvalue = new Character(s.charAt(0));
+						break;
+					case booleanType:
+						propvalue = Boolean.parseBoolean(adaptedProp.getValues()[0]);
+						break;
+					case shortType:
+						propvalue = Short.parseShort(adaptedProp.getValues()[0]);
+						break;
+					case passwordType:
+						BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+			    		ServiceReference<CryptoService> cryptoServiceRef = bundleContext.getServiceReference(CryptoService.class);
+			    		CryptoService cryptoService = bundleContext.getService(cryptoServiceRef);
+			    		
+						propvalue = (String) adaptedProp.getValues()[0];
+						if (adaptedProp.isEncrypted()) {
+							try {
+								propvalue = new Password(cryptoService.decryptAes((String) propvalue));
+							} catch (Exception e) {
+								if (e instanceof IllegalBlockSizeException
+									|| e instanceof NoSuchAlgorithmException
+									|| e instanceof NoSuchPaddingException
+									|| e instanceof InvalidKeyException
+									|| e instanceof IOException
+									|| e instanceof IllegalBlockSizeException
+									|| e instanceof BadPaddingException)
+								{
+									propvalue = new Password(cryptoService.decodeBase64((String) propvalue));
+								} else {
+									throw e;
+								}
+							}
+						}
+						else {
+							propvalue = new Password((String) propvalue);
+						}
+						break;
+					}
+				}
+				else {
+					switch (adaptedProp.getType()) {
+					case stringType:
+						propvalue = adaptedProp.getValues();
+						break;
+					case longType:
+						Long[] longValues = new Long[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								longValues[i] = Long.parseLong(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = longValues;
+						break;
+					case doubleType:
+						Double[] doubleValues = new Double[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								doubleValues[i] = Double.parseDouble(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = doubleValues;
+						break;
+					case floatType:
+						Float[] floatValues = new Float[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								floatValues[i] = Float.parseFloat(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = floatValues;
+						break;
+					case integerType:
+						Integer[] intValues = new Integer[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								intValues[i] = Integer.parseInt(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = intValues;
+						break;
+					case byteType:
+						Byte[] byteValues = new Byte[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								byteValues[i] = Byte.parseByte(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = byteValues;
+						break;
+					case charType:
+						Character[] charValues = new Character[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								String s = adaptedProp.getValues()[i];
+								charValues[i] = new Character(s.charAt(0));
+							}
+						}
+						propvalue = charValues;
+						break;
+					case booleanType:
+						Boolean[] booleanValues = new Boolean[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								booleanValues[i] = Boolean.parseBoolean(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = booleanValues;
+						break;
+					case shortType:
+						Short[] shortValues = new Short[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								shortValues[i] = Short.parseShort(adaptedProp.getValues()[i]);
+							}
+						}
+						propvalue = shortValues;
+						break;
+					case passwordType:
+						BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+			    		ServiceReference<CryptoService> cryptoServiceRef = bundleContext.getServiceReference(CryptoService.class);
+			    		CryptoService cryptoService = bundleContext.getService(cryptoServiceRef);
+			    		
+						Password[] pwdValues = new Password[adaptedProp.getValues().length];
+						for (int i=0; i<adaptedProp.getValues().length; i++) {
+							if (adaptedProp.getValues()[i] != null) {
+								if (adaptedProp.isEncrypted()) {
+									try {
+										pwdValues[i] = new Password(cryptoService.decryptAes(adaptedProp.getValues()[i]));
+									} catch (Exception e) {
+										if (e instanceof IllegalBlockSizeException
+											|| e instanceof NoSuchAlgorithmException
+											|| e instanceof NoSuchPaddingException
+											|| e instanceof InvalidKeyException
+											|| e instanceof IOException
+											|| e instanceof IllegalBlockSizeException
+											|| e instanceof BadPaddingException)
+										{
+											pwdValues[i] = new Password(cryptoService.decodeBase64(adaptedProp.getValues()[i]));
+										} else {
+											throw e;
+										}
+									}
+								}
+								else {
+									pwdValues[i] = new Password(adaptedProp.getValues()[i]);
+								}
+							}
+						}
+						propvalue = pwdValues;
+						break;
+					}
+				}
+				properties.put(propName, propvalue);
+			}
+		}
+		return properties;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertyAdapted.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertyAdapted.java
new file mode 100644
index 0000000000000000000000000000000000000000..d831f4922bc804621092186fd2a993ebca970603
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlConfigPropertyAdapted.java
@@ -0,0 +1,111 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+
+
+/**
+ * Helper class to serialize a property in XML.
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlConfigPropertyAdapted 
+{
+	@XmlEnum
+	public enum ConfigPropertyType {
+		@XmlEnumValue("String")    stringType,
+		@XmlEnumValue("Long")      longType,
+		@XmlEnumValue("Double")    doubleType,
+		@XmlEnumValue("Float")     floatType,
+		@XmlEnumValue("Integer")   integerType,
+		@XmlEnumValue("Byte")      byteType,
+		@XmlEnumValue("Char")      charType,
+		@XmlEnumValue("Boolean")   booleanType,
+		@XmlEnumValue("Short")     shortType,
+		@XmlEnumValue("Password")  passwordType
+	}
+
+	@XmlAttribute(name="name")
+	private String             name;
+
+	@XmlAttribute(name="array")
+	private boolean            array;
+	
+	@XmlAttribute(name="encrypted")
+	private boolean            encrypted;
+
+	@XmlAttribute(name="type")
+	private ConfigPropertyType type;
+
+	@XmlElement(name="value")
+	private String[]           values;
+	
+	
+	public XmlConfigPropertyAdapted()
+	{}	
+	
+	public XmlConfigPropertyAdapted(String name,
+									ConfigPropertyType type, 
+								    String[] values) 
+	{
+		super();
+
+		this.type      = type;
+		this.values    = values;
+		this.encrypted = false;   
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public boolean getArray() {
+		return array;
+	}
+
+	public void setArray(boolean array) {
+		this.array = array;
+	}
+
+	public ConfigPropertyType getType() {
+		return type;
+	}
+
+	public void setType(ConfigPropertyType type) {
+		this.type = type;
+	}	
+	
+	public boolean isEncrypted() {
+		return encrypted;
+	}
+
+	public void setEncrypted(boolean encrypted) {
+		this.encrypted = encrypted;
+	}
+
+	public String[] getValues() {
+		return values;
+	}
+
+	public void setValues(String[] values) {
+		this.values = values;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlSnapshotIdResult.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlSnapshotIdResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..28f5e048b9b09356208c5aca651a76e72d4a3ec7
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/XmlSnapshotIdResult.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Utility class to serialize a set of snapshot ids.
+ */
+@XmlRootElement(name="snapshot-ids")
+public class XmlSnapshotIdResult 
+{
+	private List<Long> snapshotIds;
+	
+	public XmlSnapshotIdResult()
+	{}
+
+	public List<Long> getSnapshotIds() {
+		return snapshotIds;
+	}
+
+	public void setSnapshotIds(List<Long> snapshotIds) {
+		this.snapshotIds = snapshotIds;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/ObjectFactory.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/ObjectFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8a52bed8149cdd438cc7180e3b34108f216f99a
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/ObjectFactory.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the org.eclipse.kura.core.configuration.metatype package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _MetaData_QNAME = new QName("http://www.osgi.org/xmlns/metatype/v1.2.0", "MetaData");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.eclipse.kura.core.configuration.metatype
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link Ticon }
+     * 
+     */
+    public Ticon createTicon() {
+        return new Ticon();
+    }
+
+    /**
+     * Create an instance of {@link Tattribute }
+     * 
+     */
+    public Tattribute createTattribute() {
+        return new Tattribute();
+    }
+
+    /**
+     * Create an instance of {@link Tmetadata }
+     * 
+     */
+    public Tmetadata createTmetadata() {
+        return new Tmetadata();
+    }
+
+    /**
+     * Create an instance of {@link Tdesignate }
+     * 
+     */
+    public Tdesignate createTdesignate() {
+        return new Tdesignate();
+    }
+
+    /**
+     * Create an instance of {@link Tad }
+     * 
+     */
+    public Tad createTad() {
+        return new Tad();
+    }
+
+    /**
+     * Create an instance of {@link Tobject }
+     * 
+     */
+    public Tobject createTobject() {
+        return new Tobject();
+    }
+
+    /**
+     * Create an instance of {@link Tocd }
+     * 
+     */
+    public Tocd createTocd() {
+        return new Tocd();
+    }
+
+    /**
+     * Create an instance of {@link Toption }
+     * 
+     */
+    public Toption createToption() {
+        return new Toption();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link Tmetadata }{@code >}}
+     * 
+     */
+    @XmlElementDecl(namespace = "http://www.osgi.org/xmlns/metatype/v1.2.0", name = "MetaData")
+    public JAXBElement<Tmetadata> createMetaData(Tmetadata value) {
+        return new JAXBElement<Tmetadata>(_MetaData_QNAME, Tmetadata.class, null, value);
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tad.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tad.java
new file mode 100644
index 0000000000000000000000000000000000000000..054a3a77e48f662c57e4aaca9a4aa9dcbdd32922
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tad.java
@@ -0,0 +1,407 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.AD;
+import org.eclipse.kura.configuration.metatype.Option;
+import org.eclipse.kura.configuration.metatype.Scalar;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Tad complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tad">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Option" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Toption" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="type" use="required" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tscalar" />
+ *       &lt;attribute name="cardinality" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
+ *       &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="default" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="required" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="AD", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Tad", propOrder = {
+    "option",
+    "any"
+})
+public class Tad implements AD
+{
+    @XmlElement(name = "Option", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+    protected List<Toption> option;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "name")
+    protected String name;
+    @XmlAttribute(name = "description")
+    protected String description;
+    @XmlAttribute(name = "id", required = true)
+    protected String id;
+    @XmlAttribute(name = "type", required = true)
+    protected Tscalar type;
+    @XmlAttribute(name = "cardinality")
+    protected Integer cardinality;
+    @XmlAttribute(name = "min")
+    protected String min;
+    @XmlAttribute(name = "max")
+    protected String max;
+    @XmlAttribute(name = "default")
+    protected String _default;
+    @XmlAttribute(name = "required")
+    protected Boolean required;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the option property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the option property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getOption().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Toption }
+     * 
+     * 
+     */
+    public List<Option> getOption() {
+        if (option == null) {
+            option = new ArrayList<Toption>();
+        }
+        return new ArrayList<Option>(this.option);
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the name property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the value of the name property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setName(String value) {
+        this.name = value;
+    }
+
+    /**
+     * Gets the value of the description property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Sets the value of the description property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setDescription(String value) {
+        this.description = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets the value of the type property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Tscalar }
+     *     
+     */
+    public Scalar getType() {
+        return Scalar.valueOf(type.name());
+    }
+
+    /**
+     * Sets the value of the type property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Tscalar }
+     *     
+     */
+    public void setType(Tscalar value) {
+        this.type = value;
+    }
+
+    /**
+     * Gets the value of the cardinality property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Integer }
+     *     
+     */
+    public int getCardinality() {
+        if (cardinality == null) {
+            return  0;
+        } else {
+            return cardinality;
+        }
+    }
+
+    /**
+     * Sets the value of the cardinality property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Integer }
+     *     
+     */
+    public void setCardinality(Integer value) {
+        this.cardinality = value;
+    }
+
+    /**
+     * Gets the value of the min property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getMin() {
+        return min;
+    }
+
+    /**
+     * Sets the value of the min property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setMin(String value) {
+        this.min = value;
+    }
+
+    /**
+     * Gets the value of the max property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getMax() {
+        return max;
+    }
+
+    /**
+     * Sets the value of the max property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setMax(String value) {
+        this.max = value;
+    }
+
+    /**
+     * Gets the value of the default property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDefault() {
+        return _default;
+    }
+
+    /**
+     * Sets the value of the default property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setDefault(String value) {
+        this._default = value;
+    }
+
+    /**
+     * Gets the value of the required property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Boolean }
+     *     
+     */
+    public boolean isRequired() {
+        if (required == null) {
+            return true;
+        } else {
+            return required;
+        }
+    }
+
+    /**
+     * Sets the value of the required property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Boolean }
+     *     
+     */
+    public void setRequired(Boolean value) {
+        this.required = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tattribute.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tattribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd0b0e14e923b740468c9940da5ef5280d699d8b
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tattribute.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.Attribute;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Tattribute complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tattribute">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Value" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="adref" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="content" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="Attribute", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Tattribute", propOrder = {
+    "value",
+    "any"
+})
+public class Tattribute implements Attribute 
+{
+    @XmlElement(name = "Value", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+    protected List<String> value;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "adref", required = true)
+    protected String adref;
+    @XmlAttribute(name = "content")
+    protected String content;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the value property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getValue().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * 
+     * 
+     */
+    public List<String> getValue() {
+        if (value == null) {
+            value = new ArrayList<String>();
+        }
+        return this.value;
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the adref property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getAdref() {
+        return adref;
+    }
+
+    /**
+     * Sets the value of the adref property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setAdref(String value) {
+        this.adref = value;
+    }
+
+    /**
+     * Gets the value of the content property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getContent() {
+        return content;
+    }
+
+    /**
+     * Sets the value of the content property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setContent(String value) {
+        this.content = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tdesignate.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tdesignate.java
new file mode 100644
index 0000000000000000000000000000000000000000..dca8a599edc875c2b86b98cf291d1324186f0572
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tdesignate.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.Designate;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Tdesignate complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tdesignate">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Object" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tobject"/>
+ *         &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="pid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="factoryPid" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="bundle" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="optional" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       &lt;attribute name="merge" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="Designate", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Tdesignate", propOrder = {
+    "object",
+    "any"
+})
+public class Tdesignate implements Designate 
+{
+    @XmlElement(name = "Object", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0", required = true)
+    protected Tobject object;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "pid")
+    protected String pid;
+    @XmlAttribute(name = "factoryPid")
+    protected String factoryPid;
+    @XmlAttribute(name = "bundle")
+    protected String bundle;
+    @XmlAttribute(name = "optional")
+    protected Boolean optional;
+    @XmlAttribute(name = "merge")
+    protected Boolean merge;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the object property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Tobject }
+     *     
+     */
+    public Tobject getObject() {
+        return object;
+    }
+
+    /**
+     * Sets the value of the object property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Tobject }
+     *     
+     */
+    public void setObject(Tobject value) {
+        this.object = value;
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the pid property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getPid() {
+        return pid;
+    }
+
+    /**
+     * Sets the value of the pid property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setPid(String value) {
+        this.pid = value;
+    }
+
+    /**
+     * Gets the value of the factoryPid property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getFactoryPid() {
+        return factoryPid;
+    }
+
+    /**
+     * Sets the value of the factoryPid property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setFactoryPid(String value) {
+        this.factoryPid = value;
+    }
+
+    /**
+     * Gets the value of the bundle property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getBundle() {
+        return bundle;
+    }
+
+    /**
+     * Sets the value of the bundle property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setBundle(String value) {
+        this.bundle = value;
+    }
+
+    /**
+     * Gets the value of the optional property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Boolean }
+     *     
+     */
+    public boolean isOptional() {
+        if (optional == null) {
+            return false;
+        } else {
+            return optional;
+        }
+    }
+
+    /**
+     * Sets the value of the optional property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Boolean }
+     *     
+     */
+    public void setOptional(Boolean value) {
+        this.optional = value;
+    }
+
+    /**
+     * Gets the value of the merge property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Boolean }
+     *     
+     */
+    public boolean isMerge() {
+        if (merge == null) {
+            return false;
+        } else {
+            return merge;
+        }
+    }
+
+    /**
+     * Sets the value of the merge property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Boolean }
+     *     
+     */
+    public void setMerge(Boolean value) {
+        this.merge = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Ticon.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Ticon.java
new file mode 100644
index 0000000000000000000000000000000000000000..49ac7fd50adf8f64ceb61f3fa034a7e5e6d0dd36
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Ticon.java
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.Icon;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Ticon complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Ticon">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="resource" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="size" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="Icon", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Ticon", propOrder = {
+    "any"
+})
+public class Ticon implements Icon  
+{
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "resource", required = true)
+    protected String resource;
+    @XmlAttribute(name = "size", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger size;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the resource property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getResource() {
+        return resource;
+    }
+
+    /**
+     * Sets the value of the resource property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setResource(String value) {
+        this.resource = value;
+    }
+
+    /**
+     * Gets the value of the size property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *     
+     */
+    public BigInteger getSize() {
+        return size;
+    }
+
+    /**
+     * Sets the value of the size property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *     
+     */
+    public void setSize(BigInteger value) {
+        this.size = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tmetadata.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tmetadata.java
new file mode 100644
index 0000000000000000000000000000000000000000..89a2dc472a8ee77192f51102b271e0d3d4a6fff5
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tmetadata.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.Designate;
+import org.eclipse.kura.configuration.metatype.MetaData;
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Tmetadata complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tmetadata">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="OCD" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tocd" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;element name="Designate" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tdesignate" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="localization" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="MetaData", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Tmetadata", propOrder = {
+    "ocd",
+    "designate",
+    "any"
+})
+public class Tmetadata implements MetaData 
+{
+    @XmlElement(name = "OCD", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+    protected List<Tocd> ocd;
+    @XmlElement(name = "Designate", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+    protected List<Tdesignate> designate;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "localization")
+    protected String localization;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the ocd property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the ocd property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getOCD().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Tocd }
+     * 
+     * 
+     */
+    public List<OCD> getOCD() {
+        if (ocd == null) {
+            ocd = new ArrayList<Tocd>();
+        }
+        return new ArrayList<OCD>(this.ocd);
+    }
+
+    /**
+     * Gets the value of the designate property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the designate property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getDesignate().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Tdesignate }
+     * 
+     * 
+     */
+    public List<Designate> getDesignate() {
+        if (designate == null) {
+            designate = new ArrayList<Tdesignate>();
+        }
+        return new ArrayList<Designate>(this.designate);
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the localization property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getLocalization() {
+        return localization;
+    }
+
+    /**
+     * Sets the value of the localization property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setLocalization(String value) {
+        this.localization = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tobject.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tobject.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ade3f4cd5d1a0b5225080c074fa79348842baf0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tobject.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.Attribute;
+import org.eclipse.kura.configuration.metatype.TObject;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Tobject complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tobject">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="Attribute" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tattribute" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="ocdref" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="Object", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Tobject", propOrder = {
+    "attribute",
+    "any"
+})
+public class Tobject implements TObject
+{
+    @XmlElement(name = "Attribute", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+    protected List<Tattribute> attribute;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "ocdref", required = true)
+    protected String ocdref;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the attribute property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the attribute property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAttribute().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Tattribute }
+     * 
+     * 
+     */
+    public List<Attribute> getAttribute() {
+        if (attribute == null) {
+            attribute = new ArrayList<Tattribute>();
+        }
+        return new ArrayList<Attribute>(this.attribute);
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the ocdref property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getOcdref() {
+        return ocdref;
+    }
+
+    /**
+     * Sets the value of the ocdref property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setOcdref(String value) {
+        this.ocdref = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tocd.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tocd.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c2fc924d8d0de2f4b8385adffe440bbb641eeac
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tocd.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.AD;
+import org.eclipse.kura.configuration.metatype.Icon;
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Tocd complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Tocd">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="AD" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Tad" maxOccurs="unbounded"/>
+ *         &lt;element name="Icon" type="{http://www.osgi.org/xmlns/metatype/v1.2.0}Ticon" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="OCD", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Tocd", propOrder = {
+    "ad",
+    "icon",
+    "any"
+})
+public class Tocd implements OCD 
+{
+    @XmlElement(name = "AD", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0", required=true)
+    protected List<Tad> ad;
+    @XmlElement(name = "Icon", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+    protected List<Ticon> icon;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "name", required = true)
+    protected String name;
+    @XmlAttribute(name = "description")
+    protected String description;
+    @XmlAttribute(name = "id", required = true)
+    protected String id;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the ad property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the ad property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAD().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Tad }
+     * 
+     * 
+     */
+    public List<AD> getAD() {
+        if (ad == null) {
+            ad = new ArrayList<Tad>();
+        }
+        return new ArrayList<AD>(this.ad);
+    }
+    
+    public void addAD(Tad tad) {
+    	if (ad == null) {
+            ad = new ArrayList<Tad>();
+        }
+    	
+    	ad.add(tad);
+    }
+
+    /**
+     * Gets the value of the icon property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the icon property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getIcon().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Ticon }
+     * 
+     * 
+     */
+    public List<Icon> getIcon() {
+        if (icon == null) {
+            icon = new ArrayList<Ticon>();
+        }
+        return new ArrayList<Icon>(this.icon);
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the name property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the value of the name property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setName(String value) {
+        this.name = value;
+    }
+
+    /**
+     * Gets the value of the description property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Sets the value of the description property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setDescription(String value) {
+        this.description = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Toption.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Toption.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac5ee190b9807a50aea07dd9c8c30ccaa3e8655c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Toption.java
@@ -0,0 +1,174 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.eclipse.kura.configuration.metatype.Option;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for Toption complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="Toption">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="label" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       &lt;anyAttribute/>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlRootElement(name="Option", namespace="http://www.osgi.org/xmlns/metatype/v1.2.0")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Toption", propOrder = {
+    "any"
+})
+public class Toption implements Option 
+{
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "label", required = true)
+    protected String label;
+    @XmlAttribute(name = "value", required = true)
+    protected String value;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the label property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getLabel() {
+        return label;
+    }
+
+    /**
+     * Sets the value of the label property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setLabel(String value) {
+        this.label = value;
+    }
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tscalar.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tscalar.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc32372b86e041b6d58fd1325b9a8616dac3cdb3
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/Tscalar.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+
+package org.eclipse.kura.core.configuration.metatype;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for Tscalar.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="Tscalar">
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     &lt;enumeration value="String"/>
+ *     &lt;enumeration value="Long"/>
+ *     &lt;enumeration value="Double"/>
+ *     &lt;enumeration value="Float"/>
+ *     &lt;enumeration value="Integer"/>
+ *     &lt;enumeration value="Byte"/>
+ *     &lt;enumeration value="Char"/>
+ *     &lt;enumeration value="Boolean"/>
+ *     &lt;enumeration value="Short"/>
+ *     &lt;enumeration value="Password"/>
+ *   &lt;/restriction>
+ * &lt;/simpleType>
+ * </pre>
+ * 
+ */
+@XmlEnum
+@XmlType(name = "Tscalar")
+public enum Tscalar 
+{
+    @XmlEnumValue("String")
+    STRING("String"),
+    @XmlEnumValue("Long")
+    LONG("Long"),
+    @XmlEnumValue("Double")
+    DOUBLE("Double"),
+    @XmlEnumValue("Float")
+    FLOAT("Float"),
+    @XmlEnumValue("Integer")
+    INTEGER("Integer"),
+    @XmlEnumValue("Byte")
+    BYTE("Byte"),
+    @XmlEnumValue("Char")
+    CHAR("Char"),
+    @XmlEnumValue("Boolean")
+    BOOLEAN("Boolean"),
+    @XmlEnumValue("Short")
+    SHORT("Short"),
+    @XmlEnumValue("Password")
+    PASSWORD("Password");
+    private final String value;
+
+    Tscalar(String v) {
+        value = v;
+    }
+
+    public String value() {
+        return value;
+    }
+
+    public static Tscalar fromValue(String v) {
+        for (Tscalar c: Tscalar.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/package-info.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..042867f1464cee5e6d7b5c8a6f9a94c74e0b7e7c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/metatype/package-info.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.2-147 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.11.25 at 06:05:15 PM CET 
+//
+
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.osgi.org/xmlns/metatype/v1.2.0")
+package org.eclipse.kura.core.configuration.metatype;
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/package-info.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..002036a8f2f2db59661bbd73d1155ee4db711482
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/package-info.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2012.10.26 at 02:11:54 PM CEST 
+//
+
+@javax.xml.bind.annotation.XmlSchema(
+	    namespace="http://eurotech.com/esf/2.0", 
+	    xmlns = { 
+	        @XmlNs(namespaceURI="http://eurotech.com/esf/2.0", prefix="esf"),
+	        @XmlNs(namespaceURI="http://www.osgi.org/xmlns/metatype/v1.2.0", prefix="ocd")
+	    },
+		elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
+		attributeFormDefault=javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED
+)
+package org.eclipse.kura.core.configuration;
+import javax.xml.bind.annotation.XmlNs;
+
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/CollectionsUtil.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/CollectionsUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..204347b540485d0a1827acfc6ab54d334897e519
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/CollectionsUtil.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration.util;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.kura.configuration.metatype.AD;
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.eclipse.kura.configuration.metatype.Scalar;
+import org.eclipse.kura.core.configuration.Password;
+
+public class CollectionsUtil 
+{
+	public static Map<String,Object> dictionaryToMap(Dictionary<String,Object> dictionary, OCD ocd)
+	{
+		if (dictionary == null) {
+			return null;
+		}
+
+		Map<String,AD> ads = new HashMap<String,AD>();
+		if (ocd != null) {
+			for (AD ad : ocd.getAD()) {
+				ads.put(ad.getId(), ad);
+			}
+		}
+		Map<String,Object>   map = new HashMap<String,Object>();
+		Enumeration<String> keys = dictionary.keys();
+		while (keys.hasMoreElements()) {
+			
+			String   key = keys.nextElement();
+			Object value =  dictionary.get(key);
+			AD        ad = ads.get(key);
+			if (ad != null && ad.getType() != null && Scalar.PASSWORD.equals(ad.getType())) {
+				map.put(key, new Password(value.toString()));
+			}
+			else {
+				map.put(key, value);
+			}
+		}
+		return map;
+	}
+
+
+	public static Dictionary<String,Object> mapToDictionary(Map<String,Object> map)
+	{
+		if (map == null) {
+			return null;
+		}
+
+		Dictionary<String,Object> dictionary = new Hashtable<String,Object>();
+		Iterator<String> keys = map.keySet().iterator();
+		while (keys.hasNext()) {
+			String key = keys.next();
+			Object value = map.get(key);
+			if (value != null) {
+				if (value instanceof Password) {
+					dictionary.put(key, value.toString());
+				}
+				else {
+					dictionary.put(key, value);
+				}
+			}
+		}
+		return dictionary;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/ComponentUtil.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/ComponentUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb97ffbbe011fb68b7807abaf598fdf3c70b7aeb
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/ComponentUtil.java
@@ -0,0 +1,350 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLStreamException;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.configuration.metatype.AD;
+import org.eclipse.kura.configuration.metatype.MetaData;
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.eclipse.kura.configuration.metatype.Scalar;
+import org.eclipse.kura.core.configuration.Password;
+import org.eclipse.kura.core.configuration.metatype.Tmetadata;
+import org.eclipse.kura.core.configuration.metatype.Tocd;
+import org.eclipse.kura.core.util.IOUtil;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.metatype.MetaTypeInformation;
+import org.osgi.service.metatype.MetaTypeService;
+import org.osgi.service.metatype.ObjectClassDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Utility class to handle the loading of the meta-information 
+ * of a bundle or one of its Services/Components.
+ */
+public class ComponentUtil 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ComponentUtil.class);
+	
+	/**
+	 * Returns a Map with all the MetaType Object Class Definitions contained in the bundle.
+	 * 
+	 * @param ctx
+	 * @param bnd
+	 * @return
+	 */
+	public static Map<String,OCD> getObjectClassDefinition(BundleContext ctx, Bundle bnd)
+	{
+		Map<String,OCD> bundleDefaults = new HashMap<String,OCD>();
+		
+		ServiceReference<MetaTypeService> ref = ctx.getServiceReference(MetaTypeService.class);
+		MetaTypeService metaTypeService = ctx.getService(ref);
+		MetaTypeInformation mti = metaTypeService.getMetaTypeInformation(bnd);
+		if (mti != null) {
+
+			String[] pids = mti.getPids();
+			if (pids != null) {				
+				for (String pid : pids) {					
+					OCD ocd = null;
+					try {
+						ocd =  readObjectClassDefinition(bnd, pid);
+						if (ocd != null) {
+							bundleDefaults.put(pid, ocd);
+						}
+					}
+					catch (Exception e) {
+						// ignore: OCD for the specified pid is not found
+						s_logger.warn("Error loading OCD for pid "+pid, e);
+					}
+				}
+			}
+		}
+		return bundleDefaults;
+	}
+	
+	
+	
+	/**
+	 * Returns the ObjectClassDefinition for the provided Service pid
+	 * as returned by the native OSGi MetaTypeService. 
+	 * The returned ObjectClassDefinition is a thick object tied to 
+	 * OSGi framework which masks certain attributes of the OCD XML
+	 * file - like required and min/max values - but which exposes
+	 * business logic like the validate method for each attribute.
+	 *  
+	 * @param ctx
+	 * @param pid
+	 * @return
+	 */
+	public static ObjectClassDefinition getObjectClassDefinition(BundleContext ctx, String pid)
+	{
+		//
+		ServiceReference<MetaTypeService> ref = ctx.getServiceReference(MetaTypeService.class);
+		MetaTypeService metaTypeService = ctx.getService(ref);
+		MetaTypeInformation mti = metaTypeService.getMetaTypeInformation(ctx.getBundle());
+
+		ObjectClassDefinition ocd = null;
+		try {
+			if (mti != null) {
+				ocd = mti.getObjectClassDefinition(pid, null); // default locale
+			}
+		}
+		catch (IllegalArgumentException iae) {
+			// ignore: OCD for the specified pid is not found
+		}
+		return ocd;
+	}
+	
+	
+	/**
+	 * Returned the ObjectClassDefinition as parsed from the XML file.
+	 * The returned OCD is just an object representation of the OCD
+	 * element contained in the XML MetaData file and it does not 
+	 * contain any extra post-processing of the loaded information.  
+	 * 
+	 * @param resourceUrl Url of the MetaData XML file which needs to be loaded
+	 * @return
+	 * @throws IOException
+	 * @throws JAXBException
+	 * @throws XMLStreamException
+	 * @throws FactoryConfigurationError
+	 */
+	public static OCD readObjectClassDefinition(URL resourceUrl)
+		throws IOException, JAXBException, XMLStreamException, FactoryConfigurationError
+	{
+		OCD ocd = null;
+		String metatypeXml = IOUtil.readResource(resourceUrl);
+		if (metatypeXml != null) {
+			MetaData metaData = XmlUtil.unmarshal(metatypeXml, MetaData.class);		
+			if (metaData.getOCD() != null && metaData.getOCD().size() > 0) {				
+				ocd = metaData.getOCD().get(0);
+			}
+			else {
+				s_logger.warn("Cannot find OCD for component with url: {}", resourceUrl.toString());
+			}
+		}
+		return ocd;					
+	}
+	
+	
+	/**
+	 * Returned the ObjectClassDefinition as parsed from the XML file.
+	 * The returned OCD is just an object representation of the OCD
+	 * element contained in the XML MetaData file and it does not 
+	 * contain any extra post-processing of the loaded information.  
+	 * 
+	 * @param pid ID of the service whose OCD should be loaded
+	 * @return
+	 * @throws IOException
+	 * @throws JAXBException
+	 * @throws XMLStreamException
+	 * @throws FactoryConfigurationError
+	 */
+	public static Tocd readObjectClassDefinition(String pid)
+		throws IOException, JAXBException, XMLStreamException, FactoryConfigurationError
+	{
+		Tocd ocd = null;
+		StringBuilder sbMetatypeXmlName = new StringBuilder();
+		sbMetatypeXmlName.append("OSGI-INF/metatype/").append(pid).append(".xml");
+		
+		String metatypeXmlName = sbMetatypeXmlName.toString();
+		String metatypeXml = IOUtil.readResource(metatypeXmlName);
+		if (metatypeXml != null) {			
+			Tmetadata metaData = XmlUtil.unmarshal(metatypeXml, Tmetadata.class);	
+			if (metaData.getOCD() != null && metaData.getOCD().size() > 0) {
+				ocd = (Tocd) metaData.getOCD().get(0);
+			}
+			else {
+				s_logger.warn("Cannot find OCD for component with pid: {}", pid);
+			}
+		}
+		return ocd;			
+	}
+	
+	
+	/**
+	 * Returned the ObjectClassDefinition as parsed from the XML file.
+	 * The returned OCD is just an object representation of the OCD
+	 * element contained in the XML MetaData file and it does not 
+	 * contain any extra post-processing of the loaded information.  
+	 * 
+	 * @param ctx
+	 * @param pid ID of the service whose OCD should be loaded
+	 * @return
+	 * @throws IOException
+	 * @throws JAXBException
+	 * @throws XMLStreamException
+	 * @throws FactoryConfigurationError
+	 */
+	public static Tocd readObjectClassDefinition(Bundle bundle, String pid)
+		throws IOException, JAXBException, XMLStreamException, FactoryConfigurationError
+	{
+		Tocd ocd = null;
+		StringBuilder sbMetatypeXmlName = new StringBuilder();
+		sbMetatypeXmlName.append("OSGI-INF/metatype/").append(pid).append(".xml");
+		
+		String metatypeXmlName = sbMetatypeXmlName.toString();
+		String metatypeXml = IOUtil.readResource(bundle, metatypeXmlName);		
+		if (metatypeXml != null) {
+			Tmetadata metaData = XmlUtil.unmarshal(metatypeXml, Tmetadata.class);	
+			if (metaData.getOCD() != null && metaData.getOCD().size() > 0) {
+				ocd = (Tocd) metaData.getOCD().get(0);
+			}
+		}
+		return ocd;				
+	}
+	
+	
+	public static Map<String,Object> getDefaultProperties(OCD ocd)
+		throws KuraException
+	{
+		//
+		// reconcile by looping through the ocd properties
+		Map<String,Object> defaults = null;
+		defaults =  new HashMap<String,Object>();
+		if (ocd != null) {
+			
+			List<AD> attrDefs = ocd.getAD();
+			if (attrDefs != null) {
+				
+				for (AD attrDef : attrDefs) {
+					
+					String name = attrDef.getName();
+					Object   defaultValue = getDefaultValue(attrDef);
+					if (defaults.get(name) == null && defaultValue != null) {
+						defaults.put(name, defaultValue);
+					}
+				}
+			}
+		}
+		return defaults;
+	}	
+	
+	
+	private static Object getDefaultValue(AD attrDef)
+	{
+		// get the default value string from the AD
+		// then split it by comma-separate list
+		// keeping in mind the possible escape sequence "\,"
+		String defaultValue = attrDef.getDefault(); 
+		if (defaultValue == null || defaultValue.length() == 0) {
+			return null;
+		}		
+
+		Object[] objectValues  = null;		
+		Scalar type = attrDef.getType();
+		if (type != null) {
+		
+			// split the default value in separate string 
+			// if cardinality is greater than 0 or abs(1)
+			String[] defaultValues = new String[] { defaultValue };
+			int cardinality = attrDef.getCardinality();
+			if (cardinality != 0 || cardinality != 1 || cardinality != -1) {
+				defaultValues = StringUtil.splitValues(defaultValue);
+			}
+			
+			// convert string values into object values
+			objectValues = getObjectValue(type, defaultValues);
+			if (cardinality == 0 || cardinality == 1 || cardinality == -1) {
+				
+				// return one single object  
+				// if cardinality is 0 or abs(1)
+				return objectValues[0];
+			}
+		}
+		else {
+			s_logger.warn("Unknown type for attribute {}", attrDef.getId());
+		}
+		return objectValues;
+	}
+
+
+	
+	private static Object[] getObjectValue(Scalar type, String[] defaultValues)
+	{		
+		List<Object> values = new ArrayList<Object>();
+		switch (type) {
+		case BOOLEAN:
+			for (String value : defaultValues) {
+				values.add(Boolean.valueOf(value));				
+			}
+			return values.toArray( new Boolean[]{});
+		
+		case BYTE: 
+			for (String value : defaultValues) {
+				values.add(Byte.valueOf(value));				
+			}
+			return values.toArray( new Byte[]{});
+		
+		case CHAR: 
+			for (String value : defaultValues) {
+				values.add( new Character(value.charAt(0)));		
+			}
+			return values.toArray( new Character[]{});
+
+		case DOUBLE: 
+			for (String value : defaultValues) {
+				values.add(Double.valueOf(value));		
+			}
+			return values.toArray( new Double[]{});
+
+		case FLOAT: 
+			for (String value : defaultValues) {
+				values.add(Float.valueOf(value));
+			}
+			return values.toArray( new Float[]{});
+
+		case INTEGER: 
+			for (String value : defaultValues) {
+				values.add(Integer.valueOf(value));		
+			}
+			return values.toArray( new Integer[]{});
+
+		case LONG: 
+			for (String value : defaultValues) {
+				values.add(Long.valueOf(value));		
+			}
+			return values.toArray( new Long[]{});
+
+		case SHORT: 
+			for (String value : defaultValues) {
+				values.add(Short.valueOf(value));		
+			}
+			return values.toArray( new Short[]{});
+			
+		case PASSWORD: 
+			for (String value : defaultValues) {
+				values.add( new Password(value));		
+			}
+			return values.toArray( new Password[]{});
+
+		case STRING:
+			return defaultValues;
+		}
+		
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/StringUtil.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/StringUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..c617b8375696688a3717885f48015a504d49347d
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/StringUtil.java
@@ -0,0 +1,319 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.core.configuration.Password;
+
+public class StringUtil 
+{		
+	private static final char DELIMITER = ',';
+	private static final char ESCAPE    = '\\';
+	
+	public static String[] splitValues(String strValues) 	
+	{
+//		List<String> defaultValues = new ArrayList<String>();
+//		String[] stringValues = defaultValue.split("(?<!\\\\)(?>\\\\\\\\)*,");
+//		for (int i=0; i<stringValues.length; i++) {
+//			if (stringValues[i] != null && stringValues[i].trim().length() > 0) {
+//				defaultValues.add(unescapeString(stringValues[i]));
+//			}
+//		}
+//		return defaultValues.toArray( new String[]{});
+		if (strValues == null)
+			return null;
+
+		// The trick is to strip out unescaped whitespace characters before and
+		// after the input string as well as before and after each 
+		// individual token within the input string without losing any escaped 
+		// whitespace characters. Whitespace between two non-whitespace
+		// characters may or may not be escaped. Also, any character may be
+		// escaped. The escape character is '\'. The delimiter is ','.
+		List<String> values = new ArrayList<String>();
+		StringBuilder buffer = new StringBuilder();
+		// Loop over the characters within the input string and extract each
+		// value token.
+		for (int i = 0; i < strValues.length(); i++) {
+			char c1 = strValues.charAt(i);
+			switch (c1) {
+				case DELIMITER :
+					// When the delimiter is encountered, add the extracted 
+					// token to the result and prepare the buffer to receive the
+					// next token.
+					values.add(buffer.toString());
+					buffer.delete(0, buffer.length());
+					break;
+				case ESCAPE :
+					// When the escape is encountered, add the immediately
+					// following character to the token, unless the end of the
+					// input has been reached. Note this will result in loop 
+					// counter 'i' being incremented twice, once here and once 
+					// at the end of the loop.
+					if (i + 1 < strValues.length()) {
+						buffer.append(strValues.charAt(++i));
+					}
+					// If the ESCAPE character occurs as the last character
+					// of the string, ignore it.
+					break;
+				default :
+					// For all other characters, add them to the current token
+					// unless dealing with unescaped whitespace at the beginning
+					// or end. We know the whitespace is unescaped because it
+					// would have been handled in the ESCAPE case otherwise.
+					if (Character.isWhitespace(c1)) {
+						// Ignore unescaped whitespace at the beginning of the
+						// token.
+						if (buffer.length() == 0) {
+							continue;
+						}
+						// If the whitespace is not at the beginning, look
+						// forward, starting with the next character, to see if 
+						// it's in the middle or at the end. Unescaped 
+						// whitespace in the middle is okay.
+						for (int j = i + 1; j < strValues.length(); j++) {
+							// Keep looping until the end of the string is
+							// reached or a non-whitespace character other than
+							// the escape is seen.
+							char c2 = strValues.charAt(j);
+							if (!Character.isWhitespace(c2)) {
+								// If the current character is not the DELIMITER, all whitespace 
+								// characters are significant and should be added to the token.
+								// Otherwise, they're at the end and should be ignored. But watch
+								// out for an escape character at the end of the input. Ignore it
+								// and any previous insignificant whitespace if it exists.
+								if (c2 == ESCAPE && j + 1 >= strValues.length()) {
+									continue;
+								}
+								if (c2 != DELIMITER) {
+									buffer.append(strValues.substring(i, j));
+								}
+								// Let loop counter i catch up with the inner loop but keep in
+								// mind it will still be incremented at the end of the outer loop.
+								i = j - 1;
+								break;
+							}
+						}
+					} else {
+						// For non-whitespace characters.
+						buffer.append(c1);
+					}
+			}
+		}
+		// Don't forget to add the last token.
+		values.add(buffer.toString());
+		return values.toArray( new String[]{});
+	}
+
+
+	public static String valueToString(Object value) 	
+	{	
+		String result = null;
+		if (value == null) {
+			result = null;
+		}
+		else if (value instanceof String) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Long) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Double) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Float) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Integer) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Byte) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Character) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Boolean) {
+			result = value.toString();
+    	}
+    	else if (value instanceof Short) {
+			result = value.toString();
+    	}
+		else if (value instanceof Password) {
+			result = value.toString();
+    	}
+    	else if (value instanceof String[]) {
+    		StringBuilder sb = new StringBuilder();
+    		String[] ss = (String[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Long[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Long[] ss = (Long[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Double[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Double[] ss = (Double[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Float[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Float[] ss = (Float[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Integer[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Integer[] ss = (Integer[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Byte[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Byte[] ss = (Byte[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Character[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Character[] ss = (Character[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Boolean[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Boolean[] ss = (Boolean[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Short[]) {
+    		StringBuilder sb = new StringBuilder();
+    		Short[] ss = (Short[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+    	else if (value instanceof Password[]) {
+    		StringBuilder sb = new StringBuilder();
+    		String[] ss = (String[]) value;
+    		for (int i=0; i<ss.length; i++) {
+    			if (ss[i] != null) {
+    				sb.append(escapeString(ss[i].toString()));
+    				if (i != ss.length-1) {
+    					sb.append(",");
+    				}
+    			}
+    		}
+    		result = sb.toString();
+    	}
+		return result;
+	}
+	
+	
+	public static String escapeString(String s)
+	{
+		String escaped = s;
+		escaped = escaped.replace("\\", "\\\\");
+		escaped = escaped.replace(",",  "\\,");
+		escaped = escaped.replace(" ",  "\\ ");
+		return escaped;
+	}
+
+
+	public static String unescapeString(String s)
+	{
+		String value = s;
+		
+		// remove all space at the beginning of the string which are not escaped
+		value = value.replaceAll("^((?<!\\\\) )*", "");
+
+		// remove all space at the end of the string which are not escaped
+		value = value.replaceAll("((?<!\\\\) )*$", "");
+		
+		// replace all escaped spaces with just space
+		// The pattern covers for any even number of backslashes before the space char
+		value = value.replaceAll("\\\\(\\\\\\\\)* ", " ");
+		
+		// replace all escaped comma with just comma
+		// The pattern covers for any even number of backslashes before the comma char
+		value = value.replaceAll("\\\\(\\\\\\\\)*,", ",");
+
+		return value;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/XmlUtil.java b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/XmlUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c24a511f333e7683b68125add5c6b1f6c5a41b1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.configuration/src/main/java/org/eclipse/kura/core/configuration/util/XmlUtil.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.configuration.util;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.MarshalException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.UnmarshalException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.ValidationEvent;
+import javax.xml.bind.util.ValidationEventCollector;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.eclipse.kura.core.configuration.XmlConfigPropertiesAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class XmlUtil 
+{
+	@SuppressWarnings("unused")
+	private static final Logger s_logger = LoggerFactory.getLogger(XmlUtil.class);
+	
+	@SuppressWarnings("rawtypes")
+	private static Map<Class,JAXBContext> s_contexts = new HashMap<Class,JAXBContext>();	
+	
+	
+	public static String marshal(Object object) throws JAXBException 
+	{
+		StringWriter sw = new StringWriter();
+		marshal(object, sw);
+		return sw.toString();
+	}
+
+	@SuppressWarnings("rawtypes")
+	public static void marshal(Object object, Writer w) throws JAXBException 
+	{
+		Class clazz = object.getClass();
+		JAXBContext context = s_contexts.get(clazz);
+		if (context == null) {			
+			context = JAXBContext.newInstance(clazz);
+			s_contexts.put(clazz, context);
+		}
+
+		ValidationEventCollector valEventHndlr = new ValidationEventCollector();
+		Marshaller marshaller = context.createMarshaller();
+		marshaller.setSchema(null);
+		marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+		marshaller.setEventHandler(valEventHndlr);
+
+		try {
+			marshaller.marshal(object, w);
+		}
+		catch (Exception e) {		
+			if (e instanceof JAXBException) {
+				throw (JAXBException) e;
+			}
+			else {
+				throw new MarshalException(e.getMessage(), e);	
+			}			
+		}
+		
+		if (valEventHndlr.hasEvents()) {			
+			for (ValidationEvent valEvent : valEventHndlr.getEvents()) {
+				if (valEvent.getSeverity() != ValidationEvent.WARNING) {
+					// throw a new Marshall Exception if there is a parsing error
+					throw new MarshalException(valEvent.getMessage(), valEvent.getLinkedException());							
+				}
+			}
+		}
+	}
+	
+
+	public static <T> T unmarshal(String s, Class<T> clazz) 
+		throws JAXBException, XMLStreamException, FactoryConfigurationError 
+	{
+		StringReader sr = new StringReader(s);
+		return unmarshal(sr, clazz);
+	}
+
+
+	public static <T> T unmarshal(Reader r, Class<T> clazz) 
+		throws JAXBException, XMLStreamException, FactoryConfigurationError 
+	{
+		JAXBContext context = s_contexts.get(clazz);
+		if (context == null) {			
+			context = JAXBContext.newInstance(clazz);
+			s_contexts.put(clazz, context);
+		}
+
+		ValidationEventCollector valEventHndlr = new ValidationEventCollector();
+		XMLStreamReader xmlsr = XMLInputFactory.newFactory().createXMLStreamReader(r);
+		Unmarshaller unmarshaller = context.createUnmarshaller();
+		unmarshaller.setSchema(null);
+		unmarshaller.setEventHandler(valEventHndlr);
+		
+		JAXBElement<T> elem = null;
+		try {
+			elem = unmarshaller.unmarshal(xmlsr, clazz);
+		}
+		catch (Exception e) {		
+			if (e instanceof JAXBException) {
+				throw (JAXBException) e;
+			}
+			else {
+				throw new UnmarshalException(e.getMessage(), e);	
+			}			
+		}
+		
+		if (valEventHndlr.hasEvents()) {			
+			for (ValidationEvent valEvent : valEventHndlr.getEvents()) {
+				if (valEvent.getSeverity() != ValidationEvent.WARNING) {
+					// throw a new Unmarshall Exception if there is a parsing error
+					String msg = MessageFormat.format("Line {0}, Col: {1}: {2}",
+							valEvent.getLocator().getLineNumber(),
+							valEvent.getLocator().getColumnNumber(),
+							valEvent.getLinkedException().getMessage());
+					throw new UnmarshalException(msg, valEvent.getLinkedException());							
+				}
+			}
+		}
+		return elem.getValue();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.crypto/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.crypto/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..6f16a365a60901431ca7d8277d5fa25d41e6bf00
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.crypto
+Bundle-SymbolicName: org.eclipse.kura.core.crypto;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.crypto; version="[0.2,0.3)",
+ javax.crypto,
+ javax.crypto.spec,
+ javax.xml.bind
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
diff --git a/kura/org.eclipse.kura.core.crypto/OSGI-INF/crypto.xml b/kura/org.eclipse.kura.core.crypto/OSGI-INF/crypto.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5c0188d8c9ef9e77c894e49b3fde3722a2846500
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/OSGI-INF/crypto.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" configuration-policy="optional" enabled="true" immediate="true" name="org.eclipse.kura.crypto.CryptoService">
+   <implementation class="org.eclipse.kura.core.crypto.CryptoServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.crypto.CryptoService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.crypto.CryptoService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.crypto/about.html b/kura/org.eclipse.kura.core.crypto/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.crypto/about_files/epl-v10.html b/kura/org.eclipse.kura.core.crypto/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.crypto/build.properties b/kura/org.eclipse.kura.core.crypto/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7b57a1adc50654e6106cbb051a8667420ce3d22c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/build.properties
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about_files/,\
+               about.html
+additional.bundles = org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.api
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.crypto/pom.xml b/kura/org.eclipse.kura.core.crypto/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..605c77567ca7aa74712e6beb4fc5a02e40ba33f8
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.crypto</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.crypto/src/main/java/org/eclipse/kura/core/crypto/CryptoServiceImpl.java b/kura/org.eclipse.kura.core.crypto/src/main/java/org/eclipse/kura/core/crypto/CryptoServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..153fafa2e256d5c9d7fd0f1695006a12d18b8325
--- /dev/null
+++ b/kura/org.eclipse.kura.core.crypto/src/main/java/org/eclipse/kura/core/crypto/CryptoServiceImpl.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.crypto;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.bind.DatatypeConverter;
+
+import org.eclipse.kura.crypto.CryptoService;
+
+public class CryptoServiceImpl implements CryptoService {
+	private static final String ALGORITHM   = "AES";
+    private static final byte[] SECRET_KEY  = "rv;ipse329183!@#".getBytes();
+                                               
+	
+	public String encryptAes(String value) 
+		throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException 
+	{
+		Key  key = generateKey();
+        Cipher c = Cipher.getInstance(ALGORITHM);
+        c.init(Cipher.ENCRYPT_MODE, key);
+        byte[] encryptedBytes = c.doFinal(value.getBytes());
+        
+        String encryptedValue = DatatypeConverter.printBase64Binary(encryptedBytes);
+        return encryptedValue;	
+	}
+
+
+	public String decryptAes(String encryptedValue) 
+		throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException 
+	{
+		Key  key = generateKey();
+        Cipher c = Cipher.getInstance(ALGORITHM);
+        c.init(Cipher.DECRYPT_MODE, key);
+        byte[] decordedValue  = DatatypeConverter.parseBase64Binary(encryptedValue);
+        byte[] decryptedBytes = c.doFinal(decordedValue);
+        String decryptedValue = new String(decryptedBytes);
+        return decryptedValue;
+    }
+
+
+	private static Key generateKey() 
+	{
+        Key key = new SecretKeySpec(SECRET_KEY, ALGORITHM);
+        return key;
+	}
+
+	
+	public String sha1Hash(String s) 
+		throws NoSuchAlgorithmException, UnsupportedEncodingException 
+	{
+		MessageDigest cript = MessageDigest.getInstance("SHA-1");
+        cript.reset();
+        cript.update(s.getBytes("UTF8"));
+        
+        byte[] encodedBytes = cript.digest();
+        return DatatypeConverter.printBase64Binary(encodedBytes);
+	}
+
+
+	public String encodeBase64(String stringValue) 
+		throws NoSuchAlgorithmException, UnsupportedEncodingException 
+	{
+		byte[] bytesValue = stringValue.getBytes("UTF-8");
+		String encodedValue = DatatypeConverter.printBase64Binary(bytesValue);
+        return encodedValue;	
+		
+	}
+
+
+	public String decodeBase64(String encodedValue) 
+		throws NoSuchAlgorithmException, UnsupportedEncodingException 
+	{
+        byte[] decodedBytes = DatatypeConverter.parseBase64Binary(encodedValue);
+        String decodedValue = new String(decodedBytes, "UTF-8");
+        return decodedValue;		
+	}
+}
diff --git a/kura/org.eclipse.kura.core.deployment/.gitignore b/kura/org.eclipse.kura.core.deployment/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.core.deployment/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.deployment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..c3d5bff592e9f3549f913b930d0656ec10abb2cd
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.deployment
+Bundle-SymbolicName: org.eclipse.kura.core.deployment;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.xml.bind,
+ javax.xml.bind.annotation,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.core.configuration.util; version="[0.2,0.3)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.deployment.agent; version="[0.2,1.0)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.deploymentadmin;version="1.1.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.core.deployment; version="0.2.0"
+
diff --git a/kura/org.eclipse.kura.core.deployment/OSGI-INF/deployment.xml b/kura/org.eclipse.kura.core.deployment/OSGI-INF/deployment.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1bd5c3f0f16e853a0ae49dfd23397c825a40cff9
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/OSGI-INF/deployment.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.core.deployment">
+   <implementation class="org.eclipse.kura.core.deployment.CloudDeploymentHandler"/>
+   <reference bind="setCloudService" cardinality="1..1" interface="org.eclipse.kura.cloud.CloudService" name="CloudService" policy="static" unbind="unsetCloudService"/>
+   <reference bind="setDeploymentAgentService" cardinality="1..1" interface="org.eclipse.kura.deployment.agent.DeploymentAgentService" name="DeploymentAgentService" policy="static" unbind="unsetDeploymentAgentService"/>
+   <reference bind="setDeploymentAdmin" cardinality="1..1" interface="org.osgi.service.deploymentadmin.DeploymentAdmin" name="DeploymentAdmin" policy="static" unbind="unsetDeploymentAdmin"/>
+   <reference bind="setSystemService" cardinality="1..1" interface="org.eclipse.kura.system.SystemService" name="SystemService" policy="static" unbind="unsetSystemService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.deployment/about.html b/kura/org.eclipse.kura.core.deployment/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.deployment/about_files/epl-v10.html b/kura/org.eclipse.kura.core.deployment/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.deployment/build.properties b/kura/org.eclipse.kura.core.deployment/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a02ca933de33ddded73141bdefb6239944d112e5
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.deployment/pom.xml b/kura/org.eclipse.kura.core.deployment/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..25f78324939c2001b1dc331a872e0af735aad7c7
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.deployment</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/CloudDeploymentHandler.java b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/CloudDeploymentHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e00f83a170b89cd97b6ca5df0733fb4a35196e5
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/CloudDeploymentHandler.java
@@ -0,0 +1,915 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.deployment;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import javax.xml.bind.JAXBException;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.cloud.CloudletTopic;
+import org.eclipse.kura.cloud.CloudletTopic.Method;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.core.util.ThrowableUtil;
+import org.eclipse.kura.deployment.agent.DeploymentAgentService;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraRequestPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.eclipse.kura.system.SystemService;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.deploymentadmin.BundleInfo;
+import org.osgi.service.deploymentadmin.DeploymentAdmin;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudDeploymentHandler implements EventHandler, CloudClientListener 
+{
+	private static Logger s_logger = LoggerFactory.getLogger(CloudDeploymentHandler.class);
+	
+	public static final String  APP_ID         = "DEPLOY-V1";
+	
+	// GET
+	public static final String  RESOURCE_PACKAGES = "packages";
+	public static final String  RESOURCE_BUNDLES  = "bundles";
+	
+	// EXEC
+	public static final String  RESOURCE_INSTALL   = "install";
+	public static final String  RESOURCE_UNINSTALL = "uninstall";
+	public static final String  RESOURCE_START     = "start";
+	public static final String  RESOURCE_STOP      = "stop";
+	
+	// Metrics of RESOURCE_INSTALL
+	public static final String  METRIC_INSTALL_COMMAND_URL      = "deploy.url";
+	public static final String  METRIC_INSTALL_COMMAND_FILENAME = "deploy.filename";
+	
+	// Metrics in the REPLY to RESOURCE_INSTALL	
+	public static final String  METRIC_INSTALL_REPLY_PKG_NAME    = "deploy.pkg.name";
+	public static final String  METRIC_INSTALL_REPLY_PKG_VERSION = "deploy.pkg.version";
+	
+	//private final static String [] EVENT_TOPICS = new String[] {"*"};
+	//private final static String [] EVENT_TOPICS = new String[] {"org/osgi/service/deployment/*"};
+	private final static String [] EVENT_TOPICS = {
+		DeploymentAgentService.EVENT_INSTALLED_TOPIC,
+		DeploymentAgentService.EVENT_UNINSTALLED_TOPIC
+		};
+	
+	private final static String SYS_PROP_REQ_ID = CloudDeploymentHandler.class.getPackage().getName() + "request.id";
+	private final static String SYS_PROP_REQUESTER_CLIENT_ID = CloudDeploymentHandler.class.getPackage().getName() + "requester.client.id";
+	private final static String SYS_PROP_PACKAGE_URL = CloudDeploymentHandler.class.getPackage().getName() + "package.ulr";
+	
+		
+	private static final int     DFLT_PUB_QOS  = 0;
+	private static final boolean DFLT_RETAIN   = false;
+	private static final int     DFLT_PRIORITY = 1;
+
+	private CloudService             m_cloudService;
+	private CloudClient   m_cloudClient;
+	private DeploymentAdmin          m_deploymentAdmin;
+	private DeploymentAgentService   m_deploymentAgentService;
+	private ServiceRegistration<?> m_eventServiceRegistration;
+	
+	private String m_pendingInstPackageUrl;
+	private String m_pendingInstRequestId;
+	private String m_pendingInstRequesterClientId;
+	
+	private String m_pendingUninstPackageName;
+	private String m_pendingUninstRequestId;
+	private String m_pendingUninstRequesterClientId;
+
+	
+	private BundleContext m_bundleContext;
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+	
+	protected void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+	}
+
+	protected void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+	protected void setDeploymentAdmin(DeploymentAdmin deploymentAdmin) {
+		m_deploymentAdmin = deploymentAdmin;
+	}
+	
+	protected void unsetDeploymentAdmin(DeploymentAdmin deploymentAdmin) {
+		m_deploymentAdmin = null;
+	}
+	
+	protected void setDeploymentAgentService(DeploymentAgentService deploymentAgentService) {
+		m_deploymentAgentService = deploymentAgentService;
+	}
+
+	protected void unsetDeploymentAgentService(DeploymentAgentService deploymentAgentService) {
+		m_deploymentAgentService = null;
+	}
+	
+	public void setSystemService(SystemService systemService) {
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) 
+	{
+		s_logger.info("activate...");
+		
+		m_bundleContext = componentContext.getBundleContext();
+		
+		m_pendingInstPackageUrl = System.getProperty(SYS_PROP_PACKAGE_URL);
+		if (m_pendingInstPackageUrl != null) {
+			s_logger.info("Found pending package URL {}", m_pendingInstPackageUrl);
+		}
+		
+		m_pendingInstRequestId = System.getProperty(SYS_PROP_REQ_ID);
+		if (m_pendingInstRequestId != null) {
+			s_logger.info("Found pending request ID {}", m_pendingInstRequestId);
+		}
+
+		m_pendingInstRequesterClientId = System.getProperty(SYS_PROP_REQUESTER_CLIENT_ID);
+		if (m_pendingInstRequesterClientId != null) {
+			s_logger.info("Found pending requester client ID {}", m_pendingInstRequesterClientId);
+		}
+		
+		Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+		d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+//		d.put(EventConstants.EVENT_FILTER,
+//		"(bundle.symbolicName=com.acme.*)" );
+		BundleContext bundleContext = componentContext.getBundleContext();
+		m_eventServiceRegistration = bundleContext.registerService(EventHandler.class.getName(), this, d);
+				
+		try {
+			
+			s_logger.info("Getting CloudApplicationClient for {}...", APP_ID);
+			
+			m_cloudClient = m_cloudService.newCloudClient(APP_ID);
+			m_cloudClient.addCloudClientListener(this);
+		} catch (KuraException e) {
+			s_logger.error("Error getting CloudApplicationClient", e);
+		}
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("deactivate...");
+				
+		m_cloudClient.release();
+		m_eventServiceRegistration.unregister();
+		
+		System.clearProperty(SYS_PROP_PACKAGE_URL);
+		System.clearProperty(SYS_PROP_REQUESTER_CLIENT_ID);
+		System.clearProperty(SYS_PROP_REQ_ID);
+		
+		if (m_pendingInstPackageUrl != null) {
+			s_logger.info("Setting system property {} to {}", SYS_PROP_PACKAGE_URL, m_pendingInstPackageUrl);
+			System.setProperty(SYS_PROP_PACKAGE_URL, m_pendingInstPackageUrl);
+		}
+		if (m_pendingInstRequestId != null) {
+			s_logger.info("Setting system property {} to {}", SYS_PROP_REQ_ID, m_pendingInstRequestId);
+			System.setProperty(SYS_PROP_REQ_ID, String.valueOf(m_pendingInstRequestId));
+		}
+		if (m_pendingInstRequesterClientId != null) {
+			s_logger.info("Setting system property {} to {}", SYS_PROP_REQUESTER_CLIENT_ID, m_pendingInstRequesterClientId);
+			System.setProperty(SYS_PROP_REQUESTER_CLIENT_ID, String.valueOf(m_pendingInstRequesterClientId));
+		}
+		
+		m_pendingInstPackageUrl = null;
+		m_pendingInstRequestId = null;
+		m_pendingInstRequesterClientId = null;
+		
+		m_bundleContext = null;
+	}
+	
+	@Override
+	public void handleEvent(Event event) {
+		
+		String topic = event.getTopic();
+		
+		s_logger.info("Received event topic {}", topic);
+
+		String[] propertyNames = event.getPropertyNames();
+		
+		for (String propertyName : propertyNames) {
+			//System.err.println("Event property " + propertyName + ": " + event.getProperty(propertyName));
+			s_logger.debug("Event property {}: {}", propertyName, event.getProperty(propertyName));
+		}
+		
+		if (topic.equals(DeploymentAgentService.EVENT_INSTALLED_TOPIC)) {
+			
+			if (m_pendingInstPackageUrl == null) {
+				s_logger.info("Ignore event because no request is pending");
+				return;
+			}
+			
+			String packageName = (String) event.getProperty(DeploymentAgentService.EVENT_PACKAGE_NAME);
+			String packageVersion = (String) event.getProperty(DeploymentAgentService.EVENT_PACKAGE_VERSION);
+			String packageUrl = (String) event.getProperty(DeploymentAgentService.EVENT_PACKAGE_URL);
+			Boolean successful = (Boolean) event.getProperty(DeploymentAgentService.EVENT_SUCCESSFUL);
+			Exception ex = (Exception) event.getProperty(DeploymentAgentService.EVENT_EXCEPTION);
+			
+			String successfully = successful ? "Successfully" : "Unsuccessfully";
+			
+			s_logger.info("{} completed installation of package {}", successfully, packageUrl);
+			
+			s_logger.info("Responding to command {}...", RESOURCE_INSTALL);
+			
+			if (m_pendingInstRequestId == null) {
+				s_logger.error("Unexpected null request ID associated to package URL {}", m_pendingInstPackageUrl);
+				return;
+			}
+
+			if (m_pendingInstRequesterClientId == null) {
+				s_logger.error("Unexpected null requester client ID associated to package URL {}", m_pendingInstPackageUrl);
+				return;
+			}
+			
+			KuraResponsePayload response = null;
+			try {
+				int responseCode = successful ? KuraResponsePayload.RESPONSE_CODE_OK : KuraResponsePayload.RESPONSE_CODE_ERROR;
+				
+				response = new KuraResponsePayload(responseCode);
+				response.addMetric(METRIC_INSTALL_REPLY_PKG_NAME, packageName);
+				response.addMetric(METRIC_INSTALL_REPLY_PKG_VERSION, packageVersion);
+				response.setException(ex);
+				response.setTimestamp( new Date());
+				response.setBody(packageUrl.getBytes("UTF-8"));
+			} catch(Exception e) {
+				response = new KuraResponsePayload(e); 
+				response.setTimestamp(new Date());
+				s_logger.error("Error responding to command {} {}", RESOURCE_INSTALL, e);
+			}
+
+			try {
+				m_cloudClient.controlPublish(m_pendingInstRequesterClientId,
+											 "REPLY" + "/" + m_pendingInstRequestId, 
+										     response,
+										     DFLT_PUB_QOS, 
+										     DFLT_RETAIN,
+										     DFLT_PRIORITY);
+			}
+			catch (KuraException e) {
+				s_logger.error("Error publishing response for topic {} {}", RESOURCE_INSTALL, e);
+			}
+			
+			m_pendingInstPackageUrl = null;
+			m_pendingInstRequestId = null;
+			m_pendingInstRequesterClientId = null;
+		} else if (topic.equals(DeploymentAgentService.EVENT_UNINSTALLED_TOPIC)) {
+			if (m_pendingUninstPackageName == null) {
+				s_logger.info("Ignore event because no request is pending");
+				return;
+			}
+
+			String packageName = (String) event.getProperty(DeploymentAgentService.EVENT_PACKAGE_NAME);
+			Boolean successful = (Boolean) event.getProperty(DeploymentAgentService.EVENT_SUCCESSFUL);
+			Exception ex = (Exception) event.getProperty(DeploymentAgentService.EVENT_EXCEPTION);
+
+			String successfully = successful ? "Successfully" : "Unsuccessfully";
+
+			s_logger.info("{} completed installation of package {}", successfully, packageName);
+
+			s_logger.info("Responding to command {}...", RESOURCE_UNINSTALL);
+
+			if (m_pendingUninstRequestId == null) {
+				s_logger.error("Unexpected null request ID associated to package {}", m_pendingUninstPackageName);
+				return;
+			}
+			
+			if (m_pendingUninstRequesterClientId == null) {
+				s_logger.error("Unexpected null requester client ID associated to package {}", m_pendingUninstPackageName);
+				return;
+			}
+
+			KuraResponsePayload response = null;
+			try {
+				int responseCode = successful ? KuraResponsePayload.RESPONSE_CODE_OK : KuraResponsePayload.RESPONSE_CODE_ERROR;
+
+				response = new KuraResponsePayload(responseCode);
+				response.setException(ex);
+				response.setTimestamp( new Date());
+				response.setBody(packageName.getBytes("UTF-8"));
+			} catch(Exception e) {
+				response = new KuraResponsePayload(e); 
+				response.setTimestamp(new Date());
+				s_logger.error("Error responding to command {} {}", RESOURCE_UNINSTALL, e);
+			}
+
+			try {
+				m_cloudClient.controlPublish(m_pendingUninstRequesterClientId,
+											 "REPLY" + "/" + m_pendingUninstRequestId, 
+											 response,
+											 DFLT_PUB_QOS, 
+											 DFLT_RETAIN,
+											 DFLT_PRIORITY);
+			}
+			catch (KuraException e) {
+				s_logger.error("Error publishing response for command {} {}", RESOURCE_UNINSTALL, e);
+			}
+
+			m_pendingUninstPackageName = null;
+			m_pendingUninstRequestId = null;
+			m_pendingUninstRequesterClientId = null;
+		}
+	}
+
+	
+	private KuraResponsePayload doExecInstallFromUrl(CloudletTopic requestTopic, KuraRequestPayload request) {
+		KuraResponsePayload response = null;
+		
+		String packageUrl = (String) request.getMetric(METRIC_INSTALL_COMMAND_URL);
+		
+		if (packageUrl == null) {
+			s_logger.error("Package URL parameter missing");
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			response.setTimestamp(new Date());
+			try {
+				response.setBody("Package URL parameter missing".getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException e) {
+				// Ignore
+			}
+			
+			return response;
+		}
+		
+		s_logger.info("About to download and install package at URL {}", packageUrl);
+		
+		try {
+			m_pendingInstPackageUrl = packageUrl;
+			m_pendingInstRequestId = request.getRequestId();
+			m_pendingInstRequesterClientId = request.getRequesterClientId();
+						
+			s_logger.info("Installing package at URL: " + packageUrl);
+			m_deploymentAgentService.installDeploymentPackageAsync(packageUrl);
+		} catch (Exception e) {
+			
+			s_logger.error("Failed to download and install package at URL {}: {}", packageUrl, e);
+			
+			m_pendingInstPackageUrl = null;
+			m_pendingInstRequestId = null;
+			m_pendingInstRequesterClientId = null;
+			
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_ERROR);
+			response.setTimestamp(new Date());
+			try {
+				response.setBody(e.getMessage().getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException uee) {
+				// Ignore
+			}
+		}
+		
+		return response;
+	}
+	
+	private KuraResponsePayload doExecInstallFromData(CloudletTopic requestTopic, KuraRequestPayload request) {
+		KuraResponsePayload response = null;
+		
+		String packageFilename = (String) request.getMetric(METRIC_INSTALL_COMMAND_FILENAME);
+		byte[] packageData = request.getBody();
+		
+		if (packageFilename == null || packageData == null) {
+			s_logger.error("Package filename or data missing");
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			response.setTimestamp(new Date());
+			try {
+				response.setBody("Package filename or data missing".getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException e) {
+				// Ignore
+			}
+			
+			return response;
+		}
+						
+		try {
+			String filePath = System.getProperty("java.io.tmpdir") + File.separator + packageFilename;
+			
+			s_logger.info("Writing deployment package data to file {}", filePath);
+
+			String packageUrl = null;
+		    FileOutputStream fos = null;
+		    try {
+		    	fos = new FileOutputStream(filePath);
+		    	fos.write(packageData);
+		    	
+				URL url = new URL("file", null, filePath);
+				packageUrl = url.toString();
+		    } catch (IOException e) {
+		    	throw (e);
+		    } finally {
+		    	if (fos != null) {
+		    		try {
+		    			fos.close();
+		    		} catch (IOException e) {
+		    			// Ignore
+		    		}
+		    	}
+		    }
+			
+			m_pendingInstPackageUrl = packageUrl;
+			m_pendingInstRequestId = request.getRequestId();
+			m_pendingInstRequesterClientId = request.getRequesterClientId();
+			
+			s_logger.info("Installing package...");
+			m_deploymentAgentService.installDeploymentPackageAsync(packageUrl);
+		} catch (Exception e) {
+			
+			s_logger.error("Failed to install package {}: {}", packageFilename, e);
+			m_pendingInstPackageUrl = null;
+			m_pendingInstRequestId = null;
+			m_pendingInstRequesterClientId = null;
+			
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_ERROR);
+			response.setTimestamp(new Date());
+			try {
+				response.setBody(e.getMessage().getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException uee) {
+				// Ignore
+			}
+		}
+		
+		return response;
+	}	
+	
+	private KuraResponsePayload doExecInstall(CloudletTopic requestTopic, KuraRequestPayload request) {
+		KuraResponsePayload response = null;
+		
+		//
+		// We only allow one request at a time
+		if (m_pendingInstPackageUrl != null) {
+			s_logger.info("Antother request seems still pending: {}. Checking if stale...", m_pendingInstPackageUrl);
+			
+			boolean isPending = m_deploymentAgentService.isInstallingDeploymentPackage(m_pendingInstPackageUrl);
+			if (isPending) {
+				s_logger.info("...it isn't");
+				response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_ERROR);
+				response.setTimestamp(new Date());
+				try {
+					response.setBody("Only one request at a time is allowed".getBytes("UTF-8"));
+				} catch (UnsupportedEncodingException e) {
+					// Ignore
+				}
+				
+				return response;
+			}
+		}
+		
+		if (request.getMetric(METRIC_INSTALL_COMMAND_URL) != null) {
+			response = doExecInstallFromUrl(requestTopic, request);
+		} else {
+			response = doExecInstallFromData(requestTopic, request);
+		}
+		
+		return response;
+	}
+	
+	private KuraResponsePayload doExecUninstall(CloudletTopic requestTopic, KuraRequestPayload request) {
+		
+		KuraResponsePayload response = null;
+		
+		String packageName = request.getBody() == null ? null : new String(request.getBody());
+		
+		if (packageName == null) {
+			s_logger.error("Package name parameter missing");
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			response.setTimestamp(new Date());
+			try {
+				response.setBody("Package name parameter missing".getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException e) {
+				// Ignore
+			}
+			
+			return response;
+		}
+		
+		//
+		// We only allow one request at a time
+		if (m_pendingUninstPackageName != null) {
+			s_logger.info("Antother request seems still pending: {}. Checking if stale...", m_pendingUninstPackageName);
+			
+			boolean isPending = m_deploymentAgentService.isUninstallingDeploymentPackage(m_pendingUninstPackageName);
+			if (isPending) {
+				s_logger.info("...it isn't");
+				response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_ERROR);
+				response.setTimestamp(new Date());
+				try {
+					response.setBody("Only one request at a time is allowed".getBytes("UTF-8"));
+				} catch (UnsupportedEncodingException e) {
+					// Ignore
+				}
+				
+				return response;
+			}
+		}
+		
+		s_logger.info("About to uninstall package {}", packageName);
+		
+		try {
+			m_pendingUninstPackageName = packageName;
+			m_pendingUninstRequestId = request.getRequestId();
+			m_pendingUninstRequesterClientId = request.getRequesterClientId();
+						
+			s_logger.info("Uninstalling package...");
+			m_deploymentAgentService.uninstallDeploymentPackageAsync(packageName);
+		} catch (Exception e) {
+			
+			s_logger.error("Failed to uninstall package {}: {}", packageName, e);
+			
+			m_pendingUninstPackageName = null;
+			m_pendingUninstRequestId = null;
+			m_pendingUninstRequesterClientId = null;
+			
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_ERROR);
+			response.setTimestamp(new Date());
+			try {
+				response.setBody(e.getMessage().getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException uee) {
+				// Ignore
+			}
+		}
+		
+		return response;
+	}
+	
+	private KuraResponsePayload doGetPackages(KuraPayload request) {
+		KuraResponsePayload response = null;
+		
+		DeploymentPackage[] dps = m_deploymentAdmin.listDeploymentPackages();
+		XmlDeploymentPackages xdps = new XmlDeploymentPackages();
+		XmlDeploymentPackage[] axdp = new XmlDeploymentPackage[dps.length];
+		
+		for (int i = 0; i < dps.length; i++) {
+			DeploymentPackage dp = dps[i];
+			
+			XmlDeploymentPackage xdp = new XmlDeploymentPackage();
+			xdp.setName(dp.getName());
+			xdp.setVersion(dp.getVersion().toString());
+			
+			BundleInfo[] bis = dp.getBundleInfos();
+			XmlBundleInfo[] axbi = new XmlBundleInfo[bis.length];
+			
+			for (int j = 0; j < bis.length; j++) {
+				
+				BundleInfo bi = bis[j];
+				XmlBundleInfo xbi = new XmlBundleInfo();
+				xbi.setName(bi.getSymbolicName());
+				xbi.setVersion(bi.getVersion().toString());
+				
+				axbi[j] = xbi;
+			}
+			
+			xdp.setBundleInfos(axbi);
+			
+			axdp[i] = xdp;
+		}
+		
+		xdps.setDeploymentPackages(axdp);
+		
+		try {
+			String s = XmlUtil.marshal(xdps);
+			
+			s_logger.info("Getting resource {}: {}", RESOURCE_PACKAGES, s);
+			
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_OK); 
+			response.setTimestamp(new Date());
+			
+			try {
+				response.setBody(s.getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException e) {
+				// Ignore
+			}
+		} catch (JAXBException e) {
+			s_logger.error("Error getting resource {}: {}", RESOURCE_PACKAGES, e);
+		}
+		
+		return response;
+	}
+
+	private KuraResponsePayload doGetBundles(KuraPayload request) {
+		KuraResponsePayload response = null;
+
+		Bundle[] bundles = m_bundleContext.getBundles();
+		XmlBundles xmlBundles = new XmlBundles();
+		XmlBundle[] axb = new XmlBundle[bundles.length];
+		
+		for (int i = 0; i < bundles.length; i++) {
+			
+			Bundle bundle = bundles[i];
+			XmlBundle xmlBundle = new XmlBundle();
+			
+			xmlBundle.setName(bundle.getSymbolicName());
+			xmlBundle.setVersion(bundle.getVersion().toString());
+			xmlBundle.setId(bundle.getBundleId());
+			
+			int state = bundle.getState();
+			
+			switch(state) {
+			case Bundle.UNINSTALLED:
+				xmlBundle.setState("UNINSTALLED");
+				break;
+				
+			case Bundle.INSTALLED:
+				xmlBundle.setState("INSTALLED");
+				break;
+			
+			case Bundle.RESOLVED:
+				xmlBundle.setState("RESOLVED");
+				break;
+				
+			case Bundle.STARTING:
+				xmlBundle.setState("STARTING");
+				break;
+				
+			case Bundle.STOPPING:
+				xmlBundle.setState("STOPPING");
+				break;
+				
+			case Bundle.ACTIVE:
+				xmlBundle.setState("ACTIVE");
+				break;
+				
+			default:
+				xmlBundle.setState(String.valueOf(state));
+			}
+			
+			axb[i] = xmlBundle;
+		}
+		
+		xmlBundles.setBundles(axb);
+
+		try {
+			String s = XmlUtil.marshal(xmlBundles);
+			
+			s_logger.info("Getting resource {}: {}", RESOURCE_BUNDLES, s);
+			
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_OK); 
+			response.setTimestamp(new Date());
+			
+			try {
+				response.setBody(s.getBytes("UTF-8"));
+			} catch (UnsupportedEncodingException e) {
+				// Ignore
+			}
+		} catch (JAXBException e) {
+			s_logger.error("Error getting resource {}: {}", RESOURCE_BUNDLES, e);
+		}
+
+		
+		return response;
+	}
+	
+	private KuraResponsePayload doExecStartStopBundle(CloudletTopic requestTopic, KuraPayload request, boolean start) {
+		
+		KuraResponsePayload response = null;
+		
+		String bundleId = requestTopic.getResources()[1];
+		
+		if (bundleId == null) {
+			s_logger.info("EXEC start/stop bundle: null bundle ID");
+			
+			response = new KuraResponsePayload(
+					KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			
+			response.setTimestamp(new Date());
+		} else {
+			Long id = null;
+			try {
+				id = Long.valueOf(bundleId);
+			} catch (NumberFormatException e){
+				
+				s_logger.error("EXEC start/stop bundle: bad bundle ID format: {}", e);
+				response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+				response.setTimestamp(new Date());
+				response.setExceptionMessage(e.getMessage());
+
+				response.setExceptionStack(ThrowableUtil.stackTraceAsString(e));
+			}
+			
+			if (id != null) {
+				
+				s_logger.info("Executing command {}", start ? RESOURCE_START : RESOURCE_STOP);
+				
+				Bundle bundle = m_bundleContext.getBundle(id);
+				if (bundle == null) {
+					s_logger.error("Bundle ID {} not found", id);
+					response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+					response.setTimestamp(new Date());
+				} else {
+					try {
+						if (start) {
+							bundle.start();
+						} else {
+							bundle.stop();
+						}
+						s_logger.info("{} bundle ID {} ({})", new Object[] {start ? "Started" : "Stopped", id, bundle.getSymbolicName()});
+						response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_OK);
+						response.setTimestamp(new Date());
+					} catch (BundleException e) {
+						s_logger.error("Failed to {} bundle {}: {}", new Object[] {start ? "start" : "stop", id, e});
+						response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_ERROR);
+						response.setTimestamp(new Date());
+					}
+				}				
+			}
+		}
+	
+		return response;
+	}
+	
+	KuraResponsePayload doGetResource(CloudletTopic requestTopic, KuraPayload request) {
+		KuraResponsePayload response = null;
+		
+		String resourceName = requestTopic.getResources()[0];
+		
+		if (resourceName == null) {
+
+			s_logger.info("GET: null resource name");
+			
+			response = new KuraResponsePayload(
+					KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			
+			response.setTimestamp(new Date());
+
+		} else if (resourceName.equals(RESOURCE_PACKAGES)) {
+			response = doGetPackages(request);
+		} else if (resourceName.equals(RESOURCE_BUNDLES)) {
+			response = doGetBundles(request);
+		} else {
+			s_logger.info("Resource {} not found", resourceName);
+			
+			response = new KuraResponsePayload(
+					KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+			
+			response.setTimestamp(new Date());
+		}
+		
+		return response;
+	}
+	
+	KuraResponsePayload doExecCommand(CloudletTopic requestTopic, KuraRequestPayload request) {
+		KuraResponsePayload response = null;
+		
+		String commandName = requestTopic.getResources()[0];
+
+		if (commandName == null) {
+			
+			s_logger.info("EXEC: null command name");
+			
+			response = new KuraResponsePayload(
+					KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);
+			
+			response.setTimestamp(new Date());
+
+		} else if (commandName.equals(RESOURCE_INSTALL)) {
+			response = doExecInstall(requestTopic, request);
+		} else if (commandName.equals(RESOURCE_UNINSTALL)) {
+			response = doExecUninstall(requestTopic, request);
+		} else if (commandName.equals(RESOURCE_START)) {
+			response = doExecStartStopBundle(requestTopic, request, true);
+		} else if (commandName.equals(RESOURCE_STOP)) {
+			response = doExecStartStopBundle(requestTopic, request, false);
+		} else {
+			s_logger.info("Command {} not found", commandName);
+			
+			response = new KuraResponsePayload(
+					KuraResponsePayload.RESPONSE_CODE_NOTFOUND);
+			
+			response.setTimestamp(new Date());			
+		}
+		
+		return response;
+	}
+	
+	@Override
+	public void onControlMessageArrived(String deviceId, 
+									    String appTopic,
+								        KuraPayload msg, 
+								        int qos, 
+								        boolean retain) 
+	{		
+		if (appTopic.startsWith("REPLY")) {
+			// Ignore
+			return;
+		}
+		
+		KuraRequestPayload reqPayload;
+		try {
+			reqPayload = KuraRequestPayload.buildFromKuraPayload(msg);
+		} catch (ParseException e) {
+			s_logger.error("Error building request payload for topic: {}", appTopic);
+			return;
+		}
+		
+		KuraResponsePayload response = null;
+		try {
+			CloudletTopic requestTopic = CloudletTopic.parseAppTopic(appTopic);		
+			Method method = requestTopic.getMethod();
+			switch (method) {
+			case GET:
+				response = doGetResource(requestTopic, reqPayload);
+				break;
+				
+			case EXEC:
+				response = doExecCommand(requestTopic, reqPayload);
+				break;
+			
+			default:
+				s_logger.error("invalid operation {}", method);			
+				response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);			
+				response.setTimestamp(new Date());
+				break;
+			}
+		}
+		catch (IllegalArgumentException e) {
+			s_logger.error("invalid operation {}", appTopic);			
+			response = new KuraResponsePayload(KuraResponsePayload.RESPONSE_CODE_BAD_REQUEST);			
+			response.setTimestamp(new Date());
+		}
+		
+		if (response != null) {
+			try {
+				String requestId = reqPayload.getRequestId();
+				String requesterClientId = reqPayload.getRequesterClientId();
+				
+				m_cloudClient.controlPublish(requesterClientId,
+						                     "REPLY" + "/" + requestId, 
+										     response,
+										     DFLT_PUB_QOS,
+										     DFLT_RETAIN,
+										     DFLT_PRIORITY);
+			}
+			catch (KuraException e) {
+				s_logger.error("Error publishing response for topic {}: {}", appTopic, e);
+			}
+		}
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, 
+								 String appTopic,
+								 KuraPayload msg, 
+								 int qos, 
+								 boolean retain) 
+	{
+		s_logger.warn("publishArrived on semantic topic {}. Should have never happened.", appTopic);
+	}
+
+	@Override
+	public void onConnectionLost() {
+		s_logger.info("connectionLost");
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		s_logger.info("connectionRestored");
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		// Ignore
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		// Ignore
+	}
+
+}
diff --git a/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundle.java b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundle.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e710f8173bb7fa81f3eb44e6f89ae1566641a71
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundle.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.deployment;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="bundle")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlBundle {
+	
+	@XmlElement(name="name")
+	public String name;
+	
+	@XmlElement(name="version")
+	public String version;
+	
+	@XmlElement(name="id")
+	public long id;
+	
+	@XmlElement(name="state")
+	public String state;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundleInfo.java b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundleInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..83f5fce3afc96afbd859046e17d588f873f64d00
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundleInfo.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.deployment;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="bundle")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlBundleInfo {
+	
+	@XmlElement(name="name")
+	public String name;
+	
+	@XmlElement(name="version")
+	public String version;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundles.java b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundles.java
new file mode 100644
index 0000000000000000000000000000000000000000..e87d1a87e5d95ceec665a15cb927eeb8ba6ff804
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlBundles.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.deployment;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="bundles")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlBundles {
+	
+	@XmlElement(name="bundle")
+	public XmlBundle[] bundles;
+
+	public XmlBundle[] getBundles() {
+		return bundles;
+	}
+
+	public void setBundles(XmlBundle[] bundles) {
+		this.bundles = bundles;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlDeploymentPackage.java b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlDeploymentPackage.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b89ef4c2808f512a6ef646f7a302adec20dfaf0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlDeploymentPackage.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.deployment;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="package")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlDeploymentPackage {
+	
+	@XmlElement(name="name")
+	public String name;
+	
+	@XmlElement(name="version")
+	public String version;
+	
+	@XmlElementWrapper(name="bundles")
+	@XmlElement(name="bundle")
+	public XmlBundleInfo[] bundleInfos;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public XmlBundleInfo[] getBundleInfos() {
+		return bundleInfos;
+	}
+
+	public void setBundleInfos(XmlBundleInfo[] bundleInfos) {
+		this.bundleInfos = bundleInfos;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlDeploymentPackages.java b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlDeploymentPackages.java
new file mode 100644
index 0000000000000000000000000000000000000000..168f794bcda9502272534454908c019237ecffc0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.deployment/src/main/java/org/eclipse/kura/core/deployment/XmlDeploymentPackages.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.deployment;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+@XmlRootElement(name="packages")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class XmlDeploymentPackages {
+	
+	@XmlElement(name="package")
+	public XmlDeploymentPackage[] deploymentPackages;
+
+	public XmlDeploymentPackage[] getDeploymentPackages() {
+		return deploymentPackages;
+	}
+
+	public void setDeploymentPackages(XmlDeploymentPackage[] deploymentPackages) {
+		this.deploymentPackages = deploymentPackages;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/.gitignore b/kura/org.eclipse.kura.core.net/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.core.net/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.net/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..7026484a0bf4bac5d8e346caad5b3b9c36bc3cac
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.net
+Bundle-SymbolicName: org.eclipse.kura.core.net;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,0.3)",
+ org.eclipse.kura.net.dhcp; version="[0.2,1.0)",
+ org.eclipse.kura.net.firewall; version="[0.2,1.0)",
+ org.eclipse.kura.net.modem; version="[0.2,0.3)",
+ org.eclipse.kura.net.wifi; version="[0.2,0.3)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.core.net; version="0.2.0",org.eclipse
+ .kura.core.net.modem; version="0.2.0",org.eclipse.kura.core.net.util;
+  version="0.2.0"
+
diff --git a/kura/org.eclipse.kura.core.net/about.html b/kura/org.eclipse.kura.core.net/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.net/about_files/epl-v10.html b/kura/org.eclipse.kura.core.net/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.net/build.properties b/kura/org.eclipse.kura.core.net/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..dbbb759b8f8a5913bfd9847d36c673194982329a
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/build.properties
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.net/pom.xml b/kura/org.eclipse.kura.core.net/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6874ced41af4c04daf78cc677b8b02dbebe588a9
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.net</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/AbstractNetInterface.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/AbstractNetInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..80e0093949882c03a492e06da96461a92ac9b38e
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/AbstractNetInterface.java
@@ -0,0 +1,223 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceState;
+import org.eclipse.kura.usb.UsbDevice;
+
+public abstract class AbstractNetInterface<T extends NetInterfaceAddress> implements NetInterface<T> 
+{
+	private String 			   name;
+	private byte[]			   hardwareAddress;
+	private boolean            loopback;
+	private boolean            pointToPoint;
+	private boolean            virtual;
+	private boolean            supportsMulticast;
+	private boolean            up;
+	private int                mtu;
+	private UsbDevice          usbDevice;
+	private String             driver;
+	private String             driverVersion;
+	private String             firmwareVersion;
+	private NetInterfaceState  state;
+	private boolean            autoConnect;
+	private List<T>            interfaceAddresses;
+	
+	protected AbstractNetInterface(String name) {
+		super();
+		this.name = name;
+		this.interfaceAddresses = new ArrayList<T>();
+	}
+	
+	protected AbstractNetInterface(NetInterface<? extends NetInterfaceAddress> other) {
+	    super();
+	    this.name = other.getName();
+	    this.hardwareAddress = other.getHardwareAddress();
+	    this.loopback = other.isLoopback();
+	    this.pointToPoint = other.isPointToPoint();
+	    this.virtual = other.isVirtual();
+	    this.supportsMulticast = other.supportsMulticast();
+	    this.up = other.isUp();
+	    this.mtu = other.getMTU();
+	    this.usbDevice = other.getUsbDevice();
+	    this.driver = other.getDriver();
+	    this.driverVersion = other.getDriverVersion();
+	    this.firmwareVersion = other.getFirmwareVersion();
+	    this.state = other.getState();
+	    this.autoConnect = other.isAutoConnect();
+	    this.interfaceAddresses = new ArrayList<T>();	    
+	    // note - copying of interfaceAddresses are handled in the subclasses
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+	    this.name = name;
+	}
+
+	public byte[] getHardwareAddress() {
+		return hardwareAddress;
+	}
+	
+	public boolean isLoopback() {
+		return loopback;
+	}
+	
+	public boolean isPointToPoint() {
+		return pointToPoint;
+	}
+	
+	public boolean isVirtual() {
+		return virtual;
+	}
+	
+	public boolean supportsMulticast() {
+		return supportsMulticast;
+	}
+	
+	public boolean isUp() {
+		return up;
+	}
+
+	public int getMTU() {
+		return mtu;
+	}
+
+	public void setMTU(int mtu) {
+		this.mtu = mtu;
+	}
+	
+	public String getDriver() {
+		return driver;
+	}
+
+	public void setDriver(String driver) {
+		this.driver = driver;
+	}
+
+	public String getDriverVersion() {
+		return driverVersion;
+	}
+
+	public void setDriverVersion(String driverVersion) {
+		this.driverVersion = driverVersion;
+	}
+
+	public String getFirmwareVersion() {
+		return firmwareVersion;
+	}
+
+	public void setFirmwareVersion(String firmwareVersion) {
+		this.firmwareVersion = firmwareVersion;
+	}
+
+	public NetInterfaceState getState() {
+		return state;
+	}
+
+	public void setState(NetInterfaceState state) {
+		this.state = state;
+	}
+
+	public UsbDevice getUsbDevice() {
+		return usbDevice;
+	}
+
+	public void setHardwareAddress(byte[] hardwareAddress) {
+		this.hardwareAddress = hardwareAddress;
+	}
+
+	public void setLoopback(boolean loopback) {
+		this.loopback = loopback;
+	}
+
+	public void setPointToPoint(boolean pointToPoint) {
+		this.pointToPoint = pointToPoint;
+	}
+
+	public void setVirtual(boolean virtual) {
+		this.virtual = virtual;
+	}
+
+	public void setSupportsMulticast(boolean supportsMulticast) {
+		this.supportsMulticast = supportsMulticast;
+	}
+
+	public void setUp(boolean up) {
+		this.up = up;
+	}
+
+	public void setUsbDevice(UsbDevice usbDevice) {
+		this.usbDevice = usbDevice;
+	}
+	
+	public boolean isAutoConnect() {
+		return autoConnect;
+	}
+
+	public void setAutoConnect(boolean autoConnect) {
+		this.autoConnect = autoConnect;
+	}
+	
+	public List<T> getNetInterfaceAddresses() {
+	    if(this.interfaceAddresses != null) {
+	        return Collections.unmodifiableList(this.interfaceAddresses);
+	    }	    
+	    return null;
+	}
+
+	public void setNetInterfaceAddresses(List<T> interfaceAddresses) {
+		this.interfaceAddresses = interfaceAddresses;
+	}
+	
+	@Override
+	public String toString() {		
+		StringBuilder sb = new StringBuilder();
+		sb.append("name=").append(name);
+		if(hardwareAddress != null && hardwareAddress.length == 6) {
+			sb.append(" :: hardwareAddress=")
+			.append(NetworkUtil.macToString(hardwareAddress));
+		}
+		sb.append(" :: loopback=").append(loopback)
+		.append(" :: pointToPoint=").append(pointToPoint)
+		.append(" :: virtual=").append(virtual)
+		.append(" :: supportsMulticast=").append(supportsMulticast)
+		.append(" :: up=").append(up)
+		.append(" :: mtu=").append(mtu);
+		if(usbDevice != null) {
+			sb.append(" :: usbDevice=").append(usbDevice);
+		}
+		sb.append(" :: driver=").append(driver)
+		.append(" :: driverVersion=").append(driverVersion)
+		.append(" :: firmwareVersion=").append(firmwareVersion)
+		.append(" :: state=").append(state)
+		.append(" :: autoConnect=").append(autoConnect);
+		if(interfaceAddresses != null && interfaceAddresses.size() > 0) {
+			sb.append(" :: InterfaceAddress=");
+			for(T interfaceAddress : interfaceAddresses) {
+				sb.append(interfaceAddress)
+				.append(" ");
+			}
+		}
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/EthernetInterfaceConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/EthernetInterfaceConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..18a73ca0cefb49f206d035d9634903f94e02db27
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/EthernetInterfaceConfigImpl.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.net.EthernetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+
+public class EthernetInterfaceConfigImpl extends EthernetInterfaceImpl<NetInterfaceAddressConfig> implements NetInterfaceConfig<NetInterfaceAddressConfig> {
+	
+	public EthernetInterfaceConfigImpl(String name) {
+		super(name);
+	}
+	
+    public EthernetInterfaceConfigImpl(EthernetInterface<? extends NetInterfaceAddress> other) {
+        super(other);
+        
+        // Copy the NetInterfaceAddresses
+        List<? extends NetInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<NetInterfaceAddressConfig> interfaceAddresses = new ArrayList<NetInterfaceAddressConfig>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(NetInterfaceAddress netInterfaceAddress : otherNetInterfaceAddresses) {
+                NetInterfaceAddressConfigImpl copiedInterfaceAddressImpl = new NetInterfaceAddressConfigImpl(netInterfaceAddress);
+                interfaceAddresses.add(copiedInterfaceAddressImpl);
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+    }
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/EthernetInterfaceImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/EthernetInterfaceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..80b6c88515512a15a8c3456e50911bf1a1c0d6d8
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/EthernetInterfaceImpl.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.net.EthernetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EthernetInterfaceImpl<T extends NetInterfaceAddress> extends AbstractNetInterface<T> implements EthernetInterface<T>
+{
+    private static final Logger s_logger = LoggerFactory.getLogger(EthernetInterfaceImpl.class);
+    
+	private boolean linkUp;
+	
+	public EthernetInterfaceImpl(String name) {
+		super(name);
+	}
+		   
+    public EthernetInterfaceImpl(EthernetInterface<? extends NetInterfaceAddress> other) {
+        super(other);
+        this.linkUp = other.isLinkUp();
+        
+        // Copy the NetInterfaceAddresses
+        List<? extends NetInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<T> interfaceAddresses = new ArrayList<T>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(NetInterfaceAddress netInterfaceAddress : otherNetInterfaceAddresses) {
+                try {
+                    NetInterfaceAddressImpl copiedInterfaceAddressImpl = new NetInterfaceAddressImpl(netInterfaceAddress);
+                    interfaceAddresses.add((T)copiedInterfaceAddressImpl);
+                } catch (Exception e) {
+                    s_logger.debug("Could not copy interface address: " + netInterfaceAddress);
+                }
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+    }
+
+	public NetInterfaceType getType() {
+		return NetInterfaceType.ETHERNET;
+	}
+
+	public boolean isLinkUp() {
+		return linkUp;
+	}
+
+	public void setLinkUp(boolean linkUp) {
+		this.linkUp = linkUp;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append(super.toString())
+		.append(" :: linkUp=")
+		.append(linkUp);
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/LoopbackInterfaceConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/LoopbackInterfaceConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7181acab73076a7f16e35f7f521bd4f826f2d9f
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/LoopbackInterfaceConfigImpl.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.net.LoopbackInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+
+public class LoopbackInterfaceConfigImpl extends LoopbackInterfaceImpl<NetInterfaceAddressConfig> implements NetInterfaceConfig<NetInterfaceAddressConfig> {
+	
+	public LoopbackInterfaceConfigImpl(String name) {
+		super(name);
+	}
+	
+	public LoopbackInterfaceConfigImpl(LoopbackInterface<? extends NetInterfaceAddress> other) {
+	    super(other);
+	    
+	    // Copy the NetInterfaceAddresses
+        List<? extends NetInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<NetInterfaceAddressConfig> interfaceAddresses = new ArrayList<NetInterfaceAddressConfig>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(NetInterfaceAddress netInterfaceAddress : otherNetInterfaceAddresses) {
+                NetInterfaceAddressConfigImpl copiedInterfaceAddressImpl = new NetInterfaceAddressConfigImpl(netInterfaceAddress);
+                interfaceAddresses.add(copiedInterfaceAddressImpl);
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/LoopbackInterfaceImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/LoopbackInterfaceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..705c7ae65f36a4a4dfdd9fdd2a40ed748bef957e
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/LoopbackInterfaceImpl.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.net.LoopbackInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LoopbackInterfaceImpl<T extends NetInterfaceAddress> extends AbstractNetInterface<T> implements LoopbackInterface<T> {
+	
+    private static final Logger s_logger = LoggerFactory.getLogger(LoopbackInterfaceImpl.class);
+            
+	public LoopbackInterfaceImpl(String name) {
+		super(name);
+	}
+	
+	public LoopbackInterfaceImpl(LoopbackInterface<? extends NetInterfaceAddress> other) {
+	    super(other);
+	    
+	    // Copy the NetInterfaceAddresses
+	    List<? extends NetInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<T> interfaceAddresses = new ArrayList<T>();
+
+        if(otherNetInterfaceAddresses != null) {
+    	    for(NetInterfaceAddress netInterfaceAddress : otherNetInterfaceAddresses) {
+    	        try {
+    	            NetInterfaceAddressImpl copiedInterfaceAddressImpl = new NetInterfaceAddressImpl(netInterfaceAddress);
+    	            interfaceAddresses.add((T)copiedInterfaceAddressImpl);
+    	        } catch (Exception e) {
+    	            s_logger.debug("Could not copy interface address: " + netInterfaceAddress);
+    	        }
+    	    }
+        }
+	    this.setNetInterfaceAddresses(interfaceAddresses);
+	}
+	
+	public NetInterfaceType getType() {
+		return NetInterfaceType.LOOPBACK;
+	}
+	
+	@Override
+	public String toString() {
+		return super.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetInterfaceAddressConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetInterfaceAddressConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a84f43d1e7c51adaafe850edbfefad097e27cb5c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetInterfaceAddressConfigImpl.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.List;
+
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+
+public class NetInterfaceAddressConfigImpl extends NetInterfaceAddressImpl implements NetInterfaceAddressConfig {
+
+	private List<NetConfig> m_configs;
+	
+	public NetInterfaceAddressConfigImpl() {
+		super();
+	}
+	
+	public NetInterfaceAddressConfigImpl(NetInterfaceAddress other) {
+	    super(other);
+	}
+
+	@Override
+	public List<NetConfig> getConfigs() {
+		return m_configs;
+	}
+
+	public void setNetConfigs(List<NetConfig> configs) {
+		m_configs = configs;
+	}
+	
+	public boolean equals(Object obj) {
+			
+		if (this == obj) {
+			return true;
+		}
+	    
+		/*
+        if(!super.equals(obj)) {
+            return false;
+        }
+		*/
+	    if(!(obj instanceof NetInterfaceAddressConfigImpl)) {
+	        return false;
+	    }
+	    
+	    NetInterfaceAddressConfigImpl other = (NetInterfaceAddressConfigImpl) obj;
+	    
+	    List<NetConfig> thisNetConfigs = getConfigs();
+	    List<NetConfig> otherNetConfigs = other.getConfigs();
+	    
+	    if(thisNetConfigs.size() != otherNetConfigs.size()) {
+	    	return false;
+	    }
+        if(!thisNetConfigs.containsAll(otherNetConfigs)) {
+            return false;
+        }
+        if(!otherNetConfigs.containsAll(thisNetConfigs)) {
+            return false;
+        }
+	    
+	    return true;
+	}
+	
+	@Override
+	public String toString() {
+		if(m_configs != null) {
+			StringBuffer sb = new StringBuffer();
+			for(NetConfig netConfig : m_configs) {
+				sb.append("NetConfig: ");
+				if(netConfig != null) {
+					sb.append(netConfig.toString());
+				} else {
+					sb.append("null");
+				}
+				sb.append(" - ");
+			}
+			
+			return sb.toString();
+		} else {
+			return "NetConfig: no configurations";
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetInterfaceAddressImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetInterfaceAddressImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2f86816f84706e0b94e5782c617a4adfade58ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetInterfaceAddressImpl.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.List;
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetInterfaceAddress;
+
+public class NetInterfaceAddressImpl implements NetInterfaceAddress 
+{
+	private IPAddress                  m_address;
+	private short                      m_networkPrefixLength;
+	private IPAddress		           m_netmask;
+    private IPAddress                  m_gateway;
+	private IPAddress                  m_broadcast;
+	private List<? extends IPAddress>  m_dnsAddresses;
+	
+	public NetInterfaceAddressImpl() {
+	}
+	
+	public NetInterfaceAddressImpl(NetInterfaceAddress other) {
+	    super();
+	    this.m_address = other.getAddress();
+        this.m_networkPrefixLength = other.getNetworkPrefixLength();
+        this.m_netmask = other.getNetmask();
+        this.m_gateway = other.getGateway();
+	    this.m_broadcast = other.getBroadcast();
+	    this.m_dnsAddresses = other.getDnsServers();
+	}
+
+	public IPAddress getAddress() {
+		return m_address;
+	}
+
+	public void setAddress(IPAddress address) {
+		m_address = address;
+	}
+
+	public short getNetworkPrefixLength() {
+		return m_networkPrefixLength;
+	}
+
+	public void setNetworkPrefixLength(short networkPrefixLength) {
+		m_networkPrefixLength = networkPrefixLength;
+	}
+
+	public IPAddress getNetmask() {
+		return m_netmask;
+	}
+
+	public void setNetmask(IPAddress netmask) {
+		m_netmask = netmask;
+	}
+	
+    public IPAddress getGateway() {
+        return m_gateway;
+    }
+    
+    public void setGateway(IPAddress gateway) {
+        m_gateway = gateway;
+    }
+
+	public IPAddress getBroadcast() {
+		return m_broadcast;
+	}
+
+	public void setBroadcast(IPAddress broadcast) {
+		m_broadcast = broadcast;
+	}
+	
+    @Override
+    public List<? extends IPAddress> getDnsServers() {
+        return m_dnsAddresses;
+    }
+    
+    public void setDnsServers(List<? extends IPAddress> dnsAddresses) {
+        m_dnsAddresses = dnsAddresses;
+    }
+	
+	@Override
+	public boolean equals(Object obj) {
+	    if(!(obj instanceof NetInterfaceAddress)) {
+	        return false;
+	    }
+	    
+	    NetInterfaceAddress other = (NetInterfaceAddress) obj;
+        
+        if(m_networkPrefixLength != other.getNetworkPrefixLength()) {
+            return false;
+        }
+        if(!compare(m_address, other.getAddress())) {
+	        return false;
+	    }
+        if(!compare(m_netmask, other.getNetmask())) {
+            return false;
+        }	    
+        if(!compare(m_gateway, other.getGateway())) {
+            return false;
+        }
+        if(!compare(m_broadcast, other.getBroadcast())) {
+            return false;
+        }
+        if(!compare(m_dnsAddresses, other.getDnsServers())) {
+            return false;
+        }
+	    
+	    return true;
+	}
+	
+	protected boolean compare(Object obj1, Object obj2) {
+        return (obj1 == null) ? (obj2 == null) : (obj1.equals(obj2));
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetworkConfiguration.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetworkConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..9dd07b4dc478a02cedc429f3a6aa099119455d72
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetworkConfiguration.java
@@ -0,0 +1,2027 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.modem.ModemInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IP6Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetConfigIP6;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceState;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.eclipse.kura.net.dhcp.DhcpServerConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemConnectionStatus;
+import org.eclipse.kura.net.modem.ModemConnectionType;
+import org.eclipse.kura.net.modem.ModemInterface;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+import org.eclipse.kura.net.modem.ModemPowerMode;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.ModemConfig.AuthType;
+import org.eclipse.kura.net.modem.ModemConfig.PdpType;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiBgscan;
+import org.eclipse.kura.net.wifi.WifiCiphers;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiInterface;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.net.wifi.WifiInterface.Capability;
+import org.eclipse.kura.usb.UsbDevice;
+import org.eclipse.kura.usb.UsbNetDevice;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetworkConfiguration {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(NetworkConfiguration.class);
+	
+	private Map<String, NetInterfaceConfig<? extends NetInterfaceAddressConfig>>    m_netInterfaceConfigs;
+	private Map<String,Object> m_properties;
+	private boolean m_recomputeProperties;
+	private List<String> m_modifiedInterfaceNames;
+
+	public NetworkConfiguration()
+	{
+		s_logger.debug("Created empty NetworkConfiguration");
+		m_netInterfaceConfigs = new HashMap<String, NetInterfaceConfig<? extends NetInterfaceAddressConfig>>();
+	}
+
+	/**
+	 * Constructor for create a completely new NetComponentConfiguration based on a set of properties
+	 * 
+	 * @param properties				The properties that represent the new configuration
+	 * @throws UnknownHostException		If some hostnames can not be resolved
+	 * @throws KuraException				It there is an internal error
+	 */
+	public NetworkConfiguration(Map<String,Object> properties)
+		throws UnknownHostException, KuraException
+	{
+		s_logger.debug("Creating NetworkConfiguration from properties");
+		m_netInterfaceConfigs = new HashMap<String, NetInterfaceConfig<? extends NetInterfaceAddressConfig>>();
+		String[] availableInterfaces = null;
+		
+		try {
+			availableInterfaces = (String[]) properties.get("net.interfaces");
+		} catch(ClassCastException e) {
+			//this means this configuration came from GWT - so convert the comma separated list
+			String interfaces = (String) properties.get("net.interfaces");
+			StringTokenizer st = new StringTokenizer(interfaces, ",");
+
+			List<String> interfacesArray = new ArrayList<String>();
+			while(st.hasMoreTokens()) {
+				interfacesArray.add(st.nextToken());
+			}
+			availableInterfaces = interfacesArray.toArray(new String[interfacesArray.size()]);
+		}
+		
+		if (availableInterfaces != null) {
+			s_logger.debug("There are " + availableInterfaces.length + " interfaces to add to the new configuration");
+			for(int i=0; i<availableInterfaces.length; i++) {
+				String currentNetInterface = availableInterfaces[i];
+				StringBuffer keyBuffer = new StringBuffer();
+				keyBuffer.append("net.interface.")
+				.append(currentNetInterface)
+				.append(".type");
+				NetInterfaceType type = NetInterfaceType.UNKNOWN;
+				if(properties.get(keyBuffer.toString()) != null) {
+				    type = NetInterfaceType.valueOf((String) properties.get(keyBuffer.toString()));
+				}
+				s_logger.trace("Adding interface: " + availableInterfaces[i] + " of type " + type);
+				addInterfaceConfiguration(availableInterfaces[i], type, properties);
+			}
+		}
+		
+		m_modifiedInterfaceNames = new ArrayList<String>();
+		String modifiedInterfaces = (String) properties.get("modified.interface.names");
+		if(modifiedInterfaces != null) {
+			for(String interfaceName : modifiedInterfaces.split(",")) {
+				m_modifiedInterfaceNames.add(interfaceName);
+			}
+		}
+		
+		m_recomputeProperties = true;
+	}
+	
+	public void setModifiedInterfaceNames(List<String> modifiedInterfaceNames) {
+		if(modifiedInterfaceNames != null && !modifiedInterfaceNames.isEmpty()) {
+			m_modifiedInterfaceNames = modifiedInterfaceNames;
+			m_recomputeProperties = true;
+		}
+	}
+	
+	public List<String> getModifiedInterfaceNames() {
+		return m_modifiedInterfaceNames;
+	}
+	
+	public void accept(NetworkConfigurationVisitor visitor) throws KuraException {
+	    visitor.visit(this);
+	}
+	
+	public void addNetInterfaceConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig)
+	{
+		m_netInterfaceConfigs.put(netInterfaceConfig.getName(), netInterfaceConfig);
+		m_recomputeProperties = true;
+	}
+
+	
+	public void addNetConfig(String interfaceName, NetInterfaceType netInterfaceType, NetConfig netConfig) throws KuraException {
+		NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig = m_netInterfaceConfigs.get(interfaceName);
+
+		if(netInterfaceConfig == null) {
+			switch(netInterfaceType) {
+				case LOOPBACK :
+					netInterfaceConfig = new LoopbackInterfaceConfigImpl(interfaceName);
+					break;
+				case ETHERNET :
+					netInterfaceConfig = new EthernetInterfaceConfigImpl(interfaceName);
+					break;
+				case WIFI :
+					netInterfaceConfig = new WifiInterfaceConfigImpl(interfaceName);
+					break;
+				case MODEM :
+				    netInterfaceConfig = new ModemInterfaceConfigImpl(interfaceName);
+				default :
+					break;
+			}
+		}
+		
+		List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+		
+		s_logger.trace("Adding a netConfig: " + netConfig);
+		for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+			NetInterfaceAddressConfigImpl netInterfaceAddressConfigImpl = (NetInterfaceAddressConfigImpl)netInterfaceAddressConfig;
+			List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+			netConfigs.add(netConfig);
+			netInterfaceAddressConfigImpl.setNetConfigs(netConfigs);
+		}
+		
+		m_recomputeProperties = true;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		
+		Iterator<String> it = m_netInterfaceConfigs.keySet().iterator();
+		while(it.hasNext()) {
+			NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig = m_netInterfaceConfigs.get(it.next());
+	
+			sb.append("\nname: " + netInterfaceConfig.getName());
+			sb.append(" :: Loopback? " + netInterfaceConfig.isLoopback());
+			sb.append(" :: Point to Point? " + netInterfaceConfig.isPointToPoint());
+			sb.append(" :: Up? " + netInterfaceConfig.isUp());
+			sb.append(" :: Virtual? " + netInterfaceConfig.isVirtual());
+			sb.append(" :: Driver: " + netInterfaceConfig.getDriver());
+			sb.append(" :: Driver Version: " + netInterfaceConfig.getDriverVersion());
+			sb.append(" :: Firmware Version: " + netInterfaceConfig.getFirmwareVersion());
+			sb.append(" :: MTU: " + netInterfaceConfig.getMTU());
+			if(netInterfaceConfig.getHardwareAddress() != null) {
+				sb.append(" :: Hardware Address: " + new String(netInterfaceConfig.getHardwareAddress()));
+			}
+			sb.append(" :: State: " + netInterfaceConfig.getState());
+			sb.append(" :: Type: " + netInterfaceConfig.getType());
+			sb.append(" :: Usb Device: " + netInterfaceConfig.getUsbDevice());
+			
+			
+			List<? extends NetInterfaceAddress> netInterfaceAddresses = netInterfaceConfig.getNetInterfaceAddresses();
+			for(NetInterfaceAddress netInterfaceAddress : netInterfaceAddresses) {
+				if(netInterfaceAddress.getAddress() != null) {
+					sb.append(" :: Address: " + netInterfaceAddress.getAddress().getHostAddress());
+				}
+				sb.append(" :: Prefix: " + netInterfaceAddress.getNetworkPrefixLength());
+				if(netInterfaceAddress.getNetmask() != null) {
+					sb.append(" :: Netmask: " + netInterfaceAddress.getNetmask().getHostAddress());
+				}
+				if(netInterfaceAddress.getBroadcast() != null) {
+					sb.append(" :: Broadcast: " + netInterfaceAddress.getBroadcast().getHostAddress());
+				}
+			}
+			
+			List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+			
+			if(netInterfaceAddressConfigs != null) {
+				for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+					List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+	
+					if(netConfigs != null) {
+						for(NetConfig netConfig : netConfigs) {
+							if(netConfig instanceof NetConfigIP4) {
+								sb.append("\n\tIPv4 ");
+								if(((NetConfigIP4) netConfig).isDhcp()) {
+									sb.append(" :: is DHCP client");
+									Map<String, Object> dhcp4Map = ((NetConfigIP4)netConfig).getProperties();
+									Iterator<String> it2 = dhcp4Map.keySet().iterator();
+									while(it2.hasNext()) {
+										String dhcpKey = it2.next();
+										sb.append(" :: " + dhcpKey + ": " + dhcp4Map.get(dhcpKey));
+									}
+								} else if(((NetConfigIP4)netConfig).getAddress() == null) {
+									sb.append(" :: is not configured for STATIC or DHCP");
+								} else {
+									sb.append(" :: is STATIC client");
+									if(((NetConfigIP4)netConfig).getAddress() != null) {
+										sb.append(" :: Address: " + ((NetConfigIP4)netConfig).getAddress().getHostAddress());
+									}
+									sb.append(" :: Prefix: " + ((NetConfigIP4)netConfig).getNetworkPrefixLength());
+									if(((NetConfigIP4)netConfig).getGateway() != null) {
+										sb.append(" :: Gateway: " + ((NetConfigIP4)netConfig).getGateway().getHostAddress());
+									}
+		
+									List<IP4Address> dnsServers = ((NetConfigIP4)netConfig).getDnsServers();
+									List<IP4Address> winsServers = ((NetConfigIP4)netConfig).getWinsServers();
+									List<String> domains = ((NetConfigIP4)netConfig).getDomains();
+									if(dnsServers != null) {
+										for(IP4Address dnsServer : dnsServers) {
+											sb.append(" :: DNS : " + dnsServer.getHostAddress());
+										}
+									}
+									if(winsServers != null) {
+										for(IP4Address winsServer : winsServers) {
+											sb.append(" :: WINS Server : " + winsServer.getHostAddress());
+										}
+									}
+									if(domains != null) {
+										for(String domain : domains) {
+											sb.append(" :: Domains : " + domain);
+										}
+									}
+								}
+							} else if(netConfig instanceof NetConfigIP6) {
+								sb.append("\n\tIPv6 ");
+								if(((NetConfigIP6) netConfig).isDhcp()) {
+									sb.append(" :: is DHCP client");
+									Map<String, Object> dhcp6Map = ((NetConfigIP6)netConfig).getProperties();
+									Iterator<String> it2 = dhcp6Map.keySet().iterator();
+									while(it2.hasNext()) {
+										String dhcpKey = it2.next();
+										sb.append(" :: " + dhcpKey + ": " + dhcp6Map.get(dhcpKey));
+									}
+								} else {
+									sb.append(" :: is STATIC client");
+									if(((NetConfigIP6)netConfig).getAddress() != null) {
+										sb.append(" :: Address: " + ((NetConfigIP6)netConfig).getAddress().getHostAddress());
+									}
+		
+									List<IP6Address> dnsServers = ((NetConfigIP6)netConfig).getDnsServers();
+									List<String> domains = ((NetConfigIP6)netConfig).getDomains();
+									for(IP6Address dnsServer : dnsServers) {
+										sb.append(" :: DNS : " + dnsServer.getHostAddress());
+									}
+									for(String domain : domains) {
+										sb.append(" :: Domains : " + domain);
+									}
+								}
+							} else if(netConfig instanceof WifiConfig) {
+								sb.append("\n\tWifiConfig ");
+								
+								sb.append(" :: SSID: " + ((WifiConfig) netConfig).getSSID());
+								sb.append(" :: BgScan: " + ((WifiConfig) netConfig).getBgscan());
+								sb.append(" :: Broadcast: " + ((WifiConfig) netConfig).getBroadcast());
+								int[] channels = ((WifiConfig) netConfig).getChannels();
+								if(channels != null && channels.length > 0) {
+									for(int i=0; i<channels.length; i++) {
+										sb.append(channels[i]);
+										if(i+1 < channels.length) {
+											sb.append(",");
+										}
+									}
+								}
+								sb.append(" :: Group Ciphers: " + ((WifiConfig) netConfig).getGroupCiphers());
+								sb.append(" :: Hardware Mode: " + ((WifiConfig) netConfig).getHardwareMode());
+								sb.append(" :: Mode: " + ((WifiConfig) netConfig).getMode());
+								sb.append(" :: Pairwise Ciphers: " + ((WifiConfig) netConfig).getPairwiseCiphers());
+								sb.append(" :: Passkey: " + ((WifiConfig) netConfig).getPasskey());
+								sb.append(" :: Security: " + ((WifiConfig) netConfig).getSecurity());
+							} else if(netConfig instanceof ModemConfig) {
+								sb.append("\n\tModemConfig ");
+								
+								sb.append(" :: APN: " + ((ModemConfig) netConfig).getApn());
+								sb.append(" :: Data Compression: " + ((ModemConfig) netConfig).getDataCompression());
+								sb.append(" :: Dial String: " + ((ModemConfig) netConfig).getDialString());
+								sb.append(" :: Header Compression: " + ((ModemConfig) netConfig).getHeaderCompression());
+								sb.append(" :: Password: " + ((ModemConfig) netConfig).getPassword());
+								sb.append(" :: PPP number: " + ((ModemConfig) netConfig).getPppNumber());
+								sb.append(" :: Profile ID: " + ((ModemConfig) netConfig).getProfileID());
+								sb.append(" :: Username: " + ((ModemConfig) netConfig).getUsername());
+								sb.append(" :: Auth Type: " + ((ModemConfig) netConfig).getAuthType());
+								sb.append(" :: IP Address: " + ((ModemConfig) netConfig).getIpAddress());
+								sb.append(" :: PDP Type: " + ((ModemConfig) netConfig).getPdpType());
+							} else if(netConfig instanceof DhcpServerConfig) {
+								sb.append("\n\tDhcpServerConfig ");
+								//TODO - finish displaying
+							} else if(netConfig instanceof FirewallNatConfig) {
+								sb.append("\n\tFirewallNatConfig ");
+								//TODO - finish displaying
+							} else {
+								if(netConfig != null && netConfig.getClass() != null) {
+									sb.append("\n\tUNKNOWN CONFIG TYPE???: " + netConfig.getClass().getName());
+								} else {
+									sb.append("\n\tNULL NETCONFIG PRESENT?!?");
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		
+		return sb.toString();
+	}
+	
+	// Returns a List of all modified NetInterfaceConfigs, or if none are specified, all NetInterfaceConfigs
+	public List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> getModifiedNetInterfaceConfigs() {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = null;
+		if(m_modifiedInterfaceNames != null && !m_modifiedInterfaceNames.isEmpty()) {
+			netInterfaceConfigs = new ArrayList<NetInterfaceConfig<? extends NetInterfaceAddressConfig>>();
+			for(String interfaceName : m_modifiedInterfaceNames) {
+				netInterfaceConfigs.add(m_netInterfaceConfigs.get(interfaceName));
+			}
+		} else {
+			netInterfaceConfigs = getNetInterfaceConfigs();
+		}
+		
+		return netInterfaceConfigs;
+	}
+	
+	public List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> getNetInterfaceConfigs() {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = new ArrayList<NetInterfaceConfig<? extends NetInterfaceAddressConfig>>();
+		Iterator<String> it = m_netInterfaceConfigs.keySet().iterator();
+		while(it.hasNext()) {
+			netInterfaceConfigs.add(m_netInterfaceConfigs.get(it.next()));
+		}
+		return netInterfaceConfigs;
+	}
+	
+	public NetInterfaceConfig<? extends NetInterfaceAddressConfig> getNetInterfaceConfig(String interfaceName) {
+	    return m_netInterfaceConfigs.get(interfaceName);
+	}
+	
+	public Map<String,Object> getConfigurationProperties() {
+	    if(m_recomputeProperties) {
+	        recomputeNetworkProperties();
+	        m_recomputeProperties = false;
+	    }
+	    
+		return m_properties;
+	}
+	
+	public boolean isValid() throws KuraException {
+		
+		//for(NetInterfaceConfig netInterfaceConfig : m_netInterfaceConfigs) {
+		Iterator<String> it = m_netInterfaceConfigs.keySet().iterator();
+		while(it.hasNext()) {
+			NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig = m_netInterfaceConfigs.get(it.next());
+			
+			if(netInterfaceConfig.getMTU() < 0) {
+				s_logger.error("MTU must be greater than 0");
+				return false;
+			}
+			
+			NetInterfaceType type = netInterfaceConfig.getType();
+			if(type != NetInterfaceType.ETHERNET && type != NetInterfaceType.WIFI && type != NetInterfaceType.LOOPBACK) {
+				s_logger.error("Type must be ETHERNET, WIFI, or LOOPBACK - type is " + type);
+				return false;
+			}
+			
+			List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+			for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+				List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+				
+				if(netConfigs != null) {
+					for(NetConfig netConfig : netConfigs) {
+						if(!netConfig.isValid()) {
+							s_logger.error("Invalid config " + netConfig.toString());
+							return false;
+						}
+					}
+				}
+			}
+		}
+		
+		return true;
+	}
+
+
+	// ---------------------------------------------------------------
+	//
+	//    Private Methods
+	//
+	// ---------------------------------------------------------------
+	
+	private void recomputeNetworkProperties() 
+	{
+		Map<String,Object> properties = new HashMap<String,Object>();
+		
+		String netIfPrefix = null;
+		String netIfReadOnlyPrefix = null;
+		String netIfConfigPrefix = null;
+        StringBuilder sbPrefix = null;
+		StringBuilder sbInterfaces = new StringBuilder();
+
+		if(m_modifiedInterfaceNames != null && !m_modifiedInterfaceNames.isEmpty()) {
+			StringBuilder sb = new StringBuilder();
+			
+			String prefix = "";
+			for (String interfaceName : m_modifiedInterfaceNames) {
+			  sb.append(prefix);
+			  prefix = ",";
+			  sb.append(interfaceName);
+			}
+			s_logger.debug("Set modified interface names: " + sb.toString());
+			properties.put("modified.interface.names", sb.toString());
+		}
+		
+		Iterator<String> it = m_netInterfaceConfigs.keySet().iterator();
+		while(it.hasNext()) {
+			NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig = m_netInterfaceConfigs.get(it.next());
+			
+			// add the interface to the list of interface found in the platform
+			if(sbInterfaces.length() != 0) {
+				sbInterfaces.append(",");
+			}
+			sbInterfaces.append(netInterfaceConfig.getName());
+
+	        // build the prefixes for all the properties associated with this interface
+			sbPrefix = new StringBuilder("net.interface.").append(netInterfaceConfig.getName()).append(".");	        
+	        netIfReadOnlyPrefix = sbPrefix.toString();
+	        netIfPrefix = sbPrefix.append("config.").toString();
+	        netIfConfigPrefix = sbPrefix.toString();
+	        
+			// add the properties of the interface
+            properties.put(netIfReadOnlyPrefix+"type",    			netInterfaceConfig.getType().toString());
+			properties.put(netIfPrefix+"name",          		  	netInterfaceConfig.getName());
+			if(netInterfaceConfig.getState() != null) {
+				properties.put(netIfPrefix+"state",			  			netInterfaceConfig.getState().toString());
+			}
+			properties.put(netIfPrefix+"autoconnect",     			netInterfaceConfig.isAutoConnect());
+			properties.put(netIfPrefix+"mtu",             			netInterfaceConfig.getMTU());
+			properties.put(netIfReadOnlyPrefix+"driver",          	netInterfaceConfig.getDriver());
+			properties.put(netIfReadOnlyPrefix+"driver.version",	netInterfaceConfig.getDriverVersion());
+			properties.put(netIfReadOnlyPrefix+"firmware.version",	netInterfaceConfig.getFirmwareVersion());
+			properties.put(netIfReadOnlyPrefix+"mac",          		NetUtil.hardwareAddressToString(netInterfaceConfig.getHardwareAddress()));
+			properties.put(netIfReadOnlyPrefix+"loopback",          netInterfaceConfig.isLoopback());
+			properties.put(netIfReadOnlyPrefix+"ptp",          		netInterfaceConfig.isPointToPoint());
+			properties.put(netIfReadOnlyPrefix+"up",          		netInterfaceConfig.isUp());
+			properties.put(netIfReadOnlyPrefix+"virtual",			netInterfaceConfig.isVirtual());
+			
+			// usb
+			if(netInterfaceConfig.getUsbDevice() != null) {
+			    UsbDevice usbDev = netInterfaceConfig.getUsbDevice();
+                properties.put(netIfReadOnlyPrefix+"usb.vendor.id",              usbDev.getVendorId());
+                properties.put(netIfReadOnlyPrefix+"usb.vendor.name",            usbDev.getManufacturerName());
+			    properties.put(netIfReadOnlyPrefix+"usb.product.id",             usbDev.getProductId());
+			    properties.put(netIfReadOnlyPrefix+"usb.product.name",           usbDev.getProductName());
+			    properties.put(netIfReadOnlyPrefix+"usb.busNumber",              usbDev.getUsbBusNumber());
+			    properties.put(netIfReadOnlyPrefix+"usb.devicePath",             usbDev.getUsbDevicePath());
+			}
+			
+			//custom readonly props for Ethernet and Wifi
+			if(netInterfaceConfig instanceof EthernetInterfaceConfigImpl) {
+				properties.put(netIfReadOnlyPrefix+"eth.link.up",		((EthernetInterfaceConfigImpl)netInterfaceConfig).isLinkUp());
+			} else if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+				EnumSet<Capability> capabilities = ((WifiInterfaceConfigImpl)netInterfaceConfig).getCapabilities();
+				if(capabilities != null && capabilities.size() > 0) {
+					StringBuilder sb = new StringBuilder();
+					for(Capability capability : capabilities) {
+						sb.append(capability.toString());
+						sb.append(",");
+					}
+					String capabilitiesString = sb.toString();
+					capabilitiesString = capabilitiesString.substring(0, capabilitiesString.length() - 1);
+					properties.put(netIfReadOnlyPrefix+"wifi.capabilities",			capabilitiesString);
+				}
+			}
+			
+	         // add wifi properties
+            if(netInterfaceConfig.getType() == NetInterfaceType.WIFI) {
+                
+                // capabilities
+                StringBuilder sbCapabilities = new StringBuilder();
+                EnumSet<Capability> capabilities = ((WifiInterface)netInterfaceConfig).getCapabilities();
+                if(capabilities != null) {
+                    Iterator<Capability> it2 = ((WifiInterface)netInterfaceConfig).getCapabilities().iterator();
+                    while(it2.hasNext()) {
+                        sbCapabilities.append(it2.next().name()).append(" ");
+                    }
+                    properties.put(netIfReadOnlyPrefix+"wifi.capabilities", sbCapabilities.toString());
+                }
+            }
+            
+            // add modem properties
+           if(netInterfaceConfig.getType() == NetInterfaceType.MODEM) {
+               String delim;
+               
+               // revision
+               StringBuffer revisionIdBuf = new StringBuffer();
+               String[] revisionId = ((ModemInterface<?>)netInterfaceConfig).getRevisionId();
+               if(revisionId != null) {
+                   delim = null;
+                   for(String rev : revisionId) {
+                	   if (delim != null) {
+                		   revisionIdBuf.append(delim);
+                	   }
+                       revisionIdBuf.append(rev);
+                       delim = ",";
+                   }
+               }
+               
+               // technology types
+               StringBuffer techTypesBuf = new StringBuffer();
+               List<ModemTechnologyType> techTypes = ((ModemInterface<?>)netInterfaceConfig).getTechnologyTypes();
+               if(techTypes != null) {
+                   delim = null;
+                   for(ModemTechnologyType techType : techTypes) {
+                	   if (delim != null) {
+                		   techTypesBuf.append(delim);
+                	   }
+                       techTypesBuf.append(techType.toString());
+                       delim = ",";
+                   }
+               }
+               
+               ModemPowerMode powerMode = ModemPowerMode.UNKNOWN;
+               if(((ModemInterface<?>)netInterfaceConfig).getPowerMode() != null) {
+                   powerMode = ((ModemInterface<?>)netInterfaceConfig).getPowerMode();
+               }
+               
+               properties.put(netIfReadOnlyPrefix+"manufacturer",           ((ModemInterface<?>)netInterfaceConfig).getManufacturer());
+               properties.put(netIfReadOnlyPrefix+"model",                  ((ModemInterface<?>)netInterfaceConfig).getModel());
+               properties.put(netIfReadOnlyPrefix+"revisionId",             revisionIdBuf.toString());
+               properties.put(netIfReadOnlyPrefix+"serialNum",              ((ModemInterface<?>)netInterfaceConfig).getSerialNumber());
+               properties.put(netIfReadOnlyPrefix+"technologyTypes",        techTypesBuf.toString());
+               
+               properties.put(netIfConfigPrefix+"identifier",               ((ModemInterface<?>)netInterfaceConfig).getModemIdentifier());
+               properties.put(netIfConfigPrefix+"powerMode",                powerMode.toString());
+               properties.put(netIfConfigPrefix+"pppNum",                   ((ModemInterface<?>)netInterfaceConfig).getPppNum());
+               properties.put(netIfConfigPrefix+"poweredOn",                ((ModemInterface<?>)netInterfaceConfig).isPoweredOn());
+            }
+			
+			for (NetInterfaceAddress nia : netInterfaceConfig.getNetInterfaceAddresses()) {
+			    String typePrefix = "ip4.";
+				if (nia != null) {				    
+                    if(nia.getAddress() != null) {
+                        properties.put(netIfReadOnlyPrefix+typePrefix+"address", nia.getAddress().getHostAddress());
+                    }
+                    if(nia.getBroadcast() != null) {
+                        properties.put(netIfReadOnlyPrefix+typePrefix+"broadcast", nia.getBroadcast().getHostAddress());
+                    }
+                    if(nia.getGateway() != null) {
+                        properties.put(netIfReadOnlyPrefix+typePrefix+"gateway", nia.getGateway().getHostAddress());
+                    }
+                    if(nia.getNetmask() != null) {
+                        properties.put(netIfReadOnlyPrefix+typePrefix+"netmask", nia.getNetmask().getHostAddress());
+                    }
+                    if(nia.getNetmask() != null) {
+                        properties.put(netIfReadOnlyPrefix+typePrefix+"prefix", Short.valueOf(nia.getNetworkPrefixLength()));
+                    }
+                    if(nia.getDnsServers() != null) {
+                        StringBuilder dnsServers = new StringBuilder();
+                        for(IPAddress dnsServer : nia.getDnsServers()) {
+                            if(dnsServers.length() != 0) {
+                                dnsServers.append(",");
+                            }
+                            dnsServers.append(dnsServer);
+                        }
+                        properties.put(netIfReadOnlyPrefix+typePrefix+"dnsServers", dnsServers.toString());
+                    }
+                    
+                    // Wifi interface address
+                    if(nia instanceof WifiInterfaceAddress) {
+                        // access point
+                        WifiAccessPoint wap = ((WifiInterfaceAddress)nia).getWifiAccessPoint();
+                        if (wap != null) {
+                            /* TODO: need fields to reflect current state?
+                            properties.put(sbNetIfPrefix+"wifi.ssid", wap.getSSID());
+                            properties.put(sbNetIfPrefix+"wifi.mode", wap.getMode());
+                            */
+                        }
+                        
+                        long bitrate = ((WifiInterfaceAddress)nia).getBitrate();
+                        properties.put(netIfReadOnlyPrefix+"wifi.bitrate", Long.valueOf(bitrate));
+                        
+                        WifiMode wifiMode;
+                        if(((WifiInterfaceAddress)nia).getMode() != null) {
+                            wifiMode = ((WifiInterfaceAddress)nia).getMode();
+                        } else {
+                            wifiMode = WifiMode.UNKNOWN;
+                        }
+                        properties.put(netIfPrefix+"wifi.mode", wifiMode.toString());
+                    }
+                    
+                    // Modem interface address
+                    if(nia instanceof ModemInterfaceAddress) {
+                        if(((ModemInterfaceAddress)nia).getConnectionType() != null) {
+                            properties.put(netIfConfigPrefix+"connection.type", ((ModemInterfaceAddress)nia).getConnectionType().toString());
+                        }
+                        if(((ModemInterfaceAddress)nia).getConnectionStatus() != null) {
+                            properties.put(netIfConfigPrefix+"connection.status", ((ModemInterfaceAddress)nia).getConnectionStatus().toString());
+                        }
+                    }
+				}
+			}
+
+			// add the properties of the network configurations associated to the interface
+
+			List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+			s_logger.trace("netInterfaceAddressConfigs.size() for " + netInterfaceConfig.getName() + ": " + netInterfaceAddressConfigs.size());
+
+			for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+				List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+				
+				if(netConfigs != null) {
+					s_logger.trace("netConfigs.size(): " + netConfigs.size());
+	
+					for(NetConfig netConfig : netConfigs) {
+						if (netConfig instanceof WifiConfig) {
+							s_logger.trace("adding netconfig WifiConfigIP4 for " + netInterfaceConfig.getName());
+							addWifiConfigIP4Properties((WifiConfig) netConfig, netIfConfigPrefix, properties);
+						} else if (netConfig instanceof ModemConfig) {
+						    s_logger.trace("adding netconfig ModemConfig for " + netInterfaceConfig.getName());
+                            addModemConfigProperties((ModemConfig) netConfig, netIfConfigPrefix, properties);
+						} else if (netConfig instanceof NetConfigIP4) {
+							s_logger.trace("adding netconfig NetConfigIP4 for " + netInterfaceConfig.getName());
+							addNetConfigIP4Properties((NetConfigIP4) netConfig, netIfConfigPrefix, properties);
+	
+							/*
+							Iterator<String> it2 = properties.keySet().iterator();
+							while(it2.hasNext()) {
+								String key = it2.next();
+								System.out.println("\t\t\t"+key+"="+properties.get(key));
+							}*/
+						} else if (netConfig instanceof NetConfigIP6) {
+							s_logger.trace("adding netconfig NetConfigIP6 for " + netInterfaceConfig.getName());
+							addNetConfigIP6Properties((NetConfigIP6) netConfig, netIfConfigPrefix, properties);
+	
+							/*
+							Iterator<String> it = properties.keySet().iterator();
+							while(it.hasNext()) {
+								String key = it.next();
+								System.out.println("\t\t\t"+key+"="+properties.get(key));
+							}*/
+						} else if (netConfig instanceof DhcpServerConfig4) {
+							s_logger.trace("adding netconfig DhcpServerConfig4 for " + netInterfaceConfig.getName());
+							addDhcpServerConfig4((DhcpServerConfig4) netConfig, netIfConfigPrefix, properties);
+						} else if (netConfig instanceof FirewallNatConfig) {
+							s_logger.trace("adding netconfig FirewallNatConfig for " + netInterfaceConfig.getName());
+							addFirewallNatConfig((FirewallNatConfig) netConfig, netIfConfigPrefix, properties);
+						}
+					}
+				}
+			}
+		}
+		properties.put("net.interfaces", sbInterfaces.toString());
+		
+		m_properties = properties;
+	}
+	
+	private void addWifiConfigIP4Properties(WifiConfig wifiConfig,
+			String netIfConfigPrefix, 
+			Map<String,Object> properties) {
+	    
+	    WifiMode mode = wifiConfig.getMode();
+	    if(mode == null) {
+	        s_logger.trace("WifiMode is null - could not add wifiConfig: " + wifiConfig);
+	        return;
+	    }
+	    
+		StringBuilder prefix = new StringBuilder(netIfConfigPrefix).append("wifi.").append(mode.toString().toLowerCase());
+	    
+		int [] channels = wifiConfig.getChannels();
+		StringBuffer sbChannel = new StringBuffer();
+		if(channels != null) {
+			for (int i = 0; i < channels.length; i++) {
+				sbChannel.append(channels[i]);
+				if (i < (channels.length-1)) {
+					sbChannel.append(' ');
+				}
+			}
+		}
+
+		properties.put(prefix+".ssid", wifiConfig.getSSID());
+		properties.put(prefix+".driver", wifiConfig.getDriver());
+		if(wifiConfig.getMode() != null) {
+			properties.put(prefix+".mode", wifiConfig.getMode().toString());
+		} else {
+			properties.put(prefix+".mode", WifiMode.UNKNOWN.toString());
+		}
+		if(wifiConfig.getSecurity() != null) {
+			properties.put(prefix+".securityType", wifiConfig.getSecurity().toString());
+		} else {
+			properties.put(prefix+".securityType", WifiSecurity.NONE.toString());
+		}
+		properties.put(prefix+".channel", sbChannel.toString());
+		if(wifiConfig != null && wifiConfig.getPasskey() != null) {
+			properties.put(prefix+".passphrase", wifiConfig.getPasskey());
+		} else {
+			properties.put(prefix+".passphrase", "");
+		}
+		if(wifiConfig != null && wifiConfig.getHardwareMode() != null) {
+			properties.put(prefix+".hardwareMode", wifiConfig.getHardwareMode());
+		} else {
+			properties.put(prefix+".hardwareMode", "");
+		}
+		properties.put(prefix+".broadcast", Boolean.valueOf(wifiConfig.getBroadcast()));
+		if(wifiConfig.getRadioMode() != null) {
+		    properties.put(prefix+".radioMode", wifiConfig.getRadioMode().toString());
+		}
+		
+		if (wifiConfig.getPairwiseCiphers() != null) {
+			properties.put(prefix+".pairwiseCiphers", wifiConfig.getPairwiseCiphers().name());
+		}
+		
+		if (wifiConfig.getGroupCiphers() != null) {
+			properties.put(prefix+".groupCiphers", wifiConfig.getGroupCiphers().name());
+		}
+		
+		properties.put(prefix+".pingAccessPoint", wifiConfig.pingAccessPoint());
+		
+		/*
+		Iterator<Entry<String, Object>> it = properties.entrySet().iterator();
+		while(it.hasNext()) {
+			Entry<String, Object> entry = it.next();
+			System.out.println(entry.getKey() + " = " + entry.getValue());
+		}*/
+	}
+	
+	private WifiConfig getWifiConfig(String netIfConfigPrefix,
+	        WifiMode mode,
+	        Map<String, Object> properties) throws KuraException {
+	    
+	    String key;
+	    WifiConfig wifiConfig = new WifiConfig();
+	    StringBuilder prefix = new StringBuilder(netIfConfigPrefix).append("wifi.").append(mode.toString().toLowerCase());
+	    
+	    // mode
+	    s_logger.trace("mode is " + mode.toString());
+	    wifiConfig.setMode(mode);
+        
+        // ssid
+        key = prefix + ".ssid";
+        String ssid = (String)properties.get(key);
+        if(ssid == null) {
+            ssid = "";
+        }
+        s_logger.trace("SSID is " + ssid);
+        wifiConfig.setSSID(ssid);       
+	    
+	    // driver
+	    key = prefix + ".driver";
+	    String driver = (String)properties.get(key);
+	    if(driver == null) {
+	    	driver = "";
+	    }
+	    s_logger.trace("driver is " + driver);
+	    wifiConfig.setDriver(driver);	    
+	    
+	    // security
+	    key = prefix + ".securityType";
+	    WifiSecurity wifiSecurity = WifiSecurity.NONE;
+	    String securityString = (String)properties.get(key);
+	    s_logger.trace("securityString is " + securityString);
+	    if(securityString != null && !securityString.isEmpty()) {
+	        try {
+	            wifiSecurity = WifiSecurity.valueOf(securityString);
+	        } catch (IllegalArgumentException e) {
+	            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Could not parse wifi security " + securityString);
+	        }
+	    }
+	    wifiConfig.setSecurity(wifiSecurity);
+	    
+	    // channels
+	    key = prefix + ".channel";
+	    String channelsString = (String)properties.get(key);
+	    s_logger.trace("channelsString is " + channelsString);
+	    if(channelsString != null) {
+	    	channelsString = channelsString.trim();
+	    	if (channelsString.length() > 0) {
+		    	StringTokenizer st = new StringTokenizer(channelsString, " ");
+		    	int tokens = st.countTokens();
+		    	if (tokens > 0) {
+		    		int[] channels = new int[tokens];
+					for (int i = 0; i < tokens; i++) {
+						String token = st.nextToken();
+						try {
+							channels[i] = Integer.parseInt(token);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+					wifiConfig.setChannels(channels);
+		    	}
+	    	}
+	    }
+	    
+        // passphrase
+        key = prefix + ".passphrase";
+        String passphrase = (String)properties.get(key);
+        if(passphrase == null) {
+            passphrase = "";
+        }
+	    s_logger.trace("passphrase is " + passphrase);
+        wifiConfig.setPasskey(passphrase);       
+
+        // hardware mode
+        key = prefix + ".hardwareMode";
+        String hwMode = (String)properties.get(key);
+        if(hwMode == null) {
+            hwMode = "";
+        }
+	    s_logger.trace("hwMode is " + hwMode);
+        wifiConfig.setHardwareMode(hwMode);
+        
+        // bgscan
+        if(mode == WifiMode.INFRA) {
+	        key = prefix + ".bgscan";
+	        String bgscan = (String)properties.get(key);
+	        if(bgscan == null) {
+	        	bgscan = "";
+	        }
+		    s_logger.trace("bgscan is " + bgscan);
+	        wifiConfig.setBgscan(new WifiBgscan(bgscan));
+	        
+	        key = prefix + ".pairwiseCiphers";
+	        String pairwiseCiphers = (String)properties.get(key);
+	        if (pairwiseCiphers != null) {
+	        	wifiConfig.setPairwiseCiphers(WifiCiphers.valueOf(pairwiseCiphers));
+	        }
+	        
+	        key = prefix + ".groupCiphers";
+	        String groupCiphers = (String)properties.get(key);
+	        if (groupCiphers != null) {
+	        	wifiConfig.setGroupCiphers(WifiCiphers.valueOf(groupCiphers));
+	        }
+	        
+	        // ping access point?
+	        key = prefix + ".pingAccessPoint";
+	        boolean pingAccessPoint = false;
+	        if(properties.get(key) != null) {
+	            pingAccessPoint = (Boolean)properties.get(key);
+	        s_logger.trace("Ping Access Point is {}", pingAccessPoint);
+	        } else {
+	            s_logger.trace("Ping Access Point is null");
+	        }
+	        wifiConfig.setPingAccessPoint(pingAccessPoint);
+        }
+        
+        // broadcast
+        key = prefix + ".broadcast";
+        Boolean broadcast = (Boolean)properties.get(key);
+        if(broadcast != null) {
+            wifiConfig.setBroadcast(broadcast);
+        }
+	    s_logger.trace("hwMode is " + hwMode);
+	    
+	    // radio mode
+        key = prefix + ".radioMode";
+        WifiRadioMode radioMode;
+        String radioModeString = (String)properties.get(key);
+        s_logger.trace("radioModeString is " + radioModeString);
+        if(radioModeString != null && !radioModeString.isEmpty()) {
+            try {
+                radioMode = WifiRadioMode.valueOf(radioModeString);
+                wifiConfig.setRadioMode(radioMode);
+            } catch (IllegalArgumentException e) {
+                throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Could not parse wifi radio mode " + radioModeString);
+            }
+        }
+        
+	    if(!wifiConfig.isValid()) {
+	    	return null;
+	    } else {
+		    s_logger.trace("Returning wifiConfig: " + wifiConfig);
+	    	return wifiConfig;
+	    }
+	}
+	
+	private void addModemConfigProperties(ModemConfig modemConfig,
+	        String prefix, 
+            Map<String, Object> properties) {
+	    
+        properties.put(prefix+"apn", modemConfig.getApn());
+	    properties.put(prefix+"authType", (modemConfig.getAuthType() != null) ? modemConfig.getAuthType().toString() : "");
+	    properties.put(prefix+"dataCompression", modemConfig.getDataCompression());
+	    properties.put(prefix+"dialString", modemConfig.getDialString());
+	    properties.put(prefix+"headerCompression", modemConfig.getHeaderCompression());
+	    properties.put(prefix+"ipAddress", (modemConfig.getIpAddress() != null) ? modemConfig.getIpAddress().toString() : "");
+	    properties.put(prefix+"password", modemConfig.getPassword());
+	    properties.put(prefix+"pdpType", (modemConfig.getPdpType() != null) ? modemConfig.getPdpType().toString() : "");
+        properties.put(prefix+"pppNum", modemConfig.getPppNumber());
+        properties.put(prefix+"lcpEchoInterval", modemConfig.getLcpEchoInterval());
+        properties.put(prefix+"lcpEchoFailure", modemConfig.getLcpEchoFailure());
+	    properties.put(prefix+"profileId", modemConfig.getProfileID());
+        //properties.put(prefix+"provider", modemConfig.getProvider());
+	    properties.put(prefix+"username", modemConfig.getUsername());;
+	    properties.put(prefix+"enabled", modemConfig.isEnabled());
+	    properties.put(prefix+"gpsEnabled", modemConfig.isGpsEnabled());
+	}
+	
+    private ModemConfig getModemConfig(String prefix,
+            Map<String, Object> properties) throws KuraException {
+     
+        String key;
+        ModemConfig modemConfig = new ModemConfig();
+        
+        // apn
+        key = prefix + "apn";
+        String apn = (String)properties.get(key);
+        s_logger.trace("APN is " + apn);
+        modemConfig.setApn(apn);       
+
+        // auth type
+        key = prefix + "authType";
+        String authTypeString = (String)properties.get(key);
+        AuthType authType = AuthType.NONE;
+        s_logger.trace("Auth type is " + authTypeString);
+        if(authTypeString != null && !authTypeString.isEmpty()) {
+            try {
+                authType = AuthType.valueOf(authTypeString);
+            } catch (IllegalArgumentException e) {
+                throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Could not parse auth type " + authTypeString);
+            }
+        } else {
+            s_logger.trace("Auth type is null");
+        }
+        modemConfig.setAuthType(authType);
+        
+        // data compression
+        key = prefix + "dataCompression";
+        if(properties.get(key) != null) {
+            int dataCompression = (Integer)properties.get(key);
+        s_logger.trace("Data compression is " + dataCompression);
+        modemConfig.setDataCompression(dataCompression);     
+        } else {
+            s_logger.trace("Data compression is null");
+        }
+
+        // dial string
+        key = prefix + "dialString";
+        String dialString = (String)properties.get(key);
+        s_logger.trace("Dial string is " + dialString);
+        modemConfig.setDialString(dialString);       
+
+        // header compression
+        key = prefix + "headerCompression";
+        if(properties.get(key) != null) {
+            int headerCompression = (Integer)properties.get(key);
+        s_logger.trace("Header compression is " + headerCompression);
+        modemConfig.setHeaderCompression(headerCompression);       
+        } else {
+            s_logger.trace("Header compression is null");
+        }
+
+        // ip address
+        String ipAddressString = (String)properties.get(prefix + "ipAddress");
+        IPAddress ipAddress = null;
+        s_logger.trace("IP address is " + ipAddressString);
+        if(ipAddressString != null && !ipAddressString.isEmpty()) {
+            try {
+                IP4Address.parseHostAddress(ipAddressString);
+            } catch (UnknownHostException e) {
+                throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Could not parse ip address " + ipAddressString);
+            }
+        } else {
+            s_logger.trace("IP address is null");
+        }
+        modemConfig.setIpAddress(ipAddress);       
+
+        // password
+        String password = (String)properties.get(prefix + "password");
+        s_logger.trace("Password is " + password);
+        modemConfig.setPassword(password);       
+
+        // pdp type
+        String pdpTypeString = (String)properties.get(prefix + "pdpType");
+        PdpType pdpType = PdpType.UNKNOWN;
+        if(pdpTypeString != null && !pdpTypeString.isEmpty()) {
+            try {
+                pdpType = PdpType.valueOf(pdpTypeString);
+            } catch (IllegalArgumentException e) {
+                throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Could not parse pdp type " + pdpTypeString);
+            }
+        }
+        s_logger.trace("Pdp type is " + pdpTypeString);
+        modemConfig.setPdpType(pdpType);       
+
+        // profile id
+        key = prefix + "profileId";
+        if(properties.get(key) != null) {
+            int profileId = (Integer)properties.get(key);
+        s_logger.trace("Profile id is " + profileId);
+        modemConfig.setProfileID(profileId);       
+        } else {
+            s_logger.trace("Profile id is null");
+        }
+
+        // ppp number
+        key = prefix + "pppNum";
+        if(properties.get(key) != null) {
+            int pppNum = (Integer)properties.get(key);
+            s_logger.trace("PPP number is " + pppNum);
+            modemConfig.setPppNumber(pppNum);
+        } else {
+            s_logger.trace("PPP number is null");
+        }
+        
+        // LCP echo interval
+        key = prefix + "lcpEchoInterval";
+        if(properties.get(key) != null) {
+        	int lcpEchoInterval = (Integer)properties.get(key);
+        	s_logger.trace("LCP Echo Interval is " + lcpEchoInterval);
+        	modemConfig.setLcpEchoInterval(lcpEchoInterval);
+        } else {
+        	s_logger.trace("LCP Echo Interval  is null");
+        }
+        
+        // LCP echo failure
+        key = prefix + "lcpEchoFailure";
+        if(properties.get(key) != null) {
+        	int lcpEchoFailure = (Integer)properties.get(key);
+        	s_logger.trace("LCP Echo Failure is " + lcpEchoFailure);
+        	modemConfig.setLcpEchoFailure(lcpEchoFailure);
+        } else {
+        	s_logger.trace("LCP Echo Failure is null");
+        }
+        
+        // username
+        String username = (String)properties.get(prefix + "username");
+        s_logger.trace("Username is " + username);
+        modemConfig.setUsername(username);       
+
+        // enabled
+        key = prefix + "enabled";
+        boolean enabled = false;
+        if(properties.get(key) != null) {
+            enabled = (Boolean)properties.get(key);
+        s_logger.trace("Enabled is " + enabled);
+        } else {
+            s_logger.trace("Enabled is null");
+        }
+        modemConfig.setEnabled(enabled);      
+        
+        // GPS enabled
+        key = prefix + "gpsEnabled";
+        boolean gpsEnabled = false;
+        if(properties.get(key) != null) {
+            gpsEnabled = (Boolean)properties.get(key);
+        s_logger.trace("GPS Enabled is {}", gpsEnabled);
+        } else {
+            s_logger.trace("GPS Enabled is null");
+        }
+        modemConfig.setGpsEnabled(gpsEnabled);
+        
+        return modemConfig;
+    }
+			
+	private void addNetConfigIP4Properties(NetConfigIP4 nc,
+			String netIfConfigPrefix, 
+			Map<String,Object> properties) {
+
+		properties.put(netIfConfigPrefix+"autoconnect", nc.isAutoConnect());
+		properties.put(netIfConfigPrefix+"ip4.status", nc.getStatus().toString());
+		
+		StringBuilder sbDnsAddresses = new StringBuilder();
+        if(nc.getDnsServers() != null) {
+            for (IP4Address ip : nc.getDnsServers()) {
+                if(sbDnsAddresses.length() != 0) {
+                    sbDnsAddresses.append(",");
+                }
+                sbDnsAddresses.append(ip.getHostAddress());
+            }
+        }
+        properties.put(netIfConfigPrefix+"ip4.dnsServers", sbDnsAddresses.toString());
+
+		if(nc.isDhcp()) {
+			properties.put(netIfConfigPrefix+"dhcpClient4.enabled", true);
+		} else {
+			properties.put(netIfConfigPrefix+"dhcpClient4.enabled", false);
+			
+			if(nc.getAddress() != null) {
+				properties.put(netIfConfigPrefix+"ip4.address", nc.getAddress().getHostAddress());
+			} else {
+				properties.put(netIfConfigPrefix+"ip4.address", "");
+			}
+			
+			properties.put(netIfConfigPrefix+"ip4.prefix",  nc.getNetworkPrefixLength());
+			
+			if(nc.getGateway() != null) {
+				properties.put(netIfConfigPrefix+"ip4.gateway", nc.getGateway().getHostAddress());
+			} else {
+				properties.put(netIfConfigPrefix+"ip4.gateway", "");
+			}
+
+			StringBuilder sbWinsAddresses = new StringBuilder();
+			if(nc.getWinsServers() != null) {
+				for (IP4Address ip : nc.getWinsServers()) {
+					if(sbWinsAddresses.length() != 0) {
+						sbWinsAddresses.append(",");
+					}
+					sbWinsAddresses.append(ip.getHostAddress());
+				}
+			}
+			properties.put(netIfConfigPrefix+"winsServers", sbWinsAddresses.toString());
+
+			StringBuilder sbDomains = new StringBuilder();
+			if(nc.getDomains() != null) {
+				for (String domain : nc.getDomains()) {
+					if(sbDomains.length() != 0) {
+						sbDomains.append(",");
+					}
+					sbDomains.append(domain);
+				}
+			}
+			properties.put(netIfConfigPrefix+"domains", sbDomains.toString());
+		}
+	}
+	
+	private void addNetConfigIP6Properties(NetConfigIP6 nc,
+			String netIfConfigPrefix, 
+			Map<String,Object> properties) {
+		
+		properties.put(netIfConfigPrefix+"ip6.status", nc.getStatus().toString());
+		
+		if(nc.isDhcp()) {
+			properties.put(netIfConfigPrefix+"dhcpClient6.enabled", true);
+		} else {
+			properties.put(netIfConfigPrefix+"dhcpClient6.enabled", false);
+			if(nc.getAddress() != null) {
+			    properties.put(netIfConfigPrefix+"address", nc.getAddress().getHostAddress());
+			}
+
+			StringBuilder sbDnsAddresses = new StringBuilder();
+			for (IP6Address ip : nc.getDnsServers()) {
+				if(sbDnsAddresses.length() != 0) {
+					sbDnsAddresses.append(",");
+				}
+				sbDnsAddresses.append(ip.getHostAddress());
+			}
+			properties.put(netIfConfigPrefix+"ip6.dnsServers", sbDnsAddresses.toString());
+
+			StringBuilder sbDomains = new StringBuilder();
+			for (String domain : nc.getDomains()) {
+				if(sbDomains.length() != 0) {
+					sbDomains.append(",");
+				}
+				sbDomains.append(domain);
+			}
+			properties.put(netIfConfigPrefix+"domains", sbDomains.toString());
+		}
+	}
+	
+	private void addDhcpServerConfig4(DhcpServerConfig4 nc,
+			String netIfConfigPrefix, 
+			Map<String,Object> properties) {
+		
+		/*
+		 * .config.dhcpServer4.defaultLeaseTime
+		 * .config.dhcpServer4.maxLeaseTime
+		 * .config.dhcpServer4.prefix
+		 * .config.dhcpServer4.rangeStart
+		 * .config.dhcpServer4.rangeEnd
+		 * .config.dhcpServer4.passDns
+		 */
+
+		properties.put(netIfConfigPrefix+"dhcpServer4.enabled", nc.isEnabled());
+		properties.put(netIfConfigPrefix+"dhcpServer4.defaultLeaseTime", nc.getDefaultLeaseTime());
+		properties.put(netIfConfigPrefix+"dhcpServer4.maxLeaseTime", nc.getMaximumLeaseTime());
+		properties.put(netIfConfigPrefix+"dhcpServer4.prefix", nc.getPrefix());
+		properties.put(netIfConfigPrefix+"dhcpServer4.rangeStart", nc.getRangeStart().toString());
+		properties.put(netIfConfigPrefix+"dhcpServer4.rangeEnd", nc.getRangeEnd().toString());
+		properties.put(netIfConfigPrefix+"dhcpServer4.passDns", nc.isPassDns());
+		
+	}
+	
+	private void addFirewallNatConfig(FirewallNatConfig nc,
+			String netIfConfigPrefix, 
+			Map<String,Object> properties) {
+		
+		/*
+		 * .config.nat.enabled
+		 */
+		
+		properties.put(netIfConfigPrefix+"nat.enabled", true);
+	}
+
+	private void addInterfaceConfiguration(String interfaceName, NetInterfaceType type,
+			Map<String,Object> props)
+		throws UnknownHostException, KuraException
+	{
+		if(type == null) {
+			s_logger.error("Null type for " + interfaceName);
+			return;
+		}
+		
+        switch(type) {
+        case LOOPBACK:
+            LoopbackInterfaceConfigImpl loopbackInterfaceConfig = new LoopbackInterfaceConfigImpl(interfaceName);            
+            List<NetInterfaceAddressConfig> loopbackInterfaceAddressConfigs = new ArrayList<NetInterfaceAddressConfig>();                            
+            loopbackInterfaceAddressConfigs.add(new NetInterfaceAddressConfigImpl());
+            loopbackInterfaceConfig.setNetInterfaceAddresses(loopbackInterfaceAddressConfigs);
+            
+            this.populateNetInterfaceConfiguration(loopbackInterfaceConfig, props);
+            
+            m_netInterfaceConfigs.put(interfaceName, loopbackInterfaceConfig);
+            break;
+        case ETHERNET:
+            EthernetInterfaceConfigImpl ethernetInterfaceConfig = new EthernetInterfaceConfigImpl(interfaceName);
+            List<NetInterfaceAddressConfig> ethernetInterfaceAddressConfigs = new ArrayList<NetInterfaceAddressConfig>();
+            ethernetInterfaceAddressConfigs.add(new NetInterfaceAddressConfigImpl());
+            ethernetInterfaceConfig.setNetInterfaceAddresses(ethernetInterfaceAddressConfigs);
+            
+            this.populateNetInterfaceConfiguration(ethernetInterfaceConfig, props);
+            
+            m_netInterfaceConfigs.put(interfaceName, ethernetInterfaceConfig);            
+            break;
+        case WIFI:
+            WifiInterfaceConfigImpl wifiInterfaceConfig = new WifiInterfaceConfigImpl(interfaceName);
+            
+            List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = new ArrayList<WifiInterfaceAddressConfig>();
+            wifiInterfaceAddressConfigs.add(new WifiInterfaceAddressConfigImpl());
+            wifiInterfaceConfig.setNetInterfaceAddresses(wifiInterfaceAddressConfigs);
+
+            this.populateNetInterfaceConfiguration(wifiInterfaceConfig, props);
+            
+            m_netInterfaceConfigs.put(interfaceName, wifiInterfaceConfig);            
+            break;
+        case MODEM:
+            ModemInterfaceConfigImpl modemInterfaceConfig = new ModemInterfaceConfigImpl(interfaceName);
+
+            List<ModemInterfaceAddressConfig> modemInterfaceAddressConfigs = new ArrayList<ModemInterfaceAddressConfig>();
+            modemInterfaceAddressConfigs.add(new ModemInterfaceAddressConfigImpl());
+            modemInterfaceConfig.setNetInterfaceAddresses(modemInterfaceAddressConfigs);
+            
+            this.populateNetInterfaceConfiguration(modemInterfaceConfig, props);
+            
+            m_netInterfaceConfigs.put(interfaceName, modemInterfaceConfig);            
+            break;
+        case UNKNOWN:
+            s_logger.trace("Found interface of unknown type in current configuration: " + interfaceName);
+            break;
+/*
+        default:
+            
+		switch (type) {
+		case ETHERNET:
+			addEthernetConfiguration(interfaceName, props);
+			break;
+		case WIFI:
+			addWifiConfiguration(interfaceName, props); 
+			break;
+*/
+		default:
+			s_logger.error("Unsupported type " + type.toString() + " for interface " + interfaceName);
+			break;
+		}
+	}
+	
+	
+	private void populateNetInterfaceConfiguration(
+	        AbstractNetInterface<? extends NetInterfaceAddressConfig> netInterfaceConfig,
+	        Map<String, Object> props) throws UnknownHostException, KuraException
+    {
+	    String interfaceName = netInterfaceConfig.getName();
+
+	    StringBuffer keyBuffer = new StringBuffer();
+	    keyBuffer.append("net.interface.").append(interfaceName).append(".type");
+	    NetInterfaceType interfaceType = NetInterfaceType.valueOf((String) props.get(keyBuffer.toString()));
+	    s_logger.trace("Populating interface: " + interfaceName + " of type " + interfaceType);
+        
+	    
+        // build the prefixes for all the properties associated with this interface
+        StringBuilder sbPrefix = new StringBuilder();
+        sbPrefix.append("net.interface.").append(interfaceName).append(".");
+        
+        String netIfReadOnlyPrefix = sbPrefix.toString();
+        String netIfPrefix = sbPrefix.append("config.").toString();
+        String netIfConfigPrefix = sbPrefix.toString();
+        
+        //[RO] State
+        String stateConfig = netIfReadOnlyPrefix + "state";
+        if (props.containsKey(stateConfig)) {
+            try {
+                NetInterfaceState state = (NetInterfaceState) props.get(stateConfig);
+                s_logger.trace("got state: " + state);
+                netInterfaceConfig.setState(state);
+            }
+            catch (Exception e) {
+                s_logger.error("Could not process State configuration. Retaining current value.", e);
+            }
+        }
+        
+        // Auto connect
+        boolean autoConnect = false;
+        String autoConnectKey = netIfPrefix + "autoconnect";
+        if (props.containsKey(autoConnectKey)) {
+            autoConnect = (Boolean) props.get(autoConnectKey);
+            s_logger.trace("got autoConnect: " + autoConnect);
+            netInterfaceConfig.setAutoConnect(autoConnect);
+        }
+        
+        // MTU
+        String mtuConfig = netIfPrefix + "mtu";
+        if (props.containsKey(mtuConfig)) {
+            int mtu = (Integer) props.get(mtuConfig);
+            s_logger.trace("got MTU: " + mtu);
+            netInterfaceConfig.setMTU(mtu);
+        }
+        
+        // Driver
+        String driverKey = netIfReadOnlyPrefix + "driver";
+        if (props.containsKey(driverKey)) {
+            String driver = (String) props.get(driverKey);
+            s_logger.trace("got Driver: " + driver);
+            netInterfaceConfig.setDriver(driver);
+        }
+        
+        // Driver Version
+        String driverVersionKey = netIfReadOnlyPrefix + "driver.version";
+        if (props.containsKey(driverVersionKey)) {
+            String driverVersion = (String) props.get(driverVersionKey);
+            s_logger.trace("got Driver Version: " + driverVersion);
+            netInterfaceConfig.setDriverVersion(driverVersion);
+        }
+        
+        // Firmware Version
+        String firmwardVersionKey = netIfReadOnlyPrefix + "firmware.version";
+        if (props.containsKey(firmwardVersionKey)) {
+            String firmwareVersion = (String) props.get(firmwardVersionKey);
+            s_logger.trace("got Firmware Version: " + firmwareVersion);
+            netInterfaceConfig.setFirmwareVersion(firmwareVersion);
+        }
+        
+        // Mac Address
+        String macAddressKey = netIfReadOnlyPrefix + "mac";
+        if (props.containsKey(macAddressKey)) {
+            String macAddress = (String) props.get(macAddressKey);
+            s_logger.trace("got Mac Address: " + macAddress);
+            netInterfaceConfig.setHardwareAddress(NetUtil.hardwareAddressToBytes(macAddress));
+        }
+        
+        // Is Loopback
+        String loopbackKey = netIfReadOnlyPrefix + "loopback";
+        if (props.containsKey(loopbackKey)) {
+            Boolean isLoopback = (Boolean) props.get(loopbackKey);
+            s_logger.trace("got Is Loopback: " + isLoopback);
+            netInterfaceConfig.setLoopback(isLoopback);
+        }
+        
+        // Is Point to Point
+        String ptpKey = netIfReadOnlyPrefix + "ptp";
+        if (props.containsKey(ptpKey)) {
+            Boolean isPtp = (Boolean) props.get(ptpKey);
+            s_logger.trace("got Is PtP: " + isPtp);
+            netInterfaceConfig.setPointToPoint(isPtp);
+        }
+        
+        // Is Up
+        String upKey = netIfReadOnlyPrefix + "up";
+        if (props.containsKey(upKey)) {
+            Boolean isUp = (Boolean) props.get(upKey);
+            s_logger.trace("got Is Up: " + isUp);
+            netInterfaceConfig.setUp(isUp);
+            
+            if(isUp) {
+            	netInterfaceConfig.setState(NetInterfaceState.ACTIVATED);
+            } else {
+            	netInterfaceConfig.setState(NetInterfaceState.DISCONNECTED);
+            }
+        } else {
+        	s_logger.trace("Setting state to");
+        	netInterfaceConfig.setState(NetInterfaceState.DISCONNECTED);
+        }
+        
+        // Is Virtual
+        String virtualKey = netIfReadOnlyPrefix + "virtual";
+        if (props.containsKey(virtualKey)) {
+            Boolean isVirtual = (Boolean) props.get(virtualKey);
+            s_logger.trace("got Is Virtual: " + isVirtual);
+            netInterfaceConfig.setVirtual(isVirtual);
+        }
+        
+        // USB
+        String vendorId = (String)props.get(netIfReadOnlyPrefix+"usb.vendor.id");
+        String vendorName = (String)props.get(netIfReadOnlyPrefix+"usb.vendor.name");
+        String productId = (String)props.get(netIfReadOnlyPrefix+"usb.product.id");
+        String productName = (String)props.get(netIfReadOnlyPrefix+"usb.product.name");
+        String usbBusNumber = (String)props.get(netIfReadOnlyPrefix+"usb.busNumber");
+        String usbDevicePath = (String)props.get(netIfReadOnlyPrefix+"usb.devicePath");
+        
+        if ((vendorId != null) && (productId != null)) {
+	        UsbDevice usbDevice = new UsbNetDevice(vendorId, productId, vendorName, productName, usbBusNumber, usbDevicePath, interfaceName);
+	        s_logger.trace("adding usbDevice: " + usbDevice + ", port: " + usbDevice.getUsbPort());	  
+	        netInterfaceConfig.setUsbDevice(usbDevice);
+        }
+   		
+   		if(netInterfaceConfig instanceof EthernetInterfaceConfigImpl) {
+   			// Is Up
+   	        String linkUpKey = netIfReadOnlyPrefix + "eth.link.up";
+   	        if (props.containsKey(linkUpKey)) {
+   	         Boolean linkUp = (Boolean) props.get(linkUpKey);
+   	            s_logger.trace("got Is Link Up: " + linkUp);
+   	            ((EthernetInterfaceConfigImpl)netInterfaceConfig).setLinkUp(linkUp);
+   	        }
+   		} else if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+   			// Wifi Capabilities
+   	        String capabilitiesKey = netIfReadOnlyPrefix + "wifi.capabilities";
+   	        if (props.containsKey(capabilitiesKey)) {
+   	        	String capabilitiesString = (String) props.get(capabilitiesKey);
+   	        	if(capabilitiesString != null) {
+   	        		String[] capabilities = capabilitiesString.split(" ");
+   	        		if(capabilities != null && capabilities.length > 0) {
+   	        			EnumSet<Capability> capabilitiesEnum = EnumSet.noneOf(Capability.class);
+   	        			for(String capability : capabilities) {
+   	        			    if(capability != null && !capability.isEmpty()) {
+   	        			        capabilitiesEnum.add(Capability.valueOf(capability));
+   	        			    }
+   	        			}
+   	        			((WifiInterfaceConfigImpl)netInterfaceConfig).setCapabilities(capabilitiesEnum);
+   	        		}
+   	        	}
+   	        }
+   		} else if(netInterfaceConfig instanceof ModemInterfaceConfigImpl) {
+   		    ModemInterfaceConfigImpl modemInterfaceConfig = (ModemInterfaceConfigImpl) netInterfaceConfig;
+   		    String key;
+            
+            // manufacturer
+            key = netIfReadOnlyPrefix+"manufacturer";
+            if(props.containsKey(key)) {
+                modemInterfaceConfig.setManufacturer((String)props.get(key));
+            }
+   		    
+   		    // manufacturer
+   		    key = netIfReadOnlyPrefix+"model";
+   		    if(props.containsKey(key)) {
+                modemInterfaceConfig.setModel((String)props.get(key));
+   		    }
+   		    
+   		    // revision id
+   		    key = netIfReadOnlyPrefix+"revisionId";
+   		    if(props.containsKey(key)) {
+       		    String revisionIdString = (String)props.get(key);
+                modemInterfaceConfig.setRevisionId(revisionIdString.split(","));
+   		    }
+   		                
+            // serial number
+            key = netIfReadOnlyPrefix+"serialNum";
+            if(props.containsKey(key)) {
+                modemInterfaceConfig.setSerialNumber((String)props.get(key));
+            }
+   		    
+   		    // technology types
+            key = netIfReadOnlyPrefix+"technologyTypes";
+            if(props.containsKey(key)) {
+       		    ArrayList<ModemTechnologyType> technologyTypes = new ArrayList<ModemTechnologyType>();
+       		    String techTypesString = (String)props.get(netIfReadOnlyPrefix+"technologyTypes");
+       		    if(techTypesString != null && !techTypesString.isEmpty()) {
+       		        for(String techTypeString : techTypesString.split(",")) {
+       		            if(techTypeString != null && !techTypeString.isEmpty()) {
+       		                try{
+           		                ModemTechnologyType modemTechType = ModemTechnologyType.valueOf(techTypeString);
+           		                technologyTypes.add(modemTechType);
+       		                } catch (IllegalArgumentException e) {
+       		                    s_logger.error("Could not parse type " + techTypeString);
+       		                }
+       		            }
+       		        }
+       	            modemInterfaceConfig.setTechnologyTypes(technologyTypes);
+       		    }
+            }
+
+            // modem identifier
+            key = netIfConfigPrefix+"identifier";
+            if(props.containsKey(key)) {
+                modemInterfaceConfig.setModemIdentifier((String)props.get(key));
+            }
+   		    
+   		    // power mode
+            key = netIfConfigPrefix+"powerMode";
+            if(props.containsKey(key)) {
+       		    ModemPowerMode powerMode = ModemPowerMode.UNKNOWN;
+       		    String modemPowerModeString = (String)props.get(netIfConfigPrefix+"powerMode");
+       		    if(modemPowerModeString != null) {
+       		        powerMode = ModemPowerMode.valueOf(modemPowerModeString);
+                    modemInterfaceConfig.setPowerMode(powerMode);
+       		    }
+            }
+            
+            // ppp number
+            key = netIfConfigPrefix+"pppNum";
+            if(props.containsKey(key)) {
+                if(props.get(key) != null) {
+                    modemInterfaceConfig.setPppNum((Integer)props.get(key));
+                }
+            }
+            
+            // powered on
+            key = netIfConfigPrefix+"poweredOn";
+            if(props.containsKey(key)) {
+                if(props.get(key) != null) {
+                    modemInterfaceConfig.setPoweredOn((Boolean)props.get(key));
+                }
+            }
+   		}
+        
+        
+        // Status
+        String configStatus4 = null;
+        String configStatus4Key = "net.interface." + interfaceName+".config.ip4.status";
+        if (props.containsKey(configStatus4Key)) {
+            configStatus4 = (String) props.get(configStatus4Key);
+        }
+        if(configStatus4 == null) {
+            configStatus4 = NetInterfaceStatus.netIPv4StatusDisabled.name();
+        }
+        s_logger.trace("Status Ipv4? " + configStatus4);
+        
+        String configStatus6 = null;
+        String configStatus6Key = "net.interface." + interfaceName+".config.ip6.status";
+        if (props.containsKey(configStatus6Key)) {
+            configStatus6 = (String) props.get(configStatus6Key);
+        }
+        if(configStatus6 == null) {
+            configStatus6 = NetInterfaceStatus.netIPv6StatusDisabled.name();
+        }
+
+
+        // POPULATE NetInterfaceAddresses
+        for(NetInterfaceAddressConfig netInterfaceAddress : netInterfaceConfig.getNetInterfaceAddresses()) {
+
+            List<NetConfig> netConfigs = new ArrayList<NetConfig>();            
+            if(netInterfaceAddress instanceof NetInterfaceAddressConfigImpl) {
+                ((NetInterfaceAddressConfigImpl) netInterfaceAddress).setNetConfigs(netConfigs);
+            } else if (netInterfaceAddress instanceof WifiInterfaceAddressConfigImpl) {
+                ((WifiInterfaceAddressConfigImpl) netInterfaceAddress).setNetConfigs(netConfigs);
+            } else if (netInterfaceAddress instanceof ModemInterfaceAddressConfigImpl) {
+                ((ModemInterfaceAddressConfigImpl) netInterfaceAddress).setNetConfigs(netConfigs);
+            }
+            
+            
+            // Common NetInterfaceAddress
+            if(netInterfaceAddress instanceof NetInterfaceAddressImpl) {
+                s_logger.trace("netInterfaceAddress is instanceof NetInterfaceAddressImpl");
+                NetInterfaceAddressImpl netInterfaceAddressImpl = (NetInterfaceAddressImpl) netInterfaceAddress;
+
+                String addressType = ".ip4";       // TODO: determine dynamically
+                
+                // populate current address status
+                String key = "net.interface." + interfaceName + addressType + ".address";
+                if(props.containsKey(key)) {
+                    IPAddress address = IP4Address.parseHostAddress((String)props.get(key));
+                    s_logger.trace("got " + key + ": " + address);
+                    netInterfaceAddressImpl.setAddress(address);
+                }
+    
+                key = "net.interface." + interfaceName + addressType + ".broadcast";
+                if(props.containsKey(key)) {
+                    IPAddress broadcast = IP4Address.parseHostAddress((String)props.get(key));
+                    s_logger.trace("got " + key + ": " + broadcast);
+                    netInterfaceAddressImpl.setBroadcast(broadcast);
+                }
+                
+                key = "net.interface." + interfaceName + addressType + ".dnsServers";
+                if(props.containsKey(key)) {
+                    List<IPAddress> dnsServers = new ArrayList<IPAddress>();
+                    String dnsServersString = (String) props.get(key);
+                    s_logger.trace("got " + key + ": " + dnsServersString);
+                    for(String dnsServer : dnsServersString.split(",")) {
+                        dnsServers.add(IP4Address.parseHostAddress(dnsServer));
+                    }
+                    netInterfaceAddressImpl.setDnsServers(dnsServers);
+                }
+    
+                key = "net.interface." + interfaceName + addressType + ".gateway";
+                if(props.containsKey(key)) {
+                	if(props.get(key) != null && !((String)props.get(key)).trim().equals("")) {
+                		IPAddress gateway = IP4Address.parseHostAddress((String)props.get(key));
+                		s_logger.trace("got " + key + ": " + gateway);
+                		netInterfaceAddressImpl.setGateway(gateway);
+                	} else {
+                		s_logger.trace("got " + key + ": null");
+                		netInterfaceAddressImpl.setGateway(null);
+                	}
+                }
+    
+                key = "net.interface." + interfaceName + addressType + ".netmask";
+                if(props.containsKey(key)) {
+                    IPAddress netmask = IP4Address.parseHostAddress((String)props.get(key));
+                    s_logger.trace("got " + key + ": " + netmask);
+                    netInterfaceAddressImpl.setBroadcast(netmask);
+                }
+    
+                key = "net.interface." + interfaceName + addressType + ".prefix";
+                if(props.containsKey(key)) {
+                    Short prefix = (Short) props.get(key);
+                    s_logger.trace("got " + key + ": " + prefix);
+                    netInterfaceAddressImpl.setNetworkPrefixLength(prefix);
+                }                
+            }
+
+            // WifiInterfaceAddress
+            if(netInterfaceAddress instanceof WifiInterfaceAddressImpl) {
+                s_logger.trace("netInterfaceAddress is instanceof WifiInterfaceAddressImpl");
+                WifiInterfaceAddressImpl wifiInterfaceAddressImpl = (WifiInterfaceAddressImpl) netInterfaceAddress;
+                
+                // wifi mode
+                String configWifiMode = netIfPrefix + "wifi.mode";
+                if (props.containsKey(configWifiMode)) {
+                    
+                    WifiMode mode = WifiMode.INFRA;     // FIXME: INFRA for now while debugging - probably want this as UNKNOWN
+                    if(props.get(configWifiMode) != null) {
+                        mode = WifiMode.valueOf((String) props.get(configWifiMode));
+                    }
+                    
+                    s_logger.trace("Adding wifiMode: " + mode);
+                    wifiInterfaceAddressImpl.setMode(mode);
+                }
+            }
+            
+            // ModemInterfaceAddress
+            if(netInterfaceAddress instanceof ModemInterfaceAddressConfigImpl) {
+                s_logger.trace("netInterfaceAddress is instanceof ModemInterfaceAddressConfigImpl");
+                ModemInterfaceAddressConfigImpl modemInterfaceAddressImpl = (ModemInterfaceAddressConfigImpl) netInterfaceAddress;
+                
+                // connection type
+                String configConnType = netIfPrefix + "connection.type";
+                if (props.containsKey(configConnType)) {
+                    ModemConnectionType connType = ModemConnectionType.PPP;
+                    String connTypeStr = (String)props.get(configConnType); 
+                    if(connTypeStr != null && !connTypeStr.isEmpty()) {
+                        connType = ModemConnectionType.valueOf(connTypeStr);
+                    }
+                    
+                    s_logger.trace("Adding modem connection type: " + connType);
+                    modemInterfaceAddressImpl.setConnectionType(connType);
+                }
+                
+                // connection type
+                String configConnStatus = netIfPrefix + "connection.status";
+                if (props.containsKey(configConnStatus)) {
+                    ModemConnectionStatus connStatus = ModemConnectionStatus.UNKNOWN;
+                    String connStatusStr = (String)props.get(configConnStatus);
+                    if(connStatusStr != null && !connStatusStr.isEmpty()) {
+                        connStatus = ModemConnectionStatus.valueOf(connStatusStr);
+                    }
+                    
+                    s_logger.trace("Adding modem connection status: " + connStatus);
+                    modemInterfaceAddressImpl.setConnectionStatus(connStatus);
+                }                
+            }
+            
+            
+
+            // POPULATE NetConfigs
+            
+            // dhcp4
+            String configDhcp4 = "net.interface." + interfaceName+".config.dhcpClient4.enabled";
+            NetConfigIP4 netConfigIP4 = null;
+            boolean dhcpEnabled = false;
+            if (props.containsKey(configDhcp4)) {
+                dhcpEnabled = (Boolean) props.get(configDhcp4);
+                s_logger.trace("DHCP 4 enabled? " + dhcpEnabled);
+            }
+            
+            netConfigIP4 = new NetConfigIP4(NetInterfaceStatus.valueOf(configStatus4), autoConnect, dhcpEnabled);
+            netConfigs.add(netConfigIP4);
+            
+            if(!dhcpEnabled) {
+                // NetConfigIP4
+                String configIp4 = "net.interface." + interfaceName+".config.ip4.address";
+                if (props.containsKey(configIp4)) {
+                	s_logger.trace("got " + configIp4 + ": " + props.get(configIp4));
+                                        
+                    // address
+                    String addressIp4 = (String) props.get(configIp4);
+                    s_logger.trace("IPv4 address: " + addressIp4);
+                    if(addressIp4 != null && !addressIp4.isEmpty()) {
+                        IP4Address ip4Address = (IP4Address) IPAddress.parseHostAddress(addressIp4);
+                        netConfigIP4.setAddress(ip4Address);
+                    }
+    
+                    // prefix
+                    String configIp4Prefix = "net.interface." + interfaceName+".config.ip4.prefix";
+                    short networkPrefixLength = -1;
+                    if (props.containsKey(configIp4Prefix)) {
+                        if(props.get(configIp4Prefix) instanceof Short) {
+                            networkPrefixLength = (Short) props.get(configIp4Prefix);
+                        } else if(props.get(configIp4Prefix) instanceof String) {
+                            networkPrefixLength = Short.parseShort((String) props.get(configIp4Prefix));
+                        }
+                        
+                        try {
+                            netConfigIP4.setNetworkPrefixLength(networkPrefixLength);
+                        } catch (KuraException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        }
+                        
+                        /*
+                        s_logger.trace("IPv4 prefix: " + networkPrefixLength);
+                        netInterfaceAddress.setNetworkPrefixLength(networkPrefixLength);
+                        //FIXME - hack for now
+                        netInterfaceAddress.setBroadcast((IP4Address) IPAddress.parseHostAddress("192.168.1.255"));
+                        ip4Config.setNetworkPrefixLength(networkPrefixLength);
+                        */
+                    }
+                    
+                    // gateway
+                    String configIp4Gateway = "net.interface." + interfaceName+".config.ip4.gateway";
+                    if (props.containsKey(configIp4Gateway)) {
+    
+                        String gatewayIp4 = (String) props.get(configIp4Gateway);
+                        s_logger.trace("IPv4 gateway: " + gatewayIp4);
+                        if(gatewayIp4 != null && !gatewayIp4.isEmpty()) {
+                            IP4Address ip4Gateway = (IP4Address) IPAddress.parseHostAddress(gatewayIp4);
+                            netConfigIP4.setGateway(ip4Gateway);
+                        }
+                    }
+                }
+            }
+
+            // dns servers
+            String configDNSs = "net.interface." + interfaceName+".config.ip4.dnsServers";
+            if (props.containsKey(configDNSs)) {
+                
+                List<IP4Address> dnsIPs = new ArrayList<IP4Address>();
+                String dnsAll = (String) props.get(configDNSs);
+                String[] dnss = dnsAll.split(",");
+                for (String dns : dnss) {
+                	if (dns != null && dns.length() > 0) {
+	                    s_logger.trace("IPv4 DNS: " + dns);
+	                    IP4Address dnsIp4 = (IP4Address) IPAddress.parseHostAddress(dns);
+	                    dnsIPs.add(dnsIp4);
+                	}
+                }
+                netConfigIP4.setDnsServers(dnsIPs);
+            }
+
+            // win servers
+            String configWINSs = "net.interface." + interfaceName+".config.ip4.winsServers";
+            if (props.containsKey(configWINSs)) {
+                
+                List<IP4Address> winsIPs = new ArrayList<IP4Address>();
+                String winsAll = (String) props.get(configWINSs);
+                String[] winss = winsAll.split(",");
+                for (String wins : winss) {
+                    s_logger.trace("WINS: " + wins);
+                    IP4Address winsIp4 = (IP4Address) IPAddress.parseHostAddress(wins);
+                    winsIPs.add(winsIp4);
+                }
+                netConfigIP4.setWinsServers(winsIPs);
+            }
+            
+            // domains
+            String configDomains = "net.interface." + interfaceName + ".config.ip4.domains";
+            if (props.containsKey(configDomains)) {
+                
+                List<String> domainNames = new ArrayList<String>();
+                String domainsAll = (String) props.get(configDomains);
+                String[] domains = domainsAll.split(",");
+                for (String domain : domains) {
+                    s_logger.trace("IPv4 Domain: " + domain);
+                    domainNames.add(domain);
+                }
+                netConfigIP4.setDomains(domainNames);
+            }
+            
+            // FirewallNatConfig - see if NAT is enabled
+            String configNatEnabled = "net.interface." + interfaceName + ".config.nat.enabled";
+            if (props.containsKey(configNatEnabled)) {
+                boolean natEnabled = (Boolean) props.get(configNatEnabled);
+                s_logger.trace("NAT enabled? " + natEnabled);
+                
+                if(natEnabled) {
+                    FirewallNatConfig natConfig = new FirewallNatConfig(interfaceName, "unknown", true);
+                    netConfigs.add(natConfig);
+                }
+            }
+            
+            // DhcpServerConfigIP4 - see if there is a DHCP 4 Server
+            String configDhcpServerEnabled = "net.interface." + interfaceName + ".config.dhcpServer4.enabled";
+            if (props.containsKey(configDhcpServerEnabled)) {
+                boolean dhcpServerEnabled = (Boolean) props.get(configDhcpServerEnabled);
+                s_logger.trace("DHCP Server 4 enabled? " + dhcpServerEnabled);
+                
+                IP4Address subnet = null;
+                IP4Address routerAddress = (dhcpEnabled) ? (IP4Address)netInterfaceAddress.getAddress() : netConfigIP4.getAddress();
+                IP4Address subnetMask = null;
+                int defaultLeaseTime = -1;
+                int maximumLeaseTime = -1;
+                short prefix = -1;
+                IP4Address rangeStart = null;
+                IP4Address rangeEnd = null;
+                boolean passDns = false;
+                List<IP4Address> dnServers = new ArrayList<IP4Address>();   
+                
+                // prefix
+                String configDhcpServerPrefix = "net.interface." + interfaceName+".config.dhcpServer4.prefix";
+                if (props.containsKey(configDhcpServerPrefix)) {
+                    if(props.get(configDhcpServerPrefix) instanceof Short) {
+                        prefix = (Short) props.get(configDhcpServerPrefix);
+                    } else if(props.get(configDhcpServerPrefix) instanceof String) {
+                        prefix = Short.parseShort((String) props.get(configDhcpServerPrefix));
+                    }
+                    s_logger.trace("DHCP Server prefix: " + prefix);
+                }
+                
+                // rangeStart
+                String configDhcpServerRangeStart = "net.interface." + interfaceName+".config.dhcpServer4.rangeStart";
+                if (props.containsKey(configDhcpServerRangeStart)) {
+                    String dhcpServerRangeStart = (String) props.get(configDhcpServerRangeStart);
+                    s_logger.trace("DHCP Server Range Start: " + dhcpServerRangeStart);
+                    if(dhcpServerRangeStart != null && !dhcpServerRangeStart.isEmpty()) {
+                        rangeStart = (IP4Address) IPAddress.parseHostAddress(dhcpServerRangeStart);
+                    }
+                }
+                
+                // rangeEnd
+                String configDhcpServerRangeEnd = "net.interface." + interfaceName+".config.dhcpServer4.rangeEnd";
+                if (props.containsKey(configDhcpServerRangeEnd)) {
+                    String dhcpServerRangeEnd = (String) props.get(configDhcpServerRangeEnd);
+                    s_logger.trace("DHCP Server Range End: " + dhcpServerRangeEnd);
+                    if(dhcpServerRangeEnd != null && !dhcpServerRangeEnd.isEmpty()) {
+                        rangeEnd = (IP4Address) IPAddress.parseHostAddress(dhcpServerRangeEnd);
+                    }
+                }
+                
+                // default lease time
+                String configDhcpServerDefaultLeaseTime = "net.interface." + interfaceName+".config.dhcpServer4.defaultLeaseTime";
+                if (props.containsKey(configDhcpServerDefaultLeaseTime)) {
+                    if(props.get(configDhcpServerDefaultLeaseTime) instanceof Integer) {
+                        defaultLeaseTime = (Integer) props.get(configDhcpServerDefaultLeaseTime);
+                    } else if(props.get(configDhcpServerDefaultLeaseTime) instanceof String) {
+                        defaultLeaseTime = Integer.parseInt((String) props.get(configDhcpServerDefaultLeaseTime));
+                    }
+                    s_logger.trace("DHCP Server Default Lease Time: " + defaultLeaseTime);
+                }
+                
+                // max lease time
+                String configDhcpServerMaxLeaseTime = "net.interface." + interfaceName+".config.dhcpServer4.maxLeaseTime";
+                if (props.containsKey(configDhcpServerMaxLeaseTime)) {
+                    if(props.get(configDhcpServerMaxLeaseTime) instanceof Integer) {
+                        maximumLeaseTime = (Integer) props.get(configDhcpServerMaxLeaseTime);
+                    } else if(props.get(configDhcpServerMaxLeaseTime) instanceof String) {
+                        maximumLeaseTime = Integer.parseInt((String) props.get(configDhcpServerMaxLeaseTime));
+                    }
+                    s_logger.trace("DHCP Server Maximum Lease Time: " + maximumLeaseTime);
+                }
+                
+                // passDns
+                String configDhcpServerPassDns = "net.interface." + interfaceName+".config.dhcpServer4.passDns";
+                if (props.containsKey(configDhcpServerPassDns)) {
+                    if(props.get(configDhcpServerPassDns) instanceof Boolean) {
+                        passDns = (Boolean) props.get(configDhcpServerPassDns);
+                    } else if(props.get(configDhcpServerPassDns) instanceof String) {
+                        passDns = Boolean.parseBoolean((String) props.get(configDhcpServerPassDns));
+                    }
+                    s_logger.trace("DHCP Server Pass DNS?: " + passDns);
+                }
+                
+                if(routerAddress != null && rangeStart != null && rangeEnd != null) {
+                    //get the netmask and subnet
+                    int prefixInt = (int)prefix;
+                    int mask = ~((1 << (32 - prefixInt)) - 1);                  
+                    String subnetMaskString = NetworkUtil.dottedQuad(mask);
+                    String subnetString =  NetworkUtil.calculateNetwork(routerAddress.getHostAddress(), subnetMaskString);
+                    subnet = (IP4Address) IPAddress.parseHostAddress(subnetString);
+                    subnetMask = (IP4Address) IPAddress.parseHostAddress(subnetMaskString);
+                    
+                    dnServers.add(routerAddress);
+                    
+                    DhcpServerConfigIP4 dhcpServerConfig = new DhcpServerConfigIP4(interfaceName, dhcpServerEnabled, subnet, routerAddress, subnetMask, defaultLeaseTime,
+                            maximumLeaseTime, prefix, rangeStart, rangeEnd, passDns, dnServers);
+                    netConfigs.add(dhcpServerConfig);
+                } else {
+                    s_logger.trace("Not including DhcpServerConfig - router: " + routerAddress + ", range start: " + rangeStart + ", range end: " + rangeEnd);
+                }
+            }
+
+            // dhcp6
+            String configDhcp6 = "net.interface." + interfaceName + ".config.dhcpClient6.enabled";
+            NetConfigIP6 netConfigIP6 = null;
+            boolean dhcp6Enabled = false;
+            if (props.containsKey(configDhcp6)) {
+                dhcp6Enabled = (Boolean) props.get(configDhcp6);
+                s_logger.trace("DHCP 6 enabled? " + dhcp6Enabled);
+            }
+            
+            if(!dhcp6Enabled) {
+                // ip6
+                String configIp6 = "net.interface." + interfaceName + ".config.ip6.address";
+                if (props.containsKey(configIp6)) {                    
+                    
+                    // address
+                    String addressIp6 = (String) props.get(configIp6);
+                    s_logger.trace("IPv6 address: " + addressIp6);
+                    if(addressIp6 != null && !addressIp6.isEmpty()) {
+                        IP6Address ip6Address = (IP6Address) IPAddress.parseHostAddress(addressIp6); 
+                        netConfigIP6.setAddress(ip6Address);
+                    }
+    
+                    // dns servers
+                    String configDNSs6 = "net.interface." + interfaceName + ".config.ip6.dnsServers";
+                    if (props.containsKey(configDNSs6)) {
+                        
+                        List<IP6Address> dnsIPs = new ArrayList<IP6Address>();
+                        String dnsAll = (String) props.get(configDNSs6);
+                        String[] dnss = dnsAll.split(",");
+                        for (String dns : dnss) {
+                            s_logger.trace("IPv6 DNS: " + dns);
+                            IP6Address dnsIp6 = (IP6Address) IPAddress.parseHostAddress(dns);
+                            dnsIPs.add(dnsIp6);
+                        }
+                        netConfigIP6.setDnsServers(dnsIPs);
+                    }
+                    
+                    // domains
+                    String configDomains6 = "net.interface." + interfaceName + ".config.ip6.domains";
+                    if (props.containsKey(configDomains6)) {
+                        
+                        List<String> domainNames = new ArrayList<String>();
+                        String domainsAll = (String) props.get(configDomains6);
+                        String[] domains = domainsAll.split(",");
+                        for (String domain : domains) {
+                            s_logger.trace("IPv6 Domain: " + domain);
+                            domainNames.add(domain);
+                        }
+                        netConfigIP6.setDomains(domainNames);
+                    }
+                }
+            }
+            
+            if(interfaceType == NetInterfaceType.WIFI) {
+            	s_logger.trace("Adding wifi netconfig");
+                  	
+            	 // Wifi access point config
+            	WifiConfig apConfig = getWifiConfig(netIfConfigPrefix, WifiMode.MASTER, props);
+            	if(apConfig != null) {
+            		s_logger.trace("Adding AP wifi config");
+            		netConfigs.add(apConfig);
+            	} else {
+            		s_logger.warn("no AP wifi config specified");
+            	}
+                
+                // Wifi client/adhoc config
+            	//WifiConfig adhocConfig = getWifiConfig(netIfConfigPrefix, WifiMode.ADHOC, props);
+            	WifiConfig infraConfig = getWifiConfig(netIfConfigPrefix, WifiMode.INFRA, props);
+            	/*
+            	if(adhocConfig != null && infraConfig != null) {
+            		s_logger.warn("Two conflicting client wifi configs specified");
+            	}*/
+            	if(infraConfig != null) {
+            		s_logger.trace("Adding client INFRA wifi config");
+            		netConfigs.add(infraConfig);
+            	} else {
+            		s_logger.warn("no INFRA wifi config specified");
+            	}
+            	/*
+            	if(adhocConfig != null){
+            		s_logger.trace("Adding client ADHOC wifi config");
+            		netConfigs.add(adhocConfig);
+            	}*/
+            }
+            
+            if(interfaceType == NetInterfaceType.MODEM) {
+                s_logger.trace("Adding modem netconfig");
+                    
+                netConfigs.add(getModemConfig(netIfConfigPrefix, props));
+            }
+        }
+
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetworkConfigurationVisitor.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetworkConfigurationVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..31db84ac52c4be5837e424348b8ccf243045e2df
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/NetworkConfigurationVisitor.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import org.eclipse.kura.KuraException;
+
+public interface NetworkConfigurationVisitor {
+
+    public void visit(NetworkConfiguration config) throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiAccessPointImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiAccessPointImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..15124b9aeb6e360a4c79464ecb234d608f87f7a2
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiAccessPointImpl.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.EnumSet;
+import java.util.List;
+
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+
+public class WifiAccessPointImpl implements WifiAccessPoint 
+{
+	private String            ssid;
+	private byte[]            hardwareAddress;
+	private long              frequency;
+	private WifiMode          mode;
+	private List<Long>        bitrate;
+	private int               strength;
+	private EnumSet<WifiSecurity> wpaSecurity;
+	private EnumSet<WifiSecurity> rsnSecurity;
+	private List<String> capabilities;
+	
+	public WifiAccessPointImpl(String ssid) {
+		this.ssid = ssid;
+	}
+	
+	public String getSSID() {
+		return ssid;
+	}
+
+	public byte[] getHardwareAddress() {
+		return hardwareAddress;
+	}
+
+	public void setHardwareAddress(byte[] hardwareAddress) {
+		this.hardwareAddress = hardwareAddress;
+	}
+
+	public long getFrequency() {
+		return frequency;
+	}
+
+	public void setFrequency(long frequency) {
+		this.frequency = frequency;
+	}
+
+	public WifiMode getMode() {
+		return mode;
+	}
+
+	public void setMode(WifiMode mode) {
+		this.mode = mode;
+	}
+
+	public List<Long> getBitrate() {
+		return bitrate;
+	}
+
+	public void setBitrate(List<Long> bitrate) {
+		this.bitrate = bitrate;
+	}
+
+	public int getStrength() {
+		return strength;
+	}
+
+	public void setStrength(int strength) {
+		this.strength = strength;
+	}
+
+	public EnumSet<WifiSecurity> getWpaSecurity() {
+		return wpaSecurity;
+	}
+
+	public void setWpaSecurity(EnumSet<WifiSecurity> wpaSecurity) {
+		this.wpaSecurity = wpaSecurity;
+	}
+
+	public EnumSet<WifiSecurity> getRsnSecurity() {
+		return rsnSecurity;
+	}
+
+	public void setRsnSecurity(EnumSet<WifiSecurity> rsnSecurity) {
+		this.rsnSecurity = rsnSecurity;
+	}
+	
+	public List<String> getCapabilities() {
+		return this.capabilities;
+	}
+	
+	public void setCapabilities(List<String> capabilities) {
+		this.capabilities = capabilities;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("ssid=").append(ssid);
+		if(hardwareAddress != null && hardwareAddress.length > 0) {
+			sb.append(" :: hardwareAddress=")
+			.append(NetworkUtil.macToString(hardwareAddress));
+		}
+		sb.append(" :: frequency=").append(frequency)
+		.append(" :: mode=").append(mode);
+		if(bitrate != null && bitrate.size() > 0) {
+			sb.append(" :: bitrate=");
+			for(Long rate : bitrate) {
+				sb.append(rate).append(" ");
+			}
+		}
+		sb.append(" :: strength=").append(strength);
+		if(wpaSecurity != null && wpaSecurity.size() > 0) {
+			sb.append(" :: wpaSecurity=");
+			for(WifiSecurity security : wpaSecurity) {
+				sb.append(security).append(" ");
+			}
+		}
+		if(rsnSecurity != null && rsnSecurity.size() > 0) {
+			sb.append(" :: rsnSecurity=");
+			for(WifiSecurity security : rsnSecurity) {
+				sb.append(security).append(" ");
+			}
+		}
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceAddressConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceAddressConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..849da5068e48c8af504a1cdeab3adf1d3b76847b
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceAddressConfigImpl.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.List;
+
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+
+public class WifiInterfaceAddressConfigImpl extends WifiInterfaceAddressImpl implements WifiInterfaceAddressConfig {
+
+	private List<NetConfig> m_configs;
+	
+	public WifiInterfaceAddressConfigImpl() {
+		super();
+	}
+
+    public WifiInterfaceAddressConfigImpl(WifiInterfaceAddress other) {
+        super(other);
+    }
+
+	@Override
+	public List<NetConfig> getConfigs() {
+		return m_configs;
+	}
+
+	public void setNetConfigs(List<NetConfig> configs) {
+		m_configs = configs;
+	}
+
+    @Override
+    public boolean equals(Object obj) {
+        
+        if (this == obj) {
+            return true;
+        }
+
+        if(!super.equals(obj)) {
+            return false;
+        }
+
+        if(!(obj instanceof WifiInterfaceAddressConfig)) {
+            return false;
+        }
+        
+        WifiInterfaceAddressConfig other = (WifiInterfaceAddressConfig) obj;
+        
+        if(!compare(this.getMode(), other.getMode())) {
+            return false;
+        }
+        
+        if(this.getBitrate() != other.getBitrate()) {
+            return false;
+        }
+        
+        if(!compare(this.getWifiAccessPoint(), other.getWifiAccessPoint())) {
+            return false;
+        }
+        
+        List<NetConfig> thisNetConfigs = getConfigs();
+        List<NetConfig> otherNetConfigs = other.getConfigs();
+        
+        if(thisNetConfigs.size() != otherNetConfigs.size()) {
+            return false;
+        }        
+        if(!thisNetConfigs.containsAll(otherNetConfigs)) {
+            return false;
+        }
+        if(!otherNetConfigs.containsAll(thisNetConfigs)) {
+            return false;
+        }
+        
+        return true;
+    }
+    
+    @Override
+    public String toString() {
+        if(m_configs != null) {
+            StringBuffer sb = new StringBuffer();
+            for(NetConfig netConfig : m_configs) {
+                sb.append("NetConfig: ");
+                if(netConfig != null) {
+                    sb.append(netConfig.toString());
+                } else {
+                    sb.append("null");
+                }
+                sb.append(" - ");
+            }
+            
+            return sb.toString();
+        } else {
+            return "NetConfig: no configurations";
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceAddressImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceAddressImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..afd593aefd6b72dda06372d108dd4298d594017c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceAddressImpl.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.eclipse.kura.net.wifi.WifiMode;
+
+public class WifiInterfaceAddressImpl extends NetInterfaceAddressImpl implements WifiInterfaceAddress 
+{
+	private WifiMode        m_mode;
+	private long            m_bitrate;
+	private WifiAccessPoint m_wifiAccessPoint;
+	
+	public WifiInterfaceAddressImpl()
+	{
+		super();
+	}
+	
+	public WifiInterfaceAddressImpl(WifiInterfaceAddress other) {
+	    super(other);
+	    this.m_mode = other.getMode();
+	    this.m_bitrate = other.getBitrate();
+	    this.m_wifiAccessPoint = other.getWifiAccessPoint();
+	}
+
+	public WifiMode getMode() {
+		return m_mode;
+	}
+
+	public void setMode(WifiMode mode) {
+		this.m_mode = mode;
+	}
+
+	public long getBitrate() {
+		return m_bitrate;
+	}
+
+	public void setBitrate(long bitrate) {
+		this.m_bitrate = bitrate;
+	}
+
+	public WifiAccessPoint getWifiAccessPoint() {
+		return m_wifiAccessPoint;
+	}
+
+	public void setWifiAccessPoint(WifiAccessPoint wifiAccessPoint) {
+		this.m_wifiAccessPoint = wifiAccessPoint;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+        if(!super.equals(obj)) {
+            return false;
+        }
+        
+        if(!(obj instanceof WifiInterfaceAddress)) {
+            return false;
+        }
+        
+        WifiInterfaceAddress other = (WifiInterfaceAddress) obj;
+        
+        if(!compare(m_mode, other.getMode())) {
+            return false;
+        }
+        if(!compare(m_bitrate, other.getBitrate())) {
+            return false;
+        }
+        if(!compare(m_wifiAccessPoint, other.getWifiAccessPoint())) {
+            return false;
+        }
+	    
+	    return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..13f96a9ec00d20881b999bbcd1e5db27bcefa10f
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceConfigImpl.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.wifi.WifiInterface;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+
+public class WifiInterfaceConfigImpl extends WifiInterfaceImpl<WifiInterfaceAddressConfig> implements NetInterfaceConfig<WifiInterfaceAddressConfig> {
+
+	public WifiInterfaceConfigImpl(String name) {
+		super(name);
+	}
+	   
+    public WifiInterfaceConfigImpl(WifiInterface<? extends WifiInterfaceAddress> other) {
+        super(other);
+        
+        // Copy the NetInterfaceAddresses
+        List<? extends WifiInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<WifiInterfaceAddressConfig> interfaceAddresses = new ArrayList<WifiInterfaceAddressConfig>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(WifiInterfaceAddress wifiInterfaceAddress : otherNetInterfaceAddresses) {
+                WifiInterfaceAddressConfigImpl copiedInterfaceAddressImpl = new WifiInterfaceAddressConfigImpl(wifiInterfaceAddress);
+                interfaceAddresses.add(copiedInterfaceAddressImpl);
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+    }
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..836a903e931b7cebfe333b8321575ee1e1416e40
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/WifiInterfaceImpl.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.wifi.WifiInterface;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WifiInterfaceImpl<T extends WifiInterfaceAddress> extends AbstractNetInterface<T> implements WifiInterface<T> 
+{
+    private static final Logger s_logger = LoggerFactory.getLogger(WifiInterfaceImpl.class);
+            
+	private EnumSet<Capability> capabilities = null;
+
+	public WifiInterfaceImpl(String name) {
+		super(name);
+	}
+	
+    public WifiInterfaceImpl(WifiInterface<? extends WifiInterfaceAddress> other) {
+        super(other);
+        this.capabilities = other.getCapabilities();
+        
+        // Copy the NetInterfaceAddresses
+        List<? extends WifiInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<T> interfaceAddresses = new ArrayList<T>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(WifiInterfaceAddress wifiInterfaceAddress : otherNetInterfaceAddresses) {
+                try {
+                    WifiInterfaceAddressImpl copiedInterfaceAddressImpl = new WifiInterfaceAddressImpl(wifiInterfaceAddress);
+                    interfaceAddresses.add((T)copiedInterfaceAddressImpl);
+                } catch (Exception e) {
+                    s_logger.debug("Could not copy interface address: " + wifiInterfaceAddress);
+                }
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+    }
+	
+	public NetInterfaceType getType() {
+		return NetInterfaceType.WIFI;
+	}
+
+	public EnumSet<Capability> getCapabilities() {
+		if (capabilities != null) {
+			return EnumSet.copyOf(capabilities);
+		}
+		
+		return null;
+	}
+
+	public void setCapabilities(EnumSet<Capability> capabilities) {
+		this.capabilities = capabilities;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append(super.toString());
+		if(capabilities != null && capabilities.size() > 0) {
+			sb.append(" :: capabilities=");
+			for(Capability capability : capabilities) {
+				sb.append(capability)
+				.append(" ");
+			}
+		} else {
+			sb.append(" :: capabilities=null");
+		}
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceAddressConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceAddressConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..896a0947790a245de9a50cc9c072991eb242da2c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceAddressConfigImpl.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net.modem;
+
+import java.util.List;
+
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+
+public class ModemInterfaceAddressConfigImpl extends ModemInterfaceAddressImpl implements ModemInterfaceAddressConfig {
+
+	private List<NetConfig> m_configs;
+    
+    public ModemInterfaceAddressConfigImpl() {
+        super();
+    }
+	
+	public ModemInterfaceAddressConfigImpl(ModemInterfaceAddress other) {
+		super(other);
+	}
+	
+	@Override
+	public List<NetConfig> getConfigs() {
+		return m_configs;
+	}
+
+	public void setNetConfigs(List<NetConfig> configs) {
+		m_configs = configs;
+	}
+	
+    @Override
+    public boolean equals(Object obj) {
+        
+        if (this == obj) {
+            return true;
+        }
+
+        if(!super.equals(obj)) {
+            return false;
+        }
+
+        if(!(obj instanceof ModemInterfaceAddressConfig)) {
+            return false;
+        }
+        
+        ModemInterfaceAddressConfig other = (ModemInterfaceAddressConfig) obj;
+        
+        if(!compare(this.getSignalStrength(), other.getSignalStrength())) {
+            return false;
+        }
+        
+        if(!compare(this.isRoaming(), other.isRoaming())) {
+            return false;
+        }
+        
+        if(!compare(this.getConnectionStatus(), other.getConnectionStatus())) {
+            return false;
+        }
+        
+        if(this.getBytesTransmitted() != other.getBytesTransmitted()) {
+            return false;
+        }
+        
+        if(this.getBytesReceived() != other.getBytesReceived()) {
+            return false;
+        }
+        
+        if(!compare(this.getConnectionType(), other.getConnectionType())) {
+            return false;
+        }
+        
+        List<NetConfig> thisNetConfigs = getConfigs();
+        List<NetConfig> otherNetConfigs = other.getConfigs();
+        
+        if(thisNetConfigs.size() != otherNetConfigs.size()) {
+            return false;
+        }        
+        if(!thisNetConfigs.containsAll(otherNetConfigs)) {
+            return false;
+        }
+        if(!otherNetConfigs.containsAll(thisNetConfigs)) {
+            return false;
+        }
+        
+        return true;
+    }
+    
+	@Override
+	public String toString() {
+		if(m_configs != null) {
+			StringBuffer sb = new StringBuffer();
+			for(NetConfig netConfig : m_configs) {
+				sb.append("NetConfig: ");
+				if(netConfig != null) {
+					sb.append(netConfig.toString());
+				} else {
+					sb.append("null");
+				}
+				sb.append(" - ");
+			}
+			
+			return sb.toString();
+		} else {
+			return "NetConfig: no configurations";
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceAddressImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceAddressImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..34f99b761ff977479b16e557c15020950ac948f0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceAddressImpl.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net.modem;
+
+import org.eclipse.kura.core.net.NetInterfaceAddressImpl;
+import org.eclipse.kura.net.modem.ModemConnectionStatus;
+import org.eclipse.kura.net.modem.ModemConnectionType;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+
+public class ModemInterfaceAddressImpl extends NetInterfaceAddressImpl implements ModemInterfaceAddress 
+{
+	private int							m_signalStrength;
+	private boolean						m_isRoaming;
+	private ModemConnectionStatus		m_connectionStatus;
+	private long						m_bytesTransmitted;
+	private long						m_bytesReceived;
+	private ModemConnectionType			m_connectionType;	
+	
+	public ModemInterfaceAddressImpl() {
+		super();
+	}
+
+    public ModemInterfaceAddressImpl(ModemInterfaceAddress other) {
+        super(other);
+        this.m_signalStrength = other.getSignalStrength();
+        this.m_isRoaming = other.isRoaming();
+        this.m_connectionStatus = other.getConnectionStatus();
+        this.m_bytesTransmitted = other.getBytesTransmitted();
+        this.m_bytesReceived = other.getBytesReceived();
+        this.m_connectionType = other.getConnectionType();
+    }
+
+	@Override
+	public int getSignalStrength() {
+		return m_signalStrength;
+	}
+	
+	public void setSignalStrength(int signalStrength) {
+		this.m_signalStrength = signalStrength;
+	}
+
+	@Override
+	public boolean isRoaming() {
+		return m_isRoaming;
+	}
+	
+	public void setIsRoaming(boolean isRoaming) {
+		this.m_isRoaming = isRoaming;
+	}
+
+	@Override
+	public ModemConnectionStatus getConnectionStatus() {
+		return m_connectionStatus;
+	}
+	
+	public void setConnectionStatus(ModemConnectionStatus connectionStatus) {
+		this.m_connectionStatus = connectionStatus;
+	}
+
+	@Override
+	public long getBytesTransmitted() {
+		return m_bytesTransmitted;
+	}
+	
+	public void setBytesTransmitted(long bytesTransmitted) {
+		this.m_bytesTransmitted = bytesTransmitted;
+	}
+
+	@Override
+	public long getBytesReceived() {
+		return m_bytesReceived;
+	}
+	
+	public void setBytesReceived(long bytesReceived) {
+		this.m_bytesReceived = bytesReceived;
+	}
+
+	@Override
+	public ModemConnectionType getConnectionType() {
+		return m_connectionType;
+	}
+	
+	public void setConnectionType(ModemConnectionType connectionType) {
+		this.m_connectionType = connectionType;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceConfigImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7432ec8f24107e2ccc9f6472fa8a4881f6477f39
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceConfigImpl.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net.modem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.modem.ModemInterface;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+
+public class ModemInterfaceConfigImpl extends ModemInterfaceImpl<ModemInterfaceAddressConfig> implements NetInterfaceConfig<ModemInterfaceAddressConfig> {
+
+	public ModemInterfaceConfigImpl(String name) {
+		super(name);
+	}
+
+    public ModemInterfaceConfigImpl(ModemInterface<? extends ModemInterfaceAddress> other) {
+        super(ModemInterfaceAddressConfig.class, other);
+        
+        // Copy the NetInterfaceAddresses
+        List<? extends ModemInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<ModemInterfaceAddressConfig> interfaceAddresses = new ArrayList<ModemInterfaceAddressConfig>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(ModemInterfaceAddress modemInterfaceAddress : otherNetInterfaceAddresses) {
+                ModemInterfaceAddressConfigImpl copiedInterfaceAddressImpl = new ModemInterfaceAddressConfigImpl(modemInterfaceAddress);
+                interfaceAddresses.add(copiedInterfaceAddressImpl);
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+    }
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceImpl.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..d7398d58e8797e4cf73bc388cdf0de3cba51dbdf
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/modem/ModemInterfaceImpl.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net.modem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.core.net.AbstractNetInterface;
+import org.eclipse.kura.core.net.NetInterfaceAddressImpl;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemInterface;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+import org.eclipse.kura.net.modem.ModemPowerMode;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ModemInterfaceImpl<T extends ModemInterfaceAddress> extends AbstractNetInterface<T> implements ModemInterface<T> 
+{
+    private static final Logger s_logger = LoggerFactory.getLogger(ModemInterfaceImpl.class);
+            
+    private String                     m_modemId;
+    private int                        m_pppNum;
+	private String			  	       m_model;
+	private String                     m_manufacturer;
+	private String                     m_serialNumber;
+	private String[]                   m_revisionId;
+	private List<ModemTechnologyType>  m_technologyTypes;
+	private boolean					   m_poweredOn;
+	private ModemPowerMode             m_powerMode;
+	private ModemDevice				   m_modemDevice;
+	private boolean 				   m_gpsSupported;
+	
+	
+	public ModemInterfaceImpl(String name) {
+		super(name);
+	}
+	
+    public ModemInterfaceImpl(Class<T> modemInterfaceAddressClass, ModemInterface<? extends ModemInterfaceAddress> other) {
+        super(other);
+        this.m_modemId = other.getModemIdentifier();
+        this.m_pppNum = other.getPppNum();
+        this.m_model = other.getModel();
+        this.m_manufacturer = other.getManufacturer();
+        this.m_serialNumber = other.getSerialNumber();
+        this.m_revisionId = other.getRevisionId();
+        this.m_technologyTypes = other.getTechnologyTypes();
+        this.m_poweredOn = other.isPoweredOn();
+        this.m_powerMode = other.getPowerMode();
+        this.m_modemDevice = other.getModemDevice();
+        
+        // Copy the NetInterfaceAddresses
+        List<? extends ModemInterfaceAddress> otherNetInterfaceAddresses = other.getNetInterfaceAddresses();
+        ArrayList<T> interfaceAddresses = new ArrayList<T>();
+
+        if(otherNetInterfaceAddresses != null) {
+            for(ModemInterfaceAddress modemInterfaceAddress : otherNetInterfaceAddresses) {
+                try {
+                    ModemInterfaceAddressImpl copiedInterfaceAddressImpl = new ModemInterfaceAddressImpl(modemInterfaceAddress);
+                    interfaceAddresses.add((T)copiedInterfaceAddressImpl);
+                } catch (Exception e) {
+                    s_logger.debug("Could not copy interface address: " + modemInterfaceAddress);
+                }
+            }
+        }
+        this.setNetInterfaceAddresses(interfaceAddresses);
+    }
+
+	@Override
+	public NetInterfaceType getType() {
+		return NetInterfaceType.MODEM;
+	}
+
+	@Override
+    public int getPppNum() {
+        return this.m_pppNum;
+    }
+    
+    public void setPppNum(int pppNum) {
+        this.m_pppNum = pppNum;
+    }
+    
+    @Override
+    public String getModemIdentifier() {
+        return this.m_modemId;
+    }
+    
+    public void setModemIdentifier(String modemId) {
+        this.m_modemId = modemId;
+    }
+    
+	@Override
+	public String getModel() {
+		return m_model;
+	}
+	
+	public void setModel(String model) {
+		this.m_model = model;
+	}
+
+	@Override
+	public String getManufacturer() {
+		return m_manufacturer;
+	}
+	
+	public void setManufacturer(String manufacturer) {
+		this.m_manufacturer = manufacturer;
+	}
+
+	@Override
+	public String getSerialNumber() {
+		return m_serialNumber;
+	}
+	
+	public void setSerialNumber(String serialNumber) {
+		this.m_serialNumber = serialNumber;
+	}
+
+	@Override
+	public String[] getRevisionId() {
+		return m_revisionId;
+	}
+	
+	public void setRevisionId(String[] revisionId) {
+		this.m_revisionId = revisionId;
+	}
+
+	@Override
+	public List<ModemTechnologyType> getTechnologyTypes() {
+		return m_technologyTypes;
+	}
+	
+	public void setTechnologyTypes(List<ModemTechnologyType> technologyTypes) {
+		this.m_technologyTypes = technologyTypes;
+	}
+
+	@Override
+	public boolean isPoweredOn() {
+		return m_poweredOn;
+	}
+	
+	public void setPoweredOn(boolean poweredOn) {
+		this.m_poweredOn = poweredOn;
+	}
+
+	@Override
+	public ModemPowerMode getPowerMode() {
+		return m_powerMode;
+	}
+	
+	public void setPowerMode(ModemPowerMode powerMode) {
+	    this.m_powerMode = powerMode;
+	}
+
+	@Override
+	public ModemDevice getModemDevice() {
+		return m_modemDevice;
+	}
+	
+	public void setModemDevice(ModemDevice modemDevice) {
+		this.m_modemDevice = modemDevice;
+	}
+
+	public boolean isGpsSupported() {
+		return m_gpsSupported;
+	}
+
+	public void setGpsSupported(boolean m_gpsSupported) {
+		this.m_gpsSupported = m_gpsSupported;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/util/NetworkUtil.java b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/util/NetworkUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..eee5533a69515c2c79901fdc0c79fc3719bc4784
--- /dev/null
+++ b/kura/org.eclipse.kura.core.net/src/main/java/org/eclipse/kura/core/net/util/NetworkUtil.java
@@ -0,0 +1,196 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.net.util;
+
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class NetworkUtil {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(NetworkUtil.class);
+
+	public static String calculateNetwork(String ipAddress, String netmask) {
+		int ipAddressValue = 0;
+		int netmaskValue = 0;
+
+		StringTokenizer st = new StringTokenizer(ipAddress, ".");
+		for (int i = 24; i >= 0; i -= 8) {
+			ipAddressValue = ipAddressValue | (Integer.parseInt(st.nextToken()) << i);
+		}
+
+		st = new StringTokenizer(netmask, ".");
+		for (int i = 24; i >= 0; i -= 8) {
+			netmaskValue = netmaskValue | (Integer.parseInt(st.nextToken()) << i);
+		}
+
+		int network = ipAddressValue & netmaskValue;
+		return dottedQuad(network);
+	}
+
+	public static String calculateBroadcast(String ipAddress, String netmask) {
+		int ipAddressValue = 0;
+		int netmaskValue = 0;
+
+		StringTokenizer st = new StringTokenizer(ipAddress, ".");
+		for (int i = 24; i >= 0; i -= 8) {
+			ipAddressValue = ipAddressValue | (Integer.parseInt(st.nextToken()) << i);
+		}
+
+		st = new StringTokenizer(netmask, ".");
+		for (int i = 24; i >= 0; i -= 8) {
+			netmaskValue = netmaskValue | (Integer.parseInt(st.nextToken()) << i);
+		}
+
+		int network = ipAddressValue | (~netmaskValue);
+		return dottedQuad(network);
+	}
+	
+	public static String getNetmaskStringForm(int prefix) throws KuraException {
+		if(prefix >= 0 && prefix <=32) {
+			int mask = ~((1 << (32 - prefix)) - 1);
+			return dottedQuad(mask);
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "invalid prefix ");
+		}
+	}
+
+	public static short getNetmaskShortForm(String netmask) throws KuraException {
+		if(netmask == null) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "netmask is null");
+		}
+		
+		int netmaskValue = 0;
+		StringTokenizer st = new StringTokenizer(netmask, ".");
+		for (int i = 24; i >= 0; i -= 8) {
+			netmaskValue = netmaskValue | (Integer.parseInt(st.nextToken()) << i);
+		}
+
+		boolean hitZero = false;
+		int displayMask = 1 << 31;
+		int count = 0;
+
+		for (int c = 1; c<=32; c++) {
+			if((netmaskValue & displayMask) == 0) {
+				hitZero=true;
+			} else {
+				if(hitZero) {
+					s_logger.error("received invalid mask: " + netmask);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "received invalid mask: " + netmask);
+				}
+
+				count++;
+			}
+
+			netmaskValue <<= 1;
+		}
+
+		return (short)count;
+	}
+
+	public static String dottedQuad(int ip) {
+		StringBuffer sb = new StringBuffer(15);
+		for (int shift = 24; shift > 0; shift -= 8) {
+			// process 3 bytes, from high order byte down.
+			sb.append(Integer.toString((ip >>> shift) & 0xff));
+			sb.append('.');
+		}
+
+		sb.append(Integer.toString(ip & 0xff));
+		return sb.toString();
+	}
+	
+	public static int convertIp4Address(String ipAddress) {
+		String[] splitIpAddress = ipAddress.split("\\.");
+        short[] addressBytes = new short[4];
+
+        for(int i=0; i<4; i++) {
+                String octet = splitIpAddress[i];
+                addressBytes[i] = Short.parseShort(octet);
+        }
+
+        return NetworkUtil.packIp4AddressBytes(addressBytes);
+	}
+	
+	public static int packIp4AddressBytes(short[] bytes) {
+		int val = 0;
+		for (int i = 3; i >=0; i--) {
+			val = (val << 8);
+			val |= bytes[i];
+		}
+		return val;
+	}
+
+	public static short[] unpackIP4AddressInt(int address) {
+		return new short[]{(short)(address & 0xFF), (short)((address >> 8) & 0xFF), (short)((address >> 16) & 0xFF), (short)((address >> 24) & 0xFF)};
+	}
+	
+    public static byte[] convertIP6Address(String fullFormIP6Address) {
+        byte[] retVal = new byte[16];
+        String[] ip6Split = fullFormIP6Address.split(":");
+        for(int i=0; i<8; i++) {;
+                String octet = ip6Split[i];
+                StringBuffer sb = new StringBuffer();
+
+                while((sb.length()+octet.length()) < 4) {
+                        sb.append("0");
+                }  
+                sb.append(octet);
+
+                retVal[i*2] = (byte)Short.parseShort(sb.toString().substring(0,2),16);
+                retVal[i*2+1] = (byte)Short.parseShort(sb.toString().substring(2,4),16);
+        }
+                
+        return retVal;
+    }
+    
+    public static String convertIP6Address(byte[] bytes) {
+    	StringBuffer sb = new StringBuffer();
+    	for(int i=0; i<16; i=i+2) {
+       		sb.append(Integer.toHexString(0xFF & bytes[i]));
+       		sb.append(Integer.toHexString(0xFF & bytes[i+1]));
+       		if(i!=14) {
+       			sb.append(":");
+       		}
+       	}
+    	return sb.toString();
+    }
+    
+	public static String macToString(byte[] mac) {
+		StringBuilder sb = new StringBuilder();
+		for(int i=0; i<6; i++) {
+			String octet = (Integer.toHexString(mac[i] & 0xFF)).toUpperCase();
+			if(octet.length()==1) {
+				sb.append("0");
+			}
+			sb.append(octet);
+			if(i != 5) {
+				sb.append(":");
+			}
+		}
+		return sb.toString();
+	}
+
+	public static byte[] macToBytes(String mac) {
+		StringTokenizer st = new StringTokenizer(mac,":");
+		byte[] bytes = new byte[6];
+		for(int i=0; i<6; i++) {
+			bytes[i] = (byte) Integer.parseInt(st.nextToken(), 16);
+		}
+		
+		return bytes;
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..a1343035fe52a8881cd59235184eb5753c724ae8
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core.test
+Bundle-SymbolicName: org.eclipse.kura.core.test;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.comm,
+ junit.framework,
+ org.eclipse.kura.cloud; version="[0.2,1.0)",
+ org.eclipse.kura.comm; version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration; version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration.metatype; version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration.util; version="[0.2,1.0)",
+ org.eclipse.kura.core.deployment; version="[0.2,1.0)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.junit,
+ org.osgi.framework,
+ org.osgi.service.cm,
+ org.osgi.service.component,
+ org.osgi.service.deploymentadmin;version="1.1.0",
+ org.osgi.service.event,
+ org.osgi.service.io;version="1.0.0",
+ org.slf4j;version="1.6.4"
+Fragment-Host: org.eclipse.kura.core
+Bundle-ActivationPolicy: lazy
+Comment: org.eclipse.kura.emulator is needed as we need to start-up the emulator to run the tests!!
+Require-Bundle: org.eclipse.equinox.io;bundle-version="1.0.400",
+ org.junit;bundle-version="4.10.0",
+ org.eclipse.kura.emulator;bundle-version="0.2.0",
+ org.eclipse.kura.test;bundle-version="0.2.0"
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/all-core-tests.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/all-core-tests.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dac55f53619b22162df032c715d26c0d46762245
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/all-core-tests.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+               name="org.eclipse.kura.core.test.AllCoreTests">
+   <implementation class="org.eclipse.kura.core.test.AllCoreTests"/>
+   <reference bind="setConfigAdmin" cardinality="1..1" interface="org.osgi.service.cm.ConfigurationAdmin" name="ConfigurationAdmin" policy="static" unbind="unsetConfigAdmin"/>
+   <reference bind="setDataService" cardinality="1..1" interface="org.eclipse.kura.data.DataService" name="CloudService" policy="static" unbind="unsetDataService"/>
+   <reference bind="setSystemService" cardinality="1..1" interface="org.eclipse.kura.system.SystemService" name="SystemService" policy="static" unbind="unsetSystemService"/>   
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/cloud-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/cloud-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cc7431adafe41ce1859fff13e8bcc52aa716ca9f
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/cloud-test.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="CloudServiceTest">
+   <implementation class="org.eclipse.kura.core.test.CloudServiceTest"/>
+   <reference bind="setCloudService" 
+              cardinality="1..1" 
+              interface="org.eclipse.kura.cloud.CloudService" 
+              name="CloudService" 
+              policy="static"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/cloudDeploymentHandler-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/cloudDeploymentHandler-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..15251e3cedbea9b95230b3f5df468d212fea309c
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/cloudDeploymentHandler-test.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="CloudDeploymentHandlerTest">
+   <implementation class="org.eclipse.kura.core.test.CloudDeploymentHandlerTest"/>
+   <reference bind="setCloudCallService" cardinality="1..1" interface="org.eclipse.kura.cloud.CloudCallService" name="CloudCallService" policy="static" unbind="unsetCloudCallService"/>
+   <reference bind="setDeploymentAdmin" cardinality="1..1" interface="org.osgi.service.deploymentadmin.DeploymentAdmin" name="DeploymentAdmin" policy="static" unbind="unsetDeploymentAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/comm-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/comm-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d71fefa75fbc547fa0e1723c46e66795dcfb49e6
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/comm-test.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="CommTest">
+   <implementation class="org.eclipse.kura.core.test.hw.CommTest"/>
+   <reference bind="setConnectionFactory" 
+              cardinality="1..n" 
+              interface="org.osgi.service.io.ConnectionFactory" 
+              name="ConnectionFactory" 
+              policy="dynamic"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/configuration-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/configuration-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5d4c30406ca238e5c81972b3c367f8f0b012a19b
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/configuration-test.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" configuration-policy="require" immediate="true" modified="updated" name="org.eclipse.kura.core.test.IConfigurationServiceTest">
+   <implementation class="org.eclipse.kura.core.test.ConfigurationServiceTest"/>
+   <service>
+      <provide interface="org.eclipse.kura.core.test.IConfigurationServiceTest"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.core.test.IConfigurationServiceTest"/>
+   <reference bind="setConfigurationService" cardinality="1..1" interface="org.eclipse.kura.configuration.ConfigurationService" name="ConfigurationService" policy="static" unbind="unsetConfigurationService"/>
+   <reference bind="setSystemService" cardinality="1..1" interface="org.eclipse.kura.system.SystemService" name="SystemService" policy="static" unbind="unsetSystemService"/>
+   <reference bind="setCloudCallService" cardinality="1..1" interface="org.eclipse.kura.cloud.CloudCallService" name="CloudCallService" policy="static" unbind="unsetCloudCallService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/dataService-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/dataService-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d561f54b94788e0b03dfc5d697bea6f248651aad
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/dataService-test.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="DataServiceTest">
+   <implementation class="org.eclipse.kura.core.test.DataServiceTest"/>
+   <reference bind="setDataService" cardinality="1..1" interface="org.eclipse.kura.data.DataService" name="DataService" policy="static" unbind="unsetDataService"/>
+   <service>
+      <provide interface="org.eclipse.kura.data.DataServiceListener"/>
+   </service>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/example-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/example-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..012a9de1ea984620a6801b9267e11351cef84534
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/example-test.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ExampleTest">
+   <implementation class="org.eclipse.kura.core.test.ExampleTest"/>
+   <reference bind="setDataService" cardinality="1..1" interface="org.eclipse.kura.data.DataService" name="DataService" policy="static" unbind="unsetDataService"/>
+   <service>
+      <provide interface="org.eclipse.kura.data.DataServiceListener"/>
+   </service>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/metatype/org.eclipse.kura.core.test.IConfigurationServiceTest.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/metatype/org.eclipse.kura.core.test.IConfigurationServiceTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ce87eae9a6630935738232e069e269d35f6ded9d
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/metatype/org.eclipse.kura.core.test.IConfigurationServiceTest.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0">
+    <OCD id="org.eclipse.kura.core.test.IConfigurationServiceTest" 
+         name="ConfigurationServiceTest" 
+         description="ConfigurationServiceTest Configuration">
+
+        <AD id="prop.string"
+            name="prop.string"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="prop.string.value" 
+            description="prop.string.value"/>
+
+        <AD id="prop.long"  
+            name="prop.long"
+            type="Long"
+            cardinality="0" 
+            required="false"
+            default="1351589588" 
+            description="prop.long.value"/>
+
+        <AD id="prop.double"  
+            name="prop.double"
+            type="Double"
+            cardinality="0" 
+            required="false"
+            default="13515895.9999988" 
+            description="prop.double.value"/>
+
+        <AD id="prop.float"  
+            name="prop.float"
+            type="Float"
+            cardinality="0" 
+            required="false"
+            default="3.14" 
+            description="prop.float.value"/>
+
+        <AD id="prop.integer"  
+            name="prop.integer"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="314" 
+            description="prop.integer.value"/>
+
+        <AD id="prop.byte"  
+            name="prop.byte"
+            type="Byte"
+            cardinality="0" 
+            required="false"
+            default="7" 
+            description="prop.byte.value"/>
+        
+        <AD id="prop.character"  
+            name="prop.character"
+            type="Char"
+            cardinality="0" 
+            required="false"
+            default="c" 
+            description="prop.character.value"/>
+
+        <AD id="prop.boolean"  
+            name="prop.boolean"
+            type="Boolean"
+            cardinality="0" 
+            required="false"
+            default="true" 
+            description="prop.boolean.value"/>
+
+        <AD id="prop.short"  
+            name="prop.short"
+            type="Short"
+            cardinality="0" 
+            required="false"
+            default="255" 
+            description="prop.short.value"/>
+
+        <AD id="prop.string.array"
+            name="prop.string.array"
+            type="String"
+            cardinality="3" 
+            required="false"
+            default="value1, value2, value3" 
+            description="prop.string.value"/>
+
+        <AD id="prop.long.array"  
+            name="prop.long.array"
+            type="Long"
+            cardinality="3" 
+            required="false"
+            default="1351589588, 1351589589, 1351589590" 
+            description="prop.long.value"/>
+
+        <AD id="prop.double.array"  
+            name="prop.double.array"
+            type="Double"
+            cardinality="3" 
+            required="false"
+            default="13515895.88, 13515895.89, 13515895.90" 
+            description="prop.double.value"/>
+
+        <AD id="prop.float.array"  
+            name="prop.float.array"
+            type="Float"
+            cardinality="3" 
+            required="false"
+            default="3.14, 3.15, 3.16" 
+            description="prop.float.value"/>
+
+        <AD id="prop.integer.array"  
+            name="prop.integer.array"
+            type="Integer"
+            cardinality="3" 
+            required="false"
+            default="314, 315, 316" 
+            description="prop.integer.value"/>
+
+        <AD id="prop.byte.array"  
+            name="prop.byte.array"
+            type="Byte"
+            cardinality="3" 
+            required="false"
+            default="7, 8, 9" 
+            description="prop.byte.value"/>
+        
+        <AD id="prop.character.array"  
+            name="prop.character.array"
+            type="Char"
+            cardinality="3" 
+            required="false"
+            default="c, d, e" 
+            description="prop.character.value"/>
+
+        <AD id="prop.boolean.array"  
+            name="prop.boolean.array"
+            type="Boolean"
+            cardinality="3" 
+            required="false"
+            default="true, false, true" 
+            description="prop.boolean.value"/>
+
+        <AD id="prop.short.array"  
+            name="prop.short.array"
+            type="Short"
+            cardinality="3" 
+            required="false"
+            default="253, 254, 255" 
+            description="prop.short.value"/>
+        
+    </OCD>
+    <Designate pid="org.eclipse.kura.core.test.IConfigurationServiceTest">
+        <Object ocdref="org.eclipse.kura.core.test.IConfigurationServiceTest"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/network-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/network-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..55b3a939339c44128c0da38a815ae0851facb4cb
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/network-test.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="NetworkServiceTest">
+   <implementation class="org.eclipse.kura.core.test.NetworkServiceTest"/>
+   <reference bind="setNetworkService" 
+              cardinality="1..1" 
+              interface="org.eclipse.kura.net.NetworkService" 
+              name="NetworkService" 
+              policy="static"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/system-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/system-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a244dd4f31d2841e8661780d3c28ea40912412d0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/system-test.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="SystemTest">
+   <implementation class="org.eclipse.kura.core.test.SystemServiceTest"/>
+   <reference bind="setSystemService" 
+              cardinality="1..1" 
+              interface="org.eclipse.kura.system.SystemService" 
+              name="SystemService" 
+              policy="static"/>
+</scr:component>
+
diff --git a/kura/org.eclipse.kura.core.test/OSGI-INF/systemAdmin-test.xml b/kura/org.eclipse.kura.core.test/OSGI-INF/systemAdmin-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a122c1dae69d1fd88c15e3ecbc3119f08f886d9a
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/OSGI-INF/systemAdmin-test.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="SystemAdminTest">
+   <implementation class="org.eclipse.kura.core.test.SystemAdminServiceTest"/>
+   <reference bind="setSystemAdminService" 
+              cardinality="1..1" 
+              interface="org.eclipse.kura.system.SystemAdminService" 
+              name="SystemAdminService" 
+              policy="static"/>
+</scr:component>
+
diff --git a/kura/org.eclipse.kura.core.test/about.html b/kura/org.eclipse.kura.core.test/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.test/about_files/epl-v10.html b/kura/org.eclipse.kura.core.test/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.test/build.properties b/kura/org.eclipse.kura.core.test/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c5f5a82f49bafe40d85f6149306a9fc865f4b510
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/build.properties
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+output.. = target/classes/
+source.. = src/main/java/,\
+           src/main/resources/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about_files/,\
+               about.html
+additional.bundles = slf4j.api,\
+                     org.eclipse.kura.test,\
+                     org.junit
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core.test/kura/packages/com.eurotech.app.helloworld.dp b/kura/org.eclipse.kura.core.test/kura/packages/com.eurotech.app.helloworld.dp
new file mode 100644
index 0000000000000000000000000000000000000000..90d800751c8189f8285c7fa09e7d0f598f6aeaa5
Binary files /dev/null and b/kura/org.eclipse.kura.core.test/kura/packages/com.eurotech.app.helloworld.dp differ
diff --git a/kura/org.eclipse.kura.core.test/pom.xml b/kura/org.eclipse.kura.core.test/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4072d82ad0f76f021f151dd42ed40da3bd9b9df0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/pom.xml
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.core.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+    <build>
+    <plugins>
+            <plugin>
+                    <groupId>org.eclipse.tycho</groupId>
+                    <artifactId>tycho-packaging-plugin</artifactId>
+                    <version>${tycho-version}</version>
+                    <configuration>
+                            <format>'${kura.build.version}'</format>
+                    </configuration>
+                    <executions>
+                            <execution>
+                                    <phase>package</phase>
+                                    <id>package-plugin</id>
+                                    <goals>
+                                            <goal>package-plugin</goal>
+                                    </goals>
+                                    <configuration>
+                                            <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                    </configuration>
+                            </execution>
+                    </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.eclipse.tycho</groupId>
+                <artifactId>tycho-surefire-plugin</artifactId>
+                <version>${tycho-version}</version>
+                <configuration>
+                    <providerHint>junit4</providerHint>
+                    <testSuite>org.eclipse.kura.core.test</testSuite>
+                    <testClass>org.eclipse.kura.core.test.AllCoreTests</testClass>
+<!--                                         
+                    <testClass>org.eclipse.kura.core.test.CloudDeploymentHandlerTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.CloudServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.CommURITest</testClass>
+                    <testClass>org.eclipse.kura.core.test.ComponentConfigurationImplTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.ConfigurationServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.NetUtilTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.NetworkServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.SystemAdminServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.SystemServiceTest</testClass>
+ -->                    
+		    <!-- Don't run tests in parallel because it breaks them
+                    <parallel>both</parallel>
+		    -->
+
+                    <useUnlimitedThreads>true</useUnlimitedThreads>
+                    <argLine>-Dequinox.ds.print=true -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dorg.eclipse.kura.mode=emulator -Dkura.configuration=file:../org.eclipse.kura.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties  -Dlog4j.configuration=file:../org.eclipse.kura.emulator/src/main/resources/log4j.properties</argLine>
+
+		    <!-- This can be uncommented to debug the test in the event of a failure by telneting to port 5002 and seeing the state of the OSGi runtime 		    
+                    <appArgLine>-consoleLog -console 5002 -noExit</appArgLine>
+            -->
+		    <bundleStartLevel>
+			<bundle>
+			    <id>org.eclipse.equinox.ds</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.console</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.gogo.shell</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.gogo.command</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.gogo.runtime</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.core.contenttype</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.core.jobs</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.core.runtime</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.io</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.app</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.cm</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.common</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.event</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.metatype</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.preferences</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.registry</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.util</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.osgi.services</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.osgi.util</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.hamcrest.core</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>osgi.cmpn</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.launcher</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.soda.dk.comm</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>javax.usb.api</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>slf4j.api</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.servicemix.bundles.protobuf-java</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>mqtt-client</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.hsqldb.hsqldb</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.junit</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.commons.io</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>javax.servlet</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.dependencymanager</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.deploymentadmin</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.api</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core.cloud</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core.comm</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core.configuration</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core.crypto</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core.deployment</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core.net</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.deployment.agent</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.emulator</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+		    </bundleStartLevel>
+                    <dependencies>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.ds</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.console</artifactId>
+                        </dependency>       
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.gogo.shell</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.gogo.command</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.gogo.runtime</artifactId>
+                        </dependency>                        
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.core.contenttype</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.core.jobs</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.core.runtime</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.io</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.app</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.cm</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.common</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.event</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.metatype</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.preferences</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.registry</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.util</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.osgi</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.osgi.services</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.osgi.util</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.hamcrest.core</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>osgi.cmpn</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.launcher</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.soda.dk.comm</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>javax.usb.api</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>slf4j.api</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.servicemix.bundles.protobuf-java</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>mqtt-client</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.hsqldb.hsqldb</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.junit</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.commons.io</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>javax.servlet</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>log4j</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>log4j.apache-log4j-extras</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.dependencymanager</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.deploymentadmin</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.api</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core.cloud</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core.comm</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core.configuration</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core.crypto</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core.deployment</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.core.net</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.deployment.agent</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.emulator</artifactId>
+                        </dependency>
+                        <dependency>
+                        	<type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.kura.test</artifactId>
+                        </dependency>
+                    </dependencies>
+                </configuration>
+            </plugin>
+        </plugins>
+    <pluginManagement>
+    	<plugins>
+    		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+    		<plugin>
+    			<groupId>org.eclipse.m2e</groupId>
+    			<artifactId>lifecycle-mapping</artifactId>
+    			<version>1.0.0</version>
+    			<configuration>
+    				<lifecycleMappingMetadata>
+    					<pluginExecutions>
+    						<pluginExecution>
+    							<pluginExecutionFilter>
+    								<groupId>org.eclipse.tycho</groupId>
+    								<artifactId>
+    									tycho-compiler-plugin
+    								</artifactId>
+    								<versionRange>
+    									[0.20.0,)
+    								</versionRange>
+    								<goals>
+    									<goal>compile</goal>
+    								</goals>
+    							</pluginExecutionFilter>
+    							<action>
+    								<ignore></ignore>
+    							</action>
+    						</pluginExecution>
+    						<pluginExecution>
+    							<pluginExecutionFilter>
+    								<groupId>org.eclipse.tycho</groupId>
+    								<artifactId>
+    									tycho-packaging-plugin
+    								</artifactId>
+    								<versionRange>
+    									[0.20.0,)
+    								</versionRange>
+    								<goals>
+    									<goal>build-qualifier</goal>
+    									<goal>validate-version</goal>
+    									<goal>validate-id</goal>
+    								</goals>
+    							</pluginExecutionFilter>
+    							<action>
+    								<ignore></ignore>
+    							</action>
+    						</pluginExecution>
+    					</pluginExecutions>
+    				</lifecycleMappingMetadata>
+    			</configuration>
+    		</plugin>
+    	</plugins>
+    </pluginManagement>
+    </build>
+</project>
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/AllCoreTests.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/AllCoreTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4aa68811dcc4419473dae40cd861c4ee0d4d506
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/AllCoreTests.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.util.Dictionary;
+
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.system.SystemService;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@RunWith(Suite.class)
+@SuiteClasses({ DataServiceTest.class, CloudDeploymentHandlerTest.class, CloudServiceTest.class, CommURITest.class, ComponentConfigurationImplTest.class, ConfigurationServiceTest.class, NetUtilTest.class,
+				NetworkServiceTest.class, SystemAdminServiceTest.class, SystemServiceTest.class })
+public class AllCoreTests {
+	private static final Logger s_logger = LoggerFactory.getLogger(AllCoreTests.class);
+
+	private static ConfigurationAdmin s_configAdmin;
+	private static DataService        s_dataService;
+	private static SystemService      s_sysService;
+
+	public void setConfigAdmin(ConfigurationAdmin configAdmin) {
+		s_configAdmin = configAdmin;
+	}
+
+	public void unsetConfigAdmin(ConfigurationAdmin configAdmin) {
+		s_configAdmin = configAdmin;
+	}
+
+	public void setDataService(DataService dataService) {
+		s_dataService = dataService;
+	}
+
+	public void unsetDataService(DataService dataService) {
+		s_dataService = dataService;
+	}
+
+	public void setSystemService(SystemService sysService) {
+		s_sysService = sysService;
+	}
+
+	public void unsetSystemService(SystemService sysService) {
+		s_sysService = sysService;
+	}
+	
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+		s_logger.info("setUpClass...");
+
+		int waitCount = 10;
+		while ((s_configAdmin == null || s_dataService == null) && waitCount > 0) {
+			try {
+				Thread.sleep(1000);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			waitCount--;
+			s_logger.info("Waiting for ConfigAdmin and DataService " + waitCount + "...");
+		}
+
+		if (s_configAdmin == null || s_dataService == null) {
+			throw new Exception("ConfigAdmin and DataService not set.");
+		}
+
+		try {
+
+			// update the settings
+			Configuration mqttConfig = s_configAdmin.getConfiguration("org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport");
+			Dictionary<String, Object> mqttProps = mqttConfig.getProperties();
+			
+			/*
+			mqttProps.put("broker-url", "mqtt://broker-stage.everyware-cloud.com:1883/");
+			mqttProps.put("topic.context.account-name", "edcguest");
+			mqttProps.put("username", "edcguest_broker");
+			mqttProps.put("password", "Welcome1");
+			*/
+			
+			mqttProps.put("broker-url", "mqtt://broker-sandbox.everyware-cloud.com:1883/");
+			mqttProps.put("topic.context.account-name", "edcguest");
+			mqttProps.put("username", "edcguest_broker");
+			mqttProps.put("password", "1nv1t3!");
+			
+			// cloudbees fails in getting the primary MAC address
+			// we need to compensate for it.
+			String clientId = "cloudbees-kura"; 
+			try {
+				clientId = s_sysService.getPrimaryMacAddress();
+			}
+			catch (Throwable t) {
+				// ignore.
+			}
+			mqttProps.put("client-id", clientId);
+			mqttConfig.update(mqttProps);
+
+			Configuration dataConfig = s_configAdmin.getConfiguration("org.eclipse.kura.data.DataService");
+			Dictionary<String, Object> dataProps = dataConfig.getProperties();
+			dataProps.put("connect.auto-on-startup", false);
+			dataConfig.update(dataProps);
+
+			// waiting for the configuration to be applied
+			try {
+				Thread.sleep(1000);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		} catch (Exception e) {
+			throw new Exception("Failed to reconfigure the broker settings - failing out", e);
+		}
+
+		// connect
+		if (!s_dataService.isConnected()) {
+			s_dataService.connect();
+		}
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+		s_logger.info("tearDownClass...");
+		if (s_dataService.isConnected()) {
+			s_dataService.disconnect(0);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CloudDeploymentHandlerTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CloudDeploymentHandlerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a8276f5696bb97e36f99cf3d14da69d07338135
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CloudDeploymentHandlerTest.java
@@ -0,0 +1,302 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.cloud.CloudCallService;
+import org.eclipse.kura.cloud.CloudletTopic;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.core.deployment.CloudDeploymentHandler;
+import org.eclipse.kura.core.deployment.XmlBundle;
+import org.eclipse.kura.core.deployment.XmlBundleInfo;
+import org.eclipse.kura.core.deployment.XmlBundles;
+import org.eclipse.kura.core.deployment.XmlDeploymentPackage;
+import org.eclipse.kura.core.deployment.XmlDeploymentPackages;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.deploymentadmin.DeploymentAdmin;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
+
+public class CloudDeploymentHandlerTest extends TestCase {
+
+	private static CountDownLatch s_dependencyLatch = new CountDownLatch(2);	// initialize with number of dependencies
+	private static CloudCallService s_cloudCallService;
+	private static DeploymentAdmin s_deploymentAdmin;
+	
+	private static long s_countdown = 30000;
+
+	private static final String DP_NAME = "org.eclipse.kura.test.helloworld";
+	private static final String DP_VERSION = "1.0.0";
+	private static final String BUNDLE_NAME = "org.eclipse.kura.test.helloworld";
+	private static final String BUNDLE_VERSION = "1.0.0.201407161421";
+	
+	private URL getTestDpUrl() {
+		BundleContext ctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+
+		URL packageUrl = ctx.getBundle().getResource("src/main/resources/"+DP_NAME+".dp");
+		if(packageUrl == null) {
+			//handle case where running from a jar on a real target
+			packageUrl = ctx.getBundle().getResource(DP_NAME+".dp");
+		}
+		
+		return packageUrl;
+	}
+	
+	public void setUp() {
+		// Wait for OSGi dependencies
+		try {
+			s_dependencyLatch.await(5, TimeUnit.SECONDS);
+			
+			while (!s_cloudCallService.isConnected() && s_countdown > 0) {
+				Thread.sleep(1000);
+				s_countdown -= 1000;
+			}
+			if (!s_cloudCallService.isConnected()) {
+				fail("Timed out waiting for the CloudCallService to connect");
+			}
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+
+	public void setCloudCallService(CloudCallService cloudCallService) {
+		CloudDeploymentHandlerTest.s_cloudCallService = cloudCallService;
+		s_dependencyLatch.countDown();
+	}
+	
+	public void unsetCloudCallService(CloudCallService cloudCallService) {
+		CloudDeploymentHandlerTest.s_cloudCallService = null;
+	}
+	
+	public void setDeploymentAdmin(DeploymentAdmin deploymentAdmin) {
+		CloudDeploymentHandlerTest.s_deploymentAdmin = deploymentAdmin;
+		s_dependencyLatch.countDown();
+	}
+
+	public void unsetDeploymentAdmin(DeploymentAdmin deploymentAdmin) {
+		CloudDeploymentHandlerTest.s_deploymentAdmin = null;
+	}
+	
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testExecInstallDeploymentPackage() throws Exception 
+	{
+		assertTrue(s_cloudCallService.isConnected());
+		
+		StringBuilder sb = new StringBuilder(CloudletTopic.Method.EXEC.toString())
+		.append("/")
+		.append(CloudDeploymentHandler.RESOURCE_INSTALL);
+		
+		URL packageUrl = getTestDpUrl();
+		
+		KuraPayload payload = new KuraPayload();
+
+		payload.addMetric(CloudDeploymentHandler.METRIC_INSTALL_COMMAND_URL, packageUrl.toString());
+
+		KuraResponsePayload resp = s_cloudCallService.call(
+				CloudDeploymentHandler.APP_ID,
+				sb.toString(),
+				payload,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetPackages() throws Exception {
+		
+		assertTrue(s_cloudCallService.isConnected());
+		
+		DeploymentPackage dp = s_deploymentAdmin.getDeploymentPackage(DP_NAME);
+		if (dp == null) {
+			InputStream is = getTestDpUrl().openStream();
+			dp = s_deploymentAdmin.installDeploymentPackage(is);
+		}
+		
+		StringBuilder sb = new StringBuilder(CloudletTopic.Method.GET.toString())
+		.append("/")
+		.append(CloudDeploymentHandler.RESOURCE_PACKAGES);
+		
+		KuraResponsePayload resp = s_cloudCallService.call(
+				CloudDeploymentHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+
+		String s = new String(resp.getBody());
+
+		XmlDeploymentPackages xmlPackages = XmlUtil.unmarshal(s, XmlDeploymentPackages.class);
+
+		XmlDeploymentPackage[] packages = xmlPackages.getDeploymentPackages();
+
+		XmlDeploymentPackage xmlDp = null;
+		if (packages != null) {
+			for (int i = 0; i < packages.length; i++) {
+				if (packages[i].getName().equals(DP_NAME)) {
+					xmlDp = packages[i];
+					break;
+				}
+			}
+		}
+
+		assertNotNull(xmlDp);
+		assertEquals(DP_VERSION, xmlDp.getVersion());
+		XmlBundleInfo[] bundleInfos = xmlDp.getBundleInfos();
+		assertEquals(1, bundleInfos.length);
+		assertEquals(BUNDLE_NAME, bundleInfos[0].getName());
+		assertEquals(BUNDLE_VERSION, bundleInfos[0].getVersion());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetBundles() throws Exception {
+
+		assertTrue(s_cloudCallService.isConnected());
+		
+		DeploymentPackage dp = s_deploymentAdmin.getDeploymentPackage(DP_NAME);
+		if (dp == null) {
+			InputStream is = getTestDpUrl().openStream();
+			dp = s_deploymentAdmin.installDeploymentPackage(is);
+		}
+		
+		StringBuilder sb = new StringBuilder(CloudletTopic.Method.GET.toString())
+		.append("/")
+		.append(CloudDeploymentHandler.RESOURCE_BUNDLES);
+		
+		KuraResponsePayload resp = s_cloudCallService.call(
+				CloudDeploymentHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+
+		String s = new String(resp.getBody());
+
+		XmlBundles xmlBundles = XmlUtil.unmarshal(s, XmlBundles.class);
+
+		XmlBundle[] bundles = xmlBundles.getBundles();
+
+		XmlBundle bundle = null;
+		if (bundles != null) {
+			for (int i = 0; i < bundles.length; i++) {
+				if (bundles[i].getName().equals(DP_NAME)) {
+					bundle = bundles[i];
+					break;
+				}
+			}
+		}
+
+		assertNotNull(bundle);
+		assertEquals(BUNDLE_VERSION, bundle.getVersion());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testExecStartStop() throws Exception {
+
+		assertTrue(s_cloudCallService.isConnected());
+		
+		DeploymentPackage dp = s_deploymentAdmin.getDeploymentPackage(DP_NAME);
+		if (dp == null) {
+			InputStream is = getTestDpUrl().openStream();
+			dp = s_deploymentAdmin.installDeploymentPackage(is);
+		}
+		
+		Bundle bundle = dp.getBundle(BUNDLE_NAME);
+				
+		assertNotNull(bundle);
+		
+		if (bundle.getState() == Bundle.RESOLVED) {
+			bundle.start();
+		}
+		
+		assertEquals(Bundle.ACTIVE, bundle.getState());
+		
+		StringBuilder sb = new StringBuilder(CloudletTopic.Method.EXEC.toString())
+		.append("/")
+		.append(CloudDeploymentHandler.RESOURCE_STOP)
+		.append("/")
+		.append(bundle.getBundleId());
+		
+		KuraResponsePayload resp = s_cloudCallService.call(
+				CloudDeploymentHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+		
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+
+		assertEquals(Bundle.RESOLVED, bundle.getState());
+		
+		// Start
+		sb = new StringBuilder(CloudletTopic.Method.EXEC.toString())
+		.append("/")
+		.append(CloudDeploymentHandler.RESOURCE_START)
+		.append("/")
+		.append(bundle.getBundleId());
+		
+		resp = s_cloudCallService.call(
+				CloudDeploymentHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+		
+		assertEquals(Bundle.ACTIVE, bundle.getState());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testExecUninstallDeploymentPackage() throws Exception {
+
+		assertTrue(s_cloudCallService.isConnected());
+		
+		DeploymentPackage dp = s_deploymentAdmin.getDeploymentPackage(DP_NAME);
+		if (dp == null) {
+			InputStream is = getTestDpUrl().openStream();
+			dp = s_deploymentAdmin.installDeploymentPackage(is);
+		}
+		
+		StringBuilder sb = new StringBuilder(CloudletTopic.Method.EXEC.toString())
+		.append("/")
+		.append(CloudDeploymentHandler.RESOURCE_UNINSTALL);
+		
+		KuraPayload payload = new KuraPayload();
+		payload.setBody("org.eclipse.kura.test.helloworld".getBytes("UTF-8"));
+		
+		KuraResponsePayload resp = s_cloudCallService.call(
+				CloudDeploymentHandler.APP_ID,
+				sb.toString(),
+				payload,
+				5000);
+		
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+		assertNull(s_deploymentAdmin.getDeploymentPackage(DP_NAME));
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CloudServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CloudServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..72e9b18d089f27a7eb421e170f7a2af734c38318
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CloudServiceTest.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CloudServiceTest extends TestCase implements CloudClientListener
+{
+	private static CountDownLatch dependencyLatch = new CountDownLatch(1);	// initialize with number of dependencies
+	private static CloudService   cloudService;
+	
+	private int            publishedMsgId;
+	private boolean        publishPublished;
+	private boolean        publishConfirmed;
+	private boolean        publishArrived;
+
+	private int            controlMsgId;
+	private boolean        controlPublished;
+	private boolean        controlConfirmed;
+	private boolean        controlArrived;
+	
+	@BeforeClass
+	public void setUp() {
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+	
+	public void setCloudService(CloudService cloudService) {
+		CloudServiceTest.cloudService = cloudService;
+		dependencyLatch.countDown();
+	}
+	
+	@Test
+	public void testDummy() {
+		assertTrue(true);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(CloudServiceTest.cloudService);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testService() 
+		throws Exception
+	{
+		publishArrived = false;
+		controlArrived = false;
+				
+		CloudClient cloudAppClient = CloudServiceTest.cloudService.newCloudClient("testService");
+		cloudAppClient.addCloudClientListener(this);
+		
+		// test regular subscriptions
+		int count = 0;
+		while (!cloudAppClient.isConnected() && count < 10) {
+			Thread.sleep(1000);
+			count++;
+		}
+		if (!cloudAppClient.isConnected()) {
+			throw new Exception("Not connected");
+		}
+		cloudAppClient.subscribe("test", 1);
+
+		// test default subscriptions
+		int priority = 5;
+		
+		KuraPayload payload = new KuraPayload();
+		payload.setBody("payload".getBytes());
+		publishedMsgId = cloudAppClient.publish("test", payload, 1, false, priority);
+
+		KuraPayload controlPayload = new KuraPayload();
+		controlPayload.setBody("control_payload".getBytes());
+		controlMsgId = cloudAppClient.controlPublish("control_test", controlPayload, 1, false, priority);
+		
+		Thread.sleep(1000);
+		
+		assertTrue("publish not published!", publishPublished);
+		assertTrue("publish not confirmed!", publishConfirmed);
+		assertTrue("publish not arrived!",   publishArrived);
+
+		assertTrue("control not published!", controlPublished);
+		assertTrue("control not confirmed!", controlConfirmed);
+		assertTrue("control not arrived!",   controlArrived);
+
+		cloudAppClient.release();
+	}
+	
+	@Override
+	public void onConnectionLost() {
+		// Ignore
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		// Ignore
+	}
+
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		assertEquals("control_test",    appTopic);
+		assertEquals("control_payload", new String(msg.getBody()));
+		controlArrived = true;
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		assertEquals("test",    appTopic);
+		assertEquals("payload", new String(msg.getBody()));
+		publishArrived = true;		
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		if (messageId == publishedMsgId) {
+			assertEquals("test", appTopic);
+			publishConfirmed = true;
+		}
+		if (messageId == controlMsgId) {
+			assertEquals("control_test", appTopic);
+			controlConfirmed = true;
+		}
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		if (messageId == publishedMsgId) {
+			assertEquals("test", appTopic);
+			publishPublished = true;
+		}
+		if (messageId == controlMsgId) {
+			assertEquals("control_test", appTopic);
+			controlPublished = true;
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CommURITest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CommURITest.java
new file mode 100644
index 0000000000000000000000000000000000000000..45ee02a7f19a10b372f2f99a04bd2782f9400d32
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/CommURITest.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.Test;
+
+import junit.framework.TestCase;
+
+public class CommURITest extends TestCase 
+{
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testSyntax() 
+		throws Exception
+	{
+		CommURI commUri = new CommURI.Builder("/dev/ttyUSB0").withBaudRate(4800).build();
+		System.out.println(commUri);
+		
+		CommURI commUri1 = CommURI.parseString(commUri.toString());
+		System.out.println(commUri1);
+		
+		assertEquals(commUri1.toString(), commUri.toString());
+	}
+
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ComponentConfigurationImplTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ComponentConfigurationImplTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7aae54455ab3b6e46c5629b021737707a73c257
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ComponentConfigurationImplTest.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.kura.core.configuration.ComponentConfigurationImpl;
+import org.eclipse.kura.core.configuration.metatype.Tocd;
+import org.eclipse.kura.core.configuration.util.ComponentUtil;
+import org.eclipse.kura.core.configuration.util.StringUtil;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.Test;
+
+import junit.framework.TestCase;
+
+public class ComponentConfigurationImplTest extends TestCase 
+{
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testSplitDefaultValues()
+		throws Exception
+	{		
+		String defaultString = "abc, def, 124  , qwer\\, ty , ed, \\ \\ spa ce\\ , 789";
+		String[] defaultValues = StringUtil.splitValues(defaultString);
+		for (String s : defaultValues) {
+			System.err.println(s);
+		}
+		assertEquals(7, defaultValues.length);
+		assertEquals("abc",       defaultValues[0]);
+		assertEquals("def",       defaultValues[1]);
+		assertEquals("124",       defaultValues[2]);
+		assertEquals("qwer, ty",  defaultValues[3]);
+		assertEquals("ed",        defaultValues[4]);
+		assertEquals("  spa ce ", defaultValues[5]);
+		assertEquals("789",       defaultValues[6]);
+		
+		String expected = "abc,def,124,qwer\\,\\ ty,ed,\\ \\ spa\\ ce\\ ,789";
+		String joined   = StringUtil.valueToString(defaultValues);
+		assertEquals(expected, joined);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testSplitDefaultValues2()
+		throws Exception
+	{		
+		String defaultString = "  a\\,b,b\\,c,\\ c\\\\,d   ";
+		String[] defaultValues = StringUtil.splitValues(defaultString);
+		
+		assertEquals(4,      defaultValues.length);
+		assertEquals("a,b",  defaultValues[0]);
+		assertEquals("b,c",  defaultValues[1]);
+		assertEquals(" c\\", defaultValues[2]); 
+		assertEquals("d",    defaultValues[3]);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testPropertiesMarshallUnmarshall()
+		throws Exception
+	{
+		String pid = "org.eclipse.kura.cloud.CloudService";
+		Tocd definition = null;
+		Map<String,Object> properties = new HashMap<String,Object>();
+		properties.put("prop.string",    new String("prop.value"));
+		properties.put("prop.long",      Long.MAX_VALUE);
+		properties.put("prop.double",    Double.MAX_VALUE);
+		properties.put("prop.float",     Float.MAX_VALUE);
+		properties.put("prop.integer",   Integer.MAX_VALUE);
+		properties.put("prop.byte",      Byte.MAX_VALUE);
+		properties.put("prop.character", 'a');
+		properties.put("prop.short",     Short.MAX_VALUE);
+		
+		ComponentConfigurationImpl config = new ComponentConfigurationImpl(pid, definition, properties);
+		String s  = XmlUtil.marshal(config);
+		System.err.println(s);
+		
+		ComponentConfigurationImpl config1 = XmlUtil.unmarshal(s, ComponentConfigurationImpl.class);
+		String s1 = XmlUtil.marshal(config1);
+		System.err.println(s1);
+		
+		Map<String,Object> properties1 = config1.getConfigurationProperties();
+		assertEquals(properties, properties1);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testOCDMarshallUnmarshall()
+		throws Exception
+	{
+		String pid = "org.eclipse.kura.cloud.CloudService";
+
+		Tocd definition = ComponentUtil.readObjectClassDefinition(pid);
+
+		Map<String,Object> properties = new HashMap<String,Object>();
+		properties.put("prop.string",    new String("prop.value"));
+		properties.put("prop.long",      Long.MAX_VALUE);
+		properties.put("prop.double",    Double.MAX_VALUE);
+		properties.put("prop.float",     Float.MAX_VALUE);
+		properties.put("prop.integer",   Integer.MAX_VALUE);
+		properties.put("prop.byte",      Byte.MAX_VALUE);
+		properties.put("prop.character", 'a');
+		properties.put("prop.short",     Short.MAX_VALUE);
+		
+		ComponentConfigurationImpl config = new ComponentConfigurationImpl(pid, definition, properties);
+		String s  = XmlUtil.marshal(config);
+		System.err.println(s);
+		
+		ComponentConfigurationImpl config1 = XmlUtil.unmarshal(s, ComponentConfigurationImpl.class);
+		String s1 = XmlUtil.marshal(config1);
+		System.err.println(s1);
+		
+		Map<String,Object> properties1 = config1.getConfigurationProperties();
+		assertEquals(properties, properties1);
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ConfigurationServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ConfigurationServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0077326fef039811ef0a52a7bbc08ac98257a7d
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ConfigurationServiceTest.java
@@ -0,0 +1,476 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudCallService;
+import org.eclipse.kura.cloud.CloudletTopic;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.core.configuration.CloudConfigurationHandler;
+import org.eclipse.kura.core.configuration.ComponentConfigurationImpl;
+import org.eclipse.kura.core.configuration.XmlComponentConfigurations;
+import org.eclipse.kura.core.configuration.XmlSnapshotIdResult;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.message.KuraResponsePayload;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.Test;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConfigurationServiceTest extends TestCase implements IConfigurationServiceTest, ConfigurableComponent
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ConfigurationServiceTest.class);
+	
+	private static CountDownLatch 		dependencyLatch = new CountDownLatch(4);	// initialize with number of dependencies
+	private static Object 				lock = new Object(); // initialize with number of dependencies
+	private static ConfigurationService configService;
+	private static CloudCallService     cloudCallService;
+	private static SystemService        systemService;
+	
+	private static long 				s_countdown = 30000;
+	
+	@SuppressWarnings("unused")
+	private static ComponentContext 	componentContext;
+	
+	private static Map<String, Object>  s_properties;
+	
+	public void setUp() 
+	{
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);			
+			while (s_countdown > 0) {
+				Thread.sleep(1000);
+				s_countdown -= 1000;
+			}
+			if (s_countdown > 0) {
+				fail("Dependencies not resolved!");
+			}
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+	
+	public void setConfigurationService(ConfigurationService configurationService) {
+		ConfigurationServiceTest.configService = configurationService;
+		dependencyLatch.countDown();
+	}
+
+	public void setCloudCallService(CloudCallService cloudCallService) {
+		ConfigurationServiceTest.cloudCallService = cloudCallService;
+		dependencyLatch.countDown();
+	}
+
+	public void setSystemService(SystemService systemService) {
+		ConfigurationServiceTest.systemService = systemService;
+		dependencyLatch.countDown();
+	}
+	
+	public void unsetConfigurationService(ConfigurationService configurationService) {
+		ConfigurationServiceTest.configService = null;
+	}
+
+	public void unsetCloudCallService(CloudCallService cloudCallService) {
+		ConfigurationServiceTest.cloudCallService = null;
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+		ConfigurationServiceTest.systemService = null;
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(ConfigurationServiceTest.configService);
+	}
+	
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.info("ConfigurationServiceTest.activate...");
+		ConfigurationServiceTest.componentContext = componentContext;
+		s_properties = properties;
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("ConfigurationServiceTest.deactivate...");
+	}
+	
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("Updated called: "+properties);
+		
+		Set<Entry<String, Object>> entries = properties.entrySet();
+		for (Map.Entry<String, Object> entry : entries) {
+			System.err.println("\t\t" + entry.getKey() + " = " + entry.getValue());
+		}
+		
+		s_properties = properties;
+		synchronized (lock) {
+			lock.notifyAll();
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testLocalConfiguration()
+		throws Exception
+	{		
+		String pid = "org.eclipse.kura.core.test.IConfigurationServiceTest";		
+		s_logger.info("configService 1:"+ConfigurationServiceTest.configService);
+		synchronized (lock) {
+			lock.wait(5000);			
+		}
+		
+		s_logger.info("Asserting default values...");
+
+		//
+		// test the default properties
+		assertDefaultValues(s_properties);
+		
+		//
+		// take a snapshot
+		s_logger.info("configService 2:"+ConfigurationServiceTest.configService);
+		s_logger.info("Taking snapshot...");
+		
+		long sid;
+		sid = ConfigurationServiceTest.configService.snapshot();
+		
+		//
+		// test a positive update flow
+		Hashtable<String,Object> props = new Hashtable<String,Object>();
+		Set<String> keys = s_properties.keySet();
+		for (String key : keys) {
+			props.put(key, s_properties.get(key));
+		}
+		props.put("prop.string",    "string_prop");
+		props.put("prop.long",      9999L);		
+		props.put("prop.double",    99.99D);
+		props.put("prop.float",     99.99F);
+		props.put("prop.integer",   99999);
+		props.put("prop.character", '9');
+		props.put("prop.boolean",   false);
+		
+		short s9 = (short) 9;
+		props.put("prop.short",     s9);
+
+		byte b9 = (byte) 9;
+		props.put("prop.byte",     b9);
+		
+		s_logger.info("configService 3:"+ConfigurationServiceTest.configService);
+		s_logger.info("Updating configuration with new values for " + pid + " with props: " + props);
+		ConfigurationServiceTest.configService.updateConfiguration(pid, props);		
+		synchronized (lock) {
+			lock.wait(10000);			
+		}
+
+		s_logger.info("Asserting values...");
+		assertEquals("string_prop", s_properties.get("prop.string"));
+		assertEquals(9999L,  s_properties.get("prop.long"));		
+		assertEquals(99.99D, s_properties.get("prop.double"));
+		assertEquals(99.99F, s_properties.get("prop.float"));
+		assertEquals(99999,  s_properties.get("prop.integer"));
+		assertEquals('9',    s_properties.get("prop.character"));
+		assertEquals(false,  s_properties.get("prop.boolean"));
+		assertEquals(s9,     s_properties.get("prop.short"));
+		assertEquals(b9,     s_properties.get("prop.byte"));
+		
+		// test a negative update flow
+		props.clear();
+		keys = s_properties.keySet();
+		for (String key : keys) {
+			props.put(key, s_properties.get(key));
+		}
+		props.put("prop.long", "AAAA");
+		try {
+			ConfigurationServiceTest.configService.updateConfiguration(pid, props);
+			assertFalse("Configuration update should have failed", false);
+		}
+		catch (KuraException e) {
+			assertTrue("Configuration update has failed as expected", true);
+			assertEquals(KuraErrorCode.CONFIGURATION_ATTRIBUTE_INVALID, e.getCode());
+		}
+
+		// test a negative update flow
+		props.clear();
+		keys = s_properties.keySet();
+		for (String key : keys) {
+			props.put(key, s_properties.get(key));
+		}
+		props.remove("prop.string");
+		try {
+			ConfigurationServiceTest.configService.updateConfiguration(pid, props);
+			assertFalse("Configuration update should have failed", false);
+		}
+		catch (KuraException e) {
+			assertTrue("Configuration update has failed as expected", true);
+			assertEquals(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, e.getCode());
+		}
+		
+		//
+		// restore a snapshot
+		// Wait for everything to get stable
+		Thread.sleep(5000);
+		s_logger.info("Rolling back...");
+		ConfigurationServiceTest.configService.rollback(sid);
+
+		// Wait for everything to get stable
+		Thread.sleep(5000);
+		assertDefaultValues(s_properties);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testRemoteConfiguration()
+		throws Exception
+	{
+		assertTrue(cloudCallService.isConnected());
+		assertDefaultValues(s_properties);
+		
+		s_logger.info("Starting testRemoteConfiguration");
+		
+		String pid = "org.eclipse.kura.core.test.IConfigurationServiceTest";
+		
+		// load the current configuration
+		s_logger.info("loading the current configuration");
+		
+		StringBuilder sb = new StringBuilder(CloudletTopic.Method.GET.toString())
+		.append("/")
+		.append(CloudConfigurationHandler.RESOURCE_CONFIGURATIONS)
+		.append("/")
+		.append(pid);
+		
+		KuraResponsePayload resp = cloudCallService.call(
+				CloudConfigurationHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+		assertNotNull(resp.getBody());
+		
+		// unmarshall the response
+		String s = new String(resp.getBody(), "UTF-8");
+		StringReader sr = new StringReader(s);
+		XmlComponentConfigurations xmlConfigs = XmlUtil.unmarshal(sr, XmlComponentConfigurations.class);
+		
+		System.err.println("Checking current configuration");
+		List<ComponentConfigurationImpl> configs = xmlConfigs.getConfigurations();
+		assertDefaultValues(configs.get(0).getConfigurationProperties());
+		
+		// take a snapshot
+		System.err.println("taking a snapshot");
+		
+		sb = new StringBuilder(CloudletTopic.Method.EXEC.toString())
+		.append("/")
+		.append(CloudConfigurationHandler.RESOURCE_SNAPSHOT);
+		
+		resp = cloudCallService.call(
+				CloudConfigurationHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+		assertNotNull(resp.getBody());
+		
+		// unmarshall the response
+		s = new String(resp.getBody(), "UTF-8");
+		sr = new StringReader(s);
+		XmlSnapshotIdResult snapshotIds = XmlUtil.unmarshal(sr, XmlSnapshotIdResult.class);				
+
+		s_logger.info("validating configuration");
+		assertNotNull(snapshotIds);
+		assertEquals(1, snapshotIds.getSnapshotIds().size());
+		
+		long sid = snapshotIds.getSnapshotIds().get(0);
+
+		// modify the configuration
+		s_logger.info("modifying configuration");
+		ComponentConfigurationImpl  ccnew = new ComponentConfigurationImpl();
+		ccnew.setPid(pid);
+		Hashtable<String,Object> propsnew = new Hashtable<String,Object>();
+		propsnew.put("prop.string", "modified_value");
+		ccnew.setProperties(propsnew);
+		
+		XmlComponentConfigurations newConfigs = new XmlComponentConfigurations();
+		List<ComponentConfigurationImpl> newccs = new ArrayList<ComponentConfigurationImpl>();
+		newccs.add(ccnew);
+		newConfigs.setConfigurations(newccs);
+		
+		StringWriter sw = new StringWriter();
+		XmlUtil.marshal(newConfigs, sw);
+		
+		KuraPayload payload = new KuraPayload();
+		payload.setBody(sw.toString().getBytes());
+		
+		sb = new StringBuilder(CloudletTopic.Method.PUT.toString())
+		.append("/")
+		.append(CloudConfigurationHandler.RESOURCE_CONFIGURATIONS)
+		.append("/")
+		.append(pid);
+		
+		resp = cloudCallService.call(
+				CloudConfigurationHandler.APP_ID,
+				sb.toString(),
+				payload,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+		
+		int count = 0;
+		while(!(("modified_value").equals(s_properties.get("prop.string"))) && count < 10) {
+			count++;
+			System.err.println("waiting for configuration update");
+			Thread.sleep(1000);
+		}
+		
+		s_logger.info("validating modified configuration");
+		s_logger.info("Checking these are equal: " + s_properties.get("prop.string") + " AND " + "modified_value");
+		assertEquals("modified_value", s_properties.get("prop.string"));
+		
+		// reload the current configuration
+		s_logger.info("reloading the current configuration");
+
+		sb = new StringBuilder(CloudletTopic.Method.GET.toString())
+		.append("/")
+		.append(CloudConfigurationHandler.RESOURCE_CONFIGURATIONS)
+		.append("/")
+		.append(pid);
+		
+		resp = cloudCallService.call(
+				CloudConfigurationHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+		assertNotNull(resp.getBody());
+		
+		// unmarshall the response
+		s = new String(resp.getBody(), "UTF-8");
+		System.err.println(s);			
+		
+		sr = new StringReader(s);
+		xmlConfigs = XmlUtil.unmarshal(sr, XmlComponentConfigurations.class);
+		
+		s_logger.info("validating modified configuration");
+		if(xmlConfigs == null) {
+			s_logger.info("ERROR: xmlConfigs is null");
+		}
+		assertNotNull(xmlConfigs);
+		ComponentConfigurationImpl ccmod = xmlConfigs.getConfigurations().get(0);
+		s_logger.info("Checking these are equal: " + ccmod.getConfigurationProperties().get("prop.string") + " AND " + "modified_value");
+		assertEquals("modified_value", ccmod.getConfigurationProperties().get("prop.string"));		
+		
+		// rollback
+		sb = new StringBuilder(CloudletTopic.Method.EXEC.toString())
+		.append("/")
+		.append(CloudConfigurationHandler.RESOURCE_ROLLBACK)
+		.append("/")
+		.append(sid);
+		
+		resp = cloudCallService.call(
+				CloudConfigurationHandler.APP_ID,
+				sb.toString(),
+				null,
+				5000);
+
+		assertEquals(KuraResponsePayload.RESPONSE_CODE_OK, resp.getResponseCode());
+
+		// Wait for everything to get stable
+		Thread.sleep(5000);
+		assertDefaultValues(s_properties);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testSnapshotsMaxCount()
+		throws Exception
+	{
+		int maxCount = ConfigurationServiceTest.systemService.getKuraSnapshotsCount();
+		for (int i=0; i<maxCount*2; i++) {
+			ConfigurationServiceTest.configService.snapshot();
+		}
+		
+		Set<Long> sids = ConfigurationServiceTest.configService.getSnapshots();
+		assertEquals(maxCount, sids.size());
+	}
+
+	private void assertDefaultValues(Map<String,Object> properties) 
+	{
+		// scalar properties
+		assertEquals("prop.string.value", properties.get("prop.string"));
+		assertEquals(1351589588L,         properties.get("prop.long"));		
+		assertEquals(13515895.9999988,    properties.get("prop.double"));
+		assertEquals(3.14F,               properties.get("prop.float"));
+		assertEquals(314,                 properties.get("prop.integer"));
+		assertEquals('c',                 properties.get("prop.character"));
+		assertEquals(true,                properties.get("prop.boolean"));
+		
+		short s = (short) 255;
+		assertEquals(s,                   properties.get("prop.short"));
+
+		byte b = (byte) 7;
+		assertEquals(b,                   properties.get("prop.byte"));
+	
+		
+		// array properties
+		String[] stringValues = new String[] { "value1", "value2", "value3" };
+		assertTrue(Arrays.equals(stringValues, (String[]) properties.get("prop.string.array")));
+		
+		Long[] longValues = new Long[] { 1351589588L, 1351589589L, 1351589590L };
+		assertTrue(Arrays.equals(longValues, (Long[]) properties.get("prop.long.array")));		
+
+		Double[] doubleValues = new Double[] { 13515895.88, 13515895.89, 13515895.90 };
+		assertTrue(Arrays.equals(doubleValues, (Double[]) properties.get("prop.double.array")));
+		
+		Float[] floatValues = new Float[] { 3.14F, 3.15F, 3.16F };
+		assertTrue(Arrays.equals(floatValues, (Float[]) properties.get("prop.float.array")));
+		
+		Integer[] intValues = new Integer[] { 314, 315, 316 };
+		assertTrue(Arrays.equals(intValues, (Integer[]) properties.get("prop.integer.array")));
+		
+		Character[] charValues = new Character[] { 'c', 'd', 'e' };
+		assertTrue(Arrays.equals(charValues, (Character[]) properties.get("prop.character.array")));
+		
+		Boolean[] boolValues = new Boolean[] { true, false, true }; 
+		assertTrue(Arrays.equals(boolValues, (Boolean[]) properties.get("prop.boolean.array")));
+		
+		Short[] shortValues = new Short[] { (short) 253, (short) 254, (short) 255}; 
+		assertTrue(Arrays.equals(shortValues, (Short[]) properties.get("prop.short.array")));
+
+		Byte[] byteValues = new Byte[] { (byte) 7, (byte) 8, (byte) 9 }; 
+		assertTrue(Arrays.equals(byteValues, (Byte[]) properties.get("prop.byte.array")));
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/DataServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/DataServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a89f73bf16cf2f40c7fead0fe90edb589dfb1aa0
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/DataServiceTest.java
@@ -0,0 +1,376 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import static org.junit.Assert.*;
+
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.data.DataServiceListener;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class DataServiceTest implements DataServiceListener {
+	
+	private static CountDownLatch s_dependencyLatch = new CountDownLatch(1);	// initialize with number of dependencies
+	private static DataService s_dataService;
+	
+	private static Set<Integer> s_qos0MsgIds = new HashSet<Integer>();
+	private static Set<Integer> s_qos12MsgIds = new HashSet<Integer>();
+	private static Set<Integer> s_qos12HighPriorityMsgIds = new HashSet<Integer>();
+	
+	private static Lock s_lock = new ReentrantLock();
+	private static Condition s_connected = s_lock.newCondition();
+	private static Condition s_disconnecting = s_lock.newCondition();
+	private static Condition s_disconnected = s_lock.newCondition();
+	private static Condition s_arrived = s_lock.newCondition();
+
+	static final int MAX_MSGS = 100;
+	static final int ALL_PUBLISHED_TIMEOUT = 30;
+	static final int ALL_CONFIRMED_QOS1_TIMEOUT = 60;
+	static final int ALL_CONFIRMED_QOS2_TIMEOUT = 120;
+	static final int DFLT_MSG_PRIORITY = 5;
+	static final int HIGH_MSG_PRIORITY = 0;
+	static final String MSG_SEMATIC_TOPIC1 = "data/service/test/"+new Random();
+	static final String MSG_SEMATIC_TOPIC2 = "data/service/test/"+new Random();
+	static final String MSG_TOPIC1 = "#account-name/#client-id/"+MSG_SEMATIC_TOPIC1;
+	static final String MSG_TOPIC2 = "#account-name/#client-id/"+MSG_SEMATIC_TOPIC2;
+	static final String MSG_PAYLOAD = "Lorem ipsum dolor sit amet";
+	
+	// JUnit 3 and is called before every test
+//	public void setUp() {
+//		System.err.println("JUnit 3 setUp");
+//		// Wait for OSGi dependencies
+//		try {
+//			s_dependencyLatch.await(5, TimeUnit.SECONDS);
+//		} catch (InterruptedException e) {
+//			fail("OSGi dependencies unfulfilled");
+//		}
+//	}
+	
+	// JUnit 4 and is called before every test
+//	@Before
+//	public void setUpBefore() {
+//		System.err.println("@Before (JUnit4) setUpBefore");
+//		// Wait for OSGi dependencies
+//		try {
+//			s_dependencyLatch.await(5, TimeUnit.SECONDS);
+//		} catch (InterruptedException e) {
+//			fail("OSGi dependencies unfulfilled");
+//		}
+//	}
+	
+	// JUnit 4 and is called once
+	@BeforeClass
+	public static void setUpBeforeClass() {
+		// Wait for OSGi dependencies
+		try {
+			s_dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+		
+	public void setDataService(DataService dataService) {
+		s_dataService = dataService;
+		s_dependencyLatch.countDown();
+	}
+	
+	public void unsetDataService(DataService dataService) {
+		s_dataService = null;
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testConnect() throws KuraConnectException {
+		if (!s_dataService.isConnected()) {
+			s_dataService.connect();
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testDisconnect() throws KuraConnectException, InterruptedException {
+		if (!s_dataService.isConnected()) {
+			s_dataService.connect();
+		}
+		
+		s_dataService.disconnect(0);
+		assertFalse(s_dataService.isConnected());
+		
+		// TODO: if auto-connect is enabled check it does not
+		// automatically reconnects.
+		
+		// test onConnectionEstablished
+		s_lock.lock();
+		try {
+			s_dataService.connect();
+			s_connected.await(30, TimeUnit.SECONDS);
+		} catch (KuraConnectException e) {
+			throw e;
+		} catch (InterruptedException e) {
+			throw e;
+		} finally {
+			s_lock.unlock();
+		}
+		
+		// test onDisconnecting/onDisconnected
+		s_lock.lock();
+		s_dataService.disconnect(0);
+		s_disconnecting.await(1, TimeUnit.SECONDS);
+		s_disconnected.await(1, TimeUnit.SECONDS);
+		s_lock.unlock();
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testPublish() throws KuraConnectException, InterruptedException {
+		if (!s_dataService.isConnected()) {
+			s_dataService.connect();
+		}
+		
+		
+		// publish at QoS = 0
+		synchronized (s_qos0MsgIds) {
+			s_qos0MsgIds.clear();
+		}
+		
+		for (int i = 0; i < MAX_MSGS; i++) {
+			try {
+				synchronized (s_qos0MsgIds) {
+					Integer id = s_dataService.publish(MSG_TOPIC1, MSG_PAYLOAD.getBytes(), 0, false, DFLT_MSG_PRIORITY);
+					s_qos0MsgIds.add(id);
+				}
+			} catch (KuraStoreException e) {
+				break;
+			}
+		}
+		
+		boolean allPublished = false;
+		for (int i = 0; i < ALL_PUBLISHED_TIMEOUT; i++) {
+			synchronized (s_qos0MsgIds) {
+				if (s_qos0MsgIds.isEmpty()) {
+					allPublished = true;
+					break;
+				}
+			}
+			Thread.sleep(1000);
+		}
+		
+		assertTrue(allPublished);
+		
+
+		// publish at QoS = 1
+		synchronized (s_qos12MsgIds) {
+			s_qos12MsgIds.clear();
+		}
+		
+		for (int i = 0; i < MAX_MSGS; i++) {
+			try {
+				synchronized (s_qos12MsgIds) {
+					Integer id = s_dataService.publish(MSG_TOPIC1, MSG_PAYLOAD.getBytes(), 1, false, DFLT_MSG_PRIORITY);
+					s_qos12MsgIds.add(id);
+				}
+			} catch (KuraStoreException e) {
+				break;
+			}
+		}
+		
+		boolean allConfirmed = false;
+		for (int i = 0; i < ALL_CONFIRMED_QOS1_TIMEOUT; i++) {
+			synchronized (s_qos12MsgIds) {
+				if (s_qos12MsgIds.isEmpty()) {
+					allConfirmed = true;
+					break;
+				}
+			}
+			Thread.sleep(1000);
+		}
+		
+		assertTrue(allConfirmed);
+
+		
+		// publish at QoS = 2
+		synchronized (s_qos12MsgIds) {
+			s_qos12MsgIds.clear();
+		}
+		
+		for (int i = 0; i < MAX_MSGS; i++) {
+			try {
+				synchronized (s_qos12MsgIds) {
+					Integer id = s_dataService.publish(MSG_TOPIC1, MSG_PAYLOAD.getBytes(), 2, false, DFLT_MSG_PRIORITY);
+					s_qos12MsgIds.add(id);
+				}
+			} catch (KuraStoreException e) {
+				break;
+			}
+		}
+		
+		allConfirmed = false;
+		for (int i = 0; i < ALL_CONFIRMED_QOS2_TIMEOUT; i++) {
+			synchronized (s_qos12MsgIds) {
+				if (s_qos12MsgIds.isEmpty()) {
+					allConfirmed = true;
+					break;
+				}
+			}
+			Thread.sleep(1000);
+		}
+		
+		assertTrue(allConfirmed);
+		
+		//
+		// publish at two different priorities at QoS = 1
+		
+		// First publish half of the messages at default priority
+		synchronized (s_qos12MsgIds) {
+			s_qos12MsgIds.clear();
+		}
+		
+		for (int i = 0; i < MAX_MSGS/2; i++) {
+			try {
+				synchronized (s_qos12MsgIds) {
+					Integer id = s_dataService.publish(MSG_TOPIC1, MSG_PAYLOAD.getBytes(), 1, false, DFLT_MSG_PRIORITY);
+					s_qos12MsgIds.add(id);
+				}
+			} catch (KuraStoreException e) {
+				break;
+			}
+		}
+
+		//... then publish half of the messages at higher priority
+		synchronized (s_qos12HighPriorityMsgIds) {
+			s_qos12HighPriorityMsgIds.clear();
+		}		
+
+		for (int i = 0; i < MAX_MSGS/2; i++) {
+			try {
+				synchronized (s_qos12HighPriorityMsgIds) {
+					Integer id = s_dataService.publish(MSG_TOPIC1, MSG_PAYLOAD.getBytes(), 1, false, HIGH_MSG_PRIORITY);
+					s_qos12HighPriorityMsgIds.add(id);
+				}
+			} catch (KuraStoreException e) {
+				break;
+			}
+		}
+
+		// messages published at higher priority are expected to be
+		// confirmed before messages published at default priority
+		allConfirmed = false;
+		for (int i = 0; i < ALL_CONFIRMED_QOS1_TIMEOUT; i++) {
+			synchronized (s_qos12MsgIds) {
+				synchronized (s_qos12HighPriorityMsgIds) {
+					if (s_qos12HighPriorityMsgIds.isEmpty()) {
+						if(s_qos12MsgIds.isEmpty()) {
+							fail("High priority messages should be confirmed before default priority messages");
+						} else {
+							allConfirmed = true;
+							break;
+						}
+					}
+				}
+			}
+			Thread.sleep(1000);
+		}
+		
+		assertTrue(allConfirmed);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testSubscribe() throws KuraException, InterruptedException {
+		if (!s_dataService.isConnected()) {
+			s_dataService.connect();
+		}
+		
+		s_lock.lock();
+		try {
+			s_dataService.subscribe(MSG_TOPIC2, 0);
+			s_dataService.publish(MSG_TOPIC2, MSG_PAYLOAD.getBytes(), 0, false, HIGH_MSG_PRIORITY);
+			boolean arrived = s_arrived.await(5, TimeUnit.SECONDS);
+			assertTrue(arrived);
+		} catch (KuraException e) {
+			throw e;
+		} catch (InterruptedException e) {
+			throw e;
+		} finally {
+			s_lock.unlock();
+		}
+	}
+	
+	@Override
+	public void onConnectionEstablished() {
+		s_lock.lock();
+		s_connected.signal();
+		s_lock.unlock();
+	}
+
+	@Override
+	public void onDisconnecting() {
+		s_lock.lock();
+		s_disconnecting.signal();
+		s_lock.unlock();
+	}
+
+	@Override
+	public void onDisconnected() {
+		s_lock.lock();
+		s_disconnected.signal();
+		s_lock.unlock();
+	}
+
+	@Override
+	public void onConnectionLost(Throwable cause) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos,
+			boolean retained) {
+		s_lock.lock();
+		if (topic.endsWith(MSG_SEMATIC_TOPIC2)) {
+			s_arrived.signal();
+		}
+		s_lock.unlock();
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		synchronized (s_qos0MsgIds) {
+			s_qos0MsgIds.remove(messageId);
+		}
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		synchronized (s_qos12MsgIds) {
+			s_qos12MsgIds.remove(messageId);
+		}
+		synchronized (s_qos12HighPriorityMsgIds) {
+			s_qos12HighPriorityMsgIds.remove(messageId);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ExampleTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ExampleTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..37961dc4071d7cbd36672368002089f637c969cd
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/ExampleTest.java
@@ -0,0 +1,205 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.data.DataServiceListener;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.service.component.ComponentContext;
+
+public class ExampleTest implements DataServiceListener {
+	
+	// If you wonder why we need to use static members is our test cases, keep reading.
+	// Two instances of the ExampleTest gets created during the test run:
+	// * by the OSGi framework (this is a declarative service component)
+	// * by the JUnit framework. This instance needs to access the OSGi service we want to test (the dependency).
+	//   The service being tested is provided by the OSGi framework through the setXxxService bind method.
+	//   Thus the service need to be shared across the two ExampleTest instances
+	//   through a static class member.
+	//
+	// The CountDownLatch instance need to be shared too because it's checked by the 
+	// ExampleTest instance created by JUnit but decremented by the instance
+	// created by OSGi.
+	// 
+	// In the example below the service under test (the dependency) is the DataService.
+	// The DataService notifies some events to interested client components, the ExampleTest
+	// class in this example, through the DataServiceListener interface.
+	// The ExampleTest does not register itself as a listener explicitly calling a register method of the
+	// DataService. Instead, it registers the DataServiceListener as a provided service in its component definition. 
+	// The DataService will dynamically discover from the OSGi service registry the registered DataServiceListeners. 
+	//
+	// The important thing to note here is that, while the ExampleTest instance created by OSGi is registered
+	// to the OSGi framework as a DataServiceListener, the one created by JUnit is not.
+	// When JUnit runs a test, it uses the DataService through its instance of ExampleTest.
+	// Since this instance is not registered in the OSGi framework, the DataService will not find it and
+	// will not call it.
+	// This is a problem if a JUnit test needs to synchronize with a callback because the synchronization
+	// cannot happen through instance members (e.g. a Lock).
+	// The easiest think is to share everything is needed through static members.
+	// 
+	private static DataService s_dataService;
+	private static CountDownLatch s_dependencyLatch = new CountDownLatch(1);	// initialize with number of dependencies
+	
+	private static Lock s_lock = new ReentrantLock();
+	private static Condition s_condition = s_lock.newCondition();
+	private static Set<Integer> s_messageIds = new HashSet<Integer>();
+	
+	public ExampleTest() {
+		super();
+		System.err.println("New instance created");
+	}
+	
+	//
+	// OSGi activation methods. These methods are called only once.
+	// There is only a single instance of this class created by the OSGi framework. 
+	protected void activate(ComponentContext componentContext,
+			Map<String, Object> properties) {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": activated");
+	}
+	
+	public void updated(Map<String, Object> properties) {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": updated");
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": deactivated");
+	}
+	
+	public void setDataService(DataService dataService) {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": setXxxService");
+		s_dataService = dataService;
+		s_dependencyLatch.countDown();
+	}
+	
+	public void unsetDataService(DataService dataService) {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": unsetDataService");
+		s_dataService = null;
+	}
+	
+	//
+	// JUnit 4 stuff
+	@BeforeClass
+	public static void setUpOnce() {
+		System.err.println("Setup test preconditions. This static method is called once");
+		// Wait for OSGi dependencies
+		try {
+			s_dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+	
+	@Before
+	public void setUp() throws KuraConnectException {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": setup test preconditions. This is method is called before every @Test method like the JUnit 3 setUp method");
+		if (!s_dataService.isConnected()) {
+			s_dataService.connect();
+		}
+	}
+	
+	@Test
+	public void Test() throws InterruptedException, KuraStoreException {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": test");
+		
+		s_lock.lock();
+		try {
+			Integer messageId = s_dataService.publish("#account-name/#client-id/a/b/c", "Hello!".getBytes(), 1, false, 5);
+			s_messageIds.add(messageId);
+			boolean confirmed = s_condition.await(5, TimeUnit.SECONDS);
+			assertTrue(confirmed);
+		} catch (KuraStoreException e) {
+			throw e;
+		} catch (InterruptedException e) {
+			throw e;
+		} finally {
+			s_lock.unlock();
+		}
+	}
+	
+	@After
+	public void tearDown() {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": release resources that might have been allocated by the @Before method. This is method is called after every @Test method like the JUnit 3 tearDown method");
+	}
+	
+	@AfterClass
+	public static void tearDownOnce() {
+		System.err.println("Release resources that might have been allocated by the @BeforeClass method. This static method is called once");
+	}
+
+	//
+	// DataServiceListener
+	@Override
+	public void onConnectionEstablished() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onDisconnecting() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onDisconnected() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onConnectionLost(Throwable cause) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos,
+			boolean retained) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		System.err.println("ExampleTest instance :" + System.identityHashCode(this) + ": onMessageConfirmed");
+		s_lock.lock();
+		s_messageIds.remove(messageId);
+		if (s_messageIds.isEmpty()) {
+			s_condition.signal();
+		}
+		s_lock.unlock();
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/IConfigurationServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/IConfigurationServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..43efd724da18249137cce9e0342851bed5a0e732
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/IConfigurationServiceTest.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+public interface IConfigurationServiceTest {
+
+	//DO NOT REMOVE - used by the ConfigurationServiceTest
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/NetUtilTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/NetUtilTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a89bc9f7f6aae9e985ea632879c6f9774a655a9
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/NetUtilTest.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.Test;
+
+import junit.framework.TestCase;
+
+public class NetUtilTest extends TestCase 
+{
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetPrimaryMacAddress()
+	{
+		assertNotNull(NetUtil.getPrimaryMacAddress());
+		assertFalse("UNKNOWN".equals(NetUtil.getPrimaryMacAddress()));
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/NetworkServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/NetworkServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f92561c12890edef1410187da3e2a613be249a6
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/NetworkServiceTest.java
@@ -0,0 +1,147 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class NetworkServiceTest extends TestCase
+{
+	private static CountDownLatch dependencyLatch = new CountDownLatch(1);	// initialize with number of dependencies
+	private static final String MAC_DELIM = ":";
+
+	private static NetworkService       networkService;
+	
+	@BeforeClass
+	public void setUp() {
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+	
+	public void setNetworkService(NetworkService networkService) {
+		NetworkServiceTest.networkService = networkService;
+		dependencyLatch.countDown();
+	}
+
+	@Test
+	public void testDummy() {
+		assertTrue(true);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(NetworkServiceTest.networkService);
+	}
+
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testInterfaceNamesList() 
+		throws Exception
+	{
+		List<String> interfaces = networkService.getAllNetworkInterfaceNames();
+		System.out.println("network interface names: "+interfaces);
+		assertNotNull(interfaces);
+		assertTrue(interfaces.size() > 0);
+		for(String interfaceName : interfaces) {
+			assertFalse(interfaceName.isEmpty());
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testAllInterfaces() 
+		throws Exception
+	{
+		List<NetInterface<? extends NetInterfaceAddress>> interfaces = networkService.getNetworkInterfaces();
+		assertNotNull(interfaces);
+		System.out.println("number of interfaces: " + interfaces.size());
+		assertTrue(interfaces.size() > 0);
+		
+		for (NetInterface<? extends NetInterfaceAddress> ni : interfaces) {
+			System.out.println("network interface name: "+ni.getName());
+			System.out.println("network interface type: "+ni.getType());
+			System.out.println("network interface mac: "+getMacFromHwAddress(ni.getHardwareAddress()));
+			System.out.println("network interface state: "+ni.getState());
+
+			assertNotNull(ni.getName());
+			assertFalse(ni.getName().isEmpty());
+			assertNotNull(ni.getType());
+			assertNotNull(ni.getState());			
+			assertNotNull(ni.getNetInterfaceAddresses());
+			
+			for (NetInterfaceAddress ia : ni.getNetInterfaceAddresses()) {
+				if (ia.getAddress() != null) {
+					System.out.println("   network interface address: "+ia.getAddress().getHostAddress());
+				}
+			}
+		}		
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testActiveInterfaces() 
+		throws Exception
+	{
+		List<NetInterface<? extends NetInterfaceAddress>> interfaces = networkService.getActiveNetworkInterfaces();
+		assertNotNull(interfaces);
+		System.out.println("number of active interfaces: " + interfaces.size());
+		assertTrue(interfaces.size() > 0);
+
+		for (NetInterface<? extends NetInterfaceAddress> ni : interfaces) {
+			System.out.println("network interface name: "+ni.getName());
+			System.out.println("network interface type: "+ni.getType());
+			System.out.println("network interface mac: "+getMacFromHwAddress(ni.getHardwareAddress()));
+			System.out.println("network interface state: "+ni.getState());
+
+			assertNotNull(ni.getName());
+			assertFalse(ni.getName().isEmpty());
+			assertNotNull(ni.getType());
+			assertNotNull(ni.getState());			
+			assertNotNull(ni.getNetInterfaceAddresses());
+			
+			for (NetInterfaceAddress ia : ni.getNetInterfaceAddresses()) {
+				if (ia.getAddress() != null) {
+					System.out.println("   network interface address: "+ia.getAddress().getHostAddress());
+				}
+			}
+		}	
+	}
+	
+	private String getMacFromHwAddress(byte[] hwAddr) {
+		StringBuilder sb = new StringBuilder();
+		if(hwAddr != null) {
+	        for (int i = 0; i < hwAddr.length; i++) {
+	        	if(i > 0) {
+	        		sb.append(MAC_DELIM);
+	        	}
+	            sb.append(String.format("%1X", hwAddr[i]));
+	        }
+		}
+        return sb.toString();
+	}	
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/SystemAdminServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/SystemAdminServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e40a3c1c6fae40800df727c3984d3b5265a0840
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/SystemAdminServiceTest.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.system.SystemAdminService;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class SystemAdminServiceTest extends TestCase {
+
+	private static SystemAdminService sysAdminService = null;
+	
+	@BeforeClass
+	public void setUp() {
+	}	
+	
+	public static void setSystemAdminService(SystemAdminService sas) {
+		sysAdminService = sas;
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(sysAdminService);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+  	public void testGetUptime() {
+		String actual = sysAdminService.getUptime();
+		assertTrue(Long.parseLong(actual) > 0);
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/SystemServiceTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/SystemServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..12e86d4b5d4f74e215156b9f5e5a01b4e9fbb42b
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/SystemServiceTest.java
@@ -0,0 +1,269 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class SystemServiceTest extends TestCase {
+
+	private static SystemService systemService = null;
+	private static CountDownLatch dependencyLatch = new CountDownLatch(1);	// initialize with number of dependencies
+	private static boolean onCloudbees = false;
+	
+	@BeforeClass
+	public void setUp() {
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(10, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}	
+	
+	public static void setSystemService(SystemService sms) {
+		systemService = sms;
+		onCloudbees = systemService.getOsName().contains("Cloudbees");		
+		dependencyLatch.countDown();
+	}
+	
+	@Test
+	public void testDummy() {
+		assertTrue(true);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(systemService);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetPrimaryMacAddress() {
+		
+		String actual = systemService.getPrimaryMacAddress();
+		System.out.println("MAC: " + actual);
+
+		Pattern regex = Pattern.compile("[0-9a-fA-F:]{12}");
+		Matcher match = regex.matcher(actual);
+		
+		assertEquals("getPrimaryMacAddress() length", 17, actual.length());
+		assertTrue("getPrimaryMacAddress() is string with colons", match.find());
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetPlatform() {
+		String[] expected = { "dynacor", 					//emulated
+				"Ubuntu", 									//Ubuntu
+				"BeagleBone"								//BeagleBone
+				};
+		
+		try {
+			boolean foundMatch = false;
+			for(String possibility : expected) {
+				if(systemService.getPlatform().equals(possibility)) {
+					foundMatch = true;
+					break;
+				}
+			}
+			assertTrue(foundMatch);
+		} catch (Exception e) {
+			fail("getPlatform() failed: " + e.getMessage());
+		}	
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetOsDistro() {
+		String[] expected = { "DevOsDitribution", 			//emulated
+				"Linux" 									//Ubuntu
+				};
+		
+		try {
+			boolean foundMatch = false;
+			for(String possibility : expected) {
+				if(systemService.getOsDistro().equals(possibility)) {
+					foundMatch = true;
+					break;
+				}
+			}
+			assertTrue(foundMatch);
+		} catch (Exception e) {
+			fail("getOsDistro() failed: " + e.getMessage());
+		}	
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetOsDistroVersion() {
+		String[] expected = { "DevOsDitributionVersion", 	//emulated
+				"N/A" 										//Ubuntu
+				};
+		
+		try {
+			boolean foundMatch = false;
+			for(String possibility : expected) {
+				if(systemService.getOsDistroVersion().equals(possibility)) {
+					foundMatch = true;
+					break;
+				}
+			}
+			assertTrue(foundMatch);
+		} catch (Exception e) {
+			fail("getOsDistroVersion() failed: " + e.getMessage());
+		}		
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetOsArch() {
+		String expected = System.getProperty("os.arch");		
+		String actual = systemService.getOsArch();
+		
+		assertNotNull("getOsArch() not null", actual);
+		assertEquals("getOsArch() value", expected, actual);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetOsName() {
+		String expected = System.getProperty("os.name");
+		if(onCloudbees) expected = "Linux (Cloudbees)";
+		
+		String actual = systemService.getOsName();
+		
+		assertNotNull("getOsName() not null", actual);
+		assertEquals("getOsName() value", expected, actual);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetOsVersion() {
+		String expected = System.getProperty("os.version");		
+		String actual = systemService.getOsVersion();
+		
+		assertNotNull("getOsVersion() not null", actual);
+		assertEquals("getOsVersion() value", expected, actual);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetJavaVersion() {
+		String expected = System.getProperty("java.runtime.version");
+		String actual = systemService.getJavaVersion();
+
+		assertNotNull("getJavaVersion() not null", actual);
+		assertEquals("getJavaVersion() value", expected, actual);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetJavaVmName() {
+		String expected = System.getProperty("java.vm.name");
+		String actual = systemService.getJavaVmName();
+
+		assertNotNull("getJavaVmName() not null", actual);
+		assertEquals("getJavaVmName() value", expected, actual);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetJavaVmVersion() {
+		String expected = System.getProperty("java.vm.version");
+		String actual = systemService.getJavaVmVersion();
+
+		assertNotNull("getJavaVmVersion() not null", actual);
+		assertEquals("getJavaVmVersion() value", expected, actual);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetFileSeparator() {
+		String expected = System.getProperty("file.separator");
+		String actual = systemService.getFileSeparator();
+
+		assertNotNull("getFileSeparator() not null", actual);
+		assertEquals("getFileSeparator() value", expected, actual);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testJavaHome() {
+		String actual = systemService.getJavaHome();
+		assertNotNull("getJavaHome() not null", actual);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetProductVersion() {
+		assertTrue(true);
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testKuraTemporaryConfigDirectory() {
+		assertNotNull(systemService.getKuraTemporaryConfigDirectory());
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testGetBiosVersion() {
+		assertNotNull(systemService.getBiosVersion());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void getDeviceName() {
+		assertNotNull(systemService.getDeviceName());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void getFirmwareVersion() {
+		assertNotNull(systemService.getFirmwareVersion());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void getModelId() {
+		assertNotNull(systemService.getModelId());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void getModelName() {
+		assertNotNull(systemService.getModelName());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void getPartNumber() {
+		assertNotNull(systemService.getPartNumber());
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void getSerialNumber() {
+		assertNotNull(systemService.getSerialNumber());
+	}
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/hw/CommTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/hw/CommTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ca26faa099bf54317a1e8b0ab75a3737d6ded21
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/hw/CommTest.java
@@ -0,0 +1,245 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test.hw;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.service.io.ConnectionFactory;
+
+public class CommTest extends TestCase {
+	
+	private static CountDownLatch dependencyLatch = new CountDownLatch(1);	// initialize with number of dependencies
+	private static ConnectionFactory connectionFactory;
+	//private static String SERIAL_PORT_NAME ="/dev/tty.PL2303-00001004";
+	private static String SERIAL_PORT_NAME ="/dev/ttyUSB0";
+	
+	@BeforeClass
+	public void setUp() {
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+	}
+	
+	public void setConnectionFactory(ConnectionFactory connectionFactory) {
+		CommTest.connectionFactory = connectionFactory;
+		dependencyLatch.countDown();
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(CommTest.connectionFactory);
+	}
+	
+	//Dont run these hardware tests in CloudBees!!!
+	/*@Test
+	public void testCommConnection()
+		throws Exception
+	{		
+		String uri = new CommURI.Builder(SERIAL_PORT_NAME)
+									.withBaudRate(19200)
+									.withDataBits(8)
+									.withStopBits(1)
+									.withParity(0)
+									.withTimeout(2000)
+									.build().toString();
+		
+		CommConnection conn = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+		assertNotNull(conn);
+		
+		OutputStream os = conn.openOutputStream();
+		os.write(10);
+		os.write("hello".getBytes(), 0, "hello".getBytes().length);
+		os.flush();
+		
+		os.close();
+		os = null;
+		conn.close();
+		conn = null;
+	}
+	
+	@Test
+	public void testOpenSerialPort() {
+		try {
+			String uri = new CommURI.Builder(SERIAL_PORT_NAME)
+										.withBaudRate(19200)
+										.withDataBits(8)
+										.withStopBits(1)
+										.withParity(0)
+										.withTimeout(2000)
+										.build().toString();
+			CommConnection conn = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+			assertNotNull(conn);
+
+			InputStream is = conn.openInputStream();
+			OutputStream os = conn.openOutputStream();
+			
+			assertNotNull(is);
+			assertNotNull(os);
+			
+			is.close();
+			os.close();
+			is = null;
+			os = null;
+			conn.close();
+			conn = null;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	@Test
+	public void testWriteToPort() {
+		try {
+			String uri = new CommURI.Builder(SERIAL_PORT_NAME)
+										.withBaudRate(19200)
+										.withDataBits(8)
+										.withStopBits(1)
+										.withParity(0)
+										.withTimeout(2000)
+										.build().toString();
+			CommConnection conn = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+			assertNotNull(conn);
+
+			OutputStream os = conn.openOutputStream();
+			
+			assertNotNull(os);
+			
+			os.write("this is a set of test data coming from a junit test in Kura\r\n".getBytes());
+			os.flush();
+			
+			os.close();
+			os = null;
+			conn.close();
+			conn = null;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}*/
+	
+	
+	//  CAN'T READ IN AUTOMATED TEST
+	/*@Test
+	public void testReadFromPort() {
+		try {
+			String uri = new CommURI.Builder(SERIAL_PORT_NAME)
+										.withBaudRate(19200)
+										.withDataBits(8)
+										.withStopBits(1)
+										.withParity(0)
+										.withTimeout(2000)
+										.build().toString();
+			CommConnection conn = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+			assertNotNull(conn);
+			
+			InputStream is = conn.openInputStream();
+			
+			assertNotNull(is);
+			
+			System.out.println("waiting for serial port input - make sure to end this with a <ENTER>...");			
+			StringBuffer sb = new StringBuffer();
+			int c;
+			while((c = is.read()) != 0xd) {
+				System.out.println("read byte: 0x" + Integer.toHexString(c) + " -> " + (char)c);
+				sb.append((char)c);
+			}
+			
+			System.out.println("Read from serial port: " + sb.toString());
+			
+			is.close();
+			is = null;
+			conn.close();
+			conn = null;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}*/
+	
+	/*
+	@Test
+	public void testTwoPorts() {
+		try {
+			String uri = new CommURI.Builder(SERIAL_PORT_NAME)
+										.withBaudRate(19200)
+										.withDataBits(8)
+										.withStopBits(1)
+										.withParity(0)
+										.withTimeout(2000)
+										.build().toString();
+			CommConnection connOne = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+			assertNotNull(connOne);
+			uri = new CommURI.Builder(SERIAL_PORT_NAME)
+										.withBaudRate(19200)
+										.withDataBits(8)
+										.withStopBits(1)
+										.withParity(0)
+										.withTimeout(2000)
+										.build().toString();
+			CommConnection connTwo = (CommConnection) CommTest.connectionFactory.createConnection(uri, 1, false);
+			assertNotNull(connTwo);
+			
+			InputStream isOne = connOne.openInputStream();
+			OutputStream osOne = connOne.openOutputStream();
+			InputStream isTwo = connTwo.openInputStream();
+			OutputStream osTwo = connTwo.openOutputStream();
+			
+			assertNotNull(isOne);
+			assertNotNull(osOne);
+			assertNotNull(isTwo);
+			assertNotNull(osTwo);
+			
+			//write from one to two
+			byte[] array = "this is a message from one to two\n".getBytes();
+			osOne.write(array);
+			StringBuffer sb = new StringBuffer();
+			int c;
+			while((c = isTwo.read()) != 0xa) {
+				System.out.println("port 2: read byte: 0x" + Integer.toHexString(c) + " -> " + (char)c);
+				sb.append((char)c);
+			}
+			System.out.println("Port 2: Read from serial port two: " + sb.toString());
+			
+			array = "this is a message from two to one\n".getBytes();
+			osTwo.write(array);
+			sb = new StringBuffer();
+			while((c = isOne.read()) != 0xa) {
+				System.out.println("port 1: read byte: 0x" + Integer.toHexString(c) + " -> " + (char)c);
+				sb.append((char)c);
+			}
+			System.out.println("Port 1: Read from serial port: " + sb.toString());
+			
+			isOne.close();
+			osOne.close();
+			isOne = null;
+			osOne = null;
+			isTwo.close();
+			osTwo.close();
+			isTwo = null;
+			osTwo = null;
+			connOne.close();
+			connOne = null;
+			connTwo.close();
+			connTwo = null;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}*/
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/hw/RxTxTest.java b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/hw/RxTxTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..107db96aeea1df88f467dae4777e79f2e4287785
--- /dev/null
+++ b/kura/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/hw/RxTxTest.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.test.hw;
+
+
+public class RxTxTest {
+
+	/**
+	 * For this to work on a MAC you must have enabled serial support:
+	 * Install this driver if using a PL2303 USB to Serial device: http://sourceforge.net/projects/osx-pl2303/
+	 * Run these commands to enable locking for RXTX:
+	 * 		sudo mkdir /var/lock
+	 * 		sudo chmod 777 /var/lock
+	 * Find your device node with 'ls -l /dev/*PL*' and replace it as needed below in the com port identifier call
+	 * This is commented out because it will not work on cloudbees (or anything without a physical comm port)
+	 */
+	/*@Test
+	public void serialTest() {
+		
+		try {
+			Enumeration ports = CommPortIdentifier.getPortIdentifiers();
+			while (ports.hasMoreElements()) {
+				CommPortIdentifier port = (CommPortIdentifier)ports.nextElement();
+				String type;
+				switch (port.getPortType()) {
+				case CommPortIdentifier.PORT_PARALLEL:
+					type = "Parallel"; 
+					break;
+				case CommPortIdentifier.PORT_SERIAL:
+					type = "Serial"; 
+					break;
+				default: /// Shouldn't happen
+					type = "Unknown"; 
+					break;
+				}
+				System.out.println(port.getName() + ": " + type);
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		
+		CommPortIdentifier portIdentifier = null;
+		InputStream in = null;
+		OutputStream out = null;
+		
+		try {
+			portIdentifier = CommPortIdentifier.getPortIdentifier("/dev/ttyUSB0");
+		} catch (NoSuchPortException e) {
+			e.printStackTrace();
+		}
+		if ( portIdentifier.isCurrentlyOwned() ) {
+			System.out.println("Error: Port is currently in use");
+		}
+		else {
+			CommPort commPort = null;
+			try {
+				commPort = portIdentifier.open(this.getClass().getName(),2000);
+			} catch (PortInUseException e) {
+				e.printStackTrace();
+			}
+
+			if ( commPort instanceof SerialPort ) {
+				SerialPort serialPort = (SerialPort) commPort;
+				try {
+					serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
+				} catch (UnsupportedCommOperationException e) {
+					e.printStackTrace();
+				}
+
+				try {
+					in = serialPort.getInputStream();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+				try {
+					out = serialPort.getOutputStream();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+				
+				Assert.assertNotNull(in);
+				Assert.assertNotNull(out);
+				
+				try {
+					in.close();
+					out.close();
+					in = null;
+					out = null;
+					serialPort.close();
+					serialPort = null;
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			else {
+				System.out.println("Error: Only serial ports are handled by this example.");
+			}
+		}
+	}*/
+}
diff --git a/kura/org.eclipse.kura.core.test/src/main/resources/org.eclipse.kura.test.helloworld.dp b/kura/org.eclipse.kura.core.test/src/main/resources/org.eclipse.kura.test.helloworld.dp
new file mode 100644
index 0000000000000000000000000000000000000000..bfd8e2e8a4b0da484b4dbff0444889f5d45f4770
Binary files /dev/null and b/kura/org.eclipse.kura.core.test/src/main/resources/org.eclipse.kura.test.helloworld.dp differ
diff --git a/kura/org.eclipse.kura.core/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..da8892678ae3a28cbaa2e0892936b4a119093b20
--- /dev/null
+++ b/kura/org.eclipse.kura.core/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.core
+Bundle-SymbolicName: org.eclipse.kura.core;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.kura.core.linux.util; version="0.2.0",org.
+ eclipse.kura.core.util; version="0.2.0"
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.crypto,
+ javax.net,
+ javax.net.ssl,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.data; version="[0.2,0.3)",
+ org.eclipse.kura.db; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,1.0)",
+ org.eclipse.kura.ssl; version="[0.2,0.3)",
+ org.eclipse.kura.system; version="[0.2,0.3)",
+ org.eclipse.paho.client.mqttv3; version="[0.4,0.4]",
+ org.eclipse.paho.client.mqttv3.persist; version="[0.4,0.4]",
+ org.hsqldb,
+ org.hsqldb.jdbc,
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.util.tracker;version="[1.5.0,2.0.0)",
+ org.slf4j;version="1.6.4"
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/data.xml b/kura/org.eclipse.kura.core/OSGI-INF/data.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bc374a33bd77bfe11e972c9ddebc26e4a76926f6
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/data.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+    name="org.eclipse.kura.data.DataService"
+    activate="activate" 
+    deactivate="deactivate" 
+    modified="updated" 
+    enabled="true" 
+    immediate="true"
+    configuration-policy="require">
+   <implementation class="org.eclipse.kura.core.data.DataServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.configuration.ConfigurableComponent"/>
+      <provide interface="org.eclipse.kura.data.DataTransportListener"/>
+      <provide interface="org.eclipse.kura.data.DataService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.data.DataService"/>
+   <reference name="DbService" 
+              bind="setDbService" 
+              unbind="unsetDbService"
+              cardinality="1..1" 
+              policy="static" 
+              interface="org.eclipse.kura.db.DbService"/>
+   <reference name="DataTransportService"
+              bind="setDataTransportService" 
+              unbind="unsetDataTransportService"
+              cardinality="1..1" 
+              policy="static"
+              interface="org.eclipse.kura.data.DataTransportService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/db.xml b/kura/org.eclipse.kura.core/OSGI-INF/db.xml
new file mode 100644
index 0000000000000000000000000000000000000000..65de42a63ea26a57e7a41cdd98a0336d832b202f
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/db.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.db.DbService">
+   <implementation class="org.eclipse.kura.core.db.HsqlDbServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.db.DbService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.db.DbService"/>
+   <reference name="SystemService" 
+              policy="static"
+              cardinality="1..1"
+              bind="setSystemService"
+              unbind="unsetSystemService"
+              interface="org.eclipse.kura.system.SystemService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport.xml b/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c5780d5be151b2f551a367894cd1fb4930a7526d
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport" 
+         name="MqttDataTransport" 
+         description="The MqttDataTransport provides an MQTT connection. Its configuration parameters are used to determine the MQTT broker and the credentials to connect to the broker.">
+
+        <Icon resource="MqttDataTransport" size="32"/>
+                
+        <AD id="broker-url"
+            name="broker-url"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="mqtt://broker-url:1883/" 
+            description="URL of the mqtt broker to connect to, for example, mqtt://broker-sandbox.everyware-cloud.com:1883/ or mqtts://broker-sandbox.everyware-cloud.com:8883/."/>
+
+        <AD id="topic.context.account-name"
+            name="topic.context.account-name"
+            type="String"
+            cardinality="0"
+            required="false"
+            default="account-name"
+            description="The value of this attribute will replace the '#account-name' token found in publishing topics. For connections to the EDC platform, this attribute is mandatory and must match the name of the EDC account."/>
+
+        <AD id="username"  
+            name="username"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="username" 
+            description="Username to be used when connecting to the MQTT broker."/>
+
+        <AD id="password"  
+            name="password"
+            type="Password"
+            cardinality="0" 
+            required="true"
+            default="password" 
+            description="Password to be used when connecting to the MQTT broker."/>
+
+        <AD id="client-id"
+            name="client-id"
+            type="String"
+            cardinality="0"
+            required="false"
+            min="0"
+            max="23"
+            default="" 
+            description="Client identifier to be used when connecting to the MQTT broker. The identifier has to be unique within your account. Characters '/', '+', and '#' are invalid and they will be replaced by '-'. If left empty, this is automatically determined by the client software as the MAC address of the main network interface."/>
+        
+        <AD id="keep-alive"  
+            name="keep-alive"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="30"
+            description="Frequency in seconds for the periodic MQTT PING message."/>
+            
+        <AD id="timeout"
+            name="timeout"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="10"
+            description="Timeout used for all interactions with the MQTT broker."/>
+
+        <AD id="clean-session"
+            name="clean-session"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="true"
+            description="MQTT Clean Session flag."/>
+            
+        <AD id="lwt.topic"
+            name="lwt.topic"
+            type="String"
+            cardinality="0"
+            required="false"
+            default="$EDC/#account-name/#client-id/MQTT/LWT"
+            description="MQTT Last Will and Testament topic. The tokens '#account-name' and '#client-id' will be replaced by the values of the properties topic.context.account-name and client-id"/>
+            
+        <AD id="lwt.payload"
+            name="lwt.payload"
+            type="String"
+            cardinality="0"
+            default=""
+            required="false"
+            description="MQTT Last Will and Testament payload as a string."/>
+            
+        <AD id="lwt.qos"  
+            name="lwt.qos"
+            type="Integer"
+            cardinality="0"
+            required="false"
+            default="0"
+            description="MQTT Last Will and Testament QoS (0..2).">
+            <Option label="0" value="0"/>
+            <Option label="1" value="1"/>
+            <Option label="2" value="2"/>
+        </AD>
+            
+        <AD id="lwt.retain"
+            name="lwt.retain"
+            type="Boolean"
+            cardinality="0"
+            required="false"
+            default="false"
+            description="MQTT Last Will and Testament Retain flag."/>
+            
+        <AD id="in-flight.persistence"
+            name="in-flight.persistence"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="file"
+            description="Storage type where in-flight messages are persisted across reconnections.">
+           <Option label="file" value="file"/>
+           <Option label="memory" value="memory"/>
+        </AD>
+            
+    </OCD>
+    <Designate pid="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport">
+        <Object ocdref="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.data.DataService.xml b/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.data.DataService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6f4f5419fcab35de86ffa95dd96b6908197a07ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.data.DataService.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.data.DataService"
+         name="DataService" 
+         description="DataService provides auto-connect, reconnect on connection drops and storing of outgoing messages.">
+
+        <Icon resource="DataService" size="32"/>
+        
+        <AD id="connect.auto-on-startup"
+            name="connect.auto-on-startup"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="false"
+            description="Enable automatic connect of the Data Publishers on startup."/>
+                        
+        <AD id="connect.retry-interval"
+            name="connect.retry-interval"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="60"
+            min="0"
+            description="Frequency in seconds to retry a connection of the Data Publishers after a disconnect (0 to disable)."/>
+            
+        <AD id="disconnect.quiesce-timeout"
+            name="disconnect.quiesce-timeout"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="10"
+            min="0"
+            description="Timeout used to try to complete the delivery of stored messages before forcing a disconnect of the Data Publisher."/>
+
+        <AD id="store.housekeeper-interval"
+            name="store.housekeeper-interval"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="900"
+            min="5"
+            description="Interval in seconds used to run the Data Store housekeeper task (min 5)."/>
+
+        <AD id="store.purge-age"
+            name="store.purge-age"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="60"
+            min="5"
+            description="Age in seconds of completed messages (either published with QoS = 0 or confirmed with QoS > 0) after which they are deleted (min 5)."/>
+            
+        <AD id="store.capacity"
+            name="store.capacity"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="10000"
+            min="1"
+            description="Maximum number of messages persisted in the Data Store. The limit does not apply to messages with the priority less than 2. These priority levels are reserved to the framework which uses it for life-cycle messages - birth and death certificates - and replies to request/response flows."/>
+            
+        <AD id="in-flight-messages.republish-on-new-session"
+            name="in-flight-messages.republish-on-new-session"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="true"
+            description="Whether to republish in-flight messages on a new MQTT session."/>
+
+        <AD id="in-flight-messages.max-number"
+            name="in-flight-messages.max-number"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="9"
+            min="1"
+            max="10"
+            description="The maximum number of in-flight messages."/>
+            
+        <AD id="in-flight-messages.congestion-timeout"
+            name="in-flight-messages.congestion-timeout"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="0"
+            min="0"
+            description="Timeouts the in-flight messages congestion condition. The service will force a disconnect attempting to reconnect (0 to disable)."/>
+            
+    </OCD>
+    <Designate pid="org.eclipse.kura.data.DataService">
+        <Object ocdref="org.eclipse.kura.data.DataService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.ssl.SslManagerService.xml b/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.ssl.SslManagerService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aec805b29fb7fabf29a2787afed10012788bb766
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/metatype/org.eclipse.kura.ssl.SslManagerService.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.ssl.SslManagerService"
+         name="SslManagerService" 
+         description="The SslManagerService is responsible to manage the configuration of the SSL connections.">
+
+        <Icon resource="SslManagerService" size="32"/>
+        
+        <AD id="ssl.default.protocol"
+            name="ssl.default.protocol"
+            type="String"
+            cardinality="0"
+            required="false"
+            default="TLSv1"
+            description="The protocol to use to initialize the SSLContext. If not specified, TLSv1 will be used."/>
+                        
+        <AD id="ssl.hostname.verification"
+        	name="ssl.hostname.verification"
+        	type="Boolean"
+        	cardinality="0"
+        	required="false"
+        	default="true"
+        	description="Enable or disable hostname verification." />
+        	
+        <AD id="ssl.default.trustStore"
+            name="ssl.default.trustStore"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="/opt/eclipse/security/cacerts"
+            description="Location of the Java keystore file containing the collection of CA certificates trusted by this application process (trust store). Key store type is expected to be JKS. If not specified or the specified file does not exist, the default Java VM trust store will be used."/>
+            
+        <AD id="ssl.default.keyStore"
+            name="ssl.default.keyStore"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="/opt/eclipse/security/keystore"
+            description="Location of the Java keystore file containing an application process's own certificate and private key.  Key store type is expected to be JKS. If not specified or the specified file does not exist, the default Java VM key store will be used."/>
+
+        <AD id="ssl.default.cipherSuites"
+            name="ssl.default.cipherSuites"
+            type="String"
+            cardinality="0"
+            required="false"
+            default=""
+            description="Comma-separated list of allosed ciphers. If not specifed, all Java VM ciphers will be allowed."/>
+            
+    </OCD>
+    
+    <Designate pid="org.eclipse.kura.ssl.SslManagerService">
+        <Object ocdref="org.eclipse.kura.ssl.SslManagerService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/mqttDataTransport.xml b/kura/org.eclipse.kura.core/OSGI-INF/mqttDataTransport.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c3978f633fbbdcd17d06c63ca36aa872d763820e
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/mqttDataTransport.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport">
+   <implementation class="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport"/>
+   <service>
+      <provide interface="org.eclipse.kura.data.DataTransportService"/>
+      <provide interface="org.eclipse.kura.ssl.SslServiceListener" />
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport"/>
+   <reference name="SystemService" 
+              policy="static"
+              cardinality="1..1"
+              bind="setSystemService"
+              unbind="unsetSystemService"
+              interface="org.eclipse.kura.system.SystemService"/>
+   <reference name="SslManagerService" 
+              policy="static"
+              cardinality="1..1"
+              bind="setSslManagerService"
+              unbind="unsetSslManagerService"
+              interface="org.eclipse.kura.ssl.SslManagerService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/ssl.xml b/kura/org.eclipse.kura.core/OSGI-INF/ssl.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4abbe6c576d3e9cb0694cc25f042cd52fb8c2cb7
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/ssl.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.ssl.SslManagerService">
+   <implementation class="org.eclipse.kura.core.ssl.SslManagerServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.ssl.SslManagerService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.ssl.SslManagerService"/>
+   <reference name="SystemService" 
+              policy="static"
+              cardinality="1..1"
+              bind="setSystemService"
+              unbind="unsetSystemService"
+              interface="org.eclipse.kura.system.SystemService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/system.xml b/kura/org.eclipse.kura.core/OSGI-INF/system.xml
new file mode 100644
index 0000000000000000000000000000000000000000..923eaf4ad4a0f3a9108bc7c2c978520c37ad3d4b
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/system.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" modified="updated" name="org.eclipse.kura.system.SystemService">
+   <implementation class="org.eclipse.kura.core.system.SystemServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.system.SystemService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.system.SystemService"/>
+   <reference name="NetworkService" 
+              interface="org.eclipse.kura.net.NetworkService" 
+              bind="setNetworkService" 
+              unbind="unsetNetworkService"
+              cardinality="1..1" 
+              policy="static"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.core/OSGI-INF/systemAdmin.xml b/kura/org.eclipse.kura.core/OSGI-INF/systemAdmin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2af29f774a31e1d04d6b62a34a95fc49b7fba38f
--- /dev/null
+++ b/kura/org.eclipse.kura.core/OSGI-INF/systemAdmin.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" name="org.eclipse.kura.system.SystemAdminService">
+   <implementation class="org.eclipse.kura.core.system.SystemAdminServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.system.SystemAdminService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.system.SystemAdminService"/>        
+ </scr:component>
diff --git a/kura/org.eclipse.kura.core/about.html b/kura/org.eclipse.kura.core/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core/about_files/epl-v10.html b/kura/org.eclipse.kura.core/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.core/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.core/build.properties b/kura/org.eclipse.kura.core/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a6f2ccd133e30db057bf0f892b426038cf2a0317
--- /dev/null
+++ b/kura/org.eclipse.kura.core/build.properties
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/,\
+           src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               src/main/resources/,\
+               about.html,\
+               about_files/
+additional.bundles = mqtt-client,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     osgi.cmpn,\
+                     org.eclipse.equinox.io,\
+                     log4j,\
+                     org.eclipse.kura.api
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.core/pom.xml b/kura/org.eclipse.kura.core/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aaaf950bc76e20c31411b7517caeab25a8f5b644
--- /dev/null
+++ b/kura/org.eclipse.kura.core/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<artifactId>org.eclipse.kura.core</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.18.1,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataMessage.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataMessage.java
new file mode 100644
index 0000000000000000000000000000000000000000..579330fb6ba0d9c4f263db16174181cd9f2179d1
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataMessage.java
@@ -0,0 +1,246 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data;
+
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * DataMessage is a message that is currently transiting through the DataService.
+ * It is a wrapper class over the message payload as produced by the client application
+ * but it also capture all the state information of the message through its
+ * DataService life-cycle of: stored -> published -> confirmed.
+ */
+public class DataMessage 
+{
+	private int  	id;
+	private String  topic;
+	private int     qos;
+	private boolean retain;
+	private Date    createdOn;
+	private Date   	publishedOn;
+    private int     publishedMessageId;
+	private Date    confirmedOn;
+	private byte[]  payload;
+	private int     priority;
+	private String  sessionId;
+	private Date    droppedOn;
+		
+	public DataMessage()
+	{}
+	
+	public DataMessage(Builder b) {
+		id                 = b.id;
+		topic              = b.topic;
+		qos                = b.qos;
+		retain             = b.retain;
+		createdOn          = b.createdOn;	
+		publishedOn        = b.publishedOn;
+		publishedMessageId = b.publishedMessageId;;
+		confirmedOn        = b.confirmedOn;
+		payload            = b.payload;
+		priority           = b.priority;
+		sessionId          = b.sessionId;
+		droppedOn          = b.droppedOn;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public String getTopic() {
+		return topic;
+	}
+
+	public int getQos() {
+		return qos;
+	}
+
+	public boolean isRetain() {
+		return retain;
+	}
+
+	public Date getCreatedOn() {
+		return createdOn;
+	}
+
+	public Date getPublishedOn() {
+		return publishedOn;
+	}
+
+    public int getPublishedMessageId() {
+        return publishedMessageId;
+    }
+
+    public void setPublishedMessageId(int publishedMessageId) {
+        this.publishedMessageId = publishedMessageId;
+    }
+
+    public Date getConfirmedOn() {
+		return confirmedOn;
+	}
+
+	public byte[] getPayload() {
+		return payload;
+	}
+	
+	public int getPriority() {
+		return priority;
+	}
+	
+	public String getSessionId() {
+		return sessionId;
+	}
+	
+	public Date droppedOn() {
+		return this.droppedOn;
+	}
+
+	@Override
+	public String toString() {
+		return "DataMessage [id=" + id + ", topic=" + topic + ", qos=" + qos
+				+ ", retain=" + retain + ", createdOn=" + createdOn
+				+ ", publishedOn=" + publishedOn + ", publishedMessageId="
+				+ publishedMessageId + ", confirmedOn=" + confirmedOn
+				+ ", payload=" + Arrays.toString(payload) + ", priority="
+				+ priority + ", sessionId=" 
+				+ sessionId + ", droppedOn="
+				+ droppedOn + "]";
+	}
+
+	public static class Builder {
+
+		private int		   id;
+		private String     topic;
+		private int        qos;
+		private boolean    retain;
+		private Date       createdOn;
+		private Date   	   publishedOn;
+        private int        publishedMessageId;
+		private Date       confirmedOn;
+		private byte[]	   payload;
+		private int        priority;
+		private String     sessionId;
+		private Date       droppedOn;
+		
+		public Builder(int id) {
+			this.id = id;
+		}
+		
+		public Builder withTopic(String topic) {
+			this.topic = topic;
+			return this;
+		}
+
+		public Builder withQos(int qos) {
+			this.qos = qos;
+			return this;
+		}
+
+		public Builder withRetain(boolean retain) {
+			this.retain = retain;
+			return this;
+		}
+		
+		public Builder withCreatedOn(Date createdOn) {
+			this.createdOn = createdOn;
+			return this;
+		}
+
+		public Builder withPublishedOn(Date publishedOn) {
+			this.publishedOn = publishedOn;
+			return this;
+		}
+
+        public Builder withPublishedMessageId(int publishedMessageId) {
+            this.publishedMessageId = publishedMessageId;
+            return this;
+        }
+
+        public Builder withConfirmedOn(Date confirmedOn) {
+			this.confirmedOn = confirmedOn;
+			return this;
+		}
+
+		public Builder withPayload(byte[] payload) {
+			this.payload = payload;
+			return this;
+		}
+		
+		public Builder withPriority(int priority) {
+			this.priority = priority;
+			return this;
+		}
+		
+		public Builder withSessionId(String sessionId) {
+			this.sessionId = sessionId;
+			return this;
+		}
+		
+		public Builder withDroppedOn(Date droppedOn) {
+			this.droppedOn = droppedOn;
+			return this;
+		}
+		
+		public int getId() {
+			return id;
+		}
+
+		public String getTopic() {
+			return topic;
+		}
+
+		public int getQos() {
+			return qos;
+		}
+
+		public boolean getRetain() {
+			return retain;
+		}
+
+		public Date getCreatedOn() {
+			return createdOn;
+		}
+
+		public Date getPublishedOn() {
+			return publishedOn;
+		}
+
+        public int getPublishedMessageId() {
+            return publishedMessageId;
+        }
+
+        public Date getConfirmedOn() {
+			return confirmedOn;
+		}
+
+		public byte[] getPayload() {
+			return payload;
+		}
+		
+		public int getPriority() {
+			return priority;
+		}
+		
+		public String getSessionId() {
+			return sessionId;
+		}
+		
+		public Date getDroppedOn() {
+			return droppedOn;
+		}
+ 		
+		public DataMessage build() {			
+			return new DataMessage(this);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff939419de43ca799cf657adfde953ac6b1a1d74
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java
@@ -0,0 +1,641 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.regex.Pattern;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraNotConnectedException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.KuraTimeoutException;
+import org.eclipse.kura.KuraTooManyInflightMessagesException;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.core.data.store.DbDataStore;
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.data.DataServiceListener;
+import org.eclipse.kura.data.DataTransportListener;
+import org.eclipse.kura.data.DataTransportService;
+import org.eclipse.kura.data.DataTransportToken;
+import org.eclipse.kura.db.DbService;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DataServiceImpl implements DataService, DataTransportListener, ConfigurableComponent {
+	
+	private static final Logger s_logger = LoggerFactory
+			.getLogger(DataServiceImpl.class);
+	
+	private static final int TRANSPORT_TASK_TIMEOUT = 1; // In seconds
+	
+	private static final String AUTOCONNECT_PROP_NAME = "connect.auto-on-startup";
+	private static final String CONNECT_DELAY_PROP_NAME = "connect.retry-interval";
+	private static final String DISCONNECT_DELAY_PROP_NAME = "disconnect.quiesce-timeout";
+	private static final String STORE_HOUSEKEEPER_INTERVAL_PROP_NAME = "store.housekeeper-interval";
+	private static final String STORE_PURGE_AGE_PROP_NAME = "store.purge-age";
+	private static final String STORE_CAPACITY_PROP_NAME = "store.capacity";
+	private static final String REPUBLISH_IN_FLIGHT_MSGS_PROP_NAME = "in-flight-messages.republish-on-new-session";
+	private static final String MAX_IN_FLIGHT_MSGS_PROP_NAME = "in-flight-messages.max-number";
+	private static final String IN_FLIGHT_MSGS_CONGESTION_TIMEOUT_PROP_NAME = "in-flight-messages.congestion-timeout";
+	
+	private Map<String, Object> m_properties = new HashMap<String, Object>();
+	
+	private DataTransportService m_dataTransportService;
+	private DbService m_dbService;
+	private DataServiceListeners m_dataServiceListeners;
+	
+	protected ScheduledExecutorService m_reconnectExecutor;
+	private ScheduledFuture<?> m_reconnectFuture;
+	
+	// A dedicated executor for the publishing task
+	private ScheduledExecutorService m_publisherExecutor;
+	
+	private DataStore m_store;
+	
+	private Map<DataTransportToken, Integer> m_inFlightMsgIds;
+
+	private ScheduledExecutorService m_congestionExecutor;
+	private ScheduledFuture<?> m_congestionFuture;
+	
+	// ----------------------------------------------------------------
+	//
+	// Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext,
+			Map<String, Object> properties) {
+		s_logger.info("Activating...");
+		
+		m_reconnectExecutor = Executors.newSingleThreadScheduledExecutor();
+		m_publisherExecutor = Executors.newSingleThreadScheduledExecutor();
+		m_congestionExecutor = Executors.newSingleThreadScheduledExecutor();
+						
+		m_properties.putAll(properties);
+		
+		m_store = new DbDataStore();
+		
+		try {
+			m_store.start(m_dbService,
+					(Integer) m_properties.get(STORE_HOUSEKEEPER_INTERVAL_PROP_NAME),
+					(Integer) m_properties.get(STORE_PURGE_AGE_PROP_NAME),
+					(Integer) m_properties.get(STORE_CAPACITY_PROP_NAME));
+			
+			// The initial list of in-flight messages
+			List<DataMessage> inFlightMsgs = m_store.allInFlightMessagesNoPayload();
+			
+			// The map associating a DataTransportToken with a message ID
+			m_inFlightMsgIds = new ConcurrentHashMap<DataTransportToken, Integer>();
+			
+			if (inFlightMsgs != null) {
+				for (DataMessage message : inFlightMsgs) {
+					
+					DataTransportToken token = new DataTransportToken(message.getPublishedMessageId(), message.getSessionId());
+					m_inFlightMsgIds.put(token, message.getId());
+					
+					s_logger.debug("Restored in-fligh messages from store. Topic: {}, ID: {}, MQTT message ID: {}",
+							new Object[] {message.getTopic(), message.getId(), message.getPublishedMessageId()});
+				}
+			}
+		} catch (KuraStoreException e) {
+			s_logger.error("Failed to start store", e);
+			throw new ComponentException("Failed to start store", e);
+		}
+		
+		ServiceTracker<DataServiceListener, DataServiceListener> listenersTracker = new ServiceTracker<DataServiceListener, DataServiceListener>(
+				componentContext.getBundleContext(),
+				DataServiceListener.class, null);
+		 		
+		// Deferred open of tracker to prevent
+		// java.lang.Exception: Recursive invocation of ServiceFactory.getService
+		// on ProSyst
+		m_dataServiceListeners = new DataServiceListeners(listenersTracker);
+		
+		startReconnectTask();
+	}
+	
+	public void updated(Map<String, Object> properties) {
+		s_logger.info("Updating...");
+		
+		stopReconnectTask();
+		
+		m_properties.clear();
+		m_properties.putAll(properties);
+		
+		m_store.update((Integer) m_properties.get(STORE_HOUSEKEEPER_INTERVAL_PROP_NAME),
+				(Integer) m_properties.get(STORE_PURGE_AGE_PROP_NAME),
+				(Integer) m_properties.get(STORE_CAPACITY_PROP_NAME));
+		
+		if (!m_dataTransportService.isConnected()) {
+			startReconnectTask();
+		}
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		s_logger.info("Deactivating...");
+		
+		m_congestionExecutor.shutdownNow();
+		
+		// Await termination of the publisher executor tasks
+		try {
+			m_publisherExecutor.awaitTermination(TRANSPORT_TASK_TIMEOUT, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			s_logger.info("Interrupted", e);
+		}
+		m_publisherExecutor.shutdownNow();
+		
+		stopReconnectTask();
+		m_reconnectExecutor.shutdownNow();
+		
+		disconnect();
+
+		m_dataServiceListeners.close();
+				
+		m_store.stop();
+	}
+		
+	// ----------------------------------------------------------------
+	//
+	// Dependencies
+	//
+	// ----------------------------------------------------------------
+	
+	public void setDataTransportService(DataTransportService dataTransportService) {
+		this.m_dataTransportService = dataTransportService;
+	}
+
+	public void unsetDataTransportService(DataTransportService dataTransportService) {
+		this.m_dataTransportService = null;
+	}
+
+	public void setDbService(DbService dbService) {
+		this.m_dbService = dbService;
+	}
+
+	public void unsetDbService(DbService dbService) {
+		this.m_dbService = null;
+	}
+	
+	@Override
+	public void onConnectionEstablished(boolean newSession) {
+		
+		s_logger.info("Notified connected");
+		
+		// On a new session all messages the were in-flight in the previous session
+		// would be lost and never confirmed by the DataPublisherService.
+		//
+		// If the DataPublisherService is configured with Clean Start flag set to true,
+		// then the session and connection boundaries are the same.
+		// Otherwise, a session spans multiple connections as far as the client connects
+		// to the same broker instance with the same client ID.
+		//
+		// We have two options here:
+		// Forget them.
+		// Unpublish them so they will be republished on the new session.
+		//
+		// The latter has the potential drawback that duplicates can be generated with any QoS.
+		// This can occur for example if the DataPublisherService is connecting with a different client ID
+		// or to a different broker URL resolved to the same broker instance.
+		//
+		// Also note that unpublished messages will be republished accordingly to their
+		// original priority. Thus a message reordering may occur too.
+		// Even if we artificially upgraded the priority of unpublished messages to -1 so to
+		// republish them first, their relative order would not necessarily match the order
+		// in the DataPublisherService persistence.
+		
+		if (newSession) {
+			Boolean unpublishInFlightMsgs = (Boolean) m_properties.get(REPUBLISH_IN_FLIGHT_MSGS_PROP_NAME);
+			
+			if (unpublishInFlightMsgs) {
+				s_logger.info("New session established. Unpublishing all in-flight messages. Disregarding the QoS level, this may cause duplicate messages.");
+				try {
+					m_store.unpublishAllInFlighMessages();
+					m_inFlightMsgIds.clear();
+				} catch (KuraStoreException e) {
+					s_logger.error("Failed to unpublish in-flight messages", e);
+				}
+			} else {
+				s_logger.info("New session established. Dropping all in-flight messages.");
+				try {
+					m_store.dropAllInFlightMessages();
+					m_inFlightMsgIds.clear();
+				} catch (KuraStoreException e) {
+					s_logger.error("Failed to drop in-flight messages", e);
+				}
+			}
+		}
+		
+		// Notify the listeners
+		m_dataServiceListeners.onConnectionEstablished();
+		
+		// Schedule execution of a publisher task
+		submitPublishingWork();
+	}
+
+	@Override
+	public void onDisconnecting() 
+	{		
+		s_logger.info("Notified disconnecting");
+		
+		// Notify the listeners
+		m_dataServiceListeners.onDisconnecting();
+		
+		// Schedule execution of a publisher task waiting until done or timeout.
+		Future<?> future = submitPublishingWork();
+		try {
+			future.get(TRANSPORT_TASK_TIMEOUT, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			s_logger.info("Interrupted while waiting for the publishing work to complete");
+		} catch (ExecutionException e) {
+			s_logger.warn("ExecutionException while waiting for the publishing work to complete", e);
+		} catch (TimeoutException e) {
+			s_logger.warn("Timeout while waiting for the publishing work to complete");
+		}
+	}
+
+	@Override
+	public void onDisconnected() 
+	{		
+		s_logger.info("Notified disconnected");
+		
+		// Notify the listeners
+		m_dataServiceListeners.onDisconnected();
+	}
+
+	@Override
+	public void onConfigurationUpdating(boolean wasConnected) {
+		s_logger.info("Notified DataTransportService configuration updating...");
+		stopReconnectTask();
+		disconnect(0);
+	}
+
+	@Override
+	public void onConfigurationUpdated(boolean wasConnected) 
+	{
+		s_logger.info("Notified DataTransportService configuration updated.");
+		boolean autoConnect = startReconnectTask();
+		if (!autoConnect && wasConnected) {			
+			try {
+				connect();
+			} catch (KuraConnectException e) {
+				s_logger.error("Error during re-connect after configuration update.", e);
+			}
+		}
+	}
+
+
+	@Override
+	public void onConnectionLost(Throwable cause) 
+	{		
+		s_logger.info("connectionLost");
+		
+		stopReconnectTask(); // Just in case...
+		startReconnectTask();
+		
+		// Notify the listeners
+		m_dataServiceListeners.onConnectionLost(cause);
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos,
+			boolean retained) {
+		
+		s_logger.debug("Message arrived on topic: {}", topic);
+		
+		// Notify the listeners
+		m_dataServiceListeners.onMessageArrived(topic, payload, qos, retained);
+		
+		submitPublishingWork();
+	}
+
+	@Override
+	// It's very important that the publishInternal and messageConfirmed methods are synchronized
+	public synchronized void onMessageConfirmed(DataTransportToken token) {
+		
+		s_logger.debug("Confirmed message with MQTT message ID: {} on session ID: {}",
+				token.getMessageId(), token.getSessionId());
+		
+		Integer messageId = m_inFlightMsgIds.remove(token);
+		if (messageId == null) {
+			s_logger.info("Confirmed message published with MQTT message ID: {} not tracked in the map of in-flight messages", token.getMessageId());
+		} else {
+
+			DataMessage confirmedMessage = null; 
+			try {
+				s_logger.info("Confirmed message ID: {} to store", messageId);
+				m_store.confirmed(messageId);
+				confirmedMessage = m_store.get(messageId);
+			} catch (KuraStoreException e) {
+				s_logger.error("Cannot confirm message to store", e);
+			}
+			
+			// Notify the listeners
+			if (confirmedMessage != null) {
+				String topic = confirmedMessage.getTopic();
+				m_dataServiceListeners.onMessageConfirmed(messageId, topic);
+			}
+			else {
+				s_logger.error("Confirmed Message with ID {} could not be loaded from the DataStore.", messageId);
+			}
+		}
+		
+		if (m_inFlightMsgIds.size() < (Integer) m_properties.get(MAX_IN_FLIGHT_MSGS_PROP_NAME)) {
+			handleInFlightDecongestion();
+		}
+		
+		submitPublishingWork();
+	}
+
+	@Override
+	public void connect() throws KuraConnectException {
+		stopReconnectTask();
+		if (!m_dataTransportService.isConnected()) {
+			m_dataTransportService.connect();
+		}
+	}
+
+	@Override
+	public boolean isConnected() {
+		return m_dataTransportService.isConnected();
+	}
+	
+	@Override
+	public boolean isAutoConnectEnabled() {
+		return (Boolean)m_properties.get(AUTOCONNECT_PROP_NAME);
+	}
+	
+	@Override
+	public int getRetryInterval() {
+		return (Integer) m_properties.get(CONNECT_DELAY_PROP_NAME);
+	}
+
+	@Override
+	public void disconnect(long quiesceTimeout) {
+		stopReconnectTask();
+		m_dataTransportService.disconnect(quiesceTimeout);
+	}
+
+	@Override
+	public void subscribe(String topic, int qos) throws KuraTimeoutException, KuraException, KuraNotConnectedException {
+		m_dataTransportService.subscribe(topic, qos);
+	}
+
+	@Override
+	public void unsubscribe(String topic) throws KuraTimeoutException, KuraException, KuraNotConnectedException {
+		m_dataTransportService.unsubscribe(topic);
+	}
+
+	@Override
+	public int publish(String topic, byte[] payload, int qos, boolean retain,
+			int priority) throws KuraStoreException {
+		
+		s_logger.info("Storing message on topic :{}, priority: {}", topic, priority);
+
+		DataMessage dataMsg = m_store.store(topic, payload, qos, retain, priority);		
+		s_logger.info("Stored message on topic :{}, priority: {}", topic, priority);		
+		
+		submitPublishingWork();
+		
+		return dataMsg.getId();
+	}
+	
+	@Override
+	public List<Integer> getUnpublishedMessageIds(String topicRegex) throws KuraStoreException {
+		List<DataMessage> messages = m_store.allUnpublishedMessagesNoPayload();
+		return buildMessageIds(messages, topicRegex);
+	}
+	
+	@Override
+	public List<Integer> getInFlightMessageIds(String topicRegex) throws KuraStoreException {
+		List<DataMessage> messages = m_store.allInFlightMessagesNoPayload();
+		return buildMessageIds(messages, topicRegex);
+	}
+	
+	@Override
+	public List<Integer> getDroppedInFlightMessageIds(String topicRegex) throws KuraStoreException {
+		List<DataMessage> messages = m_store.allDroppedInFlightMessagesNoPayload();
+		return buildMessageIds(messages, topicRegex);
+	}
+	
+	private boolean startReconnectTask() 
+	{
+		if (m_reconnectFuture != null && !m_reconnectFuture.isDone()) {
+			s_logger.error("Reconnect task already running");
+			throw new IllegalStateException("Reconnect task already running");
+		}
+		
+		//
+    	// Establish a reconnect Thread based on the reconnect interval
+		boolean autoConnect = (Boolean) m_properties.get(AUTOCONNECT_PROP_NAME);
+    	int reconnectInterval = (Integer) m_properties.get(CONNECT_DELAY_PROP_NAME);    			
+		if (autoConnect) {
+
+			// add a delay on the reconnect
+			int maxDelay = reconnectInterval/5;
+			maxDelay = maxDelay > 0 ? maxDelay : 1;
+			int initialDelay = (new Random()).nextInt(maxDelay);
+			
+			s_logger.info("Starting reconnect task with initial delay {}", initialDelay);
+			m_reconnectFuture = m_reconnectExecutor.scheduleAtFixedRate(new Runnable() {
+				@Override
+				public void run() {
+					String originalName = Thread.currentThread().getName();
+					Thread.currentThread().setName("DataServiceImpl:ReconnectTask");
+					boolean connected = false;
+					try {
+						s_logger.info("Connecting...");
+						if (m_dataTransportService.isConnected()) {
+							s_logger.info("Already connected. Reconnect task will be terminated.");
+						}
+						else {
+							m_dataTransportService.connect();
+							s_logger.info("Connected. Reconnect task will be terminated.");
+						}
+						connected = true;
+					} catch (Exception e) {
+						s_logger.warn("Connect failed", e);
+					} catch (Error e) {
+						// There's nothing we can do here but log an exception.
+						s_logger.error("Unexpected Error. Task will be terminated", e);
+						throw e;
+					} finally {
+						Thread.currentThread().setName(originalName);
+						if (connected) {
+							// Throwing an exception will suppress subsequent executions of this periodic task.
+							throw new RuntimeException("Connected. Reconnect task will be terminated.");
+						}
+					}
+				}
+			},
+			initialDelay, 		// initial delay
+			reconnectInterval, // repeat every reconnect interval until we stopped. 
+			TimeUnit.SECONDS);
+		}
+		return autoConnect;
+	}
+	
+	private void stopReconnectTask() {
+		if (m_reconnectFuture != null && !m_reconnectFuture.isDone()) {
+
+			s_logger.info("Reconnect task running. Stopping it");
+
+			m_reconnectFuture.cancel(true);
+		}
+	}
+	
+	private void disconnect() {
+		long millis = (Integer) m_properties.get(DISCONNECT_DELAY_PROP_NAME) * 1000L;
+		m_dataTransportService.disconnect(millis);
+	}
+	
+	// Submit a new publishing work if any
+	// TODO: only one instance of the Runnable is needed
+	private Future<?> submitPublishingWork() 
+	{
+		return m_publisherExecutor.submit(new Runnable() {		
+			@Override
+			public void run() {
+				Thread.currentThread().setName("DataServiceImpl:Submit");
+				if (!m_dataTransportService.isConnected()) {
+					s_logger.info("DataPublisherService not connected");
+					return;
+				}
+				try {
+					
+					// Compared with getting all unpublished messages, getting one message at a time
+					// is a little bit inefficient (we query the underlying DB every time)
+					// but improves responsiveness to high priority message.
+					// TODO: add a getUnpublishedMessages with a limit argument?
+					// getNextMessage is a special case with limit = 1.
+					DataMessage message = null;
+					while ((message = m_store.getNextMessage()) != null) {
+						
+						// Further limit the maximum number of in-flight messages
+						if (message.getQos() > 0) {
+							if (m_inFlightMsgIds.size() >= (Integer) m_properties.get(MAX_IN_FLIGHT_MSGS_PROP_NAME)) {
+								s_logger.warn("The configured maximum number of in-flight messages has been reached");
+								handleInFlightCongestion();
+								break;
+							}
+						}
+						
+						publishInternal(message);
+						
+						// TODO: add a 'message throttle' configuration parameter to
+						// slow down publish rate?
+						
+						// Notify the listeners
+						m_dataServiceListeners.onMessagePublished(message.getId(), message.getTopic());
+					}
+				} catch (KuraConnectException e) {
+					s_logger.info("DataPublisherService is not connected", e);
+				} catch (KuraTooManyInflightMessagesException e) {
+					s_logger.info("Too many in-flight messages", e);
+					handleInFlightCongestion();
+				} catch (Exception e) {
+					s_logger.error("Probably an unrecoverable exception", e);
+				}
+			}
+		});
+	}
+	
+	// It's very important that the publishInternal and messageConfirmed methods are synchronized
+	private synchronized void publishInternal(DataMessage message)
+			throws KuraConnectException, KuraTooManyInflightMessagesException, KuraStoreException, KuraException {
+		
+		String topic = message.getTopic();
+		byte[] payload = message.getPayload();
+		int qos = message.getQos();
+		boolean retain = message.isRetain();
+		int msgId = message.getId();
+		
+		s_logger.debug("Publishing message with ID: {} on topic: {}, priority: {}",
+				new Object[] {msgId, topic, message.getPriority()});		
+		
+		DataTransportToken token = m_dataTransportService.publish(topic, payload, qos, retain);
+		
+		if (token == null) {
+			m_store.published(msgId);
+			s_logger.debug("Published message with ID: {}", msgId);
+		} else {
+			
+			// Check if the token is already tracked in the map (in which case we are in trouble)
+			Integer trackedMsgId = m_inFlightMsgIds.get(token);
+			if (trackedMsgId != null) {
+				s_logger.error("Token already tracked: "+token.getSessionId()+"-"+token.getMessageId());
+			}
+			
+			m_inFlightMsgIds.put(token, msgId);
+			m_store.published(msgId, token.getMessageId(), token.getSessionId());
+			s_logger.debug("Published message with ID: {} and MQTT message ID: {}", msgId, token.getMessageId());
+		}
+	}
+	
+	private List<Integer> buildMessageIds(List<DataMessage> messages, String topicRegex) {
+		Pattern topicPattern = Pattern.compile(topicRegex);
+		List<Integer> ids = new ArrayList<Integer>();
+		
+		if (messages != null) {
+			for (DataMessage message : messages) {
+				String topic = message.getTopic();
+				if (topicPattern.matcher(topic).matches()) {
+					ids.add(message.getId());
+				}
+			}
+		}
+		
+		return ids;
+	}
+	
+	private void handleInFlightCongestion() {
+		int timeout = (Integer) m_properties.get(IN_FLIGHT_MSGS_CONGESTION_TIMEOUT_PROP_NAME);
+		
+		// Do not schedule more that one task at a time
+		if (timeout != 0 && (m_congestionFuture == null || m_congestionFuture.isDone())) {
+			s_logger.warn("In-flight message congestion timeout started");
+			m_congestionFuture = m_congestionExecutor.schedule(new Runnable() {
+				@Override
+				public void run() {
+					Thread.currentThread().setName("DataServiceImpl:InFlightCongestion");
+					s_logger.warn("In-flight message congestion timeout elapsed. Disconnecting and reconnecting again");
+					disconnect();
+					startReconnectTask();
+				}
+			},
+			timeout,
+			TimeUnit.SECONDS);
+		}
+	}
+	
+	private void handleInFlightDecongestion() {
+		if (m_congestionFuture != null && !m_congestionFuture.isDone()) {
+			m_congestionFuture.cancel(true);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceListeners.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceListeners.java
new file mode 100644
index 0000000000000000000000000000000000000000..c40b1b4570dfef986ab05338dd158991367941df
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceListeners.java
@@ -0,0 +1,150 @@
+package org.eclipse.kura.core.data;
+
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.kura.data.DataServiceListener;
+
+class DataServiceListeners implements DataServiceListener {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(DataServiceListeners.class);
+	
+	private ServiceTracker<DataServiceListener, DataServiceListener> m_listenersTracker;
+
+	public DataServiceListeners(ServiceTracker<DataServiceListener, DataServiceListener> listenersTracker) {
+		m_listenersTracker = listenersTracker;
+	}
+	
+	public synchronized void close() {
+		if (m_listenersTracker.getTrackingCount() != -1) {
+			m_listenersTracker.close();
+		}
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onConnectionEstablished();
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onDisconnecting() {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onDisconnecting();
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onDisconnected() {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onDisconnected();
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onConnectionLost(Throwable cause) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onConnectionLost(cause);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos,
+			boolean retained) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onMessageArrived(topic, payload, qos, retained);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		} else {
+			s_logger.error("No registered services. Dropping arrived message");
+		}
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String topic) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onMessagePublished(messageId, topic);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		} else {
+			s_logger.error("No registered services. Ignoring message confirm");
+		}
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String topic) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataServiceListener) listener).onMessageConfirmed(messageId, topic);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		} 
+		else {
+			s_logger.error("No registered services. Dropping message confirm");
+		}
+	}
+	
+	private synchronized void openOnce() {
+		if (m_listenersTracker.getTrackingCount() == -1) {
+			m_listenersTracker.open();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataStore.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataStore.java
new file mode 100644
index 0000000000000000000000000000000000000000..d34c8b2290155e1df05a2b4f83be3cb77dc6e050
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataStore.java
@@ -0,0 +1,174 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data;
+
+import java.util.List;
+
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.db.DbService;
+
+/**
+ * DataStore implementation have the responsibility of doing the bookkeeping of
+ * the messages that are in transient in the system. A message in the system
+ * normally flows through the following states: stored -> published ->
+ * confirmed (or dropped). The data store should be able to store messages, track and update
+ * their state, and perform certain queries for messages in a given state.
+ */
+public interface DataStore {
+	
+	public void start(DbService dbService, int houseKeeperInterval,
+			int purgeAge, int capacity) throws KuraStoreException;
+	
+	public void update(int houseKeeperInterval, int purgeAge, int capacity);
+
+	public void stop();
+
+	/**
+	 * Stores an MQTT message for deferred publication. An identifier is always
+	 * generated and returned, even for messages published with QoS = 0. The
+	 * store policy is FIFO within each priority level, 0 being the highest
+	 * priority.
+	 * 
+	 * @param topic
+	 * @param payload
+	 * @param qos
+	 * @param retain
+	 * @param priority
+	 * @return
+	 * @throws KuraStoreException
+	 */
+	public DataMessage store(String topic, byte[] payload, int qos,
+			boolean retain, int priority) throws KuraStoreException;
+
+	/**
+	 * Acknowledges the publication of the DataMessage with the given ID
+	 * associating it to the protocol (e.g. MQTT) message ID (QoS > 0).
+	 * 
+	 * @param msgId
+	 * @param publishedMsgId
+	 * @param sessionId TODO
+	 * @throws KuraStoreException
+	 */
+	public void published(int msgId, int publishedMsgId, String sessionId)
+			throws KuraStoreException;
+
+	/**
+	 * Acknowledges the publication of the DataMessage with the given ID. This
+	 * is typically called for messages published with QoS = 0.
+	 * 
+	 * @param msgId
+	 * @param publishedMsgId
+	 * @throws KuraStoreException
+	 */
+	public void published(int msgId) throws KuraStoreException;
+
+	/**
+	 * Acknowledges the delivery of the DataMessage published with the given
+	 * protocol (e.g. MQTT) message ID. This method is only called for messages
+	 * published with QoS > 0.
+	 * 
+	 * @param msgId
+	 * @throws KuraStoreException
+	 */
+	public void confirmed(int msgId) throws KuraStoreException;
+
+	/**
+	 * Gets the next unpublished message. Messages with higher
+	 * priority (0 is the highest priority) are returned first. Within each
+	 * priority level the oldest unpublished message is returned first.
+	 * 
+	 * @return
+	 * @throws KuraStoreException
+	 */
+	public DataMessage getNextMessage() throws KuraStoreException;
+
+	/**
+	 * Returns a message from the DataStore by its message id.
+	 * @param msgId ID of the message to be loaded
+	 * @return Loaded message or null if not found.
+	 * @throws KuraStoreException
+	 */
+	public DataMessage get(int msgId) throws KuraStoreException;
+	
+	/**
+	 * Finds the list of all unpublished messages and returns them WITHOUT loading the payload.
+	 * 
+	 * @return
+	 * @throws KuraStoreException
+	 */
+	public List<DataMessage> allUnpublishedMessagesNoPayload() throws KuraStoreException;
+
+	/**
+	 * Finds the list of all published but not yet confirmed messages and returns them WITHOUT loading the payload.
+	 * These are only messages published with QoS > 0.
+	 * Messages published with QoS = 0 do not belong to the results list.
+	 * 
+	 * @return
+	 * @throws KuraStoreException
+	 */
+	public List<DataMessage> allInFlightMessagesNoPayload()
+			throws KuraStoreException;
+
+	/**
+	 * Finds the list of all published messages that will not be confirmed and returns them WITHOUT loading the payload.
+	 * These are only messages published with QoS > 0.
+	 * Messages published with QoS = 0 do not belong to the results list. 
+	 * 
+	 * @return
+	 */
+	public List<DataMessage> allDroppedInFlightMessagesNoPayload() throws KuraStoreException;
+	
+	/**
+	 * Marks all in-flight messages as unpublished.
+	 * 
+	 * @throws KuraStoreException
+	 */
+	public void unpublishAllInFlighMessages() throws KuraStoreException;
+	
+	/**
+	 * Drops all in-flight messages.
+	 * 
+	 * @throws KuraStoreException
+	 */
+	public void dropAllInFlightMessages() throws KuraStoreException;
+		
+	/**
+	 * Deletes stale messages.
+	 * These are either published messages with QoS = 0 or confirmed messages with QoS > 0, whose age exceeds the argument.
+	 * 
+	 * @param purgeAge
+	 * @throws KuraStoreException
+	 */
+	public void deleteStaleMessages(int purgeAge) throws KuraStoreException;
+	
+	/**
+	 * Defragments the store.
+	 * 
+	 * @throws KuraStoreException
+	 *             TODO
+	 */
+	public void defrag() throws KuraStoreException;
+	
+	/**
+	 * Performs a checkpoint of the store.
+	 * 
+	 * @throws KuraStoreException
+	 */
+	public void checkpoint() throws KuraStoreException;
+
+	/**
+	 * Checks and attempts to repair the store.
+	 * 
+	 * @throws KuraStoreException
+	 */
+	public void repair() throws KuraStoreException;
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/store/DbDataStore.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/store/DbDataStore.java
new file mode 100644
index 0000000000000000000000000000000000000000..11e10ccb2f310df17dad992d86b2d75599021f2f
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/store/DbDataStore.java
@@ -0,0 +1,653 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data.store;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraStoreCapacityReachedException;
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.core.data.DataMessage;
+import org.eclipse.kura.core.data.DataStore;
+import org.eclipse.kura.core.db.HsqlDbServiceImpl;
+import org.eclipse.kura.db.DbService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An implementation of the DataStore which stores messages into an embedded HSQLDB instance.
+ * FIXME: reset identity (see below, not working) on sequence limit exceed exception.
+ */
+public class DbDataStore implements DataStore
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(DbDataStore.class);
+	
+    private DbService            m_dbService;
+    private Calendar             m_utcCalendar;
+    private ScheduledExecutorService m_houseKeeperExecutor;
+    private ScheduledFuture<?>   m_houseKeeperTask;
+    int m_capacity;
+    
+    // package level constructor to be invoked only by the factory
+    public DbDataStore() {
+    	// do not make this static as it may not be thread safe
+    	m_utcCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+    }
+    
+    // ----------------------------------------------------------
+    //
+    //    Start/Stop, ServiceId  
+    //
+    // ----------------------------------------------------------
+   
+    public synchronized void start(DbService dbService, int houseKeeperInterval, int purgeAge, int capacity) throws KuraStoreException
+    {
+    	m_dbService = dbService;
+    	
+    	m_houseKeeperExecutor = Executors.newSingleThreadScheduledExecutor();
+    	    	
+    	//
+    	// Set up the schema tables required by the DataStore
+    	init(houseKeeperInterval, purgeAge, capacity);
+    }
+
+	private void init(int houseKeeperInterval, int purgeAge, int capacity)
+		throws KuraStoreException 
+	{
+		// create the MESSAGES table
+		// Note that the HSQLDB will throw an sequence limit exceeded exception when the sequence generator reaches the value 2147483647 + 1.
+		execute("CREATE TABLE IF NOT EXISTS ds_messages (id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, topic VARCHAR(32767 CHARACTERS), qos INTEGER, retain BOOLEAN, createdOn TIMESTAMP, publishedOn TIMESTAMP, publishedMessageId INTEGER, confirmedOn TIMESTAMP, payload VARBINARY(16777216), priority INTEGER, sessionId VARCHAR(32767 CHARACTERS), droppedOn TIMESTAMP);");
+
+
+		// From version 2.0.4, the index ds_messages_publishedOn is replaced with ds_messages_nextMsg
+		// So, drop it on startup if it exists.
+		execute("DROP INDEX IF EXISTS ds_messages_publishedOn;");
+
+		// Introduced in 2.0.4, create index for ds_messages
+		try {
+			execute("CREATE INDEX ds_messages_nextMsg ON ds_messages (priority ASC, createdOn ASC, publishedOn, qos);");
+		}
+		catch (KuraStoreException e) {
+			boolean handled = false;
+			if (e.getCause() != null && e.getCause() instanceof SQLException) {
+				SQLException sqle = (SQLException) e.getCause();
+				if (sqle.getErrorCode() == -5504) {
+					// Object already exist. We can ignore it
+					handled = true;
+				}
+			}
+			if (!handled) {
+				throw e;
+			}
+		}
+
+		// Test.
+		// Initialize the sequence generator with 2147483647. This throws a sequence limit exceed exception on the second INSERT.
+		//execute("CREATE TABLE IF NOT EXISTS ds_messages (id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 2147483647) PRIMARY KEY, topic VARCHAR(32767 CHARACTERS), qos INTEGER, retain BOOLEAN, createdOn TIMESTAMP, publishedOn TIMESTAMP, publishedMessageId INTEGER, confirmedOn TIMESTAMP, payload BLOB(256M), priority INTEGER, sessionId VARCHAR(32767 CHARACTERS), droppedOn TIMESTAMP);");
+		
+		// Test (note the 'BY DEFAULT' clause instead of 'ALWAYS').
+		// Initialize the sequence generator with 2147483647. This throws a sequence limit exceed exception on the second INSERT.
+		//execute("CREATE TABLE IF NOT EXISTS ds_messages (id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 2147483647) PRIMARY KEY, topic VARCHAR(32767 CHARACTERS), qos INTEGER, retain BOOLEAN, createdOn TIMESTAMP, publishedOn TIMESTAMP, publishedMessageId INTEGER, confirmedOn TIMESTAMP, payload BLOB(256M), priority INTEGER, sessionId VARCHAR(32767 CHARACTERS), droppedOn TIMESTAMP);");
+	
+		update(houseKeeperInterval, purgeAge, capacity);
+	}
+    
+	public synchronized void stop()
+    {
+		s_logger.info("Canceling the Housekeeper Task...");
+		if (m_houseKeeperTask != null) {
+			m_houseKeeperTask.cancel(true);
+		}
+		m_houseKeeperExecutor.shutdownNow();
+    }
+	
+	public synchronized void update(int houseKeeperInterval, int purgeAge, int capacity)
+	{
+		m_capacity = capacity;
+		
+		if (m_houseKeeperTask != null) {
+			m_houseKeeperTask.cancel(true);
+		}
+		
+		boolean doCheckpoint = !((HsqlDbServiceImpl) m_dbService).isLogDataEnabled();
+		
+		// Start the Housekeeper task
+		m_houseKeeperTask = m_houseKeeperExecutor.scheduleAtFixedRate(new HouseKeeperTask(this, purgeAge, doCheckpoint),
+										      1,  // start in one second
+										      houseKeeperInterval, // repeat every retryInterval until we stopped. 
+										      TimeUnit.SECONDS);
+	}
+    
+    // ----------------------------------------------------------
+    //
+    //    Message APIs  
+    //
+    // ----------------------------------------------------------
+	
+	private synchronized int getMessageCount() throws KuraStoreException
+	{
+		ResultSet rs = null;
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		int count = -1;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement("SELECT COUNT(*) FROM ds_messages;");
+			rs = stmt.executeQuery();
+			if (rs.next()) {
+				count = rs.getInt(1);
+			}
+		}
+		catch (Exception e) {
+			throw new KuraStoreException(e, "Cannot get message count");
+		}
+		finally {
+			close(rs);
+			close(stmt);
+			close(conn);
+		}
+		
+		return count;
+	}
+    
+	private synchronized void resetIdentityGenerator() throws KuraStoreException
+	{
+		execute("ALTER TABLE ds_messages ALTER COLUMN id RESTART WITH 0;");
+	}
+	
+	public synchronized DataMessage store(String topic, byte[] payload, int qos, boolean retain, int priority) throws KuraStoreException
+	{
+		if (topic == null || topic.trim().length() == 0) {
+			throw new IllegalArgumentException("topic");
+		}
+		
+		// Priority 0 are used for life-cycle messages like birth and death certificates. 
+		// Priority 1 are used for remove management by Cloudlet applications.  
+		// For those messages, bypass the max message count check of the DB cache;
+		// we want to publish those message even if the db is full, so allow their storage.
+		if (priority != 0 && priority != 1) {
+			int count = getMessageCount();
+			s_logger.debug("Store message count: {}", count);
+			if (count >= m_capacity) {
+				s_logger.error("Store capacity exceeded");
+				throw new KuraStoreCapacityReachedException("Store capacity exceeded");
+			}
+		}
+		
+		DataMessage message = null;
+		try {
+			message = storeInternal(topic, payload, qos, retain, priority);
+		} catch (KuraStoreException e) {
+			// Try to reset the sequence generator and store the message again.
+			// FIXME: it doesn't work but if we restart Kura the sequence generator restarts from 0!
+			Throwable cause = e.getCause();
+			if (cause instanceof SQLException) {
+				SQLException sqle = (SQLException) cause;
+				int errorCode = sqle.getErrorCode();
+				if (errorCode == -3416) {
+					s_logger.warn("Identity generator limit exceeded. Resetting it...");
+					resetIdentityGenerator();
+					message = storeInternal(topic, payload, qos, retain, priority);
+				} else {
+					throw e;
+				}
+			} else {
+				throw e;
+			}
+		}
+		
+		return message;
+	}
+	
+    private synchronized DataMessage storeInternal(String topic, byte[] payload, int qos, boolean retain, int priority) throws KuraStoreException 
+	{
+		if (topic == null || topic.trim().length() == 0) {
+			throw new IllegalArgumentException("topic");
+		}
+
+		Timestamp now = new Timestamp((new Date()).getTime());
+
+		int messageId = -1;
+		ResultSet rs = null;
+		Connection conn = null;
+		PreparedStatement pstmt = null;
+		PreparedStatement cstmt = null;
+		try {			
+			
+			conn = getConnection();
+
+			// store message
+			pstmt = conn.prepareStatement("INSERT INTO ds_messages (topic, qos, retain, createdOn, publishedOn, publishedMessageId, confirmedOn, payload, priority, sessionId, droppedOn) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
+			pstmt.setString   (1,  topic);				// topic
+			pstmt.setInt      (2,  qos);				// qos
+			pstmt.setBoolean  (3,  retain);				// retain
+			pstmt.setTimestamp(4,  now, m_utcCalendar); // createdOn
+			pstmt.setTimestamp(5,  null);				// publishedOn
+            pstmt.setInt      (6,  -1);                 // publishedMessageId
+			pstmt.setTimestamp(7,  null);				// confirmedOn
+			pstmt.setBytes    (8,  payload);			// payload
+			pstmt.setInt      (9, priority);            // priority
+			pstmt.setString   (10, null);               // sessionId
+			pstmt.setTimestamp(11, null);				// droppedOn
+			pstmt.execute();			
+			
+			// retrieve message id
+			cstmt = conn.prepareStatement("CALL IDENTITY();");
+			rs = cstmt.executeQuery();
+			if (rs != null && rs.next()) {
+				messageId = rs.getInt(1);
+			}
+			
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			s_logger.error("SQL error code: {}", e.getErrorCode());
+			throw new KuraStoreException(e, "Cannot store message");
+		}
+		finally {
+			close(rs);
+			close(cstmt);
+			close(pstmt);
+			close(conn);
+		}
+		return get(messageId);
+	}
+        
+    public synchronized DataMessage get(int msgId) throws KuraStoreException
+    {
+    	DataMessage msg = null;
+		ResultSet rs = null;
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement("SELECT id, topic, qos, retain, createdOn, publishedOn, publishedMessageId, confirmedOn, payload, priority, sessionId, droppedOn FROM ds_messages WHERE id = ?");
+			stmt.setInt(1, msgId);
+			rs = stmt.executeQuery();
+			if (rs.next()) {
+				msg  = buildDataMessage(rs);
+			}
+		}
+		catch (Exception e) {
+			throw new KuraStoreException(e, "Cannot get message by ID: " + msgId);
+		}
+		finally {
+			close(rs);
+			close(stmt);
+			close(conn);
+		}
+		return msg;
+    }
+    
+    public synchronized DataMessage getNextMessage() throws KuraStoreException
+    {
+    	DataMessage msg = null;
+		ResultSet rs = null;
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement("SELECT d.id, d.topic, d.qos, d.retain, d.createdOn, d.publishedOn, d.publishedMessageId, d.confirmedOn, d.payload, d.priority, d.sessionId, d.droppedOn FROM (SELECT id FROM ds_messages WHERE publishedOn IS NULL ORDER BY priority ASC, createdOn ASC LIMIT 1 USING INDEX) a, ds_messages d WHERE a.id = d.id;");
+			rs = stmt.executeQuery();
+			if (rs != null && rs.next()) {
+				msg  = buildDataMessage(rs);
+			}
+		}
+		catch (Exception e) {
+			throw new KuraStoreException(e, "Cannot get message next message");
+		}
+		finally {
+			close(rs);
+			close(stmt);
+			close(conn);
+		}
+		return msg;
+    }
+    
+	public synchronized void published(int msgId, int publishedMsgId, String sessionId) throws KuraStoreException {
+		final String sql = "UPDATE ds_messages SET publishedOn = ?, publishedMessageId = ?, sessionId = ? WHERE id = ?;";
+		
+		Timestamp now = new Timestamp((new Date()).getTime());
+
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement(sql);			
+			stmt.setTimestamp(1, now, m_utcCalendar); // timestamp
+			stmt.setInt      (2, publishedMsgId);
+			stmt.setString   (3, sessionId);
+			stmt.setInt      (4, msgId);
+			
+			stmt.execute();
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			throw new KuraStoreException(e, "Cannot update timestamp");
+		}
+		finally {
+			close(stmt);
+			close(conn);
+		}
+	}
+	
+	public synchronized void published(int msgId) throws KuraStoreException {
+		updateTimestamp("UPDATE ds_messages SET publishedOn = ? WHERE id = ?;", msgId);
+	}
+
+	public synchronized void confirmed(int msgId) throws KuraStoreException {
+		updateTimestamp("UPDATE ds_messages SET confirmedOn = ? WHERE id = ?;", msgId);
+	}
+    
+    public synchronized List<DataMessage> allUnpublishedMessagesNoPayload() throws KuraStoreException {    
+    	// Order by priority, createdOn
+    	return listMessages("SELECT id, topic, qos, retain, createdOn, publishedOn, publishedMessageId, confirmedOn, priority, sessionId, droppedOn FROM ds_messages WHERE publishedOn IS NULL ORDER BY priority ASC, createdOn ASC;");
+    }
+    
+	public synchronized List<DataMessage> allInFlightMessagesNoPayload() throws KuraStoreException {
+    	// Order by priority, createdOn
+		return listMessages("SELECT id, topic, qos, retain, createdOn, publishedOn, publishedMessageId, confirmedOn, priority, sessionId, droppedOn FROM ds_messages WHERE publishedOn IS NOT NULL AND qos > 0 AND confirmedOn IS NULL AND droppedOn IS NULL ORDER BY priority ASC, createdOn ASC;");
+	}
+	
+	public synchronized List<DataMessage> allDroppedInFlightMessagesNoPayload() throws KuraStoreException {
+    	// Order by priority, createdOn
+    	return listMessages("SELECT id, topic, qos, retain, createdOn, publishedOn, publishedMessageId, confirmedOn, priority, sessionId, droppedOn FROM ds_messages WHERE droppedOn IS NOT NULL ORDER BY priority ASC, createdOn ASC;");		
+	}
+    
+	public synchronized void unpublishAllInFlighMessages() throws KuraStoreException {
+		execute("UPDATE ds_messages SET publishedOn = NULL WHERE publishedOn IS NOT NULL AND qos > 0 AND confirmedOn IS NULL;");			
+	}
+	
+	public synchronized void dropAllInFlightMessages()  throws KuraStoreException {
+		updateTimestamp("UPDATE ds_messages SET droppedOn = ? WHERE publishedOn IS NOT NULL AND qos > 0 AND confirmedOn IS NULL;");
+	}
+    
+    public synchronized void deleteStaleMessages(int purgeAge) throws KuraStoreException {
+    	Timestamp now = new Timestamp((new Date()).getTime());
+    	// Delete dropped messages (published with QoS > 0)
+    	execute("DELETE FROM ds_messages WHERE DATEDIFF('ss', droppedOn, ?) > ? AND droppedOn IS NOT NULL;", now, purgeAge);
+    	// Delete stale confirmed messages (published with QoS > 0)
+    	execute("DELETE FROM ds_messages WHERE DATEDIFF('ss', confirmedOn, ?) > ? AND confirmedOn IS NOT NULL;", now, purgeAge);
+    	// Delete stale published messages with QoS == 0
+    	execute("DELETE FROM ds_messages WHERE qos = 0 AND DATEDIFF('ss', publishedOn, ?) > ? AND publishedOn IS NOT NULL;", now, purgeAge);
+	}
+	
+    public synchronized void defrag() throws KuraStoreException {
+    	execute("CHECKPOINT DEFRAG"); // regains the disk space
+    }
+    
+    public synchronized void checkpoint() throws KuraStoreException {
+    	execute("CHECKPOINT");
+    }
+    
+    public synchronized void repair() throws KuraStoreException {
+    	// See:
+    	// https://sourceforge.net/p/hsqldb/discussion/73674/thread/a08046eb/#7960
+		ResultSet rs = null;
+		Connection conn = null;
+		PreparedStatement pstmt = null;
+		Statement stmt = null;
+		int count = -1;
+		try {			
+			
+			conn = getConnection();
+			// Get the count of IDs for which duplicates exist
+			pstmt = conn.prepareStatement("SELECT count(*) FROM (SELECT id, COUNT(id) FROM ds_messages GROUP BY id HAVING (COUNT(id) > 1)) dups;");
+			rs = pstmt.executeQuery();
+			if (rs.next()) {
+				count = rs.getInt(1);
+			}
+			
+			if (count <= 0) {
+				return;
+			}
+			
+			s_logger.error("Found messages with duplicate ID. Count of IDs for which duplicates exist: {}. Attempting to repair...", count);
+			
+			stmt = conn.createStatement();
+			
+			stmt.execute("ALTER TABLE ds_messages DROP PRIMARY KEY;");
+			s_logger.info("Primary key dropped");
+			
+			stmt.execute("DELETE FROM ds_messages WHERE id IN (SELECT id FROM ds_messages GROUP BY id HAVING COUNT(*) > 1);");
+			s_logger.info("Duplicate messages deleted");
+			
+			stmt.execute("ALTER TABLE ds_messages ADD PRIMARY KEY (id);");
+			s_logger.info("Primary key created");
+			
+			conn.commit();
+			
+			stmt.execute("CHECKPOINT DEFRAG");
+			s_logger.info("Checkpoint defrag");
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			throw new KuraStoreException(e, "Cannot repair database");
+		}
+		finally {
+			close(rs);
+			close(pstmt);
+			close(stmt);
+			close(conn);
+		}
+    }
+    
+	// ------------------------------------------------------------------
+	//
+	//      Private Methods  
+	//
+	// ------------------------------------------------------------------    
+    
+    
+    private synchronized void updateTimestamp(String sql, Integer... msgIds) throws KuraStoreException 
+    {
+		Timestamp now = new Timestamp((new Date()).getTime());
+
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement(sql);
+			stmt.setTimestamp(1, now, m_utcCalendar); // timestamp
+
+			for (int i=0; i<msgIds.length; i++) {
+			    stmt.setInt(2+i, msgIds[i]);  // messageId
+			}
+			stmt.execute();
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			throw new KuraStoreException(e, "Cannot update timestamp");
+		}
+		finally {
+			close(stmt);
+			close(conn);
+		}
+    }
+    
+    private synchronized List<DataMessage> listMessages(String sql, Integer... params) throws KuraStoreException 
+    {    	
+    	List<DataMessage> msgs = new ArrayList<DataMessage>();
+    	
+		ResultSet rs = null;
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement(sql);
+			if (params != null) {
+				for (int i=0; i<params.length; i++) {
+					stmt.setInt(2+i, params[i]);  // timeInterval
+				}
+			}
+			
+			rs   = stmt.executeQuery();			
+			msgs = buildDataMessagesNoPayload(rs);
+		}
+		catch (Exception e) {
+			throw new KuraStoreException(e, "Cannot list messages");
+		}
+		finally {
+			close(rs);
+			close(stmt);
+			close(conn);
+		}
+		
+		return msgs;
+    }
+
+    private synchronized void execute(String sql, Integer... params) throws KuraStoreException 
+    {
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement(sql);
+			for (int i=0; i<params.length; i++) {
+			    stmt.setInt(1+i, params[i]); 
+			}
+			stmt.execute();
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			throw new KuraStoreException(e, "Cannot execute query");
+		}
+		finally {
+			close(stmt);
+			close(conn);
+		}
+    }
+    
+    private synchronized void execute(String sql, Timestamp timestamp, Integer... params) throws KuraStoreException 
+    {
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = getConnection();
+			stmt = conn.prepareStatement(sql);
+			if (timestamp != null) {
+				stmt.setTimestamp(1, timestamp, m_utcCalendar);
+			}
+			for (int i=0; i<params.length; i++) {
+			    stmt.setInt(2+i, params[i]); 
+			}
+			stmt.execute();
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			throw new KuraStoreException(e, "Cannot execute query");
+		}
+		finally {
+			close(stmt);
+			close(conn);
+		}
+    }
+
+    
+    // ------------------------------------------------------------------
+	//
+	//      Private Methods: Connection Management  
+	//
+	// ------------------------------------------------------------------    
+
+    
+    private List<DataMessage> buildDataMessagesNoPayload(ResultSet rs) 
+    		throws SQLException, IOException
+    {
+    	List<DataMessage> messages = new ArrayList<DataMessage>();
+    	while (rs.next()) {    		
+    		messages.add(buildDataMessageNoPayload(rs));
+    	}
+    	return messages;
+    }
+    
+	private DataMessage buildDataMessageNoPayload(ResultSet rs) 
+		throws SQLException 
+	{
+		DataMessage.Builder builder = buildDataMessageBuilder(rs);
+		return builder.build();		
+	}
+	
+	private DataMessage buildDataMessage(ResultSet rs) 
+		throws SQLException 
+	{
+		DataMessage.Builder builder = buildDataMessageBuilder(rs);
+		builder = builder.withPayload(rs.getBytes("payload"));
+		return builder.build();
+	}
+
+	private DataMessage.Builder buildDataMessageBuilder(ResultSet rs)
+			throws SQLException 
+	{
+		DataMessage.Builder builder;
+		builder = new DataMessage.Builder(rs.getInt("id"))
+									    .withTopic(rs.getString("topic"))
+									    .withQos(rs.getInt("qos"))
+									    .withRetain(rs.getBoolean("retain"))
+									    .withCreatedOn(rs.getTimestamp("createdOn", m_utcCalendar))
+									    .withPublishedOn(rs.getTimestamp("publishedOn", m_utcCalendar))
+                                        .withPublishedMessageId(rs.getInt("publishedMessageId"))
+									    .withConfirmedOn(rs.getTimestamp("confirmedOn", m_utcCalendar))
+									    .withPriority(rs.getInt("priority"))
+									    .withSessionId(rs.getString("sessionId"))
+									    .withDroppedOn(rs.getTimestamp("droppedOn"));
+		return builder;
+	}
+    
+	private Connection getConnection() throws SQLException {	    
+		return m_dbService.getConnection();
+	}
+	
+	private void rollback(Connection conn) {
+		m_dbService.rollback(conn);
+	}
+	
+	private void close(ResultSet... rss) {
+		m_dbService.close(rss);
+	}
+
+	private void close(Statement... stmts) {
+		m_dbService.close(stmts);
+	}
+
+	private void close(Connection conn) {
+		m_dbService.close(conn);
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/store/HouseKeeperTask.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/store/HouseKeeperTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..6615fc30150182cfb8257c8861ada3cd90c9b1fb
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/store/HouseKeeperTask.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data.store;
+
+import org.eclipse.kura.KuraStoreException;
+import org.eclipse.kura.core.data.DataStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Housekeeper Task which periodically purges confirmed messages from the local database.
+ * It also contains the total number of messages in the system to a given cap. 
+ */
+public class HouseKeeperTask implements Runnable 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(HouseKeeperTask.class);
+	
+    private int               m_purgeAge;
+    private boolean			  m_doCheckpoint;
+	private DataStore         m_store;
+	
+	public HouseKeeperTask(DataStore store, int purgeAge, boolean doCheckpoint)
+	{
+		m_purgeAge = purgeAge;
+		m_doCheckpoint = doCheckpoint;
+		m_store  = store;
+	}
+	
+	
+	@Override
+	public void run()
+	{	
+		try {
+			Thread.currentThread().setName(getClass().getSimpleName());
+			s_logger.info("HouseKeeperTask started.");
+
+			//
+			// check and attempt to repair the store
+			s_logger.info("HouseKeeperTask: Check store...");
+			m_store.repair();
+
+			//
+			// delete all confirmed messages
+			s_logger.info("HouseKeeperTask: Delete confirmed messages...");	
+			m_store.deleteStaleMessages(m_purgeAge);
+
+			// delete overflowing messages
+			//			s_logger.info("HouseKeeperTask: Delete overflow messages...");
+			//			String maxNumMsgsStr = m_config.getProperty("data.service.store.max_number_of_messages");			
+			//			int maxNumMsgs = Integer.parseInt(maxNumMsgsStr);			
+			//			m_store.deleteOverflowMessages(maxNumMsgs);
+
+			if (m_doCheckpoint) {
+				s_logger.info("HouseKeeperTask: Performing store checkpoint with defrag...");
+				m_store.defrag();
+			}
+			
+			s_logger.info("HouseKeeperTask ended.");
+		}
+		//
+		// do not throw the exception as that will stop future executions
+		catch (KuraStoreException me) {
+			s_logger.warn("HouseCleaningTask exception", me);
+		}
+		catch (Throwable t) {
+			if (t instanceof InterruptedException) {
+				s_logger.info("HouseCleaningTask stopped");
+			}
+			else {
+				s_logger.warn("HouseCleaningTask exception", t);
+			}
+		}
+	}    	
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/DataTransportListeners.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/DataTransportListeners.java
new file mode 100644
index 0000000000000000000000000000000000000000..c79d99eb88a81773955581ff89f2541658ba0a2a
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/DataTransportListeners.java
@@ -0,0 +1,166 @@
+package org.eclipse.kura.core.data.transport.mqtt;
+
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.kura.data.DataTransportListener;
+import org.eclipse.kura.data.DataTransportToken;
+
+class DataTransportListeners implements DataTransportListener {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(DataTransportListeners.class);
+	
+	private ServiceTracker<DataTransportListener, DataTransportListener> m_listenersTracker;
+	
+	public DataTransportListeners(ServiceTracker<DataTransportListener, DataTransportListener> listenersTracker) {
+		super();
+		this.m_listenersTracker = listenersTracker;
+	}
+	
+	public synchronized void close() {
+		if (m_listenersTracker.getTrackingCount() != -1) {
+			m_listenersTracker.close();
+		}
+	}
+
+	@Override
+	public void onConnectionEstablished(boolean newSession) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onConnectionEstablished(newSession);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onDisconnecting() {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onDisconnecting();
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onDisconnected() {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onDisconnected();
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onConfigurationUpdating(boolean wasConnected) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onConfigurationUpdating(wasConnected);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onConfigurationUpdated(boolean wasConnected) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onConfigurationUpdated(wasConnected);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onConnectionLost(Throwable cause) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onConnectionLost(cause);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void onMessageArrived(String topic, byte[] payload, int qos,
+			boolean retained) {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onMessageArrived(topic,
+							payload, qos, retained);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		} else {
+			s_logger.info("No registered services. Ignoring arrived message");
+		}
+	}
+
+	@Override
+	public void onMessageConfirmed(DataTransportToken token) {
+		openOnce();
+				
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((DataTransportListener) listener).onMessageConfirmed(token);
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		} else {
+			s_logger.info("No registered services. Ignoring message delivery confirm");
+		}
+	}
+
+	private synchronized void openOnce() {
+		if (m_listenersTracker.getTrackingCount() == -1) {
+			m_listenersTracker.open();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/MqttClientConfiguration.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/MqttClientConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..566302597672486ddf9f8db63d4714c4308151ca
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/MqttClientConfiguration.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data.transport.mqtt;
+
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+
+public class MqttClientConfiguration {
+	private String brokerUrl;
+	private String clientId;
+	private PersistenceType persistenceType;
+	private MqttConnectOptions connectOptions;
+	
+	public enum PersistenceType {
+		FILE,
+		MEMORY
+	};
+
+	public MqttClientConfiguration(String brokerUrl, String clientId,
+			PersistenceType persistenceType,
+			MqttConnectOptions connectOptions) {
+		super();
+		this.brokerUrl = brokerUrl;
+		this.clientId = clientId;
+		this.persistenceType = persistenceType;
+		this.connectOptions = connectOptions;
+	}
+
+	public String getBrokerUrl() {
+		return brokerUrl;
+	}
+
+	public String getClientId() {
+		return clientId;
+	}
+	
+	public PersistenceType getPersistenceType() {
+		return this.persistenceType;
+	}
+
+	public MqttConnectOptions getConnectOptions() {
+		return connectOptions;
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/MqttDataTransport.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/MqttDataTransport.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c9ce6734fe8b148f4788e89a613c8c46931cbe3
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/transport/mqtt/MqttDataTransport.java
@@ -0,0 +1,899 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.data.transport.mqtt;
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.net.ssl.SSLSocketFactory;
+
+import org.eclipse.kura.KuraConnectException;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.KuraNotConnectedException;
+import org.eclipse.kura.KuraTimeoutException;
+import org.eclipse.kura.KuraTooManyInflightMessagesException;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.core.data.transport.mqtt.MqttClientConfiguration.PersistenceType;
+import org.eclipse.kura.core.util.ValidationUtil;
+import org.eclipse.kura.data.DataTransportListener;
+import org.eclipse.kura.data.DataTransportService;
+import org.eclipse.kura.data.DataTransportToken;
+import org.eclipse.kura.ssl.SslManagerService;
+import org.eclipse.kura.ssl.SslServiceListener;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.IMqttToken;
+import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttClientPersistence;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MqttDataTransport implements DataTransportService, MqttCallback, ConfigurableComponent, SslServiceListener 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(MqttDataTransport.class);
+
+	private static final String MQTT_SCHEME = "mqtt://";
+	private static final String MQTTS_SCHEME = "mqtts://";
+	// TODO: add mqtt+ssl for secure mqtt
+	
+	private static final String TOPIC_PATTERN = "#([^\\s/]+)"; // '#' followed by one or more non-whitespace but not the '/'
+	private static final Pattern s_topicPattern = Pattern.compile(TOPIC_PATTERN);
+
+	private SystemService     m_systemService;
+	private SslManagerService m_sslManagerService;
+	
+	private MqttAsyncClient m_mqttClient;
+
+	private DataTransportListeners m_dataTransportListeners;
+		
+	private MqttClientConfiguration m_clientConf;
+	private boolean m_newSession;
+	private String m_sessionId;
+	
+	PersistenceType m_persistenceType;
+	MqttClientPersistence m_persistence;
+	
+	private Map<String, String> m_topicContext = new HashMap<String, String>();
+	private Map<String, Object> m_properties = new HashMap<String, Object>();
+
+	private static final String MQTT_BROKER_URL_PROP_NAME = "broker-url";
+	private static final String MQTT_USERNAME_PROP_NAME = "username";
+	private static final String MQTT_PASSWORD_PROP_NAME = "password";
+	private static final String MQTT_CLIENT_ID_PROP_NAME = "client-id";
+	private static final String MQTT_KEEP_ALIVE_PROP_NAME = "keep-alive";
+	private static final String MQTT_CLEAN_SESSION_PROP_NAME = "clean-session";
+	private static final String MQTT_TIMEOUT_PROP_NAME = "timeout"; // All timeouts
+	
+	private static final String MQTT_LWT_QOS_PROP_NAME = "lwt.qos";
+	private static final String MQTT_LWT_RETAIN_PROP_NAME = "lwt.retain";
+	private static final String MQTT_LWT_TOPIC_PROP_NAME = "lwt.topic";
+	private static final String MQTT_LWT_PAYLOAD_PROP_NAME = "lwt.payload";
+
+	private static final String CLOUD_ACCOUNT_NAME_PROP_NAME = "topic.context.account-name";
+
+	private static final String PERSISTENCE_TYPE_PROP_NAME = "in-flight.persistence";
+	
+	private static final String TOPIC_ACCOUNT_NAME_CTX_NAME = "account-name";
+	private static final String TOPIC_DEVICE_ID_CTX_NAME = "client-id";
+	
+	
+    // ----------------------------------------------------------------
+    //
+    //   Dependencies
+    //
+    // ----------------------------------------------------------------
+
+    public void setSystemService(SystemService systemService) {
+        this.m_systemService = systemService;
+    }
+
+    public void unsetSystemService(SystemService systemService) {
+        this.m_systemService = null;
+    }
+
+    public void setSslManagerService(SslManagerService sslManagerService) {
+        this.m_sslManagerService = sslManagerService;
+    }
+
+    public void unsetSslManagerService(SslManagerService sslManagerService) {
+        this.m_sslManagerService= null;
+    }
+    
+    
+	// ----------------------------------------------------------------
+	//
+	// Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext,
+							Map<String, Object> properties) 
+	{
+		s_logger.info("Activating...");
+
+		// We need to catch the configuration exception and activate anyway.
+		// Otherwise the ConfigurationService will not be able to track us.
+		m_properties.putAll(properties);
+		try {
+			m_clientConf = buildConfiguration(m_properties);
+			setupMqttSession();
+		} catch (RuntimeException e) {
+			s_logger.error(
+					"Invalid client configuration. Service will not be able to connect until the configuration is updated",
+					e);
+		}
+				
+		ServiceTracker<DataTransportListener, DataTransportListener> listenersTracker = new ServiceTracker<DataTransportListener, DataTransportListener>(
+				componentContext.getBundleContext(),
+				DataTransportListener.class, null);
+		
+		// Deferred open of tracker to prevent
+		// java.lang.Exception: Recursive invocation of ServiceFactory.getService
+		// on ProSyst
+		m_dataTransportListeners = new DataTransportListeners(listenersTracker);
+		
+		// Do nothing waiting for the connect request from the upper layer.
+	}
+
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.debug("Deactivating...");
+
+		// Before deactivating us, the OSGi container should have first
+		// deactivated all dependent components.
+		// They should be able to complete whatever is needed,
+		// e.g. publishing a special last message,
+		// synchronously in their deactivate method and disconnect us cleanly.
+		// There shouldn't be anything to do here other then
+		// perhaps forcibly disconnecting the MQTT client if not already done.
+		if (isConnected()) {
+			disconnect(0);
+		}
+		
+		m_dataTransportListeners.close();
+	}
+
+	public void updated(Map<String, Object> properties) 
+	{
+		s_logger.info("Updating...");
+		
+		m_properties.clear();
+		m_properties.putAll(properties);
+
+		update();
+		
+	}
+	
+	private void update() {
+		boolean wasConnected = isConnected();
+		
+		// First notify the Listeners
+		// We do nothing other than notifying the listeners which may later
+		// request to disconnect and reconnect again.
+		m_dataTransportListeners.onConfigurationUpdating(wasConnected);
+
+		// Then update the configuration
+		// Throwing a RuntimeException here is fine.
+		// Listeners will not be notified of an invalid configuration update.
+		s_logger.info("Building new configuration...");
+		m_clientConf = buildConfiguration(m_properties);
+
+		// We do nothing other than notifying the listeners which may later
+		// request to disconnect and reconnect again.
+		m_dataTransportListeners.onConfigurationUpdated(wasConnected);
+	}
+
+
+    // ----------------------------------------------------------------
+    //
+    //   Service APIs
+    //
+    // ----------------------------------------------------------------
+
+	public synchronized void connect() throws KuraConnectException 
+	{
+		// We treat this as an application bug.
+		if (isConnected()) {
+			s_logger.error("Already connected");
+			throw new IllegalStateException("Already connected");
+			// TODO: define an KuraRuntimeException
+		}
+		
+		// Attempt to setup the MQTT session
+	    setupMqttSession();
+		
+		if (m_mqttClient == null) {
+			s_logger.error("Invalid configuration");
+			throw new IllegalStateException("Invalid configuration");
+			// TODO: define an KuraRuntimeException
+		}
+
+		s_logger.info("# ------------------------------------------------------------");
+		s_logger.info("#  Connection Properties");
+		s_logger.info("#  broker    = " + m_clientConf.getBrokerUrl());
+		s_logger.info("#  clientId  = " + m_clientConf.getClientId());
+		s_logger.info("#  username  = "
+				+ m_clientConf.getConnectOptions().getUserName());
+		s_logger.info("#  password  = XXXXXXXXXXXXXX");
+		s_logger.info("#  keepAlive = "
+				+ m_clientConf.getConnectOptions().getKeepAliveInterval());
+		s_logger.info("#  timeout   = "
+				+ m_clientConf.getConnectOptions().getConnectionTimeout());
+		s_logger.info("#  cleanSession    = "
+				+ m_clientConf.getConnectOptions().isCleanSession());
+		s_logger.info("#  willDestination = "
+				+ m_clientConf.getConnectOptions().getWillDestination());
+		s_logger.info("#  willMessage     = "
+				+ m_clientConf.getConnectOptions().getWillMessage()); 
+		s_logger.info("#");
+		s_logger.info("#  Connecting...");
+		
+		//
+		// connect
+		try {
+			IMqttToken connectToken = m_mqttClient.connect(m_clientConf
+					.getConnectOptions());
+			connectToken.waitForCompletion(getTimeToWaitMillis() * 3);
+			s_logger.info("#  Connected!");
+			s_logger.info("# ------------------------------------------------------------");
+		} 
+		catch (MqttException e) {
+			s_logger.warn("Connect failed. Forcing disconnect.", e);
+			try { 				
+				// FIXME: Close on CONNACK timeout.
+				// This exposes a Paho bug!
+				// If a connection is established, by mistake, to a non-MQTT server, e.g. to an SSH server,
+				// Paho will wait for a VERY long time (forever?) to get the MQTT CONNACK.
+				// We can wait on the connectToken specifying a shorter timeout.
+				// Upon connect timeout, we can:
+				//  - call disconnect(0), but this does not work and an "Already Disconnecting" exception will be raised on the next connect attempt.
+				//  - call close(), but this does not work and an "Already in Use Persistence" exception will be raised when retrying the connect on a new instance.
+				m_mqttClient.close();
+			}
+			catch (Exception de) {
+				s_logger.warn("Forced disconnect exception.", de);
+			}
+			finally {
+				m_mqttClient = null;
+			}
+			throw new KuraConnectException(e, "Cannot connect");
+		}
+
+		//
+		// notify the listeners
+		m_dataTransportListeners.onConnectionEstablished(m_newSession);
+	}
+
+	public boolean isConnected() {
+		if (m_mqttClient != null) {
+			return m_mqttClient.isConnected();
+		}
+		return false;
+	}
+	
+	public String getBrokerUrl() {
+		if (m_clientConf != null) {
+			return m_clientConf.getBrokerUrl();
+		}
+		return "";
+	}
+	
+	public String getAccountName() {
+		if (m_clientConf != null) {
+			return m_topicContext.get(TOPIC_ACCOUNT_NAME_CTX_NAME);
+		}
+		return "";
+	}
+	
+	public String getUsername() {
+		if (m_clientConf != null) {
+			return m_clientConf.getConnectOptions().getUserName();
+		}
+		return "";
+	}
+	
+	@Override
+	public String getClientId() {
+		if (m_clientConf != null) {
+			return m_clientConf.getClientId();
+		}
+		return "";
+	}
+
+	// TODO: java.lang.reflect.Proxy for every listener in order to catch runtime exceptions thrown by listener implementor and log them.
+	
+	public synchronized void disconnect(long quiesceTimeout) 
+	{
+		// Disconnect the client if it's connected. If it fails log the
+		// exception.
+		// Don't throw an exception because the caller would not
+		// be able to handle it.
+		if (isConnected()) {
+			s_logger.info("Disconnecting...");
+			
+			//
+			// notify the listeners
+			m_dataTransportListeners.onDisconnecting();
+			
+			try {
+				IMqttToken token = m_mqttClient.disconnect(quiesceTimeout);
+				token.waitForCompletion(getTimeToWaitMillis());
+				s_logger.info("Disconnected");
+			} catch (MqttException e) {
+				s_logger.error("Disconnect failed", e);
+			}
+			
+			//
+			// notify the listeners
+			m_dataTransportListeners.onDisconnected();
+		} else {
+			s_logger.warn("MQTT client already disconnected");
+		}
+	}
+
+	// ---------------------------------------------------------
+	//
+	// Subscription Management Methods
+	//
+	// ---------------------------------------------------------
+
+	@Override
+	public void subscribe(String topic, int qos) throws KuraTimeoutException, KuraException, KuraNotConnectedException {
+				
+		if (m_mqttClient == null || !m_mqttClient.isConnected()) {
+			throw new KuraNotConnectedException("Not connected");
+		}
+		
+		topic = replaceTopicVariables(topic);
+		
+		s_logger.info("Subscribing to topic: {} with QoS: {}", topic, qos);
+		
+		try {
+			IMqttToken token = m_mqttClient.subscribe(topic, qos);
+			token.waitForCompletion(getTimeToWaitMillis());
+		} catch (MqttException e) {
+			if (e.getReasonCode() == MqttException.REASON_CODE_CLIENT_TIMEOUT) {
+				s_logger.warn("Timeout subscribing to topic: {}", topic);
+				throw new KuraTimeoutException(
+						"Timeout subscribing to topic: " + topic, e);
+			} else {
+				s_logger.error("Cannot subscribe to topic: " + topic, e);
+				throw KuraException.internalError(e, "Cannot subscribe to topic: " + topic);
+			}
+		}
+	}
+
+	@Override
+	public void unsubscribe(String topic) throws KuraTimeoutException, KuraException, KuraNotConnectedException {
+		
+		if (m_mqttClient == null || !m_mqttClient.isConnected()) {
+			throw new KuraNotConnectedException("Not connected");
+		}
+		
+		topic = replaceTopicVariables(topic);
+		
+		s_logger.info("Unsubscribing to topic: {}", topic);
+		
+		try {
+			IMqttToken token = m_mqttClient.unsubscribe(topic);
+			token.waitForCompletion(getTimeToWaitMillis());
+		} catch (MqttException e) {
+			if (e.getReasonCode() == MqttException.REASON_CODE_CLIENT_TIMEOUT) {
+				s_logger.warn("Timeout unsubscribing to topic: {}", topic);
+				throw new KuraTimeoutException(
+						"Timeout unsubscribing to topic: " + topic, e);
+			} else {
+				s_logger.error("Cannot unsubscribe to topic: " + topic, e);
+				throw KuraException.internalError(e, "Cannot unsubscribe to topic: " + topic);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.kura.data.DataPublisherService#publish(java.lang.String
+	 * , byte[], int, boolean)
+	 * 
+	 * DataConnectException this can be easily recovered connecting the service.
+	 * TooManyInflightMessagesException the caller SHOULD retry publishing the
+	 * message at a later time. RuntimeException (unchecked) all other
+	 * unrecoverable faults that are not recoverable by the caller.
+	 */
+	@Override
+	public DataTransportToken publish(String topic, byte[] payload, int qos, boolean retain)
+			throws KuraTooManyInflightMessagesException, KuraException, KuraNotConnectedException {
+				
+		if (m_mqttClient == null || !m_mqttClient.isConnected()) {
+			throw new KuraNotConnectedException("Not connected");
+		}
+		
+		topic = replaceTopicVariables(topic);
+
+		s_logger.info("Publishing message on topic: {} with QoS: {}", topic, qos);
+		
+		MqttMessage message = new MqttMessage();
+		message.setPayload(payload);
+		message.setQos(qos);
+		message.setRetained(retain);
+
+		Integer messageId = null;
+		try {
+			IMqttDeliveryToken token = m_mqttClient.publish(topic, message);
+			// At present Paho ALWAYS allocates (gets and increments) internally a message ID,
+			// even for messages published with QoS == 0.
+			// Of course, for QoS == 0 this "internal" message ID will not hit the wire.
+			// On top of that, messages published with QoS == 0 are confirmed
+			// in the deliveryComplete callback.
+			// Another implementation might behave differently
+			// and only allocate a message ID for messages published with QoS > 0.
+			// We don't want to rely on this and only return and confirm IDs
+			// of messages published with QoS > 0.
+			s_logger.debug("Published message with ID: {}", token.getMessageId());
+			if (qos > 0) {
+				messageId = Integer.valueOf(token.getMessageId());
+			}
+		} catch (MqttPersistenceException e) {
+			// This is probably an unrecoverable internal error
+			s_logger.error("Cannot publish on topic: {}", topic, e);
+			throw new IllegalStateException("Cannot publish on topic: " + topic, e);
+		} catch (MqttException e) {
+			if (e.getReasonCode() == MqttException.REASON_CODE_MAX_INFLIGHT) {
+				s_logger.info("Too many inflight messages");
+				throw new KuraTooManyInflightMessagesException(e, "Too many in-fligh messages");
+			} else {
+				s_logger.error("Cannot publish on topic: " + topic, e);
+				throw KuraException.internalError(e, "Cannot publish on topic: " + topic);
+			}
+		}
+
+		DataTransportToken token = null;
+		if (messageId != null) {
+			token = new DataTransportToken(messageId, m_sessionId);
+		}
+		
+		return token;
+	}
+
+	// ---------------------------------------------------------
+	//
+	// MqttCallback methods
+	//
+	// ---------------------------------------------------------
+	@Override
+	public void connectionLost(final Throwable cause) {
+		s_logger.warn("Connection Lost", cause);
+
+		// notify the listeners
+		m_dataTransportListeners.onConnectionLost(cause);
+	}
+
+	@Override 
+	public void deliveryComplete(IMqttDeliveryToken token) {
+		
+		if (token == null) {
+			s_logger.error("null token");
+			return;
+		}
+
+		// Weird, tokens related to messages published with QoS > 0 have a null nested message
+		
+		MqttMessage msg = null;
+		try {
+			msg = token.getMessage();
+		} catch (MqttException e) {
+			s_logger.error("Cannot get message", e);
+			return;
+		}
+		
+		if (msg != null) {
+			// Note that Paho call this also for messages published with QoS == 0.
+			// We don't want to rely on that and we drop asynchronous confirms for QoS == 0.
+			int qos = msg.getQos();
+			
+			if (qos == 0) {
+				s_logger.debug("Ignoring deliveryComplete for messages published with QoS == 0");
+				return;
+			}
+		}
+		
+		int id = token.getMessageId();
+		
+		s_logger.debug("Delivery complete for message with ID: {}", id);
+		
+		// FIXME: We should be more selective here and only call the listener
+		// that actually published the message.
+		// Anyway we don't have such a mapping and so the publishers MUST track their own
+		// identifiers and filter confirms.
+		
+		// FIXME: it can happen that the listener that has published the message has not come up yet.
+		// This is the scenario:
+		// * Paho has some in-flight messages.
+		// * Kura gets stopped, crashes or the power is removed.
+		// * Kura starts again, Paho connects and restores in-flight messages from its persistence.
+		// * These messages are delivered (this callback gets called) before the publisher (also a DataPublisherListener)
+		// * has come up (not yet tracked by the OSGi container).
+		// These confirms will be lost!
+		
+		// notify the listeners
+		DataTransportToken dataPublisherToken = new DataTransportToken(id, m_sessionId);		
+		m_dataTransportListeners.onMessageConfirmed(dataPublisherToken);
+	}
+
+	@Override
+	public void messageArrived(String topic, MqttMessage message)
+			throws Exception {
+		
+		s_logger.debug("Message arrived on topic: {}", topic);
+		
+		// FIXME: we should be more selective here and only call the listeners
+		// actually subscribed to this topic.
+		// Anyway we don't have such a mapping so the listeners are responsible to filter messages.
+
+		// FIXME: the same argument about lost confirms applies to arrived messages.
+		
+		// notify the listeners
+		m_dataTransportListeners.onMessageArrived(topic,
+				message.getPayload(), message.getQos(),
+				message.isRetained());
+	}
+
+	private long getTimeToWaitMillis() {
+		// We use the same value for every timeout
+		long timeout = m_clientConf.getConnectOptions().getConnectionTimeout() * 1000L;
+		return timeout;
+	}
+	
+	// ---------------------------------------------------------
+	//
+	// SslServiceListener Overrides
+	//
+	// ---------------------------------------------------------
+	@Override
+	public void onConfigurationUpdated() {
+		// The SSL service was update, build a new socket connection
+		update();
+	}
+
+	/*
+	 * This method builds an internal configuration option needed by the client
+	 * to connect. The configuration is assembled from various sources:
+	 * component configuration, SystemService, NetworkService, etc. The returned
+	 * configuration is valid so no further validation is needed. If a valid
+	 * configuration cannot be assembled the method throws a RuntimeException
+	 * (assuming that this error is unrecoverable).
+	 */
+	private MqttClientConfiguration buildConfiguration(
+			Map<String, Object> properties) {
+
+		MqttClientConfiguration clientConfiguration = null;
+		MqttConnectOptions conOpt = new MqttConnectOptions();
+		String clientId = null;
+		String brokerUrl = null;
+		try {
+			// Configure the client ID
+			clientId = (String) properties.get(MQTT_CLIENT_ID_PROP_NAME);
+			if (clientId == null || clientId.trim().length() == 0) {
+				clientId = m_systemService.getPrimaryMacAddress();
+			}
+			ValidationUtil.notEmptyOrNull(clientId, "clientId");
+
+			// replace invalid token in the client ID as it is used as part of the topicname space
+			clientId = clientId.replace('/', '-');
+			clientId = clientId.replace('+', '-');
+			clientId = clientId.replace('#', '-');
+			
+			// Configure the broker URL
+			brokerUrl = (String) properties.get(MQTT_BROKER_URL_PROP_NAME);
+			ValidationUtil.notEmptyOrNull(brokerUrl, MQTT_BROKER_URL_PROP_NAME);
+			
+			brokerUrl = brokerUrl.trim();
+			brokerUrl = brokerUrl.replaceAll("^" + MQTT_SCHEME,  "tcp://");
+			brokerUrl = brokerUrl.replaceAll("^" + MQTTS_SCHEME, "ssl://");
+			brokerUrl = brokerUrl.replaceAll("/$", "");
+			ValidationUtil.notEmptyOrNull(brokerUrl, "brokerUrl");
+
+			ValidationUtil.notEmptyOrNull(
+					(String) properties.get(MQTT_USERNAME_PROP_NAME),
+					MQTT_USERNAME_PROP_NAME);
+			ValidationUtil.notEmptyOrNull(
+					(String) properties.get(MQTT_PASSWORD_PROP_NAME),
+					MQTT_PASSWORD_PROP_NAME);
+			ValidationUtil.notNegative(
+					(Integer) properties.get(MQTT_KEEP_ALIVE_PROP_NAME),
+					MQTT_KEEP_ALIVE_PROP_NAME);
+			ValidationUtil.notNegative(
+					(Integer) properties.get(MQTT_TIMEOUT_PROP_NAME),
+					MQTT_TIMEOUT_PROP_NAME);
+			
+			ValidationUtil.notNull((Boolean) properties.get(MQTT_CLEAN_SESSION_PROP_NAME), 
+					MQTT_CLEAN_SESSION_PROP_NAME);
+
+			conOpt.setUserName((String) properties.get(MQTT_USERNAME_PROP_NAME));
+			conOpt.setPassword(((String) properties
+					.get(MQTT_PASSWORD_PROP_NAME)).toCharArray());
+			conOpt.setKeepAliveInterval((Integer) properties
+					.get(MQTT_KEEP_ALIVE_PROP_NAME));
+			conOpt.setConnectionTimeout((Integer) properties
+					.get(MQTT_TIMEOUT_PROP_NAME));
+
+			conOpt.setCleanSession((Boolean) properties.get(MQTT_CLEAN_SESSION_PROP_NAME));
+			
+			synchronized (m_topicContext) {
+				m_topicContext.clear();
+				if (properties.get(CLOUD_ACCOUNT_NAME_PROP_NAME) != null) {
+					m_topicContext.put(TOPIC_ACCOUNT_NAME_CTX_NAME, (String) properties.get(CLOUD_ACCOUNT_NAME_PROP_NAME));
+				}
+				m_topicContext.put(TOPIC_DEVICE_ID_CTX_NAME, clientId);
+			}
+			
+			String willTopic = (String) properties.get(MQTT_LWT_TOPIC_PROP_NAME);
+			if (!(willTopic == null || willTopic.isEmpty())) {
+				int willQos = 0;
+				boolean willRetain = false;
+				
+				String willPayload = (String) properties.get(MQTT_LWT_PAYLOAD_PROP_NAME);
+				if (properties.get(MQTT_LWT_QOS_PROP_NAME) != null) {
+					willQos = (Integer) properties.get(MQTT_LWT_QOS_PROP_NAME);
+				}
+				if (properties.get(MQTT_LWT_RETAIN_PROP_NAME) != null) {
+					willRetain = (Boolean) properties.get(MQTT_LWT_RETAIN_PROP_NAME);
+				}
+				
+				willTopic = replaceTopicVariables(willTopic);
+				
+				byte[] payload = {};
+				if (willPayload != null && !willPayload.isEmpty()) {
+					try {
+						payload = willPayload.getBytes("UTF-8");
+					} catch (UnsupportedEncodingException e) {
+						s_logger.error("Unsupported encoding", e);
+					}
+				}
+				
+				conOpt.setWill(willTopic,
+							payload,
+							willQos,
+							willRetain);
+			}			
+		} catch (KuraException e) {
+			s_logger.error("Invalid configuration");
+			throw new IllegalStateException("Invalid MQTT client configuration", e);
+		}
+
+		//
+		// SSL
+		if (brokerUrl.startsWith("ssl")) {
+		    try {
+		        String alias = m_topicContext.get(TOPIC_ACCOUNT_NAME_CTX_NAME);
+			    SSLSocketFactory ssf = m_sslManagerService.getSSLSocketFactory(alias);
+				conOpt.setSocketFactory(ssf);
+			} 
+			catch (Exception e) {
+			    s_logger.error("SSL setup failed", e);
+			    throw new IllegalStateException("SSL setup failed", e);
+			}
+		}
+		
+		String sType = (String) properties.get(PERSISTENCE_TYPE_PROP_NAME);
+		PersistenceType persistenceType = null;
+		if (sType.equals("file")) {
+			persistenceType = PersistenceType.FILE;
+		} else if (sType.equals("memory")) {
+			persistenceType = PersistenceType.MEMORY;
+		} else {
+			throw new IllegalStateException("Invalid MQTT client configuration: persistenceType: " + persistenceType);
+		}
+
+		clientConfiguration = new MqttClientConfiguration(brokerUrl,
+				                                          clientId,
+				                                          persistenceType,
+				                                          conOpt);
+
+		return clientConfiguration;
+	}
+	
+	private String replaceTopicVariables(String topic) 
+	{	
+		boolean found;
+		Matcher topicMatcher = s_topicPattern.matcher(topic);
+		StringBuffer sb = new StringBuffer();
+		do {
+			
+			found = topicMatcher.find();
+			if (found) {
+				// By default replace #variable-name (group 0) with itself
+				String replacement = topicMatcher.group(0);
+
+				// TODO: Try to get variable-name (group 1) from the context
+				String variableName = topicMatcher.group(1);
+				synchronized (m_topicContext) {
+					String value = m_topicContext.get(variableName);
+					if (value != null) {
+						replacement = value;
+					}					
+				}
+
+				// Replace #variable-name with the value of the variable
+				topicMatcher.appendReplacement(sb, replacement);
+			}
+		} while (found);
+
+		topicMatcher.appendTail(sb);
+
+		String replacedTopic = sb.toString();
+
+		s_logger.debug("Replaced tokens in topic {} with: {}", topic, replacedTopic);
+
+		return replacedTopic;
+	}
+	
+	private String generateSessionId() {
+		return m_clientConf.getClientId() + "-" + m_clientConf.getBrokerUrl();
+	}
+	
+	private void setupMqttSession() {
+		
+		if (m_clientConf == null) {
+			throw new IllegalStateException("Invalid client configuration");
+		}
+		
+		// We need to construct a new client instance only if either the broker URL
+		// or the client ID changes.
+		// We also need to construct a new instance if
+		// the persistence type (file or memory) changes.
+		// We MUST avoid to construct a new client instance every time because
+		// in that case the MQTT message ID is reset to 1.
+		if (m_mqttClient != null) {
+			String brokerUrl = m_mqttClient.getServerURI();
+			String clientId = m_mqttClient.getClientId();
+			
+			if (!(brokerUrl.equals(m_clientConf.getBrokerUrl()) &&
+			      clientId.equals(m_clientConf.getClientId()) &&
+			      m_persistenceType == m_clientConf.getPersistenceType())) {
+				try {
+					s_logger.info("Closing client...");
+					m_mqttClient.close();
+					s_logger.info("Closed");
+				} catch (MqttException e) {
+					s_logger.error("Cannot close client", e);
+				} finally {
+					m_mqttClient = null;
+				}
+			}
+		}
+
+		// Connecting with Clean Session flag set to true always starts
+		// a new session.
+		boolean newSession = m_clientConf.getConnectOptions().isCleanSession();
+		
+		if (m_mqttClient == null) {
+			
+			s_logger.info("Creating a new client instance");
+
+			//
+			// Initialize persistence. This is only useful if the client connects with
+			// Clean Session flag set to false.
+			//
+			// Note that when using file peristence,
+			// Paho creates a subdirectory persistence whose name is encoded like this:
+			// cristiano-tcpbroker-stageeveryware-cloudcom1883/
+			// So the persistence is per client ID (cristiano) and broker URL.
+			// If we are connecting to a different broker URL or with a different client ID,
+			// Paho will create a new subdirectory for this MQTT connection.
+			// Closing the old client instance also deletes the associated persistence subdirectory.
+			//
+			// The lesson is:
+			// Reconnecting to the same broker URL with the same client ID will leverage
+			// Paho persistence and the MQTT message ID is always increased (up to the its maximum).
+			// 
+			// Connecting either to a different broker URL or with a different client ID discards persisted
+			// messages and the MQTT client ID is reset.
+			//
+			// We have a problem here where the DataService needs to track in-flight messages, possibly
+			// across different MQTT connections.
+			// These messages will never be confirmed on a different connection.
+			// While we can assume that the client ID never changes because it's typically auto-generated,
+			// we cannot safely assume that the broker URL never changes.
+			//
+			// The above leads to two problems:
+			// The MQTT message ID alone is not sufficient to track an in-flight message
+			// because it can be reset on a different connection.
+			//
+			// On a different connection the DataService should republish the in-flight messages because
+			// Paho won't do that.
+						
+			PersistenceType persistenceType = m_clientConf.getPersistenceType();
+			if (persistenceType == PersistenceType.MEMORY) {
+				s_logger.info("Using memory persistence for in-flight messages");
+				m_persistence = new MemoryPersistence();
+			} else {
+				StringBuffer sb = new StringBuffer();
+				sb.append(m_systemService.getKuraDataDirectory())
+				  .append(m_systemService.getFileSeparator())
+				  .append("paho-persistence");
+				
+				String dir = sb.toString();
+				
+				s_logger.info("Using file persistence for in-flight messages: {}", dir);
+				
+				// Look for "Close on CONNACK timeout" FIXME in this file.
+				// Make sure persistence is closed.
+				// This is needed if the previous connect attempt was
+				// forcibly terminated by closing the client.
+				if (m_persistence != null) {
+					try {
+						m_persistence.close();
+					} catch (MqttPersistenceException e) {
+						s_logger.info("Failed to close persistence. Ignoring exception "+e.getMessage());
+						s_logger.debug("Failed to close persistence. Ignoring exception.", e);
+					}
+				}
+				m_persistence = new MqttDefaultFilePersistence(dir);
+			}
+
+			//
+			// Construct the MqttClient instance
+			MqttAsyncClient mqttClient = null;
+			try {
+				mqttClient = new MqttAsyncClient(m_clientConf.getBrokerUrl(),
+						m_clientConf.getClientId(), m_persistence);
+			} catch (MqttException e) {
+				s_logger.error("Client instantiation failed", e);
+				throw new IllegalStateException("Client instantiation failed", e);
+			}
+
+			mqttClient.setCallback(this);
+
+			m_persistenceType = persistenceType;
+			m_mqttClient = mqttClient;
+
+			if (!m_clientConf.getConnectOptions().isCleanSession()) {
+				// This is tricky.
+				// The purpose of this code is to try to restore pending delivery tokens
+				// from the MQTT client persistence and determine if the next connection
+				// can be considered continuing an existing session.
+				// This is needed to allow the upper layer deciding what to do with the
+				// in-flight messages it is tracking (if any).
+				// If pending delivery tokens are found we assume that the upper layer
+				// is tracking them. In this case we set the newSession flag to false
+				// and notify this in the onConnectionEstablished callback.
+				// The upper layer shouldn't do anything special.
+				//
+				// Otherwise the next upper layer should decide what to do with the
+				// in-flight messages it is tracking (if any), either to republish or 
+				// drop them.
+				IMqttDeliveryToken[] pendingDeliveryTokens = m_mqttClient.getPendingDeliveryTokens();
+				if (pendingDeliveryTokens != null && pendingDeliveryTokens.length != 0) {
+					newSession = false;
+				}
+			}
+		}
+		
+		m_newSession = newSession;
+		m_sessionId = generateSessionId();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/db/HsqlDbServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/db/HsqlDbServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6fca57c88a65f5ecf018a9a67c4e6f6a9566e815
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/db/HsqlDbServiceImpl.java
@@ -0,0 +1,359 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.db;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Map;
+
+import org.eclipse.kura.db.DbService;
+import org.eclipse.kura.system.SystemService;
+import org.hsqldb.jdbc.JDBCPool;
+import org.osgi.service.component.ComponentException;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HsqlDbServiceImpl implements DbService 
+{
+	private static Logger s_logger = LoggerFactory.getLogger(HsqlDbServiceImpl.class);	
+    static {
+
+        // load the driver
+        // Use this way of loading the driver as it is required for OSGi
+        // Just loading the class with Class.forName is not sufficient.
+		try {
+			DriverManager.registerDriver( new org.hsqldb.jdbcDriver());
+		}
+		catch (SQLException e) {
+			throw new RuntimeException(e);
+		}
+    }
+
+    private static final String DB_URL_PROPNAME        	 = "db.service.hsqldb.url";
+    private static final String DB_CACHE_ROWS_PROPNAME   = "db.service.hsqldb.cache_rows";
+	private static final String DB_LOB_FILE_PROPNAME     = "db.service.hsqldb.lob_file_scale";
+	private static final String DB_DEFRAG_LIMIT_PROPNAME = "db.service.hsqldb.defrag_limit";
+	private static final String DB_LOG_DATA_PROPNAME     = "db.service.hsqldb.log_data";
+	private static final String DB_LOG_SIZE_PROPNAME     = "db.service.hsqldb.log_size";
+	private static final String DB_NIO_PROPNAME          = "db.service.hsqldb.nio_data_file";
+	private static final String DB_WRITE_DELAY_MILLIES_PROPNAME = "db.service.hsqldb.write_delay_millis";
+	
+
+	private static final String s_username  = "sa";
+	private static final String s_password  = "";
+	private static final Object s_init_lock = "init lock";
+	private static boolean      s_inited    = false;
+
+	@SuppressWarnings("unused")
+	private ComponentContext m_ctx;
+	private SystemService    m_systemService;
+    private JDBCPool         m_connPool;
+    
+    
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setSystemService(SystemService systemService) {
+		this.m_systemService = systemService;
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+		this.m_systemService = null;
+	}
+
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.info("activate...");
+
+		//
+		// save the bundle context
+		m_ctx = componentContext;
+
+		synchronized (s_init_lock) {
+			if (!s_inited) {
+
+				// get a connection for this Message Store
+				// If this is the first connection, this will result into starting up the database
+				Connection conn = null;
+				try {									
+					conn = getConnection();
+				}
+				catch (SQLException e) {
+					rollback(conn);
+					s_logger.error("Error during HsqdbService startup", e);
+					throw new ComponentException(e);
+				}
+				finally {
+					close(conn);
+				}
+		
+				// init the database
+				// get a connection for this Message Store
+				// If this is the first connection, this will result into starting up the database
+				try {
+					init();
+					s_inited = true;
+				}
+				catch (SQLException e) {
+					s_logger.error("Error during HsqdbService init", e);
+					throw new ComponentException(e);
+				}
+			}			
+		}
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("deactivate...");				
+		try {
+			execute("SHUTDOWN");
+			s_inited = false;
+		}			
+		catch (SQLException e) {
+			s_logger.error("Error during HsqlDbService shutdown", e);
+			throw new ComponentException(e);
+		}
+		
+		try {
+			if (m_connPool != null) {
+				m_connPool.close(0); // no wait
+			    m_connPool = null;
+			}
+		}			
+		catch (SQLException e) {
+			s_logger.error("Error during HsqlDbService connection close", e);
+			throw new ComponentException(e);
+		}
+	}
+	
+	
+
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+    
+	public synchronized Connection getConnection() throws SQLException 
+	{	    
+	    if (m_connPool == null) {
+
+			String url = m_systemService.getProperties().getProperty(DB_URL_PROPNAME);			
+			s_logger.info("Opening database with url: "+url);			
+			    
+		    m_connPool = new JDBCPool();
+		    m_connPool.setUrl(url);
+		    m_connPool.setUser(s_username);
+		    m_connPool.setPassword(s_password);
+	    }
+	    
+        Connection conn = null;
+	    try {
+		    conn = m_connPool.getConnection();
+		}
+		catch (SQLException e) {
+		    s_logger.error("Error getting connection", e);
+		    closeSilently();
+		    throw e;
+		}
+		return conn;
+	}
+	
+	public void rollback(Connection conn) {
+		try {
+			if (conn != null) {
+				conn.rollback();
+			}
+		}
+		catch (SQLException e) {
+			s_logger.error("Error during Connection rollback.", e);
+		}
+	}
+	
+	public void close(ResultSet... rss) {
+		if (rss != null) {
+			for (ResultSet rs : rss) {
+				try {
+					if (rs != null) {
+						rs.close();
+					}
+				}
+				catch (SQLException e) {
+					s_logger.error("Error during ResultSet closing", e);
+				}					
+			}
+		}
+	}
+
+	public void close(Statement... stmts) {
+		if (stmts != null) {
+			for (Statement stmt : stmts) {
+				try {
+					if (stmt != null) {
+						stmt.close();
+					}
+				}
+				catch (SQLException e) {
+					s_logger.error("Error during Statement closing", e);
+				}					
+			}
+		}
+	}
+
+	public void close(Connection conn) {
+		try {
+			if (conn != null) {
+				conn.close();
+			}
+		}
+		catch (SQLException e) {
+			s_logger.error("Error during Connection closing", e);
+		}
+	}
+
+	public boolean isLogDataEnabled() {
+		boolean isLogDataEnabled = true;
+		String sIsLogDataEnabled = m_systemService.getProperties().getProperty(DB_LOG_DATA_PROPNAME);
+		
+		if (sIsLogDataEnabled != null && !sIsLogDataEnabled.isEmpty()) { 
+			isLogDataEnabled = new Boolean(sIsLogDataEnabled);
+		}
+		
+		return isLogDataEnabled;
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private methods
+	//
+	// ----------------------------------------------------------------
+
+	private void init() 
+		throws SQLException 
+	{
+		// concurrency control
+		// Switching from concurrency control MVCC to LOCKS (2PL)
+		// 2PL will lock the whole table on a write but it makes count(*) extremely fast.
+		// As we serialize database access in the DbDataStore, 2PL is a better choice than MVCC.
+		execute("SET DATABASE TRANSACTION CONTROL LOCKS");
+
+		// Transaction Level
+		execute("SET TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED");
+
+		// set auto-commit
+		execute("SET AUTOCOMMIT FALSE");			
+
+		// Sets the write delay_millies property, delay in milliseconds.
+		String writeDelayMillies = m_systemService.getProperties().getProperty(DB_WRITE_DELAY_MILLIES_PROPNAME);
+		if (writeDelayMillies == null || writeDelayMillies.isEmpty()) {
+			writeDelayMillies = "500";
+		}
+		execute("SET FILES WRITE DELAY "+writeDelayMillies+" MILLIS");
+
+
+		// use cache tables by default as they load only part of the data in mem
+		execute("SET DATABASE DEFAULT TABLE TYPE CACHED");
+
+		String cacheRows = m_systemService.getProperties().getProperty(DB_CACHE_ROWS_PROPNAME);
+		if (cacheRows != null && !cacheRows.isEmpty()) {
+			execute("SET FILES CACHE ROWS "+cacheRows);
+		}
+
+		String lobScale = m_systemService.getProperties().getProperty(DB_LOB_FILE_PROPNAME);
+		if (lobScale != null && !lobScale.isEmpty()) {
+			execute("SET FILES LOB SCALE "+lobScale);
+		}
+		
+		String defragLimit = m_systemService.getProperties().getProperty(DB_DEFRAG_LIMIT_PROPNAME);
+		if (defragLimit != null && !defragLimit.isEmpty()) {
+			execute("SET FILES DEFRAG "+defragLimit);
+		}
+	
+		String logData = m_systemService.getProperties().getProperty(DB_LOG_DATA_PROPNAME);
+		if (logData != null && !logData.isEmpty()) {
+			execute("SET FILES LOG "+logData.toUpperCase());
+		}
+		
+		String logSize = m_systemService.getProperties().getProperty(DB_LOG_SIZE_PROPNAME);
+		if (logSize != null && !logSize.isEmpty()) {
+			execute("SET FILES LOG SIZE "+logSize);
+		}
+		
+		String useNio = m_systemService.getProperties().getProperty(DB_NIO_PROPNAME);
+		if (useNio != null && !useNio.isEmpty()) {
+			execute("SET FILES NIO "+useNio.toUpperCase());
+		}
+		
+		// Note: an automatic checkpoint is performed every time the DB is started.
+		
+		// TODO: defrag?
+	    			
+		// for encryption
+//				ResultSet rs = stmt.executeQuery("select CRYPT_KEY('AES', null) from some_table");  
+//				String key = rs.next().getString(1);  
+//				Store the key in a secure place. Now you can create an encrypted DB like so: 
+//				DriverManager.getConnection("jdbc:hsqldb:file:_some_encrypted_db;crypt_key="+key+";crypt_type=AES", "SA", "")
+	}
+	
+
+	private void execute(String sql) throws SQLException 
+    {
+		Connection conn = null;
+		Statement stmt = null;
+		try {			
+			conn = getConnection();
+			stmt = conn.createStatement();
+			stmt.execute(sql);
+			conn.commit();
+		}
+		catch (SQLException e) {
+			rollback(conn);
+			throw e;
+		}
+		finally {
+			close(stmt);
+			close(conn);
+		}
+    }
+	
+	
+	private void closeSilently()
+	{
+	    try {
+	        if (m_connPool != null) {
+	            m_connPool.close(0);
+	        }
+        }
+	    catch (Exception e) {
+            s_logger.warn("Error during HsqlDbService connection close", e);	        
+	    }
+	    finally {
+            m_connPool = null;
+	    }
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/linux/util/LinuxProcessUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/linux/util/LinuxProcessUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..19804537a4aa12d409d9d0a68343937985843514
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/linux/util/LinuxProcessUtil.java
@@ -0,0 +1,255 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.linux.util;
+
+/* 
+ * Copyright (c) 2013 Eurotech Inc. All rights reserved.
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.core.linux.util.ProcessStats;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class LinuxProcessUtil {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(LinuxProcessUtil.class);	
+	
+	public static int start(String command, boolean wait, boolean background) throws Exception {
+		Process proc = null;
+		try {
+			s_logger.info("executing: " + command);
+			proc = ProcessUtil.exec(command);
+			if(wait) {
+    			try {
+    				proc.waitFor();
+    			} catch(InterruptedException e) {
+    				e.printStackTrace();
+    			}
+    
+    			s_logger.info(command + " returned with exit value:" + proc.exitValue());
+    			if(proc.exitValue() > 0) {
+    			    String stdout = getInputStreamAsString(proc.getInputStream());
+    			    String stderr = getInputStreamAsString(proc.getErrorStream());
+    			    s_logger.debug("stdout: " + stdout);
+    			    s_logger.debug("stderr: " + stderr);
+    			}
+    			return proc.exitValue();
+			} else {
+			    return 0;
+			}
+		} catch(Exception e) {
+			throw e;
+		}
+		finally {
+			if(!background) {
+				ProcessUtil.destroy(proc);
+			}
+		}
+	}
+		
+	public static int start(String command) throws Exception {
+	    return LinuxProcessUtil.start(command, true, false);
+	}
+
+	public static int start(String command, boolean wait) throws Exception {
+		return start(command, wait, false);
+	}
+	
+	public static int start(String [] command, boolean wait) throws Exception {
+		StringBuilder cmdBuilder = new StringBuilder();
+		for(String cmd : command) {
+			cmdBuilder.append(cmd).append(' ');
+		}
+		return start(cmdBuilder.toString(), wait);
+	}
+	
+	public static int startBackground(String command, boolean wait) throws Exception {
+		return start(command, wait, true);
+	}
+	
+	public static ProcessStats startWithStats(String command) throws Exception {
+		Process proc = null;
+		try {
+			s_logger.info("executing: " + command);
+			proc = ProcessUtil.exec(command);
+			
+			try {
+				int exitVal = proc.waitFor();
+				s_logger.info(command + " returned with exit value:" + exitVal);
+			} catch(InterruptedException e) {
+				s_logger.error("error executing " + command + " command" + e);
+				//e.printStackTrace();
+			}
+			
+			ProcessStats stats = new ProcessStats(proc);
+			//s_logger.info(command + " returned with exit value:" + proc.exitValue());
+			return stats;
+		} catch(Exception e) {
+			throw e;
+		}
+	}
+	
+	public static ProcessStats startWithStats(String [] command) throws Exception {
+		Process proc = null;
+		try {
+			StringBuilder cmdBuilder = new StringBuilder();
+			for(String cmd : command) {
+				cmdBuilder.append(cmd).append(' ');
+			}
+			s_logger.debug("executing: " + cmdBuilder);
+			proc = ProcessUtil.exec(command);
+			
+			try {
+				int exitVal = proc.waitFor();
+				s_logger.debug(cmdBuilder + " returned with exit value:" + exitVal);
+			} catch(InterruptedException e) {
+				s_logger.error("error executing " + command + " command" + e);
+				//e.printStackTrace();
+			}
+
+			ProcessStats stats = new ProcessStats(proc);
+			//s_logger.debug(cmdBuilder + " returned with exit value:" + proc.exitValue());
+			return stats;
+		} catch(Exception e) {
+			throw e;
+		}
+	}
+
+	public static int getPid(String command) throws Exception {
+		StringTokenizer st = null;
+		String line = null;
+		String pid = null;
+		Process proc = null;
+		try {
+			
+			if(command != null && !command.isEmpty()) {
+    			s_logger.trace("searching process list for " + command);
+    			proc = ProcessUtil.exec("ps -ax");
+    
+    			//get the output
+    			BufferedReader br = new BufferedReader( new InputStreamReader(proc.getInputStream()));
+    			while ((line = br.readLine()) != null) {
+    				st = new StringTokenizer(line);
+    				pid = st.nextToken();
+    				st.nextElement();
+    				st.nextElement();
+    				st.nextElement();
+    				
+    				//get the remainder of the line showing the command that was issued
+    				line = line.substring(line.indexOf(st.nextToken()));
+    				
+    				//see if the line has our command
+    				if(line.indexOf(command) >= 0) {
+    					s_logger.trace("found pid " + pid + " for command: " + command);
+    					return Integer.parseInt(pid);
+    				}
+    			}
+			}
+
+			//return failure
+			return -1;
+		} catch(Exception e) {
+			throw e;
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	public static int getKuraPid() throws Exception {
+		
+		int pid = -1;
+		File kuraPidFile = new File ("/var/run/kura.pid");
+		if (kuraPidFile.exists()) {
+			BufferedReader br;
+			br = new BufferedReader(new FileReader(kuraPidFile));
+			pid = Integer.parseInt(br.readLine());
+			br.close();
+		}
+		return pid;
+	}
+
+	public static boolean stop(int pid) {
+	    return stop(pid, false);
+	}
+	
+	public static boolean kill(int pid) {
+	    return stop(pid, true);
+	}
+	
+	private static boolean stop(int pid, boolean kill) {
+		try {
+		    StringBuffer cmd = new StringBuffer();
+		    cmd.append("kill ");
+		    if(kill) {
+		        cmd.append("-9 ");
+		    }
+		    cmd.append(pid);
+		    
+		    if(kill) {
+		        s_logger.info("attempting to kill -9 pid " + pid);
+		    } else {
+		        s_logger.info("attempting to kill pid " + pid);
+		    }
+		    
+			if(start(cmd.toString()) == 0) {
+				s_logger.info("successfully killed pid " + pid);
+				return true;
+			} else {
+				s_logger.warn("failed to kill pid " + pid);
+				return false;
+			}
+		} catch (Exception e) {
+			s_logger.warn("failed to kill pid " + pid);
+			return false;
+		}
+	}
+	
+	public static boolean killAll(String command) {
+		try {
+			s_logger.info("attempting to kill process " + command);
+			if(start("killall " + command) == 0) {
+				s_logger.info("successfully killed process " + command);
+				return true;
+			} else {
+				s_logger.warn("failed to kill process " + command);
+				return false;
+			}
+		} catch (Exception e) {
+			s_logger.warn("failed to kill process " + command);
+			return false;
+		}
+	}
+	
+
+    public static String getInputStreamAsString(InputStream stream)
+            throws IOException {
+        StringBuffer sb = new StringBuffer();
+        BufferedReader br = new BufferedReader(new InputStreamReader(stream));
+        char[] cbuf = new char[1024];
+        int len;
+        while((len = br.read(cbuf)) > 0) {
+            sb.append(cbuf, 0, len);
+        }
+        return sb.toString();
+    }
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/linux/util/ProcessStats.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/linux/util/ProcessStats.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d88944d3135e3ac0dc22a4d31df64b637b507d5
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/linux/util/ProcessStats.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.core.linux.util;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class ProcessStats {
+
+	private Process m_process;
+	
+	public ProcessStats (Process proc) {
+		m_process = proc;
+	}
+	
+	public Process getProcess() {
+		return m_process;
+	}
+
+	public OutputStream getOutputStream() {
+		return m_process.getOutputStream();
+	}
+	public InputStream getInputStream() {
+		return m_process.getInputStream();
+	}
+	public InputStream getErrorStream() {
+		return m_process.getErrorStream();
+	}
+	public int getReturnValue() {
+		return m_process.exitValue();
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SSLSocketFactoryWrapper.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SSLSocketFactoryWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..b82f67552f92ed17895f7b8a45f6659896813c26
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SSLSocketFactoryWrapper.java
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.ssl;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Wrapper over the SSLSocketFactory which enforces HTTPS style hostname validation on the returned sockets.
+ * http://stackoverflow.com/questions/18139448/how-should-i-do-hostname-validation-when-using-jsse 
+ */
+public class SSLSocketFactoryWrapper extends SSLSocketFactory 
+{
+    private static final Logger s_logger = LoggerFactory.getLogger(SSLSocketFactoryWrapper.class);
+    
+    private String           ciphers;
+    private Boolean			 hostnameVerification;
+    private SSLSocketFactory sslsf;
+    
+    public SSLSocketFactoryWrapper(SSLSocketFactory sslsf,
+                                   String ciphers,
+                                   Boolean hnVerify) {
+        this.sslsf   = sslsf;
+        this.ciphers = ciphers;
+        this.hostnameVerification = hnVerify;
+    }
+
+    @Override
+    public String[] getDefaultCipherSuites()
+    {
+        return this.sslsf.getDefaultCipherSuites();
+    }
+
+    @Override
+    public String[] getSupportedCipherSuites()
+    {
+        return this.sslsf.getSupportedCipherSuites();
+    }
+    
+
+    @Override
+    public Socket createSocket() throws IOException
+    {
+        Socket socket = this.sslsf.createSocket();
+        updateSSLParameters(socket);
+        return socket;
+    }
+
+    @Override
+    public Socket createSocket(InetAddress host, int port) 
+        throws IOException
+    {
+        Socket socket = this.sslsf.createSocket(host, port);
+        updateSSLParameters(socket);
+        return socket;
+    }
+
+
+    @Override
+    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) 
+        throws IOException, UnknownHostException
+    {
+        Socket socket = this.sslsf.createSocket(host, port, localHost, localPort);
+        updateSSLParameters(socket);
+        return socket;
+    }
+
+
+    @Override
+    public Socket createSocket(String host, int port) 
+        throws IOException, UnknownHostException
+    {
+        Socket socket = this.sslsf.createSocket(host, port);
+        updateSSLParameters(socket);
+        return socket;
+    }
+
+
+    @Override
+    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
+         throws IOException
+    {
+        Socket socket = this.sslsf.createSocket(address, port, address, localPort);
+        updateSSLParameters(socket);
+        return socket;
+    }
+
+
+    @Override
+    public Socket createSocket(Socket s, String host, int port, boolean autoClose) 
+        throws IOException
+    {
+        Socket socket = this.sslsf.createSocket(s, host, port, autoClose);
+        updateSSLParameters(socket);
+        return socket;
+    }
+
+    private void updateSSLParameters(Socket socket) 
+        throws SocketException
+    {
+        if (socket instanceof SSLSocket){ 
+            
+            SSLParameters sslParams = ((SSLSocket) socket).getSSLParameters();
+
+            // Do not send an SSL-2.0-compatible Client Hello.
+            ArrayList<String> protocols = new ArrayList<String>(Arrays.asList(sslParams.getProtocols()));
+            protocols.remove("SSLv2Hello");
+            sslParams.setProtocols(protocols.toArray(new String[protocols.size()]));
+
+            // enable server verification
+            // to keep the code compatible with Java6,
+            // test if the SSLParameters class has the 
+            // setEndpointIdentificationAlgorithm method
+            Class<SSLParameters> clSSLParameters = SSLParameters.class;
+            try {
+                Method m = clSSLParameters.getMethod("setEndpointIdentificationAlgorithm", String.class);
+                if (m != null && hostnameVerification) {
+                    sslParams.setEndpointIdentificationAlgorithm("HTTPS");
+                    s_logger.info("SSL Endpoint Identification enabled.");
+                }
+            }
+            catch (NoSuchMethodException e) {
+                s_logger.warn("Cannot enable SSL Endpoint Identification as it requires Java7");
+            }
+            
+            // Adjust the supported ciphers.
+            if (this.ciphers != null && !this.ciphers.isEmpty()) {
+                String[] arrCiphers = ciphers.split(",");
+                ArrayList<String> lsCiphers = new ArrayList<String>();
+                for (String cipher : arrCiphers) {
+                    lsCiphers.add(cipher.trim());
+                }
+                sslParams.setCipherSuites(lsCiphers.toArray(new String[lsCiphers.size()]));
+            }
+
+            // update the socket parameters
+            ((SSLSocket) socket).setSSLParameters(sslParams);
+
+            // Disable the Nagle algorithm.
+            socket.setTcpNoDelay(true);
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslManagerServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslManagerServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..d50b417533c9d4097d7bc31379984869c37fbe5c
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslManagerServiceImpl.java
@@ -0,0 +1,399 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.ssl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.GeneralSecurityException;
+import java.security.InvalidKeyException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStore.Entry;
+import java.security.KeyStore.LoadStoreParameter;
+import java.security.KeyStore.PasswordProtection;
+import java.security.KeyStore.ProtectionParameter;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableEntryException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.ssl.SslManagerService;
+import org.eclipse.kura.ssl.SslServiceListener;
+import org.eclipse.kura.system.SystemService;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SslManagerServiceImpl implements SslManagerService, ConfigurableComponent
+{
+    private static final Logger s_logger = LoggerFactory.getLogger(SslManagerServiceImpl.class);
+        
+    private SystemService            m_systemService;
+    private SslServiceListeners		 m_sslServiceListeners;
+
+    @SuppressWarnings("unused")
+    private ComponentContext         m_ctx;
+    private SslManagerServiceOptions m_options;
+
+    // ----------------------------------------------------------------
+    //
+    //   Dependencies
+    //
+    // ----------------------------------------------------------------
+
+    public void setSystemService(SystemService systemService) {
+        this.m_systemService = systemService;
+    }
+
+    public void unsetSystemService(SystemService systemService) {
+        this.m_systemService = null;
+    }
+    
+    // ----------------------------------------------------------------
+    //
+    //   Activation APIs
+    //
+    // ----------------------------------------------------------------
+
+    protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+    {
+        s_logger.info("activate...");
+        
+        //
+        // save the bundle context and the properties
+        m_ctx = componentContext;
+        m_options = new SslManagerServiceOptions(properties);
+        
+        ServiceTracker<SslServiceListener, SslServiceListener> listenersTracker = new ServiceTracker<SslServiceListener, SslServiceListener>(
+				componentContext.getBundleContext(),
+				SslServiceListener.class, null);
+		
+		// Deferred open of tracker to prevent
+		// java.lang.Exception: Recursive invocation of ServiceFactory.getService
+		// on ProSyst
+        m_sslServiceListeners = new SslServiceListeners(listenersTracker);
+    }
+        
+    public void updated(Map<String,Object> properties)
+    {
+        s_logger.info("updated...: " + properties);
+
+        // Update properties and re-publish Birth certificate
+        m_options = new SslManagerServiceOptions(properties);
+        // Notify listeners that service has been updated
+        m_sslServiceListeners.onConfigurationUpdated();
+        
+    }
+    
+    protected void deactivate(ComponentContext componentContext) 
+    {
+        s_logger.info("deactivate...");
+        m_sslServiceListeners.close();
+    }
+    
+
+    // ----------------------------------------------------------------
+    //
+    //   Service APIs
+    //
+    // ----------------------------------------------------------------
+
+    @Override
+    public SSLSocketFactory getSSLSocketFactory() 
+        throws GeneralSecurityException, IOException
+    {
+        String ciphers  = m_options.getSslCiphers();
+        String protocol = m_options.getSslProtocol();
+
+        String  trustStore = m_options.getSslTrustStore();
+        TrustManager[] tms = getTrustManagers(trustStore);
+
+        String keyAlias    = null;
+        String keyStore    = m_options.getSslKeyStore();
+        char[] keyStorePwd = getKeyStorePassword();         
+        KeyManager[]   kms = getKeyManagers(keyStore, keyStorePwd, keyAlias);
+        
+        return getSSLSocketFactory(protocol, ciphers, kms, tms);
+    }
+
+    
+    @Override
+    public SSLSocketFactory getSSLSocketFactory(String keyAlias)
+        throws GeneralSecurityException, IOException
+    {
+        String protocol = m_options.getSslProtocol();
+        String ciphers  = m_options.getSslCiphers();
+
+        String  trustStore = m_options.getSslTrustStore();
+        TrustManager[] tms = getTrustManagers(trustStore);
+
+        String keyStore    = m_options.getSslKeyStore();
+        char[] keyStorePwd = getKeyStorePassword();         
+        KeyManager[]   kms = getKeyManagers(keyStore, keyStorePwd, keyAlias);
+        
+        return getSSLSocketFactory(protocol, ciphers, kms, tms);
+    }
+
+    @Override
+    public SSLSocketFactory getSSLSocketFactory(String protocol,
+                                                String ciphers,
+                                                String trustStore,
+                                                String keyStore,
+                                                char[] keyStorePwd,
+                                                String keyAlias)
+        throws GeneralSecurityException, IOException
+    {
+        TrustManager[] tms = getTrustManagers(trustStore);
+        KeyManager[]   kms = getKeyManagers(keyStore, keyStorePwd, keyAlias);
+        return getSSLSocketFactory(protocol, ciphers, kms, tms);
+    }
+
+    @Override
+    public X509Certificate[] getTrustCertificates() 
+        throws GeneralSecurityException, IOException
+    {
+        // trust store
+        X509Certificate[] cacerts = null;
+        String  trustStore = m_options.getSslTrustStore();
+        TrustManager[] tms = getTrustManagers(trustStore);
+        for (TrustManager tm : tms) {            
+            if (tm instanceof X509TrustManager) {
+                X509TrustManager x509tm = (X509TrustManager) tm;
+                cacerts = x509tm.getAcceptedIssuers();
+                break;
+//                for (X509Certificate x509cert : x509certs) {
+//                    System.err.println("TS DN:        "+x509cert.getSubjectDN());
+//                    System.err.println("TS DN:        "+x509cert.getSubjectX500Principal().getName());
+//                    System.err.println("TS CANONICAL: "+x509cert.getSubjectX500Principal().getName(X500Principal.CANONICAL));
+//                    System.err.println("TS RFC1779:   "+x509cert.getSubjectX500Principal().getName(X500Principal.RFC1779));
+//                    System.err.println("TS RFC2253:   "+x509cert.getSubjectX500Principal().getName(X500Principal.RFC2253));
+//                    System.err.println("TS alt:       "+x509cert.getSubjectAlternativeNames());
+//                    System.err.println("TS not before date: "+x509cert.getNotBefore());
+//                    System.err.println("TS not after  date: "+x509cert.getNotAfter());
+//                }
+            }
+        }
+        return cacerts;
+    }
+
+    
+    @Override
+    public void installTrustCertificate(String alias, X509Certificate x509crt) 
+        throws GeneralSecurityException, IOException
+    {
+        // load the trust store
+        String trustStore = m_options.getSslTrustStore();
+        KeyStore ts = KeyStore.getInstance(KeyStore.getDefaultType());
+        File fTrustStore = new File(trustStore);
+        if (fTrustStore.exists()) {
+            InputStream tsReadStream = new FileInputStream(trustStore);
+            ts.load(tsReadStream, null);
+        }
+        else {
+            ts.load(null, null);
+        }
+        
+        // add the certificate
+        ts.setCertificateEntry(alias, x509crt);
+        
+        // save it
+        char[] trustStorePwd = getTrustStorePassword(); 
+        FileOutputStream tsOutStream = new FileOutputStream(trustStore);
+        ts.store(tsOutStream, trustStorePwd);
+        try {
+            tsOutStream.close();
+        }
+        catch (IOException e) {}
+    }
+    
+
+    @Override
+    public void deleteTrustCertificate(String alias)
+        throws GeneralSecurityException, IOException
+    {
+        // load the trust store
+        String trustStore = m_options.getSslTrustStore();
+        KeyStore ts = KeyStore.getInstance(KeyStore.getDefaultType());
+        InputStream tsReadStream = new FileInputStream(trustStore);
+        ts.load(tsReadStream, null);
+        
+        // delete the entry
+        ts.deleteEntry(alias);
+
+        // save it
+        ts.store( new LoadStoreParameter() {            
+            @Override
+            public ProtectionParameter getProtectionParameter() {
+                char[] trustStorePwd;
+                try {
+                    trustStorePwd = getTrustStorePassword();
+                    return new PasswordProtection(trustStorePwd);
+                }
+                catch (Exception e) {
+                    s_logger.error("Error loading TrustStore password", e);
+                } 
+                return null;
+            }
+        });        
+    }
+
+    
+    // ----------------------------------------------------------------
+    //
+    //   Private methods
+    //
+    // ----------------------------------------------------------------
+
+    private SSLSocketFactory getSSLSocketFactory(String protocol,
+                                                 String ciphers,
+                                                 KeyManager[] kms,
+                                                 TrustManager[] tms) 
+        throws NoSuchAlgorithmException, KeyManagementException
+    {
+        // inits the SSL context
+        SSLContext sslCtx = null;
+        if (protocol == null) {
+            sslCtx = SSLContext.getDefault();
+        }
+        else {
+            sslCtx = SSLContext.getInstance(protocol);
+            sslCtx.init(kms, tms, null);
+        }
+
+        // get the SSLSocketFactory 
+        SSLSocketFactory sslSocketFactory = sslCtx.getSocketFactory();
+        
+        // wrap it
+        SSLSocketFactoryWrapper sfw = new SSLSocketFactoryWrapper(sslSocketFactory, ciphers, m_options.isSslHostnameVerification());        
+        return sfw;
+    }
+    
+    
+    private TrustManager[] getTrustManagers(String trustStore) 
+        throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException
+    {
+        TrustManagerFactory tmf = null;        
+        if (trustStore != null) {
+         
+            // Load the configured the Trust Store
+            File fTrustStore = new File(trustStore);
+            if (fTrustStore.exists()) {
+                
+                KeyStore ts = KeyStore.getInstance(KeyStore.getDefaultType());
+                InputStream tsReadStream = new FileInputStream(trustStore);
+                ts.load(tsReadStream, null);
+                tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+                tmf.init(ts);
+            }
+            else {
+                s_logger.info("Could not find trust store at {}. Using Java default.", trustStore);
+            }
+        }
+
+        if (tmf == null) {
+            // Load the default Java VM Trust Store
+            tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            tmf.init((KeyStore) null);
+        }        
+        return tmf.getTrustManagers(); 
+    }
+    
+    
+    private KeyManager[] getKeyManagers(String keyStore,
+                                        char[] keyStorePassword,
+                                        String keyAlias)
+        throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableEntryException
+    {
+        KeyStore ks = getKeyStore(keyStore, keyStorePassword, keyAlias);         
+        KeyManager[] kms = null;
+        if (ks != null) {
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+            kmf.init(ks, keyStorePassword);             
+            kms = kmf.getKeyManagers();
+        }
+        return kms; 
+    }
+
+    
+    private KeyStore getKeyStore(String keyStore, 
+                                 char[] keyStorePassword,
+                                 String keyAlias) 
+        throws KeyStoreException, FileNotFoundException, 
+               IOException, NoSuchAlgorithmException,
+               CertificateException, UnrecoverableEntryException
+    {
+        KeyStore ks = null;
+        if (keyStore != null) {
+         
+            // Load the configured the Key Store
+            File fKeyStore = new File(keyStore);
+            if (fKeyStore.exists()) {
+                
+                ks = KeyStore.getInstance(KeyStore.getDefaultType());
+                InputStream ksReadStream = new FileInputStream(keyStore);
+                ks.load(ksReadStream, null);    
+    
+                // if we have an alias, then build KeyStore with such key
+                if (keyAlias != null) {                
+                    if (ks.containsAlias(keyAlias) && ks.isKeyEntry(keyAlias)) {
+                        if (ks.size() > 1) {                    
+                            PasswordProtection pp = new PasswordProtection(keyStorePassword);
+                            Entry entry = ks.getEntry(keyAlias, pp);
+                            ks = KeyStore.getInstance(KeyStore.getDefaultType());
+                            ks.load(null, null);
+                            ks.setEntry(keyAlias, entry, pp);
+                        }
+                    }
+                    else {
+                        s_logger.info("Could not find alias {} in key store at {}. Using Java default.", keyAlias, keyStore);
+                        ks = null;
+                    }
+                }
+            }
+            else {
+                s_logger.info("Could not find key store at {}. Using Java default.", keyStore);
+            }
+        }
+        return ks;
+    }
+    
+    
+    private char[] getKeyStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException 
+    {
+        return m_systemService.getJavaKeyStorePassword();
+    }
+
+
+    private char[] getTrustStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException 
+    {
+        return m_systemService.getJavaTrustStorePassword();
+    }
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslManagerServiceOptions.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslManagerServiceOptions.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b7252c7064193735e616ee60ab0f8b0931796d4
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslManagerServiceOptions.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.ssl;
+
+import java.util.Map;
+
+public class SslManagerServiceOptions
+{
+    private static final String  PROP_PROTOCOL    = "ssl.default.protocol";
+    private static final String  PROP_TRUST_STORE = "ssl.default.trustStore";
+    private static final String  PROP_KEY_STORE   = "ssl.default.keyStore";
+    private static final String  PROP_CIPHERS     = "ssl.default.cipherSuites";    
+    private static final String  PROP_HN_VERIFY   = "ssl.hostname.verification";
+
+    private static final String  PROP_DEFAULT_PROTOCOL    = "TLSv1";
+    private static final Boolean PROP_DEFAULT_HN_VERIFY   = true;
+    private static final String  PROP_DEFAULT_TRUST_STORE = "/opt/eurotech/security/cacerts";
+    private static final String  PROP_DEFAULT_KEY_STORE   = "/opt/eurotech/security/keystore";
+
+    private Map<String,Object> m_properties;
+    
+    SslManagerServiceOptions(Map<String,Object> properties) {
+        m_properties = properties;
+    }
+    
+    /**
+     * Returns the ssl.default.protocol.
+     * @return
+     */
+    public String getSslProtocol() {
+        if (m_properties != null &&
+            m_properties.get(PROP_PROTOCOL) != null &&
+            m_properties.get(PROP_PROTOCOL) instanceof String) {
+            return (String) m_properties.get(PROP_PROTOCOL);
+        }
+        return PROP_DEFAULT_PROTOCOL;
+    }
+        
+    /**
+     * Returns the ssl.default.trustStore.
+     * @return
+     */
+    public String getSslTrustStore() {
+        if (m_properties != null &&
+            m_properties.get(PROP_TRUST_STORE) != null &&
+            m_properties.get(PROP_TRUST_STORE) instanceof String) {
+            return (String) m_properties.get(PROP_TRUST_STORE);
+        }
+        return PROP_DEFAULT_TRUST_STORE;
+    }
+
+    /**
+     * Returns the ssl.default.trustStore.
+     * @return
+     */
+    public String getSslKeyStore() {
+        if (m_properties != null &&
+            m_properties.get(PROP_KEY_STORE) != null &&
+            m_properties.get(PROP_KEY_STORE) instanceof String) {
+            return (String) m_properties.get(PROP_KEY_STORE);
+        }
+        return PROP_DEFAULT_KEY_STORE;
+    }
+    
+    /**
+     * Returns the ssl.default.trustStore.
+     * @return
+     */
+    public String getSslCiphers() {
+        if (m_properties != null &&
+            m_properties.get(PROP_CIPHERS) != null &&
+            m_properties.get(PROP_CIPHERS) instanceof String) {
+            return (String) m_properties.get(PROP_CIPHERS);
+        }
+        return null;
+    }
+    
+    /**
+     * Returns the ssl.hostname.verification
+     * @return
+     */
+    public Boolean isSslHostnameVerification() {
+    	if (m_properties != null &&
+            m_properties.get(PROP_HN_VERIFY) != null &&
+            m_properties.get(PROP_HN_VERIFY) instanceof Boolean) {
+    		return (Boolean) m_properties.get(PROP_HN_VERIFY);
+    	}
+    	return PROP_DEFAULT_HN_VERIFY;
+    }
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslServiceListeners.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslServiceListeners.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb777fb61c9f675fe7e5c51d2596a8d29674cdd6
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/ssl/SslServiceListeners.java
@@ -0,0 +1,47 @@
+package org.eclipse.kura.core.ssl;
+
+import org.eclipse.kura.ssl.SslServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class SslServiceListeners implements SslServiceListener {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(SslServiceListeners.class);
+	
+	private ServiceTracker<SslServiceListener, SslServiceListener> m_listenersTracker;
+
+	public SslServiceListeners(ServiceTracker<SslServiceListener, SslServiceListener> listenersTracker) {
+		super();
+		this.m_listenersTracker = listenersTracker;
+	}
+	
+	@Override
+	public void onConfigurationUpdated() {
+		openOnce();
+		
+		Object[] listeners = m_listenersTracker.getServices();
+		if (listeners != null && listeners.length != 0) {
+			for (Object listener : listeners) {
+				try {
+					((SslServiceListener) listener).onConfigurationUpdated();
+				} catch (Throwable t) {
+					s_logger.error("Unexpected Throwable", t);
+				}
+			}
+		}	
+	}
+	
+	public synchronized void close() {
+		if (m_listenersTracker.getTrackingCount() != -1) {
+			m_listenersTracker.close();
+		}
+	}
+	
+	private synchronized void openOnce() {
+		if (m_listenersTracker.getTrackingCount() == -1) {
+			m_listenersTracker.open();
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/system/SystemAdminServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/system/SystemAdminServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f640ba6401b7aaa9f9be698a8b0225c6cd6927c9
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/system/SystemAdminServiceImpl.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.system;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.InputStreamReader;
+
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.system.SystemAdminService;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class SystemAdminServiceImpl implements SystemAdminService 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(SystemAdminServiceImpl.class);
+
+	private static final String OS_LINUX    = "Linux";
+	private static final String OS_MAC_OSX  = "Mac OS X";
+	private static final String OS_WINDOWS  = "Windows";
+	private static final String UNKNOWN     = "UNKNOWN";
+	
+	@SuppressWarnings("unused")
+	private ComponentContext      m_ctx;
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) 
+	{			
+		//
+		// save the bundle context
+		m_ctx = componentContext;
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		m_ctx = null;
+	}
+
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+		
+	public String getUptime() {
+		
+		String uptimeStr = UNKNOWN;
+		long uptime = 0;
+
+		if(OS_LINUX.equals(this.getOsName())) {
+			try {
+				File file = new File("/proc/uptime");
+				FileReader fr = new FileReader(file);
+				BufferedReader br = new BufferedReader(fr);
+	
+				String line = br.readLine();
+				br.close();
+				
+				uptime = (long) (Double.parseDouble(line.substring(0, line.indexOf(" "))) * 1000);
+				uptimeStr = Long.toString(uptime);
+			} catch (Exception e) {
+				s_logger.error("Could not read uptime", e);
+			}
+		} else if(OS_MAC_OSX.equals(this.getOsName())) {
+			try {
+				String systemUptime = runSystemCommand("uptime");
+				if(!systemUptime.isEmpty()) {
+					String[] uptimeParts = systemUptime.split("up\\s+")[1].split("\\s*,\\s*");
+					int days = 0, hours = 0, mins = 0;
+
+					String uptimePart = uptimeParts[0];
+					
+					// If up less than a day, it will only show the number of mins, hr, or HH:MM
+					if(uptimePart.contains("days")) {
+						days = Integer.parseInt(uptimePart.split("\\s+days")[0]);
+						uptimePart = uptimeParts[1];
+					}
+					else if(uptimePart.contains("day")) {
+						days = Integer.parseInt(uptimePart.split("\\s+day")[0]);
+						uptimePart = uptimeParts[1];
+					}
+					
+					if(uptimePart.contains(":")) {
+						// Showing HH:MM
+						hours = Integer.parseInt(uptimePart.split(":")[0]);
+						mins = Integer.parseInt(uptimePart.split(":")[1]);
+					} else if(uptimePart.contains("hr")) {
+						// Only showing hr
+						hours = Integer.parseInt(uptimePart.split("\\s*hr")[0]);
+					} else if(uptimePart.contains("mins")) {
+						// Only showing mins
+						mins = Integer.parseInt(uptimePart.split("\\s*mins")[0]);
+					} else {
+						s_logger.error("uptime could not be parsed correctly: " + uptimeParts[0]);
+					}
+
+					uptime = (((days * 24) + hours) * 60 + mins) * 60;
+					uptimeStr = Long.toString(uptime * 1000);
+				}
+			} catch (Exception e) {
+				s_logger.error("Could not parse uptime", e);
+			}
+		}
+		return uptimeStr;
+	}
+	
+	public void reboot() {
+		String cmd = "";
+		if(OS_LINUX.equals(this.getOsName()) || OS_MAC_OSX.equals(this.getOsName())) {		
+			cmd = "reboot";
+		} else if(this.getOsName().startsWith(OS_WINDOWS)) {
+			cmd = "shutdown -r";
+		} else {
+			s_logger.error("Unsupported OS for reboot()");
+			return;
+		}
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec(cmd);
+		} catch(Exception e) {
+			s_logger.error("failed to issue reboot", e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	public void sync() {
+		String cmd = "";
+		if(OS_LINUX.equals(this.getOsName()) || OS_MAC_OSX.equals(this.getOsName())) {		
+			cmd = "sync";
+		} else {
+			s_logger.error("Unsupported OS for sync()");
+			return;
+		}
+		Process proc = null;		
+		try {
+			proc = ProcessUtil.exec(cmd);
+			int status = proc.waitFor();
+			if (status != 0) {
+				s_logger.error("sync command failed with exit code of " + status);
+			}
+		} catch(Exception e) {
+			s_logger.error("failed to issue sync command", e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+
+	
+	private String getOsName() {
+		return System.getProperty("os.name");
+	}
+	
+	private String runSystemCommand(String command) {
+		return this.runSystemCommand(command.split("\\s+"));
+	}
+	
+	private String runSystemCommand(String[] commands) {
+		Process proc = null;
+		StringBuffer response = new StringBuffer(); 
+		try {
+			proc = ProcessUtil.exec(commands);
+			proc.waitFor();
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			String newLine = "";
+			while ((line = br.readLine()) != null) {
+				response.append(newLine);
+				response.append(line);
+				newLine = "\n";
+			}
+		} catch(Exception e) {
+			String command = "";
+			String delim = "";
+			for(int i=0; i<commands.length; i++) {
+				command += delim + commands[i];
+				delim = " ";
+			}
+			s_logger.error("failed to run commands " + command, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		return response.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/system/SystemServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/system/SystemServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3dcaf3e1d872462f029c3add7733698c20e7016
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/system/SystemServiceImpl.java
@@ -0,0 +1,830 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.system;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.net.URL;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.IOUtil;
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.system.SystemService;
+import org.osgi.framework.Bundle;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ */
+public class SystemServiceImpl implements SystemService 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(SystemServiceImpl.class);
+		
+	private static final boolean onCloudbees = (new File("/private/eurotech/settings-security.xml")).exists();
+
+	private Properties       m_kuraProperties;
+	private ComponentContext m_ctx;
+
+	private NetworkService m_networkService;
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+	public void setNetworkService(NetworkService networkService) {
+		m_networkService = networkService;
+	}
+
+	public void unsetNetworkService(NetworkService networkService) {
+		m_networkService = null;
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext) 
+	{
+		m_ctx = componentContext;
+
+		// load the defaults from the kura.properties files
+		Properties kuraDefaults = new Properties();
+		boolean updateTriggered = false;
+		try {
+			//special cases for older versions to fix relative path bug in v2.0.4 and earlier
+			if(System.getProperty(KURA_CONFIG) != null && System.getProperty(KURA_CONFIG).trim().equals("file:kura/kura.properties")) {
+				System.setProperty(KURA_CONFIG, "file:/opt/eclipse/kura/kura/kura.properties");
+				updateTriggered = true;
+				s_logger.warn("Overridding invalid kura.properties location");
+			}
+			if(System.getProperty("dpa.configuration") != null && System.getProperty("dpa.configuration").trim().equals("kura/dpa.properties")) {
+				System.setProperty("dpa.configuration", "/opt/eclipse/kura/kura/dpa.properties");
+				updateTriggered = true;
+				s_logger.warn("Overridding invalid dpa.properties location");
+			}
+			if(System.getProperty("log4j.configuration") != null && System.getProperty("log4j.configuration").trim().equals("file:kura/log4j.properties")) {
+				System.setProperty("log4j.configuration", "file:/opt/eclipse/kura/kura/log4j.properties");
+				updateTriggered = true;
+				s_logger.warn("Overridding invalid log4j.properties location");
+			}
+			
+			// load the default kura.properties
+			// look for kura.properties as resource in the classpath
+			// if not found, look for such file in the kura.home directory
+			String kuraHome = System.getProperty(KEY_KURA_HOME_DIR);
+			String kuraConfig = System.getProperty(KURA_CONFIG);
+			String kuraProperties = IOUtil.readResource(KURA_PROPS_FILE);
+			
+			if (kuraProperties != null) {
+				kuraDefaults.load( new StringReader(kuraProperties));
+				s_logger.info("Loaded Jar Resource kura.properties.");
+			}
+			else if (kuraConfig != null) {
+				try {
+					URL kuraConfigUrl = new URL(kuraConfig);
+					kuraDefaults.load(kuraConfigUrl.openStream());
+					s_logger.info("Loaded URL kura.properties: "+kuraConfig);
+				}
+				catch (Exception e) {
+					s_logger.warn("Could not open kuraConfig URL", e);
+				}
+			}
+			else if (kuraHome != null) {
+				File kuraPropsFile = new File (kuraHome+File.separator+KURA_PROPS_FILE);
+				if (kuraPropsFile.exists()) {
+					kuraDefaults.load( new FileReader(kuraPropsFile));
+					s_logger.info("Loaded File kura.properties: "+kuraPropsFile);
+				} else {
+					s_logger.warn("File does not exist: " + kuraPropsFile);
+				}
+
+			}
+			else {
+				s_logger.error("Could not located kura.properties with kura.home "+kuraHome);
+			}
+			
+			// load custom kura properties
+			// look for kura_custom.properties as resource in the classpath
+			// if not found, look for such file in the kura.home directory
+			Properties kuraCustomProps = new Properties();
+			String kuraCustomConfig = System.getProperty(KURA_CUSTOM_CONFIG);
+			String kuraCustomProperties = IOUtil.readResource(KURA_CUSTOM_PROPS_FILE);
+			
+			if (kuraCustomProperties != null) {
+				kuraCustomProps.load( new StringReader(kuraCustomProperties));
+				s_logger.info("Loaded Jar Resource: " + KURA_CUSTOM_PROPS_FILE);
+			}
+			else if (kuraCustomConfig != null) {
+				try {
+					URL kuraConfigUrl = new URL(kuraCustomConfig);
+					kuraCustomProps.load(kuraConfigUrl.openStream());
+					s_logger.info("Loaded URL kura_custom.properties: "+kuraCustomConfig);
+				}
+				catch (Exception e) {
+					s_logger.warn("Could not open kuraCustomConfig URL: " + e);
+				}
+			}
+			else if (kuraHome != null) {
+				File kuraCustomPropsFile = new File (kuraHome+File.separator+KURA_CUSTOM_PROPS_FILE);
+				if (kuraCustomPropsFile.exists()) {
+					kuraCustomProps.load( new FileReader(kuraCustomPropsFile));
+					s_logger.info("Loaded File " + KURA_CUSTOM_PROPS_FILE + ": " + kuraCustomPropsFile);
+				} else {
+					s_logger.warn("File does not exist: " + kuraCustomPropsFile);
+				}
+			}
+			else {
+				s_logger.info("Did not locate a kura_custom.properties file in " + kuraHome);
+			}
+			
+			// Override defaults with values from kura_custom.properties
+			kuraDefaults.putAll(kuraCustomProps);
+			
+			//more path overrides based on earlier Kura problem with relative paths
+			if(kuraDefaults.getProperty(KEY_KURA_HOME_DIR) != null && kuraDefaults.getProperty(KEY_KURA_HOME_DIR).trim().equals("kura")) {
+				kuraDefaults.setProperty(KEY_KURA_HOME_DIR, "/opt/eclipse/kura/kura");
+				updateTriggered = true;
+				s_logger.warn("Overridding invalid kura.home location");
+			}
+			if(kuraDefaults.getProperty(KEY_KURA_PLUGINS_DIR) != null && kuraDefaults.getProperty(KEY_KURA_PLUGINS_DIR).trim().equals("kura/plugins")) {
+				kuraDefaults.setProperty(KEY_KURA_PLUGINS_DIR, "/opt/eclipse/kura/kura/plugins");
+				updateTriggered = true;
+				s_logger.warn("Overridding invalid kura.plugins location");
+			}	
+			if(kuraDefaults.getProperty("kura.packages") != null && kuraDefaults.getProperty("kura.packages").trim().equals("kura/packages")) {
+				kuraDefaults.setProperty("kura.packages", "/opt/eclipse/kura/kura/packages");
+				updateTriggered = true;
+				s_logger.warn("Overridding invalid kura.packages location");
+			}
+			
+			
+			if(updateTriggered) {
+		        File    directory;       // Desired current working directory
+
+		        directory = new File("/opt/eclipse/kura").getAbsoluteFile();
+		        if (directory.exists() || directory.mkdirs())
+		        {
+		        	String oldDir = System.getProperty("user.dir");
+		            boolean result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
+		            if(result) {
+		            	s_logger.warn("Changed working directory to /opt/eclipse/kura from " + oldDir);
+		            }
+		        }
+		        
+		        
+		        
+		        /*
+				// we were updated so we need to reload the DeploymentAdmin so it reads in the correct values
+				s_logger.info("kura.home = " + kuraDefaults.getProperty(KEY_KURA_HOME_DIR));
+				s_logger.info("kura.plugins = " + kuraDefaults.getProperty(KEY_KURA_PLUGINS_DIR));
+				s_logger.info("kura.packages = " + kuraDefaults.getProperty("kura.packages"));
+
+				//write out Kura defaults back to kuraPropsFile
+				FileOutputStream fos = new FileOutputStream(kuraHome+File.separator+KURA_PROPS_FILE);
+				kuraDefaults.store(fos, null);
+				fos.flush();
+				fos.getFD().sync();
+				fos.close();
+
+				s_logger.warn("Restarting DeploymentAgent to reload kura.properties");
+				String bundleName = "org.eclipse.kura.deployment.agent";
+
+				Bundle[] bundles = m_ctx.getBundleContext().getBundles();
+				Long id = null;
+				try {
+					if(bundles != null && bundles.length > 0) {
+						for(Bundle bundle : bundles) {
+							if(bundle.getSymbolicName().equals(bundleName)) {
+								id = bundle.getBundleId();
+								break;
+							}
+						}
+					}
+				} catch (NumberFormatException e){
+					throw new ComponentException("Error restarting org.eclipse.kura.deployment.agent.DeploymentAgentService to update Kura", e);
+				}
+
+				if (id != null) {
+					Bundle bundle = m_ctx.getBundleContext().getBundle(id);
+					if (bundle == null) {
+						s_logger.error("Bundle ID {} not found", id);
+						throw new ComponentException("Error restarting org.eclipse.kura.deployment.agent.DeploymentAgentService to update Kura");
+					} else {
+						try {
+							bundle.stop();
+							bundle.start();
+						} catch (BundleException e) {
+							s_logger.error("Failed to restart bundle ", e);
+						}
+					}
+				}*/
+			}	
+
+			// build the m_kuraProperties instance with the defaults
+			m_kuraProperties = new Properties(kuraDefaults);
+
+			// take care of the CloudBees environment 
+			// that is run in the continuous integration. 
+			if (onCloudbees) m_kuraProperties.put(KEY_OS_NAME, OS_CLOUDBEES);
+
+			// Put the Net Admin and Web interface availability property so that is available through a get.  
+			Boolean hasNetAdmin = Boolean.valueOf(m_kuraProperties.getProperty(KEY_KURA_HAVE_NET_ADMIN, "true"));
+			m_kuraProperties.put(KEY_KURA_HAVE_NET_ADMIN, hasNetAdmin);
+			s_logger.info("Kura has net admin? " + hasNetAdmin);
+			String hasWebInterface = m_kuraProperties.getProperty(KEY_KURA_HAVE_WEB_INTER, "true");
+			m_kuraProperties.put(KEY_KURA_HAVE_WEB_INTER, hasWebInterface);
+			s_logger.info("Kura has web interface? " + hasWebInterface);
+			String kuraVersion = m_kuraProperties.getProperty(KEY_KURA_VERSION, "version-unknown");
+			m_kuraProperties.put(KEY_KURA_VERSION, kuraVersion);
+			s_logger.info("Kura version? " + kuraVersion);
+
+			// load the System properties for what it makes sense
+			Properties systemProperties = System.getProperties();
+			m_kuraProperties.putAll(systemProperties);
+
+			if (getKuraHome() == null) {
+				s_logger.error("Did not initialize kura.home");
+			}
+			else {
+				s_logger.info("Kura home directory is " + getKuraHome());
+				createDirIfNotExists(getKuraHome());
+			}
+			if (getKuraSnapshotsDirectory() == null) {
+				s_logger.error("Did not initialize kura.snapshots");
+			}
+			else {
+				s_logger.info("Kura snapshots directory is " + getKuraSnapshotsDirectory());
+				createDirIfNotExists(getKuraSnapshotsDirectory());
+			}
+			if (getKuraTemporaryConfigDirectory() == null) {
+				s_logger.error("Did not initialize kura.tmp");
+			}
+			else {
+				s_logger.info("Kura tmp directory is " + getKuraTemporaryConfigDirectory());
+				createDirIfNotExists(getKuraTemporaryConfigDirectory());
+			}
+			
+			s_logger.info(new StringBuffer().append("Kura version ").append(getKuraVersion()).append(" is starting").toString());
+		}
+		catch (IOException e) {
+			throw new ComponentException("Error loading default properties", e);
+		}
+	}
+
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		m_ctx = null;
+		m_kuraProperties = null;
+	}
+
+
+	public void updated(Map<String,Object> properties)
+	{
+		// nothing to do
+		// all properties of the System service are read-only
+	}
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Returns all KuraProperties for this system. The returned instances is 
+	 * initialized by loading the kura.properties file. Properties defined at 
+	 * the System level - for example using the java -D command line flag - 
+	 * are used to overwrite the values loaded from the kura.properties file
+	 * in a hierarchical configuration fashion.  
+	 */
+	public Properties getProperties() {
+		return m_kuraProperties;
+	}
+
+	public String getPrimaryMacAddress() {
+		String primaryNetworkInterfaceName = getPrimaryNetworkInterfaceName();
+		String macAddress = null;
+
+		if (OS_MAC_OSX.equals(getOsName())) {
+			Process proc = null;
+			try {
+				s_logger.info("executing: ifconfig and looking for " + primaryNetworkInterfaceName);
+				proc = ProcessUtil.exec("ifconfig");
+				try {
+					proc.waitFor();
+					BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+					String line = null;
+					while((line = br.readLine()) != null) {
+						if(line.startsWith(primaryNetworkInterfaceName)) {
+							//get the next line and save the MAC
+							line = br.readLine();
+							if (!line.trim().startsWith("ether")) {
+								line = br.readLine();
+							}
+							String[] splitLine = line.split(" ");
+							if (splitLine.length > 0) {
+								return splitLine[1].toUpperCase();
+							}
+						}
+					}
+				} catch(InterruptedException e) {
+					e.printStackTrace();
+				}
+			} catch(Exception e) {
+				s_logger.error("Failed to get network interfaces", e);
+			}
+			finally {
+				ProcessUtil.destroy(proc);
+			}
+		} else {
+			try {
+				List<NetInterface<? extends NetInterfaceAddress>> interfaces = m_networkService.getNetworkInterfaces();
+				if (interfaces != null) {
+					for (NetInterface<? extends NetInterfaceAddress> iface : interfaces) {
+						if (iface.getName() != null && getPrimaryNetworkInterfaceName().equals(iface.getName())) {
+							macAddress = NetUtil.hardwareAddressToString(iface.getHardwareAddress());
+							break;
+						}
+					}
+				}
+			} catch (KuraException e) {
+				s_logger.error("Failed to get network interfaces", e);
+			}
+		}
+
+		return macAddress;
+	}
+
+	public String getPrimaryNetworkInterfaceName()
+	{
+		if(m_kuraProperties.getProperty(KEY_PRIMARY_NET_IFACE) != null) {
+			return this.m_kuraProperties.getProperty(KEY_PRIMARY_NET_IFACE);
+		} else {
+			if (OS_MAC_OSX.equals(getOsName())) {
+        	                return "en0";
+        	        } else if (OS_LINUX.equals(getOsName())) {
+        	                return "eth0";
+			} else {
+	                        s_logger.error("Unsupported platform");
+				return null;
+        	        }
+		}
+	}
+
+	public String getPlatform() {
+		return this.m_kuraProperties.getProperty(KEY_PLATFORM);
+	}
+
+	public String getOsArch() {
+		String override = this.m_kuraProperties.getProperty(KEY_OS_ARCH);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_OS_ARCH);
+	}
+
+	public String getOsName() {
+		String override = this.m_kuraProperties.getProperty(KEY_OS_NAME);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_OS_NAME);
+	}
+
+	public String getOsVersion() {
+		String override = this.m_kuraProperties.getProperty(KEY_OS_VER);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_OS_VER);
+	}
+
+	public String getOsDistro() {
+		return this.m_kuraProperties.getProperty(KEY_OS_DISTRO);
+	}
+
+	public String getOsDistroVersion() {
+		return this.m_kuraProperties.getProperty(KEY_OS_DISTRO_VER);
+	}
+
+	public String getJavaVendor() {
+		String override = this.m_kuraProperties.getProperty(KEY_JAVA_VENDOR);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_JAVA_VENDOR);
+	}
+
+	public String getJavaVersion() {
+		String override = this.m_kuraProperties.getProperty(KEY_JAVA_VERSION);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_JAVA_VERSION);
+	}
+
+	public String getJavaVmName() {
+		String override = this.m_kuraProperties.getProperty(KEY_JAVA_VM_NAME);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_JAVA_VM_NAME);
+	}
+
+	public String getJavaVmVersion() {
+		String override = this.m_kuraProperties.getProperty(KEY_JAVA_VM_VERSION);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_JAVA_VM_VERSION);
+	}
+
+	public String getJavaVmInfo() {
+		String override = this.m_kuraProperties.getProperty(KEY_JAVA_VM_INFO);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_JAVA_VM_INFO);
+	}
+
+	public String getOsgiFwName() {
+		String override = this.m_kuraProperties.getProperty(KEY_OSGI_FW_NAME);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_OSGI_FW_NAME);
+	}
+
+	public String getOsgiFwVersion() {
+		String override = this.m_kuraProperties.getProperty(KEY_OSGI_FW_VERSION);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_OSGI_FW_VERSION);
+	}
+
+	public int getNumberOfProcessors() 
+	{
+		try {
+			return Runtime.getRuntime().availableProcessors();
+		}
+		catch ( Throwable t ) {
+			// NoSuchMethodError on pre-1.4 runtimes
+		}
+		return -1;
+	}
+
+	public long getTotalMemory() {
+		return Runtime.getRuntime().totalMemory() / 1024;
+	}
+
+	public long getFreeMemory() {
+		return Runtime.getRuntime().freeMemory() / 1024;
+	}
+
+	public String getFileSeparator() {
+		String override = this.m_kuraProperties.getProperty(KEY_FILE_SEP);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_FILE_SEP);
+	}
+
+	public String getJavaHome() {
+		String override = this.m_kuraProperties.getProperty(KEY_JAVA_HOME);
+		if(override != null) return override;
+
+		return System.getProperty(KEY_JAVA_HOME);
+	}
+
+	public String getKuraName() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_NAME);
+	}
+
+	public String getKuraVersion() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_VERSION);
+	}
+
+	public String getKuraHome() 
+	{
+		if("emulator".equals(System.getProperty("org.eclipse.kura.mode"))) 
+		{
+			StringBuffer sb = new StringBuffer();
+			sb.append(System.getProperty("java.io.tmpdir"))
+			.append(getFileSeparator())
+			.append("kura_emulator_base")
+			.append(getFileSeparator());
+			return sb.toString();
+		} 
+		else {
+			return this.m_kuraProperties.getProperty(KEY_KURA_HOME_DIR);
+		}
+	}
+
+	public String getKuraPluginsDirectory() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_PLUGINS_DIR);
+	}
+
+	public String getKuraDataDirectory() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_DATA_DIR);
+	}
+
+	public String getKuraTemporaryConfigDirectory() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_TMP_DIR);
+	}
+
+	public String getKuraSnapshotsDirectory() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_SNAPSHOTS_DIR);
+	}
+	
+	public int getKuraSnapshotsCount() {
+		int iMaxCount   = 10;
+		String maxCount = this.m_kuraProperties.getProperty(KEY_KURA_SNAPSHOTS_COUNT);
+		if (maxCount != null && maxCount.trim().length() > 0) {
+			try {
+				iMaxCount = Integer.parseInt(maxCount);
+			}
+			catch (NumberFormatException nfe) {
+				s_logger.error("Error - Invalid kura.snapshots.count setting. Using default.", nfe);
+			}
+		}
+		return iMaxCount;
+	}
+	
+	public int getKuraWifiTopChannel() {
+		String topWifiChannel = m_kuraProperties.getProperty(KEY_KURA_WIFI_TOP_CHANNEL);
+		if(topWifiChannel != null && topWifiChannel.trim().length() > 0) {
+			return Integer.parseInt(topWifiChannel);
+		}
+		
+		s_logger.warn("The last wifi channel is not defined for this system - setting to lowest common value of 11");
+		return 11;
+	}
+	
+	public String getKuraStyleDirectory() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_STYLE_DIR);
+	}
+	
+	public String getKuraWebEnabled() {
+		return this.m_kuraProperties.getProperty(KEY_KURA_HAVE_WEB_INTER);
+	}
+
+	public String getBiosVersion() {
+		String override = this.m_kuraProperties.getProperty(KEY_BIOS_VERSION);
+		if(override != null) return override;
+
+		String biosVersion = UNSUPPORTED;
+
+		if(OS_LINUX.equals(this.getOsName())) {
+			if("2.6.34.9-WR4.2.0.0_standard".equals(getOsVersion()) || "2.6.34.12-WR4.3.0.0_standard".equals(getOsVersion())) {
+				biosVersion = runSystemInfoCommand("eth_vers_bios");
+			} else {
+				String biosTmp = runSystemInfoCommand("dmidecode -s bios-version");
+				if(biosTmp.length() > 0 && !biosTmp.contains("Permission denied")) {
+					biosVersion = biosTmp;
+				}
+			}
+		} else if (OS_MAC_OSX.equals(this.getOsName())) {
+			String[] cmds = {"/bin/sh", "-c", "system_profiler SPHardwareDataType | grep 'Boot ROM'"};
+			String biosTmp = runSystemInfoCommand(cmds);
+			if(biosTmp.contains(": ")) {
+				biosVersion = biosTmp.split(":\\s+")[1];
+			}
+		}
+
+		return biosVersion;	
+	}
+
+	public String getDeviceName() 
+	{
+		String override = this.m_kuraProperties.getProperty(KEY_DEVICE_NAME);
+		if(override != null) return override;
+
+		String deviceName = UNKNOWN;		
+		if(OS_MAC_OSX.equals(this.getOsName())) {
+			String displayTmp = runSystemInfoCommand("scutil --get ComputerName");
+			if(displayTmp.length() > 0) {
+				deviceName = displayTmp;
+			}
+		} else if (OS_LINUX.equals(this.getOsName()) || OS_CLOUDBEES.equals(this.getOsName())) {
+			String displayTmp = runSystemInfoCommand("hostname");
+			if(displayTmp.length() > 0) {
+				deviceName = displayTmp;
+			}
+		}		
+		return deviceName;
+	}
+
+	public String getFirmwareVersion() {
+		String override = this.m_kuraProperties.getProperty(KEY_FIRMWARE_VERSION);
+		if(override != null) return override;
+
+		String fwVersion = UNSUPPORTED;
+
+		if(OS_LINUX.equals(this.getOsName())) {
+			if("2.6.34.9-WR4.2.0.0_standard".equals(this.getOsVersion()) || "2.6.34.12-WR4.3.0.0_standard".equals(getOsVersion())) {
+				fwVersion = runSystemInfoCommand("eth_vers_cpld") + " " + runSystemInfoCommand("eth_vers_uctl");
+			}
+		}
+
+		return fwVersion;
+	}
+
+	public String getModelId() {
+		String override = this.m_kuraProperties.getProperty(KEY_MODEL_ID);
+		if(override != null) return override;
+
+		String modelId = UNKNOWN;
+
+		if(OS_MAC_OSX.equals(this.getOsName())) {
+			String modelTmp = runSystemInfoCommand("sysctl -b hw.model");
+			if(modelTmp.length() > 0) {
+				modelId = modelTmp;
+			}
+		} else if (OS_LINUX.equals(this.getOsName())) {
+			String modelTmp = runSystemInfoCommand("dmidecode -t system");
+			if(modelTmp.contains("Version: ")) {
+				modelId = modelTmp.split("Version:\\s+")[1].split("\n")[0];
+			}			
+		}
+
+		return modelId;
+	}
+
+	public String getModelName() {
+		String override = this.m_kuraProperties.getProperty(KEY_MODEL_NAME);
+		if(override != null) return override;
+
+		String modelName = UNKNOWN;
+
+		if(OS_MAC_OSX.equals(this.getOsName())) {
+			String[] cmds = {"/bin/sh", "-c", "system_profiler SPHardwareDataType | grep 'Model Name'"};
+			String modelTmp = runSystemInfoCommand(cmds);
+			if(modelTmp.contains(": ")) {
+				modelName = modelTmp.split(":\\s+")[1];
+			}
+		} else if (OS_LINUX.equals(this.getOsName())) {
+			String modelTmp = runSystemInfoCommand("dmidecode -t system");
+			if(modelTmp.contains("Product Name: ")) {
+				modelName = modelTmp.split("Product Name:\\s+")[1].split("\n")[0];
+			}			
+		}
+
+		return modelName;
+	}
+
+	public String getPartNumber() {
+		String override = this.m_kuraProperties.getProperty(KEY_PART_NUMBER);
+		if(override != null) return override;
+
+		String partNumber = UNSUPPORTED;
+
+		if(OS_LINUX.equals(this.getOsName())) {
+			if("2.6.34.9-WR4.2.0.0_standard".equals(getOsVersion()) || "2.6.34.12-WR4.3.0.0_standard".equals(getOsVersion())) {
+				partNumber = runSystemInfoCommand("eth_partno_bsp") + " " + runSystemInfoCommand("eth_partno_epr");
+			}
+		}
+
+		return partNumber;
+	}
+
+	public String getSerialNumber() {
+		String override = this.m_kuraProperties.getProperty(KEY_SERIAL_NUM);
+		if(override != null) return override;
+
+		String serialNum = UNKNOWN;
+
+		if(OS_MAC_OSX.equals(this.getOsName())) {
+			String[] cmds = {"/bin/sh", "-c", "system_profiler SPHardwareDataType | grep 'Serial Number'"};
+			String serialTmp = runSystemInfoCommand(cmds);
+			if(serialTmp.contains(": ")) {
+				serialNum = serialTmp.split(":\\s+")[1];
+			}
+		} else if (OS_LINUX.equals(this.getOsName())) {
+			String serialTmp = runSystemInfoCommand("dmidecode -t system");
+			if(serialTmp.contains("Serial Number: ")) {
+				serialNum = serialTmp.split("Serial Number:\\s+")[1].split("\n")[0];
+			}			
+		}
+
+		return serialNum;
+	}
+
+    public char[] getJavaKeyStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException {
+        String keyStorePwd = this.m_kuraProperties.getProperty(KEY_KURA_KEY_STORE_PWD);
+        if (keyStorePwd != null) {
+            return keyStorePwd.toCharArray();
+        }
+        return null;
+    }
+	
+    public char[] getJavaTrustStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException {
+        String trustStorePwd = this.m_kuraProperties.getProperty(KEY_KURA_TRUST_STORE_PWD);
+        if (trustStorePwd != null) {
+            return trustStorePwd.toCharArray();
+        }
+        return null;
+    }
+
+    public Bundle[] getBundles() {
+		if (m_ctx == null) {
+			return null;
+		}
+		return m_ctx.getBundleContext().getBundles();
+	}
+	
+    public List<String> getDeviceManagementServiceIgnore() {
+        String servicesToIgnore = m_kuraProperties.getProperty(CONFIG_CONSOLE_DEVICE_MANAGE_SERVICE_IGNORE);
+        if(servicesToIgnore != null && !servicesToIgnore.trim().isEmpty()) {
+        	String[] servicesArray = servicesToIgnore.split(",");
+        	if(servicesArray != null && servicesArray.length > 0) {
+        		List<String> services = new ArrayList<String>();
+        		for(String service : servicesArray) {
+        			services.add(service);
+        		}
+        		return services;
+        	}
+        }
+        
+        return null;
+    }
+
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+
+
+	private String runSystemInfoCommand(String command) {
+		return this.runSystemInfoCommand(command.split("\\s+"));
+	}
+
+
+	private String runSystemInfoCommand(String[] commands) {
+		StringBuffer response = new StringBuffer(); 
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec(commands);
+			proc.waitFor();
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			String newLine = "";
+			while ((line = br.readLine()) != null) {
+				response.append(newLine);
+				response.append(line);
+				newLine = "\n";
+			}
+		} catch(Exception e) {
+			String command = "";
+			String delim = "";
+			for(int i=0; i<commands.length; i++) {
+				command += delim + commands[i];
+				delim = " ";
+			}
+			s_logger.error("failed to run commands " + command, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		return response.toString();
+	}
+
+
+	private void createDirIfNotExists(String fileName) 
+	{
+		// Make sure the configuration directory exists - create it if not		
+		File file = new File(fileName);
+		if(!file.exists()) {
+			if(!file.mkdirs()) {
+				s_logger.error("Failed to create the temporary configuration directory: " + fileName);
+				System.exit(-1);
+			}
+		}
+	}	
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/GZipUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/GZipUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..154f6b0db465c625eaea486383b53c0c83b903e9
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/GZipUtil.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+public class GZipUtil 
+{
+
+	public static boolean isCompressed(byte[] bytes) throws IOException {
+		if ((bytes == null) || (bytes.length < 2)) {
+			return false;
+		} else {
+			return ((bytes[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (bytes[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8)));
+		}
+	}
+	
+	public static byte[] compress(byte[] source) throws IOException {
+		
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		GZIPOutputStream gzipos = null;
+		try {
+			gzipos = new GZIPOutputStream(baos);
+			gzipos.write(source);
+		} catch (IOException e) {
+			throw e;
+		} finally {
+			if (gzipos != null) {
+				try {
+					gzipos.close();
+				} catch (IOException e) {
+					// Ignore
+				}
+			}
+		}
+		return baos.toByteArray();
+	}
+	
+	public static byte[] decompress(byte[] source) throws IOException {		
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		ByteArrayInputStream bais = new ByteArrayInputStream(source);
+		GZIPInputStream gzipis = null;
+
+		try {
+			gzipis = new GZIPInputStream(bais);
+
+			int n;
+			final int MAX_BUF = 1024;
+			byte[] buf = new byte[MAX_BUF];
+			while((n = gzipis.read(buf, 0, MAX_BUF)) != -1) {
+				baos.write(buf, 0, n);
+			}
+		} catch (IOException e) {
+			throw e;
+		} finally {
+			if (gzipis != null) {
+				try {
+					gzipis.close();
+				} catch (IOException e) {
+					// Ignore
+				}
+			}
+			
+			try {
+				baos.close();
+			} catch (IOException e) {
+				// Ignore
+			}
+		}
+		
+		return baos.toByteArray();
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/IOUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/IOUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..bbd1883db6f94c37ba2d8178fc6402ac1bda3318
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/IOUtil.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.net.URL;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class IOUtil 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(IOUtil.class);
+
+	/**
+	 * Reads a resource fully and returns it as a string.
+	 * 
+	 * @param ctx
+	 * @param resourceName
+	 * @return
+	 * @throws IOException
+	 */
+	public static String readResource(String resourceName) 
+		throws IOException
+	{
+		URL resourceUrl = Thread.currentThread().getContextClassLoader().getResource(resourceName);
+		if (resourceUrl == null) {
+			return null;
+		}
+		return readResource(resourceUrl);
+	}
+
+	/**
+	 * Reads a resource fully and returns it as a string.
+	 * 
+	 * @param ctx
+	 * @param resourceName
+	 * @return
+	 * @throws IOException
+	 */
+	public static String readResource(BundleContext ctx, String resourceName) 
+		throws IOException
+	{
+		URL resourceUrl = ctx.getBundle().getResource(resourceName);
+		if (resourceUrl == null) {
+			return null;
+		}
+		
+		String resource = readResource(resourceUrl);		
+		return resource;
+	}
+	
+	/**
+	 * Reads a resource fully and returns it as a string.
+	 * 
+	 * @param ctx
+	 * @param resourceName
+	 * @return
+	 * @throws IOException
+	 */
+	public static String readResource(Bundle bundle, String resourceName) 
+		throws IOException
+	{
+		URL resourceUrl = bundle.getResource(resourceName);
+		if (resourceUrl == null) {
+			return null;
+		}
+		
+		String resource = readResource(resourceUrl);		
+		return resource;
+	}
+
+	/**
+	 * Reads a resource fully and returns it as a string.
+	 * 
+	 * @param ctx
+	 * @param resourceName
+	 * @return
+	 * @throws IOException
+	 */
+	public static String readResource(URL resourceUrl) 
+		throws IOException
+	{
+		String result = null;
+		BufferedReader resourceBr = null;
+		InputStreamReader resourceIsr = null;
+		try {
+		
+			resourceIsr = new InputStreamReader(resourceUrl.openStream());
+			resourceBr  = new BufferedReader(resourceIsr);
+			
+			int iRead = 0;
+			char[] buffer = new char[1024];
+			StringWriter sw = new StringWriter();
+			while ((iRead = resourceBr.read(buffer)) != -1) {
+				sw.write(buffer, 0, iRead);
+			}
+			result = sw.toString();
+		}
+		finally {
+			if (resourceBr != null) {
+				try { resourceBr.close(); }
+				catch (IOException e)  {
+					s_logger.warn("Error closing reader", e);
+				}
+				try { resourceIsr.close(); }
+				catch (IOException e)  {
+					s_logger.warn("Error closing reader", e);
+				}
+			}
+		}
+		return result;		
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/NamedThreadFactory.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/NamedThreadFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0c02f59e59e785138d51a1a47133aafd658eee9
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/NamedThreadFactory.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+public class NamedThreadFactory implements ThreadFactory
+{
+	public NamedThreadFactory() {
+	}
+	
+	@Override
+	public Thread newThread(Runnable r) 
+	{		
+		Thread t = Executors.defaultThreadFactory().newThread(r);
+		String className = r.getClass().getSimpleName();
+		t.setName(className);
+		return t;
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/NetUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/NetUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..61115e3ea68d5054018d32504b3ef6b5ca3a694d
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/NetUtil.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetUtil 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(NetUtil.class);
+	
+	
+	public static String hardwareAddressToString(byte[] macAddress)
+	{
+		if (macAddress == null) {
+			return "N/A";
+		}
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i<macAddress.length; i++) {
+			sb.append(String.format("%02X%s", macAddress[i], (i<macAddress.length-1) ? ":" : ""));		
+		}
+		return sb.toString();
+	}
+	
+	public static byte[] hardwareAddressToBytes(String macAddress) {
+		if(macAddress == null || macAddress.isEmpty()) {
+			return new byte[]{0, 0, 0, 0, 0, 0};
+		}
+
+		macAddress = macAddress.replaceAll(":","");
+
+		byte[] mac = new byte[6];
+        for(int i=0; i<6; i++) {
+        	mac[i] = (byte) ((Character.digit(macAddress.charAt(i*2), 16) << 4)
+        					+ Character.digit(macAddress.charAt(i*2+1), 16));
+        }
+        
+        return mac;
+	}
+	
+	
+	public static String getPrimaryMacAddress()    
+	{
+		NetworkInterface firstInterface = null;
+		Enumeration<NetworkInterface> nifs = null;
+		try {
+			
+			// look for eth0 or en0 first
+			nifs = NetworkInterface.getNetworkInterfaces();
+			if (nifs != null) {					
+				while (nifs.hasMoreElements()) {					
+					NetworkInterface nif = nifs.nextElement();
+					if ("eth0".equals(nif.getName()) || "en0".equals(nif.getName())) {
+						return hardwareAddressToString(nif.getHardwareAddress());
+					}
+				}
+			}
+			
+			// if not found yet, look for the first active ethernet interface
+			nifs = NetworkInterface.getNetworkInterfaces();
+			if (nifs != null) {					
+				while (nifs.hasMoreElements()) {					
+					NetworkInterface nif = nifs.nextElement();
+					if (!nif.isVirtual() && nif.getHardwareAddress() != null) {
+						firstInterface = nif;
+						if (nif.getName().startsWith("eth") || nif.getName().startsWith("en")) {
+							return hardwareAddressToString(nif.getHardwareAddress());
+						}
+					}
+				}
+			}
+			
+			if (firstInterface != null) {
+				return hardwareAddressToString(firstInterface.getHardwareAddress());
+			}
+		}
+		catch (Exception e) {
+			s_logger.warn("Exception while getting current IP", e);
+		}
+
+		return null;
+	}
+	
+	
+	public static InetAddress getCurrentInetAddress()    
+	{
+		try {
+			
+			Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
+			if (nifs != null) {
+				
+				while (nifs.hasMoreElements()) {
+					
+					NetworkInterface nif = nifs.nextElement();
+					if (!nif.isLoopback() && nif.isUp() && !nif.isVirtual() && nif.getHardwareAddress() != null) {
+						
+						Enumeration<InetAddress> nadrs = nif.getInetAddresses();
+	                    while (nadrs.hasMoreElements()) {
+	                    	
+	                    	InetAddress adr = nadrs.nextElement();
+	                        if (adr != null && !adr.isLoopbackAddress() && (nif.isPointToPoint() || !adr.isLinkLocalAddress())) {
+	                        	return adr;
+	                        }
+	                    }
+					}
+				}
+			}
+		}
+		catch (Exception e) {
+			s_logger.warn("Exception while getting current IP", e);
+		}
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ProcessUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ProcessUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..347d10d79062a87138b66efa79309d0ef20e06d3
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ProcessUtil.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProcessUtil 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ProcessUtil.class);
+	
+	
+	public static Process exec(String command)
+		throws IOException
+	{
+		Runtime runtime = Runtime.getRuntime();
+		return runtime.exec(command);
+	}
+
+	
+	public static Process exec(String command, String[] envp)
+		throws IOException
+	{
+		Runtime runtime = Runtime.getRuntime();
+		return runtime.exec(command, envp);
+	}
+
+	
+	public static Process exec(String[] cmdarray)
+		throws IOException
+	{
+		Runtime runtime = Runtime.getRuntime();
+		return runtime.exec(cmdarray);
+	}
+
+	
+	public static Process exec(String[] cmdarray, String[] envp)
+		throws IOException
+	{
+		Runtime runtime = Runtime.getRuntime();
+		return runtime.exec(cmdarray, envp);
+	}
+	
+	
+	public static void close(Process proc) {
+		if (proc == null) {
+			return;
+		}
+		
+		try {
+			proc.getInputStream().close();
+		}
+		catch (Exception e) {
+			s_logger.warn("Exception in proc.getInputStream().close()", e);
+		}
+		
+		try {
+			proc.getOutputStream().close();
+		}
+		catch (Exception e) {
+			s_logger.warn("Exception in proc.getOutputStream().close()", e);
+		}
+
+		try {
+			proc.getErrorStream().close();;
+		}
+		catch (Exception e) {
+			s_logger.warn("Exception in proc.getErrorStream().close()", e);
+		}
+	}
+	
+	public static void destroy(Process proc) 
+	{
+		if (proc == null) {
+			return;
+		}
+		
+		ProcessUtil.close(proc);
+
+		try {
+			proc.destroy();
+		}
+		catch (Exception e) {
+			s_logger.warn("Exception in proc.destroy()", e);
+		}		
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/QuickSort.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/QuickSort.java
new file mode 100644
index 0000000000000000000000000000000000000000..544bc76d7278158d52b22f27bdc888bc30119a82
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/QuickSort.java
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+/* 
+ * Copyright � 2009 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Utilities to quickly sort an array of values
+ */
+public class QuickSort {
+	
+	public static void sort(int[] array) {
+		if(array.length > 0) {
+			sort(array, 0, array.length-1);
+		}
+	}
+	
+	public static void sort(long[] array) {
+		if(array.length > 0) {
+			sort(array, 0, array.length-1);
+		}
+	}
+	
+	private static void sort(int[] array, int lo, int hi) {
+	    int i=lo, j=hi, h;
+	    int x=array[(lo+hi)/2];
+
+	    //  partition
+	    do {    
+	        while (array[i]<x) i++; 
+	        while (array[j]>x) j--;
+	        if (i<=j) {
+	            h=array[i]; array[i]=array[j]; array[j]=h;
+	            i++; j--;
+	        }
+	    } while (i<=j);
+
+	    //  recursion
+	    if (lo<j) sort(array, lo, j);
+	    if (i<hi) sort(array, i, hi);
+	}
+	
+	private static void sort(long[] array, int lo, int hi) {
+	    int i=lo, j=hi;
+		long h;
+	    long x=array[(lo+hi)/2];
+
+	    //  partition
+	    do {    
+	        while (array[i]<x) i++; 
+	        while (array[j]>x) j--;
+	        if (i<=j) {
+	            h=array[i]; array[i]=array[j]; array[j]=h;
+	            i++; j--;
+	        }
+	    } while (i<=j);
+
+	    //  recursion
+	    if (lo<j) sort(array, lo, j);
+	    if (i<hi) sort(array, i, hi);
+	}
+
+	
+	/*
+	public static void sort(int[] array) {
+		quicksort(array, 0, array.length - 1);
+	}
+
+	private static void quicksort(int[] array, int left, int right) {
+		if (right <= left) return;
+		int i = partition(array, left, right);
+		quicksort(array, left, i-1);
+		quicksort(array, i+1, right);
+	}
+
+	private static int partition(int[] array, int left, int right) {
+		int i = left, j = right;
+		int tmp;
+		int pivot = array[(left + right) / 2];
+
+		while (i <= j) {
+			while (array[i] < pivot) {
+				i++;
+			}
+
+			while (array[j] > pivot) {
+				j--;
+			}
+
+			if (i <= j) {
+				tmp = array[i];
+				array[i] = array[j];
+				array[j] = tmp;
+				i++;
+				j--;
+			}
+		}
+
+		return i;
+	}
+	
+	public static void sort(long[] array) {
+		quicksort(array, 0, array.length - 1);
+	}
+
+	private static void quicksort(long[] array, int left, int right) {
+		if (right <= left) return;
+		int i = partition(array, left, right);
+		quicksort(array, left, i-1);
+		quicksort(array, i+1, right);
+	}
+
+	private static int partition(long[] array, int left, int right) {
+		int i = left, j = right;
+		long tmp;
+		long pivot = array[(left + right) / 2];
+
+		while (i <= j) {
+			while (array[i] < pivot) {
+				i++;
+			}
+
+			while (array[j] > pivot) {
+				j--;
+			}
+
+			if (i <= j) {
+				tmp = array[i];
+				array[i] = array[j];
+				array[j] = tmp;
+				i++;
+				j--;
+			}
+		}
+
+		return i;
+	}
+	*/
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ThrowableUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ThrowableUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..03d1c23a99d63873a7e9f3c44d53af5434e04ead
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ThrowableUtil.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class ThrowableUtil {
+	
+	public static String stackTraceAsString(Throwable t) {
+		StringWriter sw = new StringWriter();
+		PrintWriter pw = new PrintWriter(sw);
+		t.printStackTrace(pw);
+		return sw.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ValidationUtil.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ValidationUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..1781c41718c3f9354f54bb5271f02c4282efc049
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/util/ValidationUtil.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.core.util;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+
+public class ValidationUtil 
+{
+	public static void notNull(Object value, String argumentName) 
+		throws KuraException
+	{		
+		if (value == null) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, argumentName);
+		}
+	}
+
+	/**
+	 * Throws an EdcIllegalNullArgumentException if the string value for the specified argument is empty or null. 
+	 * @param obj
+	 * @param argumentName
+	 * @throws EdcIllegalNullArgumentException
+	 */
+	public static void notEmptyOrNull(String value, String argumentName) 
+		throws KuraException 
+	{		
+		if (value == null || value.trim().length() == 0) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, argumentName);
+		}
+	}
+	
+	/**
+	 * Throws an EdcIllegalNullArgumentException if the value for the specified argument is null. 
+	 * @param obj
+	 * @param argumentName
+	 * @throws EdcIllegalNullArgumentException
+	 */
+	public static void notNegative(int value, String argumentName) 
+		throws KuraException {		
+		if (value < 0) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, argumentName);
+		}
+	}
+
+	/**
+	 * Throws an EdcIllegalNullArgumentException if the value for the specified argument is null. 
+	 * @param obj
+	 * @param argumentName
+	 * @throws EdcIllegalNullArgumentException
+	 */
+	public static void notNegative(short value, String argumentName) 
+		throws KuraException {		
+		if (value < 0) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, argumentName);
+		}
+	}
+
+	/**
+	 * Throws an EdcIllegalNullArgumentException if the value for the specified argument is null. 
+	 * @param obj
+	 * @param argumentName
+	 * @throws EdcIllegalNullArgumentException
+	 */
+	public static void notNegative(long value, String argumentName) 
+		throws KuraException {		
+		if (value < 0) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, argumentName);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/watchdog/CriticalServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/watchdog/CriticalServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f677f75315ef1c04fc2fbff8f47281a3e1180fec
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/watchdog/CriticalServiceImpl.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.core.watchdog;
+
+public class CriticalServiceImpl {
+
+	private String name;
+	private long timeout;
+	private long updated;
+	
+	/**
+	 * 
+	 * @param name
+	 * @param timeout		timeout for reporting interval in seconds
+	 */
+	public CriticalServiceImpl(String name, long timeout) {
+		this.name = name;
+		this.timeout = timeout;
+		this.updated = System.currentTimeMillis();
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public long getTimeout() {
+		return timeout;
+	}
+	
+	public boolean isTimedOut() {
+		long current = System.currentTimeMillis();
+		return timeout < (current - updated);
+	}
+	
+	public void update() {
+		updated = System.currentTimeMillis();
+	}
+	
+	public String toString() {
+		return "Service Name:  " + name + ", Timeout(ms):  " + timeout;
+	}
+}
diff --git a/kura/org.eclipse.kura.core/src/main/protobuf/kurapayload.proto b/kura/org.eclipse.kura.core/src/main/protobuf/kurapayload.proto
new file mode 100644
index 0000000000000000000000000000000000000000..86b136a0638eb98c250e809360e5bc4208b52939
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/protobuf/kurapayload.proto
@@ -0,0 +1,53 @@
+//
+// To compile:
+// protoc --proto_path=src/main/protobuf --java_out=src/main/java src/main/protobuf/kurapayload.proto
+//
+package kuradatatypes;
+
+option java_package         = "org.eclipse.kura.core.message.protobuf";
+option java_outer_classname = "KuraPayloadProto";
+
+message KuraPayload {
+
+	message KuraMetric {
+		enum ValueType {  
+			DOUBLE         = 0; 
+			FLOAT          = 1;
+			INT64          = 2;
+			INT32          = 3;
+			BOOL           = 4;
+			STRING         = 5;
+			BYTES          = 6;
+		}
+		  
+		required string    name            = 1;
+		required ValueType type            = 2;
+
+		optional double double_value       = 3;
+		optional float  float_value        = 4;
+		optional int64  long_value         = 5;
+		optional int32  int_value          = 6;
+		optional bool   bool_value         = 7;
+		optional string string_value       = 8;
+		optional bytes  bytes_value        = 9;
+	}
+
+    message KuraPosition {
+        required double latitude   = 1;
+        required double longitude  = 2;
+        optional double altitude   = 3;
+        optional double precision  = 4;  // dilution of precision of the current satellite fix. 
+        optional double heading    = 5;  // heading in degrees
+        optional double speed      = 6;  // meters per second
+        optional int64  timestamp  = 7;
+        optional int32  satellites = 8;  // number satellites locked by the GPS device
+        optional int32  status     = 9;  // status indicator for the GPS data: 1 = no GPS response; 2 = error in response; 4 = valid.
+    }
+
+    optional int64       timestamp = 1;
+    optional KuraPosition position  = 2;
+	
+	extensions 3 to 4999;
+    repeated KuraMetric   metric    = 5000;  // can be zero, so optional
+ 	optional bytes       body      = 5001;
+}
diff --git a/kura/org.eclipse.kura.core/src/main/resources/org/eclipse/kura/core/service/monitor/monitor-config.xml b/kura/org.eclipse.kura.core/src/main/resources/org/eclipse/kura/core/service/monitor/monitor-config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cc481c7ebf8fe5af620afa7c4128e4d358594386
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/resources/org/eclipse/kura/core/service/monitor/monitor-config.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<node-descriptor name="monitor" xmlns="http://eurotech.com/kura/2.0">
+    <children>
+        <node-descriptor name="watchdog">
+            <children/>
+            <immediate>false</immediate>
+            <category>false</category>
+            <property-descriptors>
+                <property-descriptor name="timeout">
+                    <type>numberInteger</type>
+                    <default-value type="integer">50</default-value>
+                    <required>false</required>
+                    <read-only>false</read-only>
+                </property-descriptor>
+            </property-descriptors>
+        </node-descriptor>
+    </children>
+    <immediate>false</immediate>
+    <category>false</category>
+    <property-descriptors/>
+</node-descriptor>
diff --git a/kura/org.eclipse.kura.core/src/main/resources/org/eclipse/kura/protocol/messages/ProtocolExceptionMessagesBundle.properties b/kura/org.eclipse.kura.core/src/main/resources/org/eclipse/kura/protocol/messages/ProtocolExceptionMessagesBundle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4d52571ec80330bd235c18d33f952e6b5af6d79f
--- /dev/null
+++ b/kura/org.eclipse.kura.core/src/main/resources/org/eclipse/kura/protocol/messages/ProtocolExceptionMessagesBundle.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+INVALID_CONFIGURATION=Invalid configuration.
+INVALID_DATA_ADDRESS=Data address invalid.
+INVALID_DATA_TYPE=Data type invalid.
+METHOD_NOT_SUPPORTED=Method not supported. 
+NOT_AVAILABLE=Protocol not available.
+NOT_CONNECTED=not connected
+TRANSACTION_FAILURE=Transaction failure. 
diff --git a/kura/org.eclipse.kura.deployment.agent/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.deployment.agent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..3f273fdd1573dc0b73c7e71c95e1170aebbce137
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.deployment.agent
+Bundle-SymbolicName: org.eclipse.kura.deployment.agent;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Export-Package: org.eclipse.kura.deployment.agent; version="0.2.0"
+Import-Package: org.apache.commons.io;version="1.4.9999",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.deploymentadmin;version="1.0.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+Bundle-ClassPath: .
diff --git a/kura/org.eclipse.kura.deployment.agent/OSGI-INF/deploymentagent.xml b/kura/org.eclipse.kura.deployment.agent/OSGI-INF/deploymentagent.xml
new file mode 100644
index 0000000000000000000000000000000000000000..02f1077ab399f5fb77bbd367def8452d855de363
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/OSGI-INF/deploymentagent.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" enabled="true" immediate="true" name="org.eclipse.kura.deployment.agent">
+   <implementation class="org.eclipse.kura.deployment.agent.impl.DeploymentAgent"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unsetEventAdmin"/>
+   <reference bind="setDeploymentAdmin" cardinality="1..1" interface="org.osgi.service.deploymentadmin.DeploymentAdmin" name="DeploymentAdmin" policy="static" unbind="unsetDeploymentAdmin"/>
+   <service>
+      <provide interface="org.eclipse.kura.deployment.agent.DeploymentAgentService"/>
+   </service>
+</scr:component>
diff --git a/kura/org.eclipse.kura.deployment.agent/about.html b/kura/org.eclipse.kura.deployment.agent/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.agent/about_files/epl-v10.html b/kura/org.eclipse.kura.deployment.agent/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.agent/build.properties b/kura/org.eclipse.kura.deployment.agent/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2f6da77e1f95e28077e75c7a9ceb7cbd65d0ea63
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/build.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/,\
+           src/test/java/
+output.  = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about_files/,\
+               about.html
+additional.bundles = org.eclipse.osgi,\
+                     org.apache.felix.deploymentadmin,\
+                     osgi.cmpn,\
+                     slf4j.api,\
+                     org.apache.commons.io
+src.includes = about.html,\
+               about_files/
+
diff --git a/kura/org.eclipse.kura.deployment.agent/pom.xml b/kura/org.eclipse.kura.deployment.agent/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f4b6b4ebf2835a2b2868362098332a9d7b595b10
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.deployment.agent</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.deployment.agent/src/main/java/org/eclipse/kura/deployment/agent/DeploymentAgentService.java b/kura/org.eclipse.kura.deployment.agent/src/main/java/org/eclipse/kura/deployment/agent/DeploymentAgentService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4b5bbb88e3598c810b3cf364ee4ccea6e305322
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/src/main/java/org/eclipse/kura/deployment/agent/DeploymentAgentService.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.agent;
+
+public interface DeploymentAgentService {
+	
+	/**
+	 * {@linkplain org.osgi.service.event.Event Event} topic on which the result
+	 * of the deployment package installation is posted.
+	 */
+	public static final String EVENT_INSTALLED_TOPIC = DeploymentAgentService.class.getPackage().getName().replace('.', '/') + "/INSTALLED";
+
+	
+	/**
+	 * {@linkplain org.osgi.service.event.Event Event} property
+	 * representing the URL of the deployment package.
+	 */
+	public static final String EVENT_PACKAGE_URL = "deploymentpackage.url";
+	
+	
+	/**
+	 * {@linkplain org.osgi.service.event.Event Event} property 
+	 * representing the success (true or false) 
+	 * of the deployment package installation/uninstallation.
+	 */
+	public static final String EVENT_SUCCESSFUL = "successful";
+
+	
+	/**
+	 * {@linkplain org.osgi.service.event.Event Event} property
+	 * representing an Exception thrown installing or uninstalling
+	 * the deployment package.
+	 */
+	public static final String EVENT_EXCEPTION = "exception";
+	
+	
+	/**
+	 * {@linkplain org.osgi.service.event.Event Event} topic on which the result
+	 * of the deployment package uninstallation is posted.
+	 */
+	public static final String EVENT_UNINSTALLED_TOPIC = DeploymentAgentService.class.getPackage().getName().replace('.', '/') + "/UNINSTALLED";
+	
+	
+	/**
+	 * {@linkplain org.osgi.service.event.Event Event} property
+	 * representing the symbolic name of the deployment package.
+	 */
+	public static final String EVENT_PACKAGE_NAME = "deploymentpackage.name";
+	
+	public static final String EVENT_PACKAGE_VERSION = "deploymentpackage.version";
+	
+	/**
+	 * Installs a Deployment Package asynchronously fetching it at the given URL.
+	 * The method queues the package URL and returns immediately.
+	 * The result of the package installation is notified asynchronously
+	 * posting an {@linkplain org.osgi.service.event.Event Event} 
+	 * on the topic {@linkplain #EVENT_INSTALLED_TOPIC}
+	 * 
+	 * @see org.osgi.service.deploymentadmin.DeploymentAdmin#installDeploymentPackage installDeploymentPackage
+	 * 
+	 * 
+	 * @param url			The URL of the deployment package
+	 * @throws Exception    If the installation of a deployment package at the same URL is still pending 
+	 */
+	public void installDeploymentPackageAsync(String url) throws Exception;
+
+	
+	/**
+	 * Uninstalls a Deployment Package asynchronously.
+	 * The method queues the package symbolic name and returns immediately.
+	 * The result of the package uninstallation is notified asynchronously
+	 * posting an {@linkplain org.osgi.service.event.Event Event} 
+	 * on the topic {@linkplain #EVENT_UNINSTALLED_TOPIC}
+	 * 
+	 * @see org.osgi.service.deploymentadmin.DeploymentAdmin#uninstallDeploymentPackage uninstallDeploymentPackage
+	 * 
+	 * 
+	 * @param name			The symbolic name of the deployment package
+	 * @throws Exception    If the uninstallation of a deployment package at the same symbolic name is still pending 
+	 */
+	public void uninstallDeploymentPackageAsync(String name) throws Exception;
+	
+	
+	/**
+	 * Asks if the installation of a deployment package at the given URL is pending.
+	 * 
+	 * @param url	The URL of the deployment package
+	 * @return		true if the installation of a deployment package at URL is pending 
+	 */
+	public boolean isInstallingDeploymentPackage(String url);
+	
+	
+	/**
+	 * Asks if the uninstallation of a deployment package with the given symbolic name is pending.
+	 * 
+	 * @param name	The symbolic name of the deployment package
+	 * @return		true if the uninstallation of a deployment package at URL is pending 
+	 */
+	public boolean isUninstallingDeploymentPackage(String name);
+}
diff --git a/kura/org.eclipse.kura.deployment.agent/src/main/java/org/eclipse/kura/deployment/agent/impl/DeploymentAgent.java b/kura/org.eclipse.kura.deployment.agent/src/main/java/org/eclipse/kura/deployment/agent/impl/DeploymentAgent.java
new file mode 100644
index 0000000000000000000000000000000000000000..1cc920513ab1d73551a35e9087fa7dc8b837fac1
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.agent/src/main/java/org/eclipse/kura/deployment/agent/impl/DeploymentAgent.java
@@ -0,0 +1,538 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.agent.impl;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.deployment.agent.DeploymentAgentService;
+import org.osgi.framework.Version;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.osgi.service.deploymentadmin.DeploymentAdmin;
+import org.osgi.service.deploymentadmin.DeploymentException;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author cdealti
+ *
+ * The bundles installed from deployment packages are managed by the deployment admin itself.
+ * Once installed they are persisted in the persistent storage area provided by the framework.
+ * The persistent storage area is wiped up if the framework is stated with the '-clean' option.
+ * The way deployment packages and their bundles are stored in the persistence storage area
+ * is implementation dependent and we should not rely on that.
+ *
+ * In order to be able to reinstall deployment packages across reboots of the framework with
+ * the '-clean' option set, we need to store the deployment package files (.dp) in a different
+ * persistent location.
+ *
+ * Limitations:
+ * We should also keep the entire installation history. This is needed because deployment
+ * packages can be partially upgraded through 'fix packages' and these must be reinstalled in the
+ * right order.
+ * We DO NOT support this yet. We assume that for every installed deployment package
+ * there is a single deployment package file (.dp) that needs to be reinstalled.
+ */
+public class DeploymentAgent implements DeploymentAgentService {
+	private static Logger s_logger = LoggerFactory.getLogger(DeploymentAgent.class);
+
+	private static final String DPA_CONF_PATH_PROPNAME = "dpa.configuration";
+	private static final String KURA_CONF_URL_PROPNAME  = "kura.configuration";
+	private static final String PACKAGES_PATH_PROPNAME = "kura.packages";
+
+	private static final String CONN_TIMEOUT_PROPNAME = "dpa.connection.timeout";
+	private static final String READ_TIMEOUT_PROPNAME = "dpa.read.timeout";
+	
+	private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+	
+	private static Future<?>  s_installerTask;
+	private static Future<?>  s_uninstallerTask;
+
+	private DeploymentAdmin m_deploymentAdmin;
+	private EventAdmin m_eventAdmin;
+
+	private Queue<String> m_instPackageUrls;
+	private Queue<String> m_uninstPackageNames;
+	
+	private ExecutorService m_installerExecutor;
+	private ExecutorService m_uninstallerExecutor;
+	
+	private String m_dpaConfPath;
+	private String m_packagesPath;
+
+	private Properties m_deployedPackages;
+
+	private int m_connTimeout;
+	private int m_readTimeout;
+
+	protected void activate(ComponentContext componentContext) {
+
+		m_deployedPackages = new Properties();
+
+		m_dpaConfPath = System.getProperty(DPA_CONF_PATH_PROPNAME);
+		if (m_dpaConfPath == null || m_dpaConfPath.isEmpty()) {
+			throw new ComponentException("The value of '" + DPA_CONF_PATH_PROPNAME + "' is not defined");
+		}
+
+		String sKuraConfUrl = System.getProperty(KURA_CONF_URL_PROPNAME);
+		if (sKuraConfUrl == null || sKuraConfUrl.isEmpty()) {
+			throw new ComponentException("The value of '" + KURA_CONF_URL_PROPNAME + "' is not defined");
+		}
+
+		URL kuraUrl = null;
+		try {
+			kuraUrl = new URL(sKuraConfUrl);
+		} catch (MalformedURLException e) {
+			throw new ComponentException("Invalid Kura configuration URL");
+		}
+
+		Properties kuraProperties = new Properties();
+		try {
+			kuraProperties.load(kuraUrl.openStream());
+		} catch (FileNotFoundException e) {
+			throw new ComponentException("Kura configuration file not found", e);
+		} catch (IOException e) {
+			throw new ComponentException("Exception loading Kura configuration file", e);
+		}
+
+		m_packagesPath = kuraProperties.getProperty(PACKAGES_PATH_PROPNAME);
+		if (m_packagesPath == null || m_packagesPath.isEmpty()) {
+			throw new ComponentException("The value of '" + PACKAGES_PATH_PROPNAME + "' is not defined");
+		}
+		if(kuraProperties.getProperty(PACKAGES_PATH_PROPNAME) != null && kuraProperties.getProperty(PACKAGES_PATH_PROPNAME).trim().equals("kura/packages")) {
+			kuraProperties.setProperty(PACKAGES_PATH_PROPNAME, "/opt/eclipse/kura/kura/packages");
+			m_packagesPath = kuraProperties.getProperty(PACKAGES_PATH_PROPNAME);
+			s_logger.warn("Overridding invalid kura.packages location");
+		}
+
+		String sConnTimeout = kuraProperties.getProperty(CONN_TIMEOUT_PROPNAME);
+		if (sConnTimeout != null) {
+			m_connTimeout = Integer.valueOf(sConnTimeout);
+		}
+
+		String sReadTimeout = kuraProperties.getProperty(READ_TIMEOUT_PROPNAME);
+		if (sReadTimeout != null) {
+			m_readTimeout = Integer.valueOf(sReadTimeout);
+		}
+
+		File dpaConfFile = new File(m_dpaConfPath);
+		if (dpaConfFile.getParentFile() != null && !dpaConfFile.getParentFile().exists()) {
+			dpaConfFile.getParentFile().mkdirs();
+		}
+		if (!dpaConfFile.exists()) {
+			try {
+				dpaConfFile.createNewFile();
+			} catch (IOException e) {
+				throw new ComponentException("Cannot create empty DPA configuration file", e);
+			}
+		}
+
+		File packagesDir = new File(m_packagesPath);
+		if (!packagesDir.exists()) {
+			if (!packagesDir.mkdir()) {
+				throw new ComponentException("Cannot create packages directory");
+			}
+		}
+
+		m_instPackageUrls = new ConcurrentLinkedQueue<String>();
+		m_uninstPackageNames = new ConcurrentLinkedQueue<String>();
+		
+		m_installerExecutor = Executors.newSingleThreadExecutor();
+		
+		m_uninstallerExecutor = Executors.newSingleThreadExecutor();
+		
+		s_installerTask = m_installerExecutor.submit(new Runnable() {
+    		@Override
+    		public void run() {
+	    		Thread.currentThread().setName("DeploymentAgent");
+	    		installer();
+    	}});
+
+		s_uninstallerTask = m_uninstallerExecutor.submit(new Runnable() {
+    		@Override
+    		public void run() {
+	    		Thread.currentThread().setName("DeploymentAgent:Uninstall");
+	    		uninstaller();
+    	}});
+		
+		installPackagesFromConfFile();
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		m_dpaConfPath = null;
+
+		m_deployedPackages = null;
+		
+		if ((s_installerTask != null) && (!s_installerTask.isDone())) {
+    		s_logger.debug("Cancelling DeploymentAgent task ...");
+    		s_installerTask.cancel(true);
+    		s_logger.info("DeploymentAgent task cancelled? = {}", s_installerTask.isDone());
+    		s_installerTask = null;
+    	}
+    	
+    	if (m_installerExecutor != null) {
+    		s_logger.debug("Terminating DeploymentAgent Thread ...");
+    		m_installerExecutor.shutdownNow();
+    		try {
+    			m_installerExecutor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("DeploymentAgent Thread terminated? - {}", m_installerExecutor.isTerminated());
+    		m_installerExecutor = null;
+    	}
+    	
+    	if ((s_uninstallerTask != null) && (!s_uninstallerTask.isDone())) {
+    		s_logger.debug("Cancelling DeploymentAgent:Uninstall task ...");
+    		s_uninstallerTask.cancel(true);
+    		s_logger.info("DeploymentAgent:Uninstall task cancelled? = {}", s_uninstallerTask.isDone());
+    		s_uninstallerTask = null;
+    	}
+    	
+    	if (m_uninstallerExecutor != null) {
+    		s_logger.debug("Terminating DeploymentAgent:Uninstall Thread ...");
+    		m_uninstallerExecutor.shutdownNow();
+    		try {
+    			m_uninstallerExecutor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("DeploymentAgent:Uninstall Thread terminated? - {}", m_uninstallerExecutor.isTerminated());
+    		m_uninstallerExecutor = null;
+    	}
+
+		m_uninstPackageNames = null;
+		m_instPackageUrls = null;
+	}
+
+	public void setDeploymentAdmin(DeploymentAdmin deploymentAdmin) {
+		m_deploymentAdmin = deploymentAdmin;
+	}
+
+	public void unsetDeploymentAdmin(DeploymentAdmin deploymentAdmin) {
+		m_deploymentAdmin = null;
+	}
+
+	protected void setEventAdmin(EventAdmin eventAdmin) {
+		m_eventAdmin = eventAdmin;
+	}
+
+	protected void unsetEventAdmin(EventAdmin eventAdmin) {
+		m_eventAdmin = null;
+	}
+
+	@Override
+	public void installDeploymentPackageAsync(String url) throws Exception {
+		if (m_instPackageUrls.contains(url)) {
+			throw new Exception("Element already exists");
+		}
+
+		m_instPackageUrls.offer(url);
+		synchronized (m_instPackageUrls) {
+			m_instPackageUrls.notifyAll();
+		}
+	}
+
+	@Override
+	public void uninstallDeploymentPackageAsync(String name) throws Exception {
+		if (m_uninstPackageNames.contains(name)) {
+			throw new Exception("Element already exists");
+		}
+
+		m_uninstPackageNames.offer(name);
+		synchronized (m_uninstPackageNames) {
+			m_uninstPackageNames.notifyAll();
+		}
+	}
+
+	@Override
+	public boolean isInstallingDeploymentPackage(String url) {
+		if (m_instPackageUrls.contains(url)) {
+			return true;
+		}
+		return false;
+	}
+
+	@Override
+	public boolean isUninstallingDeploymentPackage(String name) {
+		if (m_uninstPackageNames.contains(name)) {
+			return true;
+		}
+		return false;
+	}
+
+	private void installer() {
+		do {
+			try {
+				try {
+					synchronized(m_instPackageUrls) {
+						m_instPackageUrls.wait();
+					}
+
+					while (!m_instPackageUrls.isEmpty()) {
+						String url = m_instPackageUrls.peek();
+						if (url != null) {
+							s_logger.info("About to install package at URL {}", url);
+							DeploymentPackage dp = null;
+							Exception ex = null;
+							try {
+								dp = installDeploymentPackageInternal(url);
+							} catch (Exception e) {
+								ex = e;
+								s_logger.error("Exception installing package at URL {}", url, e);
+							} finally {
+								boolean successful = dp != null ? true : false;
+								s_logger.info("Posting INSTALLED event for package at URL {}: {}", url, successful ? "successful" : "unsuccessful");
+								m_instPackageUrls.poll();
+								postInstalledEvent(dp, url, successful, ex);
+							}
+						}
+					}
+				} catch (InterruptedException e) {
+					s_logger.info("Exiting...");
+					Thread.interrupted();
+					return;
+				}
+			} catch (Throwable t) {
+				s_logger.error("Unexpected throwable", t);
+			}
+		} while (true);
+	}
+
+	private void uninstaller() {
+		do {
+			try {
+				try {
+					synchronized(m_uninstPackageNames) {
+						m_uninstPackageNames.wait();
+					}
+
+					while (!m_uninstPackageNames.isEmpty()) {
+						String name = m_uninstPackageNames.peek();
+						if (name != null) {
+							s_logger.info("About to uninstall package ", name);
+							DeploymentPackage dp = null;
+							boolean successful = false;
+							Exception ex = null;
+							try {
+								dp = m_deploymentAdmin.getDeploymentPackage(name);
+								if (dp != null) {
+									dp.uninstall();
+
+									String sUrl = m_deployedPackages.getProperty(name);
+									File dpFile = new File(new URL(sUrl).getPath());
+									if (!dpFile.delete()) {
+										s_logger.warn("Cannot delete file at URL: {}", sUrl);
+									}
+									successful = true;
+									removePackageFromConfFile(name);
+								}
+							} catch (Exception e) {
+								ex = e;
+								s_logger.error("Exception uninstalling package {}", name, e);
+							} finally {
+								s_logger.info("Posting UNINSTALLED event for package {}: {}", name, successful ? "successful" : "unsuccessful");
+								m_uninstPackageNames.poll();
+								postUninstalledEvent(name, successful, ex);
+							}
+						}
+					}
+				} catch (InterruptedException e) {
+					s_logger.info("Exiting...");
+					Thread.interrupted();
+					return;
+				}
+			} catch (Throwable t) {
+				s_logger.error("Unexpected throwable", t);
+			}
+		} while (true);
+	}
+
+	private void postInstalledEvent(DeploymentPackage dp, String url, boolean successful, Exception e) {
+		Map<String,Object> props = new HashMap<String,Object>();
+
+		if (dp != null) {
+			props.put(EVENT_PACKAGE_NAME, dp.getName());
+			Version version = dp.getVersion();
+			props.put(EVENT_PACKAGE_VERSION, version.toString());
+		} else {
+			props.put(EVENT_PACKAGE_NAME, "UNKNOWN");
+			props.put(EVENT_PACKAGE_VERSION, "UNKNOWN");	
+		}
+		props.put(EVENT_PACKAGE_URL, url);
+		props.put(EVENT_SUCCESSFUL, successful);
+		props.put(EVENT_EXCEPTION, e);
+		EventProperties eventProps = new EventProperties(props);
+		m_eventAdmin.postEvent(new Event(EVENT_INSTALLED_TOPIC, eventProps));
+	}
+
+	private void postUninstalledEvent(String name, boolean successful, Exception e) {	
+		Map<String,Object> props = new HashMap<String,Object>();
+		props.put(EVENT_PACKAGE_NAME, name);
+		props.put(EVENT_SUCCESSFUL, successful);
+		props.put(EVENT_EXCEPTION, e);
+		EventProperties eventProps = new EventProperties(props);
+		m_eventAdmin.postEvent(new Event(EVENT_UNINSTALLED_TOPIC, eventProps));
+	}
+
+	private void installPackagesFromConfFile() {
+
+		if (m_dpaConfPath != null) {
+			try {
+				m_deployedPackages.load(new FileReader(m_dpaConfPath));
+			} catch (IOException e) {
+				s_logger.error("Exception loading deployment packages configuration file", e);
+			}
+		}
+
+		Set<Object> packageNames = m_deployedPackages.keySet();
+		for (Object packageName : packageNames) {
+			String packageUrl = (String) m_deployedPackages.get(packageName);
+
+			s_logger.info("Deploying package name {} at URL {}", packageName, packageUrl);
+			try {
+				installDeploymentPackageAsync(packageUrl);
+			} catch (Exception e) {
+				s_logger.error("Error installing package {}", packageName, e);
+			}
+		}
+	}
+
+	private DeploymentPackage installDeploymentPackageInternal(String urlSpec) throws DeploymentException, IOException, URISyntaxException {
+		URL url = new URL(urlSpec);
+		// Get the file base name from the URL
+		String urlPath = url.getPath();
+		String[] parts = urlPath.split("/");
+		String dpBasename = parts[parts.length - 1];
+		String dpPersistentFilePath = m_packagesPath + File.separator + dpBasename;
+		File dpPersistentFile = new File(dpPersistentFilePath);
+		
+		DeploymentPackage dp = null;
+		File dpFile = null;
+		InputStream dpInputStream = null;
+		try {
+			// Download the package to a temporary file unless it already resides
+			// on the local filesystem.
+			if (!url.getProtocol().equals("file")) {
+				dpFile = File.createTempFile("dpa", null);
+				dpFile.deleteOnExit();
+
+				FileUtils.copyURLToFile(url, dpFile, m_connTimeout, m_readTimeout);
+			} else {
+				dpFile = new File(url.getPath());
+			}
+
+			dpInputStream = new FileInputStream(dpFile);
+			dp = m_deploymentAdmin.installDeploymentPackage(dpInputStream);
+
+			// Now we need to copy the deployment package file to the Kura
+			// packages directory unless it's already there.
+			if (!dpFile.getCanonicalPath().equals(dpPersistentFile.getCanonicalPath())) {
+				s_logger.info("dpFile.getCanonicalPath(): " +  dpFile.getCanonicalPath());
+				s_logger.info("dpPersistentFile.getCanonicalPath(): " +  dpPersistentFile.getCanonicalPath());
+                String line = null;
+                Process proc = Runtime.getRuntime().exec("pwd");
+                BufferedReader br = new BufferedReader( new InputStreamReader(proc.getInputStream()));
+                while ((line = br.readLine()) != null) {
+                	s_logger.info("PWD: " + line);
+                }
+				
+				FileUtils.copyFile(dpFile, dpPersistentFile);
+				addPackageToConfFile(dp.getName(), "file:" + dpPersistentFilePath);
+			}			
+		} catch (DeploymentException e) {
+			throw e;
+		} catch (IOException e) {
+		    throw e;
+		} finally {
+			if (dpInputStream != null) {
+				try {
+					dpInputStream.close();
+				} catch (IOException e) {
+					s_logger.warn("Cannot close input stream", e);
+				}
+			}
+			// The file from which we have installed the deployment package will be deleted
+			// unless it's a persistent deployment package file.
+			if (dpFile != null && !dpFile.equals(dpPersistentFile)) {
+				dpFile.delete();
+			}
+		}
+		
+		return dp;
+	}
+
+	private void addPackageToConfFile(String packageName, String packageUrl) {
+		m_deployedPackages.setProperty(packageName, packageUrl);
+
+		if (m_dpaConfPath == null) {
+			s_logger.warn("Configuration file not specified");
+			return;
+		}
+
+		try {
+			FileOutputStream fos = new FileOutputStream(m_dpaConfPath);
+			m_deployedPackages.store(fos, null);
+			fos.flush();
+			fos.getFD().sync();
+			fos.close();			
+		} catch (IOException e) {
+			s_logger.error("Error writing package configuration file", e);
+		}
+	}
+
+	private void removePackageFromConfFile(String packageName) {
+		m_deployedPackages.remove(packageName);
+
+		if (m_dpaConfPath == null) {
+			s_logger.warn("Configuration file not specified");
+			return;
+		}
+
+		try {
+			FileOutputStream fos = new FileOutputStream(m_dpaConfPath);
+			m_deployedPackages.store(fos, null);
+			fos.flush();
+			fos.getFD().sync();
+			fos.close();
+		} catch (IOException e) {
+			s_logger.error("Error writing package configuration file", e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/.gitignore b/kura/org.eclipse.kura.deployment.customizer.upgrade/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5e56e040ec0902e58df8573adaec65c5da6e9304
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/.gitignore
@@ -0,0 +1 @@
+/bin
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.deployment.customizer.upgrade/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..f9ae9acdde56d34a0715b2a64cc6b625ee02e162
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.deployment.customizer.upgrade
+Bundle-SymbolicName: org.eclipse.kura.deployment.customizer.upgrade;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-Activator: org.eclipse.kura.deployment.customizer.upgrade.rp.Activator
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.apache.commons.io;version="2.4.0",
+ org.osgi.framework;version="1.7.0",
+ org.osgi.service.deploymentadmin;version="1.1.0",
+ org.osgi.service.deploymentadmin.spi,
+ org.slf4j;version="1.6.4"
+Bundle-ClassPath: .
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/build.properties b/kura/org.eclipse.kura.deployment.customizer.upgrade/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..34d2e4d2dad529ceaeb953bfcdb63c51d69ffed2
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/pom.xml b/kura/org.eclipse.kura.deployment.customizer.upgrade/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6ff2d1daf03365873eaeab23e9d24634660fe6c3
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.deployment.customizer.upgrade</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/Activator.java b/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/Activator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6d98e05ea95dc0c280be6fa7622771162788634
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/Activator.java
@@ -0,0 +1,28 @@
+package org.eclipse.kura.deployment.customizer.upgrade.rp;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.deploymentadmin.spi.ResourceProcessor;
+
+public class Activator implements BundleActivator {
+
+	private UpgradeScriptResourceProcessorImpl urp;
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		urp = new UpgradeScriptResourceProcessorImpl();
+		Dictionary<String, String> dict = new Hashtable<String, String>();
+		dict.put("service.pid", "org.eclipse.kura.deployment.customizer.upgrade.rp.UpgradeScriptResourceProcessor");
+		urp.activate(context);
+		context.registerService(ResourceProcessor.class.getName(), urp, dict);
+	}
+
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		urp.deactivate();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/UpgradeScriptResourceProcessorImpl.java b/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/UpgradeScriptResourceProcessorImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f2e621df0ef9ecfe571548c899a73f51ccc33ed
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/UpgradeScriptResourceProcessorImpl.java
@@ -0,0 +1,127 @@
+package org.eclipse.kura.deployment.customizer.upgrade.rp;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.io.FileUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
+import org.osgi.service.deploymentadmin.spi.DeploymentSession;
+import org.osgi.service.deploymentadmin.spi.ResourceProcessor;
+import org.osgi.service.deploymentadmin.spi.ResourceProcessorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UpgradeScriptResourceProcessorImpl implements ResourceProcessor {
+	
+	private static Logger s_logger = LoggerFactory.getLogger(UpgradeScriptResourceProcessorImpl.class);
+
+	private BundleContext		m_bundleContext;
+	private DeploymentPackage 	m_sourceDP;
+	private DeploymentPackage 	m_targetDP;
+	private Map<String, File>	m_sourceResourceFiles = new HashMap<String, File>();
+	private File				m_upgradeScript;
+	
+	protected void activate(BundleContext bundleContext) {
+		m_bundleContext = bundleContext;
+		s_logger.info("Activating -> " + m_bundleContext.getBundle().getSymbolicName());
+	}
+	
+	protected void deactivate() {
+		s_logger.info("Deactivating -> " + m_bundleContext.getBundle().getSymbolicName());
+	}
+	
+	@Override
+	public void begin(DeploymentSession session) {
+		s_logger.debug("Upgrade script resource processor: begin");
+		
+		m_sourceDP = session.getSourceDeploymentPackage();
+		m_targetDP = session.getTargetDeploymentPackage();
+	}
+
+	@Override
+	public void process(String name, InputStream stream) throws ResourceProcessorException {
+		s_logger.debug("Upgrade script resource processor: process");
+		
+		// Create temporary files for source resources
+		File tmpFile = null;
+		try {
+			tmpFile = File.createTempFile("upgrade_", null);
+		} catch (IOException ioe) {
+			s_logger.error("Failed to create temporary file for resource: '{}'", name);
+			throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+					"Failed to create temporary file for resource: " + name, ioe);
+		}
+		
+		try {
+			FileUtils.copyInputStreamToFile(stream, tmpFile);
+		} catch (IOException ioe) {
+			s_logger.error("Failed to copy input stream for resource: '{}'", name);
+			throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+					"Failed to copy input stream for resource: "+ name, ioe);	
+		}
+		m_sourceResourceFiles.put(name, tmpFile);
+	}
+
+	@Override
+	public void dropped(String resource) throws ResourceProcessorException {
+		s_logger.debug("Upgrade script resource processor: dropped");
+		
+	}
+
+	@Override
+	public void dropAllResources() throws ResourceProcessorException {
+		s_logger.debug("Upgrade script resource processor: droppedAllResources");
+		
+	}
+
+	@Override
+	public void prepare() throws ResourceProcessorException {
+		s_logger.debug("Upgrade script resource processor: prepare");
+		// Iterate over list of resources
+		// TODO: Check for and execute pre-upgrade scripts here
+		Set<String> sourceResources = m_sourceResourceFiles.keySet();
+		for (String resource : sourceResources) {
+			m_upgradeScript = m_sourceResourceFiles.get(resource);
+		}
+		try {
+			executeScript(m_upgradeScript);
+		} catch (Exception e) {
+			s_logger.error("Failed to copy input stream for resource: '{}'");
+			throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+					"Failed to copy input stream for resource: "+ e);
+		}
+	}
+
+	@Override
+	public void commit() {
+		s_logger.debug("Upgrade script resource processor: commit");
+		
+		
+		
+	}
+
+	@Override
+	public void rollback() {
+		s_logger.debug("Upgrade script resource processor: rollback");
+		
+	}
+
+	@Override
+	public void cancel() {
+		s_logger.debug("Upgrade script resource processor: cancel");
+		
+	}
+	
+	private void executeScript(File file) throws IOException {
+		String path = file.getCanonicalPath();
+		String[] cmdarray = {"/bin/bash", path};
+		Runtime rt = Runtime.getRuntime();
+		rt.exec(cmdarray);
+	}
+
+}
diff --git a/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/package-info.java b/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5200280933d3173f83356d7849f6151146d4a02
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer.upgrade/src/main/java/org/eclipse/kura/deployment/customizer/upgrade/rp/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+/**
+ * @author dwoodard
+ *
+ */
+package org.eclipse.kura.deployment.customizer.upgrade.rp;
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.customizer/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.deployment.customizer/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..4605a90420b36d9d07b936abfde3bd667ef353d8
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.deployment.customizer
+Bundle-SymbolicName: org.eclipse.kura.deployment.customizer;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-Activator: org.eclipse.kura.deployment.rp.sh.impl.Activator
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.apache.commons.io;version="2.4.0",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.deploymentadmin,
+ org.osgi.service.deploymentadmin.spi;version="1.0.0",
+ org.slf4j;version="1.6.4"
+Bundle-ClassPath: .
diff --git a/kura/org.eclipse.kura.deployment.customizer/about.html b/kura/org.eclipse.kura.deployment.customizer/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.customizer/about_files/epl-v10.html b/kura/org.eclipse.kura.deployment.customizer/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.customizer/build.properties b/kura/org.eclipse.kura.deployment.customizer/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5730daf53065b9d084f16a3717dc85054d0a1588
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/build.properties
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/,\
+           src/test/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     org.apache.felix.deploymentadmin,\
+                     osgi.cmpn,\
+                     slf4j.api
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.deployment.customizer/pom.xml b/kura/org.eclipse.kura.deployment.customizer/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2ea5179e47636182ed43d0e0849af77cad43e38f
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.deployment.customizer</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/Activator.java b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/Activator.java
new file mode 100644
index 0000000000000000000000000000000000000000..e459d226ce6b6dd890fa36db5ddfdb1f9eafb82a
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/Activator.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.rp.sh.impl;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.deploymentadmin.spi.ResourceProcessor;
+
+public class Activator implements BundleActivator {
+	private ShellScriptResourceProcessorImpl rp;
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		rp = new ShellScriptResourceProcessorImpl();
+		Dictionary<String, String> dict = new Hashtable<String, String>();
+		dict.put("service.pid", "org.eclipse.kura.deployment.rp.sh.ShellScriptResourceProcessor");
+		rp.activate(context);
+		context.registerService(ResourceProcessor.class.getName(), rp, dict);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		rp.deactivate(context);
+	}
+}
diff --git a/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/InterruptTimerTask.java b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/InterruptTimerTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..7557355cabd9353cd4ff2e7a59fdfd43d290b60e
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/InterruptTimerTask.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.rp.sh.impl;
+
+import java.util.TimerTask;
+
+/**
+ * Just a simple TimerTask that interrupts the specified thread when run.
+ */
+class InterruptTimerTask extends TimerTask {
+	private Thread thread;
+
+	public InterruptTimerTask(Thread t) {
+		this.thread = t;
+	}
+
+	public void run() {
+		thread.interrupt();
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/ProcessMonitorThread.java b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/ProcessMonitorThread.java
new file mode 100644
index 0000000000000000000000000000000000000000..d50a98b146d52f61577738ba8dd373e0755b5acd
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/ProcessMonitorThread.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.rp.sh.impl;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Timer;
+
+public class ProcessMonitorThread extends Thread 
+{
+	private Process proc;
+	private String stdin;
+	private int procTout;
+	private String stdout;
+	private String stderr;
+	private boolean timedOut;
+	private Exception exception;
+	private Integer exitValue;
+
+	
+	public ProcessMonitorThread(Process proc, String stdin, int procTout) {
+		this.proc = proc;
+		this.stdin = stdin;
+		this.procTout = procTout;
+		this.timedOut = false;
+	}
+
+	
+	public String getStdout() {
+		return stdout;
+	}
+
+
+	public String getStderr() {
+		return stderr;
+	}
+
+
+	public Integer getExitValue() {
+		return exitValue;
+	}
+
+	
+	public boolean isTimedOut() {
+		return timedOut;
+	}
+	
+	
+	public Exception getException() {
+		return exception;
+	}
+
+
+	public void setException(Exception exception) {
+		this.exception = exception;
+	}
+
+	
+	public void run() {
+
+		// Resources that should be cleaned up
+		InputStream is = null;
+		InputStream es = null;
+		OutputStream os = null;
+		BufferedWriter obw = null;
+		
+		StreamGobbler isg = null;
+		StreamGobbler esg = null;
+		Timer timer = null;
+
+		try {
+			if (procTout > 0) {
+				timer = new Timer(true);
+				InterruptTimerTask interrupter = new InterruptTimerTask(Thread.currentThread());
+				timer.schedule(interrupter, procTout /*seconds*/ * 1000 /*milliseconds per second*/);
+			}
+
+			is = proc.getInputStream();
+			es = proc.getErrorStream();
+
+			os = proc.getOutputStream();
+			OutputStreamWriter osw = new OutputStreamWriter(os);
+			obw = new BufferedWriter(osw);
+
+			// Spawn a couple of StreamGobbler to consume output streams
+			isg = new StreamGobbler(is, "stdout");
+			esg = new StreamGobbler(es, "stderr");
+			isg.start();
+			esg.start();
+
+			if (stdin != null) {
+				try {
+					obw.write(stdin);
+					obw.newLine();
+					obw.flush();
+				} catch (IOException e) {
+					throw e;
+				}
+			}
+
+			proc.waitFor();
+			isg.join(1000);
+			esg.join(1000);
+			exitValue = proc.exitValue();
+		} catch (IOException e) {
+			exception = e;
+		} catch (InterruptedException e) {
+			timedOut  = true;
+		} finally {
+			if (timer != null) {
+				timer.cancel();
+			}
+
+			if (isg != null) {
+				isg.interrupt();
+				try {
+					isg.join(1000);
+				} catch (InterruptedException e) {
+					// Ignore
+				}
+				stdout = isg.getStreamAsString();
+			}
+
+			if (esg != null) {
+				esg.interrupt();
+				try {
+					esg.join(1000);
+				} catch (InterruptedException e) {
+					// Ignore
+				}
+				stderr = esg.getStreamAsString();
+			}
+
+			// See http://kylecartmell.com/?p=9
+			if (is != null) {
+				try {
+					is.close();
+				} catch (IOException e) {
+					// Ignore
+				}
+			}
+			if (es != null) {
+				try {
+					es.close();
+				} catch (IOException e) {
+					// Ignore
+				}
+			}
+			if (obw != null) {
+				try {
+					obw.close();
+				} catch (IOException e) {
+					// Ignore
+				}				
+			}
+			if (os != null) {
+				try {
+					os.close();
+				} catch (IOException e) {
+					// Ignore
+				}				
+			}			
+			if (proc != null) {
+				proc.destroy();
+			}
+
+			Thread.interrupted(); // See http://kylecartmell.com/?p=9
+		}
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/ShellScriptResourceProcessorImpl.java b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/ShellScriptResourceProcessorImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff29da0e384f3aa30f71f075d54cfa747c9dc883
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/ShellScriptResourceProcessorImpl.java
@@ -0,0 +1,461 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.rp.sh.impl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.commons.io.FileUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
+import org.osgi.service.deploymentadmin.spi.DeploymentSession;
+import org.osgi.service.deploymentadmin.spi.ResourceProcessor;
+import org.osgi.service.deploymentadmin.spi.ResourceProcessorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ShellScriptResourceProcessorImpl implements ResourceProcessor {
+	private static Logger s_logger = LoggerFactory.getLogger(ShellScriptResourceProcessorImpl.class);
+	
+	private static final String KURA_CONF_URL_PROPNAME = "kura.configuration";
+	private static final String PACKAGES_PATH_PROPNAME = "kura.packages";
+	
+	private static final String INSTALL_ACTION = "install";
+	private static final String UNINSTALL_ACTION = "uninstall";
+	
+	private File m_resourcesRootDirectory;
+	
+	private DeploymentPackage m_sourceDP;
+	private DeploymentPackage m_targetDP;
+	
+	private Map<String, File> m_sourceResourceFiles = new HashMap<String, File>();
+	private List<String> m_uninstalledResources = new ArrayList<String>();
+	private List<String> m_installedResources = new ArrayList<String>();
+	private List<String> m_droppedResources = new ArrayList<String>();
+	
+	BundleContext m_bundleContext;
+	
+	protected void activate(BundleContext bundleContext) {
+		s_logger.info("activate");
+		m_bundleContext = bundleContext;
+		
+		String sKuraConfUrl = System.getProperty(KURA_CONF_URL_PROPNAME);
+		if (sKuraConfUrl == null || sKuraConfUrl.isEmpty()) {
+			throw new ComponentException("The value of '" + KURA_CONF_URL_PROPNAME + "' is not defined");
+		}
+				
+		URL kuraUrl = null;
+		try {
+			kuraUrl = new URL(sKuraConfUrl);
+		} catch (MalformedURLException e) {
+			throw new ComponentException("Invalid Kura configuration URL");
+		}
+		
+		Properties kuraProperties = new Properties();
+		try {
+			kuraProperties.load(kuraUrl.openStream());
+		} catch (FileNotFoundException e) {
+			throw new ComponentException("Kura configuration file not found", e);
+		} catch (IOException e) {
+			throw new ComponentException("Exception loading Kura configuration file", e);
+		}
+		
+		String packagesPath = kuraProperties.getProperty(PACKAGES_PATH_PROPNAME);		
+		if (packagesPath == null || packagesPath.isEmpty()) {
+			throw new ComponentException("The value of '" + PACKAGES_PATH_PROPNAME + "' is not defined");
+		}
+		if(kuraProperties.getProperty(PACKAGES_PATH_PROPNAME) != null && kuraProperties.getProperty(PACKAGES_PATH_PROPNAME).trim().equals("kura/packages")) {
+			kuraProperties.setProperty(PACKAGES_PATH_PROPNAME, "/opt/eurotech/kura/kura/packages");
+			packagesPath = kuraProperties.getProperty(PACKAGES_PATH_PROPNAME);
+			s_logger.warn("Overridding invalid kura.packages location");
+		}
+		
+		m_resourcesRootDirectory = new File(packagesPath, "resources");
+		if (!m_resourcesRootDirectory.exists()) {
+			boolean success = m_resourcesRootDirectory.mkdirs();
+			if (!success) {
+				throw new ComponentException("Failed to make directory: "+m_resourcesRootDirectory.getPath());
+			}
+		}
+	}
+	
+	protected void deactivate(BundleContext bundleContext) {
+		s_logger.info("deactivate");
+	}
+
+	@Override
+	public void begin(DeploymentSession dpSession) {
+		s_logger.info("begin");
+		
+		m_sourceDP = dpSession.getSourceDeploymentPackage();
+		m_targetDP = dpSession.getTargetDeploymentPackage();
+		
+		s_logger.info("Source Deployment Package name: '{}'", m_sourceDP.getName());
+		s_logger.info("Target Deployment Package name: '{}'", m_targetDP.getName());
+	}
+
+	@Override
+	public void cancel() {
+		s_logger.info("cancel");
+	}
+
+	@Override
+	public void commit() {
+		s_logger.info("commit");
+		
+		// Delete dropped resources files
+		for (String resource : m_droppedResources) {
+			s_logger.info("Delete file for resource: '{}", resource);
+			File file = getDPResourceFile(resource);
+			if (file == null) {
+				s_logger.warn("Resource file missing for resource: '{}'", resource);
+			} else {
+				boolean deleted = file.delete();
+				if (!deleted) {
+					s_logger.warn("Failed to delete file for resource: '{}'", resource);
+				}
+			}
+		}
+		
+		// Copy source resource files to Deployment Package resource directory
+		Set<String> sourceResources = m_sourceResourceFiles.keySet();
+		for (String resource : sourceResources) {
+			s_logger.info("Copy file for resource: '{}'", resource);
+			// Get the source resource file
+			File sourceResourceFile = m_sourceResourceFiles.get(resource);
+			
+			// Construct the destination file
+			File dir = new File(getResourcesRootDirectory(), m_sourceDP.getName());
+			s_logger.info("getRootResourceDirectory() :'{}'", getResourcesRootDirectory());
+			s_logger.info("m_sourceDP.getName() :'{}'", m_sourceDP.getName());
+			File destFile = new File(dir, resource);
+			try {
+				s_logger.info("Copy file for resource: '{}' to path: '{}'", resource, destFile.getPath());
+				FileUtils.copyFile(sourceResourceFile, destFile);
+			} catch (IOException e) {
+				s_logger.warn("Failed to copy file for resource: '{}'", resource);
+			}
+			sourceResourceFile.delete();
+		}
+	}
+
+	@Override
+	public void dropAllResources() throws ResourceProcessorException {
+		s_logger.info("dropAllResources");
+		
+		String[] resources = m_targetDP.getResources();
+		if (resources != null) {
+			for (String resource : resources) {
+				// FIXME?: we also get bundle resources here, not only
+				// resources associated to this Resource Processor.
+				ServiceReference<?> serviceReference = m_targetDP.getResourceProcessor(resource);
+				if (serviceReference != null) {
+					if (serviceReference.compareTo(m_bundleContext.getServiceReference(ResourceProcessor.class)) == 0) {
+						m_droppedResources.add(resource);
+					}
+				}
+			}
+		}
+	}
+
+	@Override
+	public void dropped(String resource) throws ResourceProcessorException {
+		s_logger.info("Dropped resource: '{}'", resource);
+		m_droppedResources.add(resource);
+	}
+
+	@Override
+	public void prepare() throws ResourceProcessorException {
+		s_logger.info("prepare");
+		
+		// Iterate over all resources belonging to the source Deployment Package.
+		// Some resources might be new and other resources might be updated.
+		Set<String> sourceResources = m_sourceResourceFiles.keySet();
+		for (String resource : sourceResources) {
+			// Get the source resource file
+			File sourceResourceFile = m_sourceResourceFiles.get(resource);
+			
+			// Get the target resource file
+			File targetResourceFile = getDPResourceFile(resource);
+			if (targetResourceFile != null) {
+				s_logger.info("Executing uninstall action for resource: '{}'", resource);
+				try {
+					executeScript(targetResourceFile, UNINSTALL_ACTION);
+					m_uninstalledResources.add(resource);
+				} catch (Exception e) {
+					s_logger.error("Failed to execute uninstall action for resource: '{}'", resource, e);
+					throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+							"Failed to execute uninstall action for resource: "+resource, e);
+				}
+			}
+			
+			try {
+				s_logger.info("Executing install action for resource: '{}'", resource);
+				executeScript(sourceResourceFile, INSTALL_ACTION);
+				m_installedResources.add(resource);
+			} catch (Exception e) {
+				s_logger.error("Failed to execute install action for resource: '{}'", resource, e);
+				throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+						"Failed to execute install action for resource: "+resource, e);
+			}
+		}
+		
+		for (String resource : m_droppedResources) {
+			File targetResourceFile = getDPResourceFile(resource);
+			if (targetResourceFile == null) {
+				s_logger.warn("Target resource file missing for resource: '{}'. Proceed anyway but we might not be able to completely rollback the changes", resource);					
+			} else {
+				s_logger.info("Executing uninstall action for resource: '{}'", resource);
+				try {
+					executeScript(targetResourceFile, UNINSTALL_ACTION);
+					m_uninstalledResources.add(resource);
+				} catch (Exception e) {
+					s_logger.error("Failed to execute uninstall action for resource: '{}'", resource, e);
+					throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+							"Failed to execute uninstall action for resource: "+resource, e);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void process(String resource, InputStream is)
+			throws ResourceProcessorException {
+		s_logger.info("Processing resource: '{}'", resource);
+		
+		// Check deltas.
+		// Caveat: we should calculate the resource deltas against the "target" Deployment Package, i.e.
+		// a previous version of the Deployment Package.
+		// The problem is that we start the framework with the osgi.clean property set to true
+		// and we reinstall all the Deployment Packages from an external directory.
+		// Since the OSGi cache is clean there will be no target Deployment Package when the Deployment Package is reinstalled.
+		// This Resource Processor stores Deployment Package resources
+		// as files in a persistent directory on disk.
+		// The delta is then calculated against the resources files in that directory.
+		File targetResourceFile = getDPResourceFile(resource);
+		if (targetResourceFile != null) {
+			s_logger.info("Resource: '{}' already exists in Deployment Package: '{}'", resource, m_sourceDP);
+			try {
+				InputStream tis = new FileInputStream(targetResourceFile);
+				byte[] d1 = computeDigest(tis);
+				byte[] d2 = computeDigest(is);
+
+				if (digestsMatch(d1, d2)) {
+					s_logger.info("Digests for source and target resource: '{}' match. No need to update resource", resource);
+					return;
+				}
+			} catch (FileNotFoundException e) {
+				s_logger.warn("Unexpected exception. Proceed anyway", e);
+			} catch (NoSuchAlgorithmException e) {
+				s_logger.warn("Unexpected exception. Proceed anyway", e);
+			} catch (IOException e) {
+				s_logger.warn("Unexpected exception. Proceed anyway", e);
+			}
+		}
+		
+		// Create temporary files for source resources
+		File tmpFile = null;
+		try {
+			tmpFile = File.createTempFile("shrp", null);
+		} catch (IOException e) {
+			s_logger.error("Failed to create temporary file for resource: '{}'", resource);
+			throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+					"Failed to create temporary file for resource: "+resource, e);
+		}
+		tmpFile.deleteOnExit();
+		try {
+			FileUtils.copyInputStreamToFile(is, tmpFile);
+		} catch (IOException e) {
+			s_logger.error("Failed to copy input stream for resource: '{}'", resource);
+			throw new ResourceProcessorException(ResourceProcessorException.CODE_PREPARE,
+					"Failed to copy input stream for resource: "+resource, e);			
+		}
+		m_sourceResourceFiles.put(resource, tmpFile);
+	}
+
+	@Override
+	public void rollback() {
+		s_logger.info("rollback");
+		
+		for (String resource : m_installedResources) {
+			// Get the source resource file
+			File sourceResourceFile = m_sourceResourceFiles.get(resource);
+			try {
+				s_logger.info("Executing uninstall action for resource: '{}'", resource);
+				executeScript(sourceResourceFile, UNINSTALL_ACTION);
+			} catch (Exception e) {
+				s_logger.warn("Failed to execute uninstall action for resource: '{}'", resource, e);
+			}
+		}
+		
+		for (String resource : m_uninstalledResources) {
+			// Get the target resource file
+			File targetResourceFile = getDPResourceFile(resource);
+			if (targetResourceFile == null) {
+				s_logger.warn("Target resource file missing for resource: '{}'. Proceed anyway but we might not be able to completely rollback the changes", resource);					
+			} else {
+				s_logger.info("Executing install action for resource: '{}'", resource);
+				try {
+					executeScript(targetResourceFile, INSTALL_ACTION);
+				} catch (Exception e) {
+					s_logger.warn("Failed to execute install action for resource: '{}'", resource, e);
+				}
+			}
+		}
+	}
+		
+	private void executeScript(File file, String action) throws Exception {
+		String path = file.getCanonicalPath();
+		String[] cmdarray = {"/bin/bash", path, action};
+		Runtime rt = Runtime.getRuntime();
+		Process  proc = rt.exec(cmdarray);
+		
+		ProcessMonitorThread pmt = new ProcessMonitorThread(proc, null, 0);
+		pmt.start();
+		pmt.join();
+		s_logger.error("Script stdout: {}", pmt.getStdout());
+		s_logger.error("Script stderr: {}", pmt.getStderr());
+		Exception e = pmt.getException();
+		if (e != null) {
+			s_logger.error("Exception executing install action for script: '{}'", e);
+			throw e;
+		} else {
+			if (!pmt.isTimedOut()) {
+				Integer exitValue = pmt.getExitValue();
+				if (exitValue != 0) {
+					s_logger.error("Install action for script: '{}' failed with exit value: {}", path, exitValue);
+					throw new Exception("Install action for script: "+path+" failed with exit value: "+exitValue);
+				}
+			}
+		}
+	}
+	
+//	private File getTargetDPResourceFile(String resource) {
+//		File dir = getTargetDPResourceDirectory();
+//		if (dir == null) {
+//			return null;
+//		} else {
+//			File file = new File(dir, resource);
+//			if (file.exists()) {
+//				return file;
+//			}
+//		}
+//		return null;
+//	}
+//		
+//	private File getTargetDPResourceDirectory() {
+//		File root = getRootResourceDirectory();
+//		if (root == null) {
+//			return null;
+//		} else {
+//			File dir = new File(root, m_targetDP.getName());
+//			if (dir.exists()) {
+//				return dir;
+//			}
+//		}
+//		return null;
+//	}
+	
+	private File getDPResourceFile(String resource) {
+		File dir = getDPResourceDirectory();
+		if (dir == null) {
+			return null;
+		} else {
+			File file = new File(dir, resource);
+			if (file.exists()) {
+				return file;
+			}
+		}
+		return null;
+	}
+		
+	private File getDPResourceDirectory() {
+		File root = getResourcesRootDirectory();
+		if (root == null) {
+			return null;
+		} else {
+			String dpName = null;
+			if (!m_sourceDP.getName().isEmpty()) {
+				dpName = m_sourceDP.getName();
+			} else {
+				dpName = m_targetDP.getName();
+			}
+			
+			File dir = new File(root, dpName);
+			if (dir.exists()) {
+				return dir;
+			}
+		}
+		return null;
+	}
+	
+	private File getResourcesRootDirectory() {
+		return m_resourcesRootDirectory;
+	}
+	
+//	private boolean belongsToTargetDP(String resource) {
+//		boolean result = false;
+//		String[] resources = m_targetDP.getResources();
+//		if (resources != null) {
+//			for (String targetResource : resources) {
+//				if (resource.equals(targetResource)) {
+//					result = true;
+//					break;
+//				}
+//			}
+//		}
+//		return result;
+//	}
+	
+	private byte[] computeDigest(InputStream is) throws NoSuchAlgorithmException, IOException {
+		MessageDigest md = MessageDigest.getInstance("MD5");
+		DigestInputStream dis = new DigestInputStream(is, md);
+		while (dis.read() != -1);
+		byte[] digest = md.digest();
+		return digest;
+	}
+	
+	private boolean digestsMatch(byte[] d1, byte[] d2) {
+		if (d1 == null || d2 == null) {
+			return false;
+		}
+		
+		if (d1.length != d2.length) {
+			return false;
+		}
+		
+		for (int i = 0; i < d1.length; i++) {
+			if (d1[i] != d2[i]) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/StreamGobbler.java b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/StreamGobbler.java
new file mode 100644
index 0000000000000000000000000000000000000000..80bf79e9d70167b4987ac18cb74bcbe0850eb81e
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.customizer/src/main/java/org/eclipse/kura/deployment/rp/sh/impl/StreamGobbler.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.deployment.rp.sh.impl;
+
+import java.io.*;
+
+class StreamGobbler extends Thread {
+	InputStream is;
+	String type;
+	StringBuilder sb;
+
+	public StreamGobbler(InputStream is, String type) {
+		this.is = is;
+		this.type = type;
+		this.sb = new StringBuilder();
+	}
+
+	public String getStreamAsString() {
+		return sb.toString();
+	}
+
+	public void run() {
+		InputStreamReader isr = new InputStreamReader(is);
+		BufferedReader br = new BufferedReader(isr);
+
+		try	{
+			final int BUF_LEN = 1024;
+			final int MAX_BYTES = 100 * BUF_LEN;
+			int count = 0;
+			char[] cbuf = new char[BUF_LEN];
+			int read = -1;
+
+			while ((read = br.read(cbuf)) != -1) {
+				//System.out.println(type + ">number of bytes read: " + read);
+				
+				if (count < MAX_BYTES) {
+					count += read; // might slightly exceed MAX_BYTES
+					sb.append(cbuf, 0, read);
+				}
+			}
+		} catch (IOException ioe) {
+			// ioe.printStackTrace();
+		} finally {
+			try {
+				br.close();
+				is.close(); // Just in case...
+			} catch (IOException e) {
+				// Ignore
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.update/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.deployment.update/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..d5aee33d0a1b660b52fac0413c6450212172d3b8
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.deployment.update
+Bundle-SymbolicName: org.eclipse.kura.deployment.update;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
diff --git a/kura/org.eclipse.kura.deployment.update/about.html b/kura/org.eclipse.kura.deployment.update/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.update/about_files/epl-v10.html b/kura/org.eclipse.kura.deployment.update/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.deployment.update/build.properties b/kura/org.eclipse.kura.deployment.update/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..73c22eb0d8f2597aeabe35e900f1bc6f5b5a5cb5
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/build.properties
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               resources/,\
+               about_files/,\
+               about.html
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.deployment.update/pom.xml b/kura/org.eclipse.kura.deployment.update/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b3c4e14920857266701cf14c535c901a7f772101
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.deployment.update</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.deployment.update/resources/esf_update_script.sh b/kura/org.eclipse.kura.deployment.update/resources/esf_update_script.sh
new file mode 100644
index 0000000000000000000000000000000000000000..69cb071d3e93c27c070febba0c11fcfce950355f
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/resources/esf_update_script.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+echo "Kura update was here!!" > /tmp/proof.txt
diff --git a/kura/org.eclipse.kura.deployment.update/src/main/resources/org.eclipse.kura.example.dp.app.dpp b/kura/org.eclipse.kura.deployment.update/src/main/resources/org.eclipse.kura.example.dp.app.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..61b149260658c92b1b064085d78482bc57816782
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/src/main/resources/org.eclipse.kura.example.dp.app.dpp
@@ -0,0 +1,32 @@
+#Deployment Plugin Project File
+#Fri Feb 14 13:07:06 PST 2014
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.example.dp.app_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.example.dp.app.dp
+build.location=
+bundles.0.bundle_path=<.>/.project
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.example.dp.app.jar
+bundles.0.symbolic_name=org.eclipse.kura.example.dp.app;singleton\:\=true
+bundles.0.version=0.2.0.qualifier
+bundles.1.bundle_path=/Users/eurotech/dev/git/esf2_develop/esf2/kura/org.eclipse.kura.example.dp.customizer/.project
+bundles.1.customizer=true
+bundles.1.headers.count=0
+bundles.1.missing=false
+bundles.1.name=bundles/org.eclipse.kura.example.dp.customizer.jar
+bundles.1.symbolic_name=org.eclipse.kura.example.dp.customizer
+bundles.1.version=0.2.0.qualifier
+bundles.count=2
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.example.dp.app
+headers.version=1.0.0
+resources.0.headers.count=0
+resources.0.missing=false
+resources.0.name=resources/file.txt
+resources.0.path=/Users/eurotech/dev/git/esf2_develop/esf2/kura/org.eclipse.kura.example.dp.customizer/src/main/resources/file.txt
+resources.0.processor=org.eclipse.kura.example.dp.customizer.MyResourceProcessor
+resources.count=1
+
diff --git a/kura/org.eclipse.kura.deployment.update/src/main/resources/script.sh b/kura/org.eclipse.kura.deployment.update/src/main/resources/script.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e5e863d3acfb2dd4458270c5813288667a8a80bc
--- /dev/null
+++ b/kura/org.eclipse.kura.deployment.update/src/main/resources/script.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+echo "Hello world" > /tmp/proof.txt
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.emulator/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.emulator/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..67a704dcffb4dac33031bd6c97c5bbca7e8a0fe5
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.emulator
+Bundle-SymbolicName: org.eclipse.kura.emulator;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.kura.emulator; version="0.2.0"
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.usb;version="1.0.2",
+ javax.xml.parsers,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.clock; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.core.net; version="[0.2,0.3)",
+ org.eclipse.kura.net; version="[0.2,0.3)",
+ org.eclipse.kura.net.modem; version="[0.2,1.0)",
+ org.eclipse.kura.net.wifi; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.eclipse.kura.watchdog; version="[0.2,1.0)",
+ org.json,
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.util.measurement;version="1.0.1",
+ org.osgi.util.position;version="1.0.1",
+ org.slf4j;version="1.6.4",
+ org.xml.sax,
+ org.xml.sax.helpers
+Bundle-ClassPath: .
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/clock.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/clock.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b112c316caaae3f092740b98ee63780d50ba2810
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/clock.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.clock.ClockService">
+   <implementation class="org.eclipse.kura.emulator.clock.ClockServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.clock.ClockService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.clock.ClockService"/>
+   <reference name="EventAdmin" 
+              cardinality="1..1" 
+              policy="static"
+              bind="setEventAdmin"
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/emulator.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/emulator.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8c1f5c3e679e0f184fde03b0cf3b75d462770a0a
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/emulator.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.emulator.Emulator">
+   <implementation class="org.eclipse.kura.emulator.Emulator"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.clock.ClockService.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.clock.ClockService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b477f34e4cbc2d611f85a26b8f77e55b8f3e4bba
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.clock.ClockService.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.clock.ClockService" 
+         name="ClockService" 
+         description="Emulated implementation of the ClockService">
+        
+        <Icon resource="ClockService" size="32"/>
+        
+       	<AD id="enabled"
+            name="enabled"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="false"
+            description="The emulated ClockService is always disabled."/>
+
+    </OCD>
+    <Designate pid="org.eclipse.kura.clock.ClockService">
+        <Object ocdref="org.eclipse.kura.clock.ClockService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.position.PositionService.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.position.PositionService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1c52ed058a72a267e00ff374d5c128bbb66ee909
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.position.PositionService.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.position.PositionService"
+         name="PositionService" 
+         description="Emulated implementation of the PositionService.">
+        
+        <Icon resource="PositionService" size="32"/>
+        
+        <AD id="enabled"
+            name="enabled"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="true"
+            description="The emulated PositionService is always enabled and using sample GPS positions."/>
+        
+        <AD id="useGpsd"
+            name="useGpsd"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="false"
+            description="If true uses the gpsd service daemon. This implies that this daemon must be installed and active first."/>
+                
+    </OCD>
+    <Designate pid="org.eclipse.kura.position.PositionService">
+        <Object ocdref="org.eclipse.kura.position.PositionService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.watchdog.WatchdogService.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.watchdog.WatchdogService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..428ce1bac4334a290c53dbfc33613673bab271e2
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/metatype/org.eclipse.kura.watchdog.WatchdogService.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.watchdog.WatchdogService" 
+         name="WatchdogService" 
+         description="Emulated implementation of the WatchdogService">         
+
+        <Icon resource="WatchdogService" size="32"/>
+        
+        <AD id="enabled"  
+            name="enabled"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="The emulated WatchdogService is always disabled."/>
+                    
+    </OCD>
+    <Designate pid="org.eclipse.kura.watchdog.WatchdogService">
+        <Object ocdref="org.eclipse.kura.watchdog.WatchdogService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/network.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/network.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d4d245c0a1d839cf01c3e4ab34a06036fe3a0b7b
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/network.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" name="org.eclipse.kura.net.NetworkService">
+   <implementation class="org.eclipse.kura.emulator.net.EmulatedNetworkServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.NetworkService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.net.NetworkService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/position.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/position.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4c2bc0ce493e1aa84012a81022fcce3e9dc6d596
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/position.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" modified="updated" name="org.eclipse.kura.position.PositionService">
+   <implementation class="org.eclipse.kura.emulator.position.PositionServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.position.PositionService"/>
+      <!--
+      <provide interface="org.osgi.service.event.EventHandler"/>
+      -->
+   </service>
+   <reference name="EventAdmin" 
+              cardinality="1..1" 
+              policy="static"
+              bind="setEventAdmin"
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/> 
+</scr:component>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/usb.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/usb.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4bdf2ee121384eb27c3e5d717c4c9f398aa4300d
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/usb.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" name="org.eclipse.kura.usb.UsbService">
+   <implementation class="org.eclipse.kura.emulator.usb.UsbServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.usb.UsbService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.usb.UsbService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.emulator/OSGI-INF/watchdog.xml b/kura/org.eclipse.kura.emulator/OSGI-INF/watchdog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4580abefc0e4f5c8140aa0c66ba4eb80636eeab7
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/OSGI-INF/watchdog.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.watchdog.WatchdogService">
+   <implementation class="org.eclipse.kura.emulator.watchdog.WatchdogServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.watchdog.WatchdogService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.watchdog.WatchdogService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.emulator/about.html b/kura/org.eclipse.kura.emulator/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.emulator/about_files/epl-v10.html b/kura/org.eclipse.kura.emulator/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.emulator/build.properties b/kura/org.eclipse.kura.emulator/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ef81e18999b2aca7ad4e81fe9e3497640ae4c604
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/build.properties
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+output.. = target/classes/
+source.. = src/main/java/,\
+           src/main/resources/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     osgi.cmpn,\
+                     slf4j.api,\
+                     org.eclipse.equinox.metatype,\
+                     org.json
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.emulator/pom.xml b/kura/org.eclipse.kura.emulator/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..170bfd56028960c5517d462e63eb99cc6dcb808f
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/pom.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.emulator</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/Emulator.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/Emulator.java
new file mode 100644
index 0000000000000000000000000000000000000000..259bbbaf5485bab6ec6c4fb5829263e0de448919
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/Emulator.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator;
+
+import java.util.Properties;
+
+import org.osgi.service.component.ComponentContext;
+
+
+public class Emulator 
+{	
+	@SuppressWarnings("unused")
+	private ComponentContext m_componentContext;
+
+	protected void activate(ComponentContext componentContext) 
+	{
+		m_componentContext = componentContext;
+		
+		try {
+			Properties props = System.getProperties();
+			String mode = props.getProperty("org.eclipse.kura.mode");
+			if(mode.equals("emulator")) {
+				System.out.println("Framework is running in emulation mode");
+			} else {
+				System.out.println("Framework is not running in emulation mode");
+			}
+		} catch(Exception e) {
+			System.out.println("Framework is not running in emulation mode");
+		}
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		m_componentContext = null;
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/clock/ClockServiceImpl.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/clock/ClockServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea2265a07b9ddaa7a5de61082ff3f4e64f92689a
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/clock/ClockServiceImpl.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.clock;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.clock.ClockService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.EventAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClockServiceImpl implements ConfigurableComponent, ClockService
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ClockServiceImpl.class);
+
+	@SuppressWarnings("unused")
+	private ComponentContext      m_ctx;
+	@SuppressWarnings("unused")
+	private EventAdmin            m_eventAdmin;
+	@SuppressWarnings("unused")
+	private Map<String,Object>    m_properties;
+		
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = eventAdmin;
+	}
+
+	public void unsetEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = null;
+	}
+
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) 
+	{
+		s_logger.info("Activate. Current Time: {}", new Date());
+
+		// save the bundle context
+		m_ctx = componentContext;		
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("Deactivate...");
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("Updated...");		
+		try {
+
+			// save the properties
+			m_properties = properties;
+		}
+		catch (Throwable t) {
+			s_logger.error("Error updating ClockService Configuration", t);
+		}
+	}
+
+		
+	// ----------------------------------------------------------------
+	//
+	//   Master Client Management APIs
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public Date getLastSync() throws KuraException {
+		return new Date();
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/net/EmulatedNetworkServiceImpl.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/net/EmulatedNetworkServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7dcc2cf164876fa4b75c813777618249b7fc2208
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/net/EmulatedNetworkServiceImpl.java
@@ -0,0 +1,363 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.net;
+
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.EthernetInterfaceImpl;
+import org.eclipse.kura.core.net.NetInterfaceAddressImpl;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceState;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.NetworkState;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EmulatedNetworkServiceImpl implements NetworkService
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(EmulatedNetworkServiceImpl.class);
+	
+	@SuppressWarnings("unused")
+	private ComponentContext      m_ctx;
+
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) 
+	{			
+		//
+		// save the bundle context
+		m_ctx = componentContext;
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		m_ctx = null;
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+
+	@Override
+	public NetworkState getState() 
+	{
+		java.net.InetAddress jnAddress = getFirstActiveInetAddress();
+		if (jnAddress == null) {
+			return NetworkState.DISCONNECTED;
+		}
+		else if (jnAddress.isLoopbackAddress() || jnAddress.isLinkLocalAddress()) {
+			return NetworkState.CONNECTED_LOCAL;			
+		}
+		else if (jnAddress.isSiteLocalAddress()) {
+			return NetworkState.CONNECTED_SITE;
+		}
+		else {
+			return NetworkState.CONNECTED_GLOBAL;
+		}
+	}
+	
+	@Override
+	public NetInterfaceState getState(String interfaceName) 
+	{
+		// Returned unknown state for the emulataed network service.
+		return NetInterfaceState.UNKNOWN;
+	}
+	
+	@Override
+	public List<String> getAllNetworkInterfaceNames()  
+		throws KuraException
+	{
+		List<String> interfaceNames = new ArrayList<String>();
+		
+		java.net.NetworkInterface jnInterface = null;
+		Enumeration<java.net.NetworkInterface> interfaces = null;
+		try {
+			interfaces = java.net.NetworkInterface.getNetworkInterfaces();
+			while (interfaces.hasMoreElements()) {
+				jnInterface = interfaces.nextElement();
+				interfaceNames.add(jnInterface.getName());
+			}
+		}
+		catch (SocketException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+			
+		return interfaceNames;
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	@Override
+	public List<NetInterface<? extends NetInterfaceAddress>> getNetworkInterfaces() 
+		throws KuraException
+	{
+		IPAddress            netAddress = null; 
+		NetInterfaceAddressImpl  addressImpl = null;
+		List<NetInterfaceAddress>  addresses = null;
+		List<NetInterface<? extends NetInterfaceAddress>> interfaces = new ArrayList<NetInterface<? extends NetInterfaceAddress>>();
+		
+		EthernetInterfaceImpl    ethInterface = null;
+		java.net.NetworkInterface jnInterface = null;
+		List<java.net.InterfaceAddress> jnInterfaceAddresses = null;
+		Enumeration<java.net.NetworkInterface> jnInterfaces  = null;		
+		try {
+			jnInterfaces = java.net.NetworkInterface.getNetworkInterfaces();
+			while (jnInterfaces.hasMoreElements()) {
+				
+				jnInterface  = jnInterfaces.nextElement();
+				ethInterface = new EthernetInterfaceImpl(jnInterface.getName());				
+				ethInterface.setVirtual(jnInterface.isVirtual());
+				ethInterface.setState(NetInterfaceState.ACTIVATED);
+				ethInterface.setAutoConnect(true);
+
+				byte[]  hwAddr = null;
+				boolean   isUp = false;
+				boolean isLoop = false;
+				int        mtu = 0;
+				boolean  isP2p = false;
+				boolean  multi = false;
+				try {  
+					hwAddr = jnInterface.getHardwareAddress();
+					isUp   = jnInterface.isUp();
+					isLoop = jnInterface.isLoopback();
+					mtu    = jnInterface.getMTU();
+					isP2p  = jnInterface.isPointToPoint();
+					multi  = jnInterface.supportsMulticast();
+				} catch (Exception e) {
+					s_logger.warn("Exception while getting information for interface "+jnInterface.getName()+": "+e.getMessage());
+				}
+				ethInterface.setHardwareAddress(hwAddr);
+				ethInterface.setLinkUp(isUp);
+				ethInterface.setLoopback(isLoop);
+				ethInterface.setMTU(mtu);
+				ethInterface.setPointToPoint(isP2p);
+				ethInterface.setSupportsMulticast(multi);
+				ethInterface.setUp(isUp);
+				
+				addresses = new ArrayList<NetInterfaceAddress>();
+				jnInterfaceAddresses = jnInterface.getInterfaceAddresses();
+				for (java.net.InterfaceAddress jnInterfaceAddress : jnInterfaceAddresses) {
+					
+					netAddress  = IPAddress.getByAddress(jnInterfaceAddress.getAddress().getAddress());
+					addressImpl = new NetInterfaceAddressImpl();
+					addressImpl.setAddress(netAddress);
+					if (jnInterfaceAddress.getBroadcast() != null) {
+						addressImpl.setBroadcast( IPAddress.getByAddress(jnInterfaceAddress.getBroadcast().getAddress()));
+					}
+					addressImpl.setNetworkPrefixLength(jnInterfaceAddress.getNetworkPrefixLength());
+					
+					addresses.add(addressImpl);
+				}
+				ethInterface.setNetInterfaceAddresses(addresses);				
+				interfaces.add(ethInterface);				
+			}
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}			
+		return interfaces;
+	}
+
+	@Override
+	public List<WifiAccessPoint> getAllWifiAccessPoints() {		
+		return Collections.emptyList();
+	}
+
+	@Override
+	public List<WifiAccessPoint> getWifiAccessPoints(String wifiInterfaceName) {
+		return Collections.emptyList();
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	@Override
+	public List<NetInterface<? extends NetInterfaceAddress>> getActiveNetworkInterfaces()
+		throws KuraException
+	{
+		IPAddress netAddress = null; 
+		NetInterfaceAddressImpl  addressImpl = null;
+		List<NetInterfaceAddress>  addresses = null;
+		List<NetInterface<? extends NetInterfaceAddress>> interfaces = new ArrayList<NetInterface<? extends NetInterfaceAddress>>();
+		
+		EthernetInterfaceImpl    ethInterface = null;
+		java.net.NetworkInterface jnInterface = null;
+		List<java.net.InterfaceAddress> jnInterfaceAddresses = null;
+		Enumeration<java.net.NetworkInterface> jnInterfaces  = null;		
+		try {
+			jnInterfaces = java.net.NetworkInterface.getNetworkInterfaces();
+			while (jnInterfaces.hasMoreElements()) {
+				
+				try {
+					jnInterface  = jnInterfaces.nextElement();
+					if (jnInterface.isUp() && !jnInterface.isVirtual() && !jnInterface.isLoopback() && !jnInterface.isPointToPoint()&& (jnInterface.getHardwareAddress() != null) && !jnInterface.getInterfaceAddresses().isEmpty()) {
+						
+						ethInterface = new EthernetInterfaceImpl(jnInterface.getName());
+						ethInterface.setVirtual(jnInterface.isVirtual());
+						ethInterface.setState(NetInterfaceState.ACTIVATED);
+						ethInterface.setAutoConnect(true);
+	
+						byte[]  hwAddr = null;
+						boolean   isUp = false;
+						boolean isLoop = false;
+						int        mtu = 0;
+						boolean  isP2p = false;
+						boolean  multi = false;
+						try {  
+							hwAddr = jnInterface.getHardwareAddress();
+							isUp   = jnInterface.isUp();
+							isLoop = jnInterface.isLoopback();
+							mtu    = jnInterface.getMTU();
+							isP2p  = jnInterface.isPointToPoint();
+							multi  = jnInterface.supportsMulticast();
+						} catch (Exception e) {
+							s_logger.warn("Exception while getting information for interface "+jnInterface.getName(), e);
+						}
+						ethInterface.setHardwareAddress(hwAddr);
+						ethInterface.setLinkUp(isUp);
+						ethInterface.setLoopback(isLoop);
+						ethInterface.setMTU(mtu);
+						ethInterface.setPointToPoint(isP2p);
+						ethInterface.setSupportsMulticast(multi);
+						ethInterface.setUp(isUp);
+						
+						addresses = new ArrayList<NetInterfaceAddress>();
+						jnInterfaceAddresses = jnInterface.getInterfaceAddresses();
+						for (java.net.InterfaceAddress jnInterfaceAddress : jnInterfaceAddresses) {
+							
+							netAddress  = IPAddress.getByAddress(jnInterfaceAddress.getAddress().getAddress());
+							addressImpl = new NetInterfaceAddressImpl();
+							addressImpl.setAddress(netAddress);
+							if (jnInterfaceAddress.getBroadcast() != null) {
+								addressImpl.setBroadcast( IPAddress.getByAddress(jnInterfaceAddress.getBroadcast().getAddress()));
+							}
+							addressImpl.setNetworkPrefixLength(jnInterfaceAddress.getNetworkPrefixLength());
+							
+							addresses.add(addressImpl);
+						}
+						ethInterface.setNetInterfaceAddresses(addresses);				
+						interfaces.add(ethInterface);
+					}
+				} catch (SocketException se) {
+					s_logger.warn("Exception while getting information for interface "+jnInterface.getName(), se);
+				}
+			}
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}			
+		return interfaces;
+	}
+	
+	
+	
+	// ---------------------------------------------------------
+	//
+	//  Private methods
+	//
+	// ---------------------------------------------------------
+
+	private java.net.InetAddress getFirstActiveInetAddress()
+	{
+		java.net.InetAddress jnAddress = null;
+		java.net.NetworkInterface jnInterface = null;
+		try {
+		
+			Enumeration<java.net.NetworkInterface> interfaces = null;
+		
+			// search for a non loopback interface
+			interfaces = java.net.NetworkInterface.getNetworkInterfaces();
+			while (interfaces.hasMoreElements()) {
+			
+				jnInterface = interfaces.nextElement();
+				if (jnInterface.isUp() && !jnInterface.isLoopback() && !jnInterface.isVirtual()) {
+				
+					Enumeration<java.net.InetAddress> addresses = null;
+					addresses = jnInterface.getInetAddresses();
+					while (addresses.hasMoreElements()) {
+						
+						java.net.InetAddress address = addresses.nextElement();
+						if (address instanceof java.net.Inet4Address && !address.isLoopbackAddress()) {
+							jnAddress = address;
+							break;
+						}
+					}
+				}
+				if (jnAddress != null) {
+					break;
+				}
+				
+				// get a loopback interface
+				interfaces = java.net.NetworkInterface.getNetworkInterfaces();
+				while (interfaces.hasMoreElements()){
+				
+					jnInterface = interfaces.nextElement();
+					if (jnInterface.isUp() && !jnInterface.isVirtual()) {
+					
+						Enumeration<java.net.InetAddress> addresses = null;
+						addresses = jnInterface.getInetAddresses();
+						while (addresses.hasMoreElements()) {
+							
+							java.net.InetAddress address = addresses.nextElement();
+							if (address instanceof java.net.Inet4Address) {
+								jnAddress = address;
+								break;
+							}
+						}
+					}
+				}
+			}			
+		}
+		catch (SocketException e) {
+			s_logger.error("Error getting IP address", e);
+		}
+		return jnAddress;
+	}
+
+
+	@Override
+	public String getModemUsbPort(String interfaceName) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+
+	@Override
+	public String getModemPppPort(ModemDevice modemDevice) throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/GpsPoint.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/GpsPoint.java
new file mode 100644
index 0000000000000000000000000000000000000000..2677575289d15e2880c610b804831fd5e668b2ea
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/GpsPoint.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.position;
+
+public class GpsPoint {
+	private double latitude;
+	private double longitude;
+	private double altitude;
+	private String time;
+	
+	public GpsPoint(double latitude, double longitude, double altitude, String time) {
+		this.latitude = latitude;
+		this.longitude = longitude;
+		this.altitude = altitude;
+		this.time = time;
+	}
+
+	public double getLatitude() {
+		return latitude;
+	}
+
+	public double getLongitude() {
+		return longitude;
+	}
+
+	public double getAltitude() {
+		return altitude;
+	}
+
+	public String getTime() {
+		return time;
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/GpsXmlHandler.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/GpsXmlHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..e75b7f7ac4763fc7542b495d008ca25f3f9781fd
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/GpsXmlHandler.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.position;
+
+import java.util.ArrayList;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class GpsXmlHandler extends DefaultHandler {
+	private static final String LABEL = "org.eclipse.kura.app.demo.kura.training.console.GpsXmlHandler: ";	
+	
+	//Valid Elements in the xml file
+	private static final String TAG_TRACK_POINT = "trkpt";
+	private static final String TAG_ELEVATION = "ele";
+	private static final String TAG_TIME = "time";
+	
+	private ArrayList gpsPoints;
+	private String latitude;
+	private String longitude;
+	private String elevation;
+	private String time;
+	
+	private boolean foundTrackPoint = false;
+	private boolean foundElevation = false;
+	private boolean foundTime = false;
+	
+	public GpsXmlHandler() {
+		gpsPoints = new ArrayList();
+		latitude = null;
+		longitude = null;
+		elevation = null;
+		time = null;
+	}
+	
+	public void startElement(String uri, String localName, String elementName, Attributes attributes) {
+		
+		if (TAG_TRACK_POINT.equals(elementName)) {
+			foundTrackPoint = true;
+			
+			if(attributes.getLength() == 2) {
+				for(int i=0; i<attributes.getLength(); i++) {
+					if(attributes.getQName(i).compareTo("lat") == 0) {
+						latitude = attributes.getValue(i);
+					} else if(attributes.getQName(i).compareTo("lon") == 0) {
+						longitude = attributes.getValue(i);
+					} else {
+						System.out.println(LABEL + "invalid attribute in trkpt element: " + attributes.getQName(i));
+					}
+				}
+			} else {
+				System.out.println(LABEL + "there must be two attributes (lat and lon) in the trkpt element");
+			}
+			
+			elevation = null;
+			time = null;
+		} else if(TAG_ELEVATION.equals(elementName)) {
+			foundElevation = true;
+		} else if(TAG_TIME.equals(elementName)) {
+			foundTime = true;
+		}
+	}
+	
+	public void endElement(String uri, String localName, String elementName) {
+		
+		if (TAG_TRACK_POINT.equals(elementName)) {
+			foundTrackPoint = false;
+			
+			if(latitude != null && longitude != null && elevation != null && time != null) {
+				this.gpsPoints.add(new GpsPoint(Double.parseDouble(latitude), Double.parseDouble(longitude), Double.parseDouble(elevation), time));
+			} else {
+				System.out.println(LABEL + "the XML file is malformted");
+			}
+		} else if(TAG_ELEVATION.equals(elementName)) {
+			foundElevation = false;
+		} else if(TAG_TIME.equals(elementName)) {
+			foundTime = false;
+		}
+	}
+	
+	public void characters(char[] buf, int offset, int length) {
+		String tag = (new String(buf).substring(offset, offset+length)).trim();
+		
+		if (!foundTrackPoint && !foundElevation && !foundTime) {
+			return;
+		}
+		
+		if(foundElevation) {
+			if(elevation == null) {
+				this.elevation = new String(buf, offset, length);
+				return;
+			} else {
+				this.elevation = elevation + new String(buf, offset, length);
+				return;
+			}
+		}
+		
+		if(foundTime) {
+			if(time == null) {
+				this.time = new String(buf, offset, length);
+				return;
+			} else {
+				this.time = time + new String(buf, offset, length);
+				return;
+			}
+		}
+		
+		System.out.println(LABEL + "found some odd data in services.xml");
+		logDump(tag.getBytes());
+	}
+	
+	public GpsPoint[] getGpsPoints() {
+		GpsPoint[] data = new GpsPoint[gpsPoints.size()];
+
+		for(int i=0; i<gpsPoints.size(); i++) {
+			data[i] = (GpsPoint) gpsPoints.get(i);
+		}
+		
+		return data;
+	}
+	
+	private void logDump(byte[] message) {
+		for (int i = 0; i < message.length; i++) {
+			if ((i % 16) == 0) {
+				if (i > 0) {
+					System.out.println();
+				}
+				System.out.print('\t');
+			}
+			if (message[i] < 0x10) {
+				System.out.print("0x0"
+						+ Integer.toHexString(message[i] & 0x0ff) + " ");
+			} else {
+				System.out.print("0x"
+						+ Integer.toHexString(message[i] & 0x0ff) + " ");
+			}
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..460a56a740f4d8322ec82e35a40e09a15ac255ad
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java
@@ -0,0 +1,226 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.position;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.kura.position.NmeaPosition;
+import org.eclipse.kura.position.PositionLockedEvent;
+import org.eclipse.kura.position.PositionService;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.util.measurement.Measurement;
+import org.osgi.util.measurement.Unit;
+import org.osgi.util.position.Position;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PositionServiceImpl implements PositionService {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(PositionServiceImpl.class);
+
+	private static final String LOCATION = "boston";
+
+	private ComponentContext m_ctx;
+	private EventAdmin m_eventAdmin;
+	
+    private ScheduledExecutorService m_worker;
+    private ScheduledFuture<?> m_handle;
+    
+	private GpsPoint[] gpsPoints;
+	private Position currentPosition;
+	private NmeaPosition currentNmeaPosition;
+	private Date currentTime;
+	private int index = 0;
+	private boolean m_useGpsd;
+
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = eventAdmin;
+	}
+	
+	public void unsetEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = null;
+	}
+
+	// ----------------------------------------------------------------
+	//
+	// Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) {
+		//
+		// save the bundle context
+		m_ctx = componentContext;
+		m_useGpsd = false;
+		if(properties!=null){
+			if(properties.get("useGpsd")!=null)
+				m_useGpsd = (Boolean)properties.get("useGpsd");
+			if(m_useGpsd)
+				s_logger.info("USE GPSD");
+		}
+
+		start();
+	}
+	
+	public void updated(Map<String,Object> properties) 
+	{
+		if(properties!=null){
+			if(properties.get("useGpsd")!=null)
+				m_useGpsd = (Boolean)properties.get("useGpsd");
+			if(m_useGpsd)
+				s_logger.info("USE GPSD");
+		}
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		System.out.println("stopping");
+		stop();
+	}
+
+	@Override
+	public Position getPosition() {
+		return currentPosition;
+	}
+
+	@Override
+	public NmeaPosition getNmeaPosition() {
+		return currentNmeaPosition;
+	}
+
+	@Override
+	public String getNmeaTime() {
+		return currentTime.toString();
+	}
+
+	@Override
+	public String getNmeaDate() {
+		return currentTime.toString();
+	}
+
+	@Override
+	public boolean isLocked() {
+		// Always return true
+		return true;
+	}
+
+	@Override
+	public String getLastSentence() {
+		// Not supported in emulator mode since this is not NMEA
+		return null;
+	}
+
+	public void start() {
+		
+		index = 0;
+		
+		String fileName = null;
+		if (LOCATION.equals("boston")) {
+			fileName = "boston.gpx";
+		} else if (LOCATION.equals("denver")) {
+			fileName = "denver.gpx";
+		} else if (LOCATION.equals("paris")) {
+			fileName = "paris.gpx";
+		} else if (LOCATION.equals("test")) {
+			fileName = "test.gpx";
+		}
+
+		GpsXmlHandler handler = new GpsXmlHandler();
+		SAXParserFactory factory = SAXParserFactory.newInstance();
+		factory.setValidating(false);
+		try {
+			// Create the builder and parse the file
+			SAXParser parser = factory.newSAXParser();
+			s_logger.debug("Parsing: " + fileName);
+
+			BundleContext bundleContext = m_ctx.getBundleContext();
+			URL url = bundleContext.getBundle().getResource(fileName);
+			InputStream is = url.openStream();
+			
+			/*
+			BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/src/main/resources/" + fileName)));
+			StringBuffer buffer = new StringBuffer();
+			String temp = null;
+
+			while((temp = br.readLine()) != null) {
+				buffer.append(temp);
+			}
+			br.close();
+			br = null;
+
+			String string = new String(buffer);
+			byte[] data = string.getBytes();
+			ByteArrayInputStream bais = new ByteArrayInputStream(data);
+*/
+			parser.parse(is, handler);
+			gpsPoints = handler.getGpsPoints();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}		
+		
+		// schedule a new worker based on the properties of the service
+		m_worker = Executors.newSingleThreadScheduledExecutor();
+        m_handle = m_worker.scheduleAtFixedRate(new Runnable() {
+                @Override
+                public void run() {
+                        updateGps();
+                }
+        }, 0, 5, TimeUnit.SECONDS);
+        
+        s_logger.debug("posting event");
+        m_eventAdmin.postEvent( new PositionLockedEvent( new HashMap<String,Object>()));
+	}
+
+	public void stop() {
+		if (m_handle != null) {
+			m_handle.cancel(true);
+			m_handle = null;
+		}
+		
+		m_worker = null;
+	}
+	
+	private void updateGps() {
+		s_logger.debug("GPS Emulator index: " + index);
+		if ((index + 1) == gpsPoints.length) {
+			s_logger.debug("GPS Emulator - wrapping index");
+			index = 0;
+		}
+		
+		Measurement latitude = new Measurement(java.lang.Math.toRadians(gpsPoints[index].getLatitude()),Unit.rad);
+		Measurement longitude = new Measurement(java.lang.Math.toRadians(gpsPoints[index].getLongitude()),Unit.rad);
+		Measurement altitude = new Measurement(gpsPoints[index].getAltitude(),Unit.m);
+		
+		s_logger.debug("Updating lat/long/altitude: " + latitude + "/" + longitude + "/" + altitude);
+		
+		//Measurement lat, Measurement lon, Measurement alt, Measurement speed, Measurement track
+		currentTime = new Date();
+		currentPosition = new Position(latitude, longitude, altitude, null, null);
+		currentNmeaPosition = new NmeaPosition(gpsPoints[index].getLatitude(),gpsPoints[index].getLongitude(),gpsPoints[index].getAltitude(),0,0);
+		
+		index++;
+		
+		return;
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/usb/UsbServiceImpl.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/usb/UsbServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..c985a47c306f29a670b53bec3b2e95485daca046
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/usb/UsbServiceImpl.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.usb;
+
+import java.util.List;
+import java.util.Properties;
+
+import javax.usb.UsbServices;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.usb.UsbBlockDevice;
+import org.eclipse.kura.usb.UsbDevice;
+import org.eclipse.kura.usb.UsbNetDevice;
+import org.eclipse.kura.usb.UsbService;
+import org.eclipse.kura.usb.UsbTtyDevice;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UsbServiceImpl implements UsbService {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(UsbServiceImpl.class);
+
+	private List m_usbDevices;		//udev doesn't properly track devices (particularly for removal events) - so we have to do it.
+	
+	protected void activate(ComponentContext componentContext) {
+		//only support Linux
+		Properties props = System.getProperties();
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		m_usbDevices = null;
+	}
+
+	@Override
+	public UsbServices getUsbServices()
+			throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<? extends UsbDevice> getUsbDevices() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<UsbBlockDevice> getUsbBlockDevices() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<UsbNetDevice> getUsbNetDevices() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<UsbTtyDevice> getUsbTtyDevices() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/watchdog/CriticalServiceImpl.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/watchdog/CriticalServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..046dd4f9f19da3eec99f3da0ae565c99b2df8c81
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/watchdog/CriticalServiceImpl.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.emulator.watchdog;
+
+public class CriticalServiceImpl {
+
+	private String name;
+	private long timeout;
+	private long updated;
+	
+	/**
+	 * 
+	 * @param name
+	 * @param timeout		timeout for reporting interval in seconds
+	 */
+	public CriticalServiceImpl(String name, long timeout) {
+		this.name = name;
+		this.timeout = timeout;
+		this.updated = System.currentTimeMillis();
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public long getTimeout() {
+		return timeout;
+	}
+	
+	public boolean isTimedOut() {
+		long current = System.currentTimeMillis();
+		return timeout < (current - updated);
+	}
+	
+	public void update() {
+		updated = System.currentTimeMillis();
+	}
+	
+	public String toString() {
+		return "Service Name:  " + name + ", Timeout(ms):  " + timeout;
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/watchdog/WatchdogServiceImpl.java b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/watchdog/WatchdogServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..24cfceda61c0440e29492966c3d59616b7a99660
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/java/org/eclipse/kura/emulator/watchdog/WatchdogServiceImpl.java
@@ -0,0 +1,248 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.emulator.watchdog;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.watchdog.CriticalComponent;
+import org.eclipse.kura.watchdog.WatchdogService;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WatchdogServiceImpl implements WatchdogService, ConfigurableComponent {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(WatchdogServiceImpl.class);
+	
+	private Map<String,Object>				m_properties;
+	private ScheduledExecutorService		m_executor;
+	private ScheduledFuture<?>				m_future;
+	private int 							pingInterval = 10000;	//milliseconds
+	private static ArrayList<CriticalServiceImpl>	s_criticalServiceList;
+	private boolean 						m_configEnabled = false;	// initialized in properties, if false -> no watchdog
+	private boolean 						m_enabled; 
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) {
+		m_properties=properties;
+		if(properties == null) {
+			s_logger.debug("activating WatchdogService with null props");
+		} else {
+			s_logger.debug("activating WatchdogService with " + properties.toString());
+		}
+		s_criticalServiceList = new ArrayList<CriticalServiceImpl>();
+		m_enabled=false;
+		
+		//clean up if this is not our first run
+		if(m_executor != null) {
+			m_executor.shutdown();
+			while(!m_executor.isTerminated()) {
+				try {
+					Thread.sleep(500);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+			m_executor = null;
+		}
+		
+		m_executor = Executors.newSingleThreadScheduledExecutor();
+
+		m_future=m_executor.scheduleAtFixedRate(new Runnable() {
+			public void run() {
+				Thread.currentThread().setName(getClass().getSimpleName());
+				if(m_configEnabled)
+					doWatchdogLoop();
+			}
+		}, 0, pingInterval, TimeUnit.MILLISECONDS);		
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		m_executor.shutdown();
+		while(!m_executor.isTerminated()) {
+			try {
+				Thread.sleep(500);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		m_executor = null;
+		s_criticalServiceList = null;
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.debug("updated...");		
+		m_properties = properties;
+		if(m_properties!=null){
+			if(m_properties.get("enabled") != null){
+				if(m_properties.get("enabled") != null){
+					m_configEnabled = (Boolean) m_properties.get("enabled");
+				}
+			}
+			if(!m_configEnabled)
+				return;
+			if(m_properties.get("pingInterval") != null){
+				pingInterval = (Integer) m_properties.get("pingInterval");
+				if(m_future!=null){
+					m_future.cancel(false);
+					while(!m_future.isDone()){
+						try {
+							Thread.sleep(500);
+						} catch (InterruptedException e) {
+							e.printStackTrace();
+						}
+					}
+				}
+				m_future=m_executor.scheduleAtFixedRate(new Runnable() {
+					public void run() {
+						Thread.currentThread().setName(getClass().getSimpleName());
+						if(m_configEnabled)
+							doWatchdogLoop();
+					}
+				}, 0, pingInterval, TimeUnit.MILLISECONDS);		
+			}
+		}
+	}
+	
+	@Override
+	public void startWatchdog() {
+		// TODO Auto-generated method stub
+		m_enabled=true;
+	}
+
+	@Override
+	public void stopWatchdog() {
+		// TODO Auto-generated method stub
+		m_enabled=false;
+	}
+
+	@Override
+	public int getHardwareTimeout() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+    @Override
+    public void registerCriticalComponent(CriticalComponent criticalComponent) {
+        final CriticalServiceImpl service = new CriticalServiceImpl(criticalComponent.getCriticalComponentName(), criticalComponent.getCriticalComponentTimeout());
+        synchronized(s_criticalServiceList) {
+            // avoid to add same component twice (eg in case of a package updating) 
+            boolean existing=false;
+            for(CriticalServiceImpl csi:s_criticalServiceList){
+                if(criticalComponent.getCriticalComponentName().compareTo(csi.getName())==0) {
+                    existing=true;
+                }
+            }
+            if(!existing)
+                s_criticalServiceList.add(service);
+        }
+        
+        s_logger.debug("Added " + criticalComponent.getCriticalComponentName() + ", with timeout = " + criticalComponent.getCriticalComponentTimeout() +
+        ", list contains " + s_criticalServiceList.size() + " critical services");
+    }
+
+    @Override
+    @Deprecated
+	public void registerCriticalService(CriticalComponent criticalComponent) {
+        registerCriticalComponent(criticalComponent);
+	}
+
+    @Override
+    public void unregisterCriticalComponent(CriticalComponent criticalComponent) {
+        synchronized(s_criticalServiceList) {
+            for(int i=0; i<s_criticalServiceList.size(); i++) {
+                if(criticalComponent.getCriticalComponentName().compareTo(((CriticalServiceImpl)s_criticalServiceList.get(i)).getName())==0) {
+                    s_criticalServiceList.remove(i);
+                    s_logger.debug("Critical service " + criticalComponent.getCriticalComponentName() + " removed, " + System.currentTimeMillis());
+                }
+            }
+        }
+    }
+
+    @Override
+	public void unregisterCriticalService(CriticalComponent criticalComponent) {
+        unregisterCriticalComponent(criticalComponent);
+	}
+
+	@Override
+	public List<CriticalComponent> getCriticalComponents() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void checkin(CriticalComponent criticalService) {
+		synchronized(s_criticalServiceList) {
+			for(CriticalServiceImpl csi:s_criticalServiceList){
+				if(criticalService.getCriticalComponentName().compareTo(csi.getName())==0) {
+					csi.update();
+				}
+			}
+		}
+	}
+
+	private void doWatchdogLoop() {
+		if(!m_enabled)
+			return;
+		
+		boolean failure=false;
+		// Critical Services
+		synchronized(s_criticalServiceList) {
+			if(s_criticalServiceList.size() > 0) {
+				for(CriticalServiceImpl csi:s_criticalServiceList){
+					if(csi.isTimedOut()) {
+						failure=true;
+						s_logger.warn("Critical service " + csi.getName() + " failed -> SYSTEM REBOOT");
+					}
+				}
+			}
+		}
+		if(!failure)
+			refresh_watchdog();
+	}
+
+	private void refresh_watchdog() {
+		File f = new File("/dev/watchdog");
+		if(f.exists()){
+			try {
+				FileOutputStream fos = new FileOutputStream(f);
+				PrintWriter pw = new PrintWriter(fos);
+				pw.write("w");
+				pw.flush();
+				fos.getFD().sync();
+				pw.close();
+				fos.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	public boolean isConfigEnabled() {
+		return m_configEnabled;
+	}
+
+	public void setConfigEnabled(boolean configEnabled) {
+		this.m_configEnabled = configEnabled;
+	}
+}
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Core_Test.launch b/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Core_Test.launch
new file mode 100644
index 0000000000000000000000000000000000000000..60909ac3b0a224163b0bd2579179fba4c6d2f5af
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Core_Test.launch
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<booleanAttribute key="append.args" value="true"/>
+<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+<booleanAttribute key="askclear" value="false"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="true"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+<booleanAttribute key="default" value="false"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.kura.core.test/src/main/java/org/eclipse/kura/core/test/AllCoreTests.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.kura.core.test.AllCoreTests"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.kura.core.test"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8080 -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dorg.eclipse.kura.mode=emulator -Dkura.configuration=file:${git_work_tree}/kura/org.eclipse.kura.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties -Dlog4j.configuration=file:${git_work_tree}/kura/org.eclipse.kura.emulator/src/main/resources/log4j.properties"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.equinox.p2.director.app.product"/>
+<booleanAttribute key="run_in_ui_thread" value="false"/>
+<stringAttribute key="selected_target_plugins" value="javax.bluetooth@default:default,javax.comm@default:default,javax.servlet@default:false,javax.usb.api@default:default,log4j.apache-log4j-extras@default:false,log4j@default:default,mqtt-client@default:default,org.apache.commons.io@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime@default:true,org.eclipse.equinox.app@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.hsqldb.hsqldb@default:default,org.json@default:default,org.junit@default:default,org.knowhowlab.osgi.monitoradmin@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.kura.api@default:default,org.eclipse.kura.core.test@default:false,org.eclipse.kura.core@default:default,org.eclipse.kura.deployment.agent@default:default,org.eclipse.kura.emulator@default:default,org.eclipse.kura.test@default:default"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
+<stringAttribute key="timestamp" value="1351895208259"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="false"/>
+<booleanAttribute key="useProduct" value="false"/>
+</launchConfiguration>
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_Linux.launch b/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_Linux.launch
new file mode 100644
index 0000000000000000000000000000000000000000..2946f0cf3578af9358dbb4df920fb50c5288e86e
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_Linux.launch
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Kura_Emulator_Linux"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="deselected_workspace_plugins" value="org.eclipse.kura.core.test,org.eclipse.kura.demo.heater,org.eclipse.kura.demo.modbus,org.eclipse.kura.deployment.customizer,org.eclipse.kura.deployment.update,org.eclipse.kura.example.project,org.eclipse.kura.example.publisher,org.eclipse.kura.example.serial.publisher,org.eclipse.kura.linux.clock,org.eclipse.kura.linux.net,org.eclipse.kura.linux.net.test,org.eclipse.kura.linux.position,org.eclipse.kura.linux.usb,org.eclipse.kura.linux.watchdog,org.eclipse.kura.net.admin,org.eclipse.kura.protocol.can,org.eclipse.kura.protocol.can.test,org.eclipse.kura.protocol.modbus,org.eclipse.kura.protocol.modbus.test,org.eclipse.kura.test"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8080 -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dosgi.noShutdown=true -Declipse.ignoreApp=true  -Dorg.eclipse.kura.mode=emulator -Dkura.configuration=file:${git_work_tree}/kura/org.eclipse.kura.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties -Dlog4j.configuration=file:${git_work_tree}/kura/org.eclipse.kura.emulator/src/main/resources/log4j.properties"/>
+<booleanAttribute key="pde.generated.config" value="true"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="com.gwt.user@default:default,javax.servlet@default:default,javax.usb.api@default:default,javax.usb.common@default:default,log4j.apache-log4j-extras@default:false,log4j@default:default,mqtt-client@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.net@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.core.jobs@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.soda.dk.comm@default:default,org.hamcrest.core@default:default,org.hsqldb.hsqldb@default:default,org.json@default:default,org.junit@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="timestamp" value="1395389088671"/>
+<booleanAttribute key="tracing" value="false"/>
+<mapAttribute key="tracingOptions">
+<mapEntry key="org.eclipse.equinox.ds/debug" value="true"/>
+<mapEntry key="org.eclipse.equinox.ds/instantiate_all" value="true"/>
+<mapEntry key="org.eclipse.equinox.ds/performance" value="false"/>
+<mapEntry key="org.eclipse.equinox.ds/print_on_console" value="true"/>
+<mapEntry key="org.eclipse.equinox.registry/debug" value="false"/>
+<mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/objectPool/adds" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/objectPool/dups" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/cachedmanifest" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
+<mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
+<mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.internal.profile.DefaultProfileLogger"/>
+<mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/generics" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/uses" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
+<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
+</mapAttribute>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.kura.api@default:default,org.eclipse.kura.core.cloud@default:default,org.eclipse.kura.core.comm@default:default,org.eclipse.kura.core.configuration@default:default,org.eclipse.kura.core.crypto@default:default,org.eclipse.kura.core.deployment@default:default,org.eclipse.kura.core.net@default:default,org.eclipse.kura.core@default:default,org.eclipse.kura.deployment.agent@default:default,org.eclipse.kura.emulator@default:default,org.eclipse.kura.linux.command@default:default,org.eclipse.kura.web@default:default"/>
+</launchConfiguration>
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_OSX.launch b/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_OSX.launch
new file mode 100644
index 0000000000000000000000000000000000000000..8b5306f04433101bc234e676d9b5fc62cf1cb24f
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_OSX.launch
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Kura_Emulator_OSX"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="deselected_workspace_plugins" value="org.eclipse.kura.core.test,org.eclipse.kura.demo.heater,org.eclipse.kura.demo.modbus,org.eclipse.kura.deployment.customizer,org.eclipse.kura.deployment.update,org.eclipse.kura.example.project,org.eclipse.kura.example.publisher,org.eclipse.kura.example.serial.publisher,org.eclipse.kura.kura_apps.raspberry,org.eclipse.kura.linux.clock,org.eclipse.kura.linux.command,org.eclipse.kura.linux.net,org.eclipse.kura.linux.net.test,org.eclipse.kura.linux.position,org.eclipse.kura.linux.usb,org.eclipse.kura.linux.watchdog,org.eclipse.kura.net.admin,org.eclipse.kura.protocol.can,org.eclipse.kura.protocol.can.test,org.eclipse.kura.protocol.modbus,org.eclipse.kura.protocol.modbus.test,org.eclipse.kura.test"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8081 -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dosgi.noShutdown=true -Declipse.ignoreApp=true  -Dorg.eclipse.kura.mode=emulator -Dkura.configuration=file:${git_work_tree}/kura/org.eclipse.kura.emulator/src/main/resources/kura.properties -Dlog4j.configuration=file:${git_work_tree}/kura/org.eclipse.kura.emulator/src/main/resources/log4j.properties -Ddpa.configuration=/tmp/kura/dpa.properties"/>
+<booleanAttribute key="pde.generated.config" value="true"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="com.gwt.user@default:default,javax.servlet@default:default,javax.usb.api@default:default,javax.usb.common@default:default,log4j.apache-log4j-extras@default:false,log4j@default:default,mqtt-client@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.net@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime@default:true,org.eclipse.equinox.app@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.soda.dk.comm@default:default,org.hsqldb.hsqldb@default:default,org.json@default:default,org.knowhowlab.osgi.monitoradmin@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="timestamp" value="1403722201978"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.kura.api@default:true,org.eclipse.kura.core.cloud@default:default,org.eclipse.kura.core.comm@default:default,org.eclipse.kura.core.configuration@default:default,org.eclipse.kura.core.crypto@default:default,org.eclipse.kura.core.deployment@default:default,org.eclipse.kura.core.net@default:default,org.eclipse.kura.core@default:true,org.eclipse.kura.deployment.agent@default:true,org.eclipse.kura.emulator@default:true,org.eclipse.kura.web@default:default"/>
+</launchConfiguration>
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/boston.gpx b/kura/org.eclipse.kura.emulator/src/main/resources/boston.gpx
new file mode 100644
index 0000000000000000000000000000000000000000..3b001be7c7a061449cba2d0f179f70b6617148cb
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/boston.gpx
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<gpx version="1.1" creator="GPS Runner" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"><trk><number>1</number><trkseg><trkpt lat="42.229664" lon="-71.518378"><ele>149.6</ele><time>2005-04-18T18:01:13Z</time></trkpt><trkpt lat="42.229707" lon="-71.518314"><ele>149.1</ele><time>2005-04-18T18:01:15Z</time></trkpt><trkpt lat="42.230029" lon="-71.517777"><ele>148.7</ele><time>2005-04-18T18:01:31Z</time></trkpt><trkpt lat="42.230415" lon="-71.517434"><ele>146.7</ele><time>2005-04-18T18:01:44Z</time></trkpt><trkpt lat="42.230973" lon="-71.517026"><ele>143.9</ele><time>2005-04-18T18:02:02Z</time></trkpt><trkpt lat="42.23151" lon="-71.516705"><ele>141.5</ele><time>2005-04-18T18:02:19Z</time></trkpt><trkpt lat="42.231832" lon="-71.51634"><ele>139</ele><time>2005-04-18T18:02:32Z</time></trkpt><trkpt lat="42.232068" lon="-71.515932"><ele>134.7</ele><time>2005-04-18T18:02:44Z</time></trkpt><trkpt lat="42.232325" lon="-71.515331"><ele>130.9</ele><time>2005-04-18T18:02:58Z</time></trkpt><trkpt lat="42.23254" lon="-71.514773"><ele>131.4</ele><time>2005-04-18T18:03:10Z</time></trkpt><trkpt lat="42.232797" lon="-71.514173"><ele>126.1</ele><time>2005-04-18T18:03:24Z</time></trkpt><trkpt lat="42.23299" lon="-71.51355"><ele>123.7</ele><time>2005-04-18T18:03:37Z</time></trkpt><trkpt lat="42.233205" lon="-71.512885"><ele>120.3</ele><time>2005-04-18T18:03:52Z</time></trkpt><trkpt lat="42.233441" lon="-71.512156"><ele>119.8</ele><time>2005-04-18T18:04:09Z</time></trkpt><trkpt lat="42.233655" lon="-71.511533"><ele>118.4</ele><time>2005-04-18T18:04:23Z</time></trkpt><trkpt lat="42.233891" lon="-71.510975"><ele>114.5</ele><time>2005-04-18T18:04:36Z</time></trkpt><trkpt lat="42.234213" lon="-71.510267"><ele>111.2</ele><time>2005-04-18T18:04:53Z</time></trkpt><trkpt lat="42.234535" lon="-71.509409"><ele>110.7</ele><time>2005-04-18T18:05:13Z</time></trkpt><trkpt lat="42.234814" lon="-71.508915"><ele>108.3</ele><time>2005-04-18T18:05:26Z</time></trkpt><trkpt lat="42.235157" lon="-71.508336"><ele>107.3</ele><time>2005-04-18T18:05:41Z</time></trkpt><trkpt lat="42.235501" lon="-71.507843"><ele>107.8</ele><time>2005-04-18T18:05:55Z</time></trkpt><trkpt lat="42.235887" lon="-71.507199"><ele>108.3</ele><time>2005-04-18T18:06:13Z</time></trkpt><trkpt lat="42.236145" lon="-71.506748"><ele>110.2</ele><time>2005-04-18T18:06:26Z</time></trkpt><trkpt lat="42.236338" lon="-71.50619"><ele>114.1</ele><time>2005-04-18T18:06:40Z</time></trkpt><trkpt lat="42.236423" lon="-71.505632"><ele>116.5</ele><time>2005-04-18T18:06:52Z</time></trkpt><trkpt lat="42.236466" lon="-71.50516"><ele>116</ele><time>2005-04-18T18:07:01Z</time></trkpt><trkpt lat="42.236509" lon="-71.504474"><ele>116</ele><time>2005-04-18T18:07:15Z</time></trkpt><trkpt lat="42.236552" lon="-71.503894"><ele>116.9</ele><time>2005-04-18T18:07:28Z</time></trkpt><trkpt lat="42.236595" lon="-71.503551"><ele>116.5</ele><time>2005-04-18T18:07:36Z</time></trkpt><trkpt lat="42.236595" lon="-71.502972"><ele>118.4</ele><time>2005-04-18T18:07:48Z</time></trkpt><trkpt lat="42.236531" lon="-71.502349"><ele>117.4</ele><time>2005-04-18T18:08:01Z</time></trkpt><trkpt lat="42.236509" lon="-71.502113"><ele>116.9</ele><time>2005-04-18T18:08:06Z</time></trkpt><trkpt lat="42.236466" lon="-71.501813"><ele>115.5</ele><time>2005-04-18T18:08:12Z</time></trkpt><trkpt lat="42.236381" lon="-71.501126"><ele>114.1</ele><time>2005-04-18T18:08:26Z</time></trkpt><trkpt lat="42.236338" lon="-71.500397"><ele>111.2</ele><time>2005-04-18T18:08:41Z</time></trkpt><trkpt lat="42.236338" lon="-71.499667"><ele>109.7</ele><time>2005-04-18T18:08:56Z</time></trkpt><trkpt lat="42.236445" lon="-71.499002"><ele>107.8</ele><time>2005-04-18T18:09:10Z</time></trkpt><trkpt lat="42.236574" lon="-71.498401"><ele>105.4</ele><time>2005-04-18T18:09:23Z</time></trkpt><trkpt lat="42.236702" lon="-71.497736"><ele>108.3</ele><time>2005-04-18T18:09:37Z</time></trkpt><trkpt lat="42.236874" lon="-71.496985"><ele>104.9</ele><time>2005-04-18T18:09:53Z</time></trkpt><trkpt lat="42.237067" lon="-71.496234"><ele>105.9</ele><time>2005-04-18T18:10:09Z</time></trkpt><trkpt lat="42.237196" lon="-71.495633"><ele>104.9</ele><time>2005-04-18T18:10:22Z</time></trkpt><trkpt lat="42.237368" lon="-71.495011"><ele>103.5</ele><time>2005-04-18T18:10:36Z</time></trkpt><trkpt lat="42.237561" lon="-71.494453"><ele>105.4</ele><time>2005-04-18T18:10:49Z</time></trkpt><trkpt lat="42.237689" lon="-71.493895"><ele>104.4</ele><time>2005-04-18T18:11:01Z</time></trkpt><trkpt lat="42.237797" lon="-71.493359"><ele>102</ele><time>2005-04-18T18:11:12Z</time></trkpt><trkpt lat="42.238054" lon="-71.492651"><ele>103</ele><time>2005-04-18T18:11:28Z</time></trkpt><trkpt lat="42.238312" lon="-71.492093"><ele>103</ele><time>2005-04-18T18:11:42Z</time></trkpt><trkpt lat="42.238612" lon="-71.491621"><ele>104</ele><time>2005-04-18T18:11:55Z</time></trkpt><trkpt lat="42.238934" lon="-71.491148"><ele>104.4</ele><time>2005-04-18T18:12:09Z</time></trkpt><trkpt lat="42.239213" lon="-71.490676"><ele>107.8</ele><time>2005-04-18T18:12:22Z</time></trkpt><trkpt lat="42.239385" lon="-71.49029"><ele>107.8</ele><time>2005-04-18T18:12:31Z</time></trkpt><trkpt lat="42.239642" lon="-71.489775"><ele>107.3</ele><time>2005-04-18T18:12:43Z</time></trkpt><trkpt lat="42.239943" lon="-71.489217"><ele>104.9</ele><time>2005-04-18T18:12:56Z</time></trkpt><trkpt lat="42.240157" lon="-71.488767"><ele>103</ele><time>2005-04-18T18:13:06Z</time></trkpt><trkpt lat="42.240458" lon="-71.488166"><ele>100.6</ele><time>2005-04-18T18:13:20Z</time></trkpt><trkpt lat="42.240758" lon="-71.487522"><ele>103</ele><time>2005-04-18T18:13:36Z</time></trkpt><trkpt lat="42.24108" lon="-71.486814"><ele>102</ele><time>2005-04-18T18:13:54Z</time></trkpt><trkpt lat="42.24123" lon="-71.486299"><ele>100.6</ele><time>2005-04-18T18:14:05Z</time></trkpt><trkpt lat="42.241509" lon="-71.48572"><ele>100.1</ele><time>2005-04-18T18:14:19Z</time></trkpt><trkpt lat="42.241831" lon="-71.485033"><ele>98.7</ele><time>2005-04-18T18:14:35Z</time></trkpt><trkpt lat="42.242002" lon="-71.484647"><ele>99.2</ele><time>2005-04-18T18:14:44Z</time></trkpt><trkpt lat="42.242088" lon="-71.484411"><ele>99.6</ele><time>2005-04-18T18:14:49Z</time></trkpt><trkpt lat="42.242496" lon="-71.483746"><ele>105.4</ele><time>2005-04-18T18:15:06Z</time></trkpt><trkpt lat="42.242882" lon="-71.48308"><ele>103</ele><time>2005-04-18T18:15:23Z</time></trkpt><trkpt lat="42.243161" lon="-71.482458"><ele>101.6</ele><time>2005-04-18T18:15:38Z</time></trkpt><trkpt lat="42.243419" lon="-71.48175"><ele>99.6</ele><time>2005-04-18T18:15:54Z</time></trkpt><trkpt lat="42.243526" lon="-71.481514"><ele>99.2</ele><time>2005-04-18T18:16:00Z</time></trkpt><trkpt lat="42.243655" lon="-71.481407"><ele>98.7</ele><time>2005-04-18T18:16:03Z</time></trkpt><trkpt lat="42.243676" lon="-71.481364"><ele>98.7</ele><time>2005-04-18T18:16:04Z</time></trkpt><trkpt lat="42.243783" lon="-71.481063"><ele>96.3</ele><time>2005-04-18T18:16:10Z</time></trkpt><trkpt lat="42.243848" lon="-71.480806"><ele>97.2</ele><time>2005-04-18T18:16:16Z</time></trkpt><trkpt lat="42.244062" lon="-71.480291"><ele>95.3</ele><time>2005-04-18T18:16:29Z</time></trkpt><trkpt lat="42.244341" lon="-71.47969"><ele>100.1</ele><time>2005-04-18T18:16:44Z</time></trkpt><trkpt lat="42.244599" lon="-71.479218"><ele>101.6</ele><time>2005-04-18T18:16:57Z</time></trkpt><trkpt lat="42.244771" lon="-71.478703"><ele>101.6</ele><time>2005-04-18T18:17:09Z</time></trkpt><trkpt lat="42.244964" lon="-71.478102"><ele>102</ele><time>2005-04-18T18:17:23Z</time></trkpt><trkpt lat="42.245178" lon="-71.477458"><ele>104</ele><time>2005-04-18T18:17:38Z</time></trkpt><trkpt lat="42.2455" lon="-71.476579"><ele>103.5</ele><time>2005-04-18T18:17:59Z</time></trkpt><trkpt lat="42.245758" lon="-71.47615"><ele>102</ele><time>2005-04-18T18:18:10Z</time></trkpt><trkpt lat="42.246358" lon="-71.47557"><ele>100.1</ele><time>2005-04-18T18:18:28Z</time></trkpt><trkpt lat="42.246809" lon="-71.475205"><ele>97.2</ele><time>2005-04-18T18:18:40Z</time></trkpt><trkpt lat="42.24756" lon="-71.474605"><ele>89.1</ele><time>2005-04-18T18:19:03Z</time></trkpt><trkpt lat="42.248054" lon="-71.47439"><ele>88.1</ele><time>2005-04-18T18:19:16Z</time></trkpt><trkpt lat="42.248697" lon="-71.473961"><ele>86.2</ele><time>2005-04-18T18:19:34Z</time></trkpt><trkpt lat="42.249362" lon="-71.473403"><ele>83.3</ele><time>2005-04-18T18:19:55Z</time></trkpt><trkpt lat="42.24977" lon="-71.473017"><ele>81.4</ele><time>2005-04-18T18:20:09Z</time></trkpt><trkpt lat="42.250221" lon="-71.472695"><ele>80.9</ele><time>2005-04-18T18:20:23Z</time></trkpt><trkpt lat="42.250671" lon="-71.472394"><ele>80.4</ele><time>2005-04-18T18:20:37Z</time></trkpt><trkpt lat="42.251079" lon="-71.472094"><ele>80.9</ele><time>2005-04-18T18:20:49Z</time></trkpt><trkpt lat="42.25153" lon="-71.471815"><ele>81.8</ele><time>2005-04-18T18:21:02Z</time></trkpt><trkpt lat="42.251959" lon="-71.47145"><ele>84.3</ele><time>2005-04-18T18:21:15Z</time></trkpt><trkpt lat="42.252023" lon="-71.471386"><ele>84.7</ele><time>2005-04-18T18:21:17Z</time></trkpt><trkpt lat="42.252431" lon="-71.470807"><ele>82.8</ele><time>2005-04-18T18:21:33Z</time></trkpt><trkpt lat="42.252903" lon="-71.47012"><ele>79.4</ele><time>2005-04-18T18:21:52Z</time></trkpt><trkpt lat="42.253289" lon="-71.469605"><ele>76.6</ele><time>2005-04-18T18:22:06Z</time></trkpt><trkpt lat="42.253633" lon="-71.469197"><ele>77</ele><time>2005-04-18T18:22:18Z</time></trkpt><trkpt lat="42.254019" lon="-71.46879"><ele>76.1</ele><time>2005-04-18T18:22:31Z</time></trkpt><trkpt lat="42.254491" lon="-71.468339"><ele>73.7</ele><time>2005-04-18T18:22:47Z</time></trkpt><trkpt lat="42.254856" lon="-71.46791"><ele>70.8</ele><time>2005-04-18T18:23:00Z</time></trkpt><trkpt lat="42.25522" lon="-71.467459"><ele>70.3</ele><time>2005-04-18T18:23:13Z</time></trkpt><trkpt lat="42.255435" lon="-71.467009"><ele>68.9</ele><time>2005-04-18T18:23:23Z</time></trkpt><trkpt lat="42.255607" lon="-71.466429"><ele>67.9</ele><time>2005-04-18T18:23:35Z</time></trkpt><trkpt lat="42.25565" lon="-71.465936"><ele>66.5</ele><time>2005-04-18T18:23:44Z</time></trkpt><trkpt lat="42.255735" lon="-71.465399"><ele>67.9</ele><time>2005-04-18T18:23:55Z</time></trkpt><trkpt lat="42.255864" lon="-71.464841"><ele>68.9</ele><time>2005-04-18T18:24:07Z</time></trkpt><trkpt lat="42.255971" lon="-71.464305"><ele>67.4</ele><time>2005-04-18T18:24:18Z</time></trkpt><trkpt lat="42.256122" lon="-71.463661"><ele>66</ele><time>2005-04-18T18:24:32Z</time></trkpt><trkpt lat="42.256336" lon="-71.462996"><ele>65.5</ele><time>2005-04-18T18:24:46Z</time></trkpt><trkpt lat="42.256508" lon="-71.462417"><ele>63.1</ele><time>2005-04-18T18:24:59Z</time></trkpt><trkpt lat="42.256637" lon="-71.461923"><ele>61.7</ele><time>2005-04-18T18:25:10Z</time></trkpt><trkpt lat="42.256787" lon="-71.461473"><ele>62.6</ele><time>2005-04-18T18:25:20Z</time></trkpt><trkpt lat="42.256958" lon="-71.460915"><ele>62.1</ele><time>2005-04-18T18:25:32Z</time></trkpt><trkpt lat="42.25713" lon="-71.460378"><ele>61.2</ele><time>2005-04-18T18:25:43Z</time></trkpt><trkpt lat="42.257345" lon="-71.459734"><ele>61.7</ele><time>2005-04-18T18:25:57Z</time></trkpt><trkpt lat="42.257538" lon="-71.459155"><ele>62.1</ele><time>2005-04-18T18:26:10Z</time></trkpt><trkpt lat="42.257667" lon="-71.458619"><ele>63.1</ele><time>2005-04-18T18:26:21Z</time></trkpt><trkpt lat="42.25786" lon="-71.458018"><ele>63.1</ele><time>2005-04-18T18:26:33Z</time></trkpt><trkpt lat="42.258053" lon="-71.45731"><ele>61.2</ele><time>2005-04-18T18:26:48Z</time></trkpt><trkpt lat="42.258224" lon="-71.456666"><ele>61.7</ele><time>2005-04-18T18:27:02Z</time></trkpt><trkpt lat="42.258332" lon="-71.456108"><ele>61.7</ele><time>2005-04-18T18:27:14Z</time></trkpt><trkpt lat="42.258461" lon="-71.455443"><ele>60.7</ele><time>2005-04-18T18:27:28Z</time></trkpt><trkpt lat="42.258589" lon="-71.454778"><ele>58.8</ele><time>2005-04-18T18:27:42Z</time></trkpt><trkpt lat="42.258589" lon="-71.454713"><ele>58.8</ele><time>2005-04-18T18:27:43Z</time></trkpt><trkpt lat="42.258697" lon="-71.454198"><ele>59.3</ele><time>2005-04-18T18:27:54Z</time></trkpt><trkpt lat="42.258804" lon="-71.453748"><ele>60.7</ele><time>2005-04-18T18:28:04Z</time></trkpt><trkpt lat="42.259061" lon="-71.453211"><ele>63.6</ele><time>2005-04-18T18:28:17Z</time></trkpt><trkpt lat="42.259319" lon="-71.452718"><ele>63.1</ele><time>2005-04-18T18:28:29Z</time></trkpt><trkpt lat="42.259598" lon="-71.452267"><ele>63.1</ele><time>2005-04-18T18:28:41Z</time></trkpt><trkpt lat="42.259877" lon="-71.451817"><ele>62.6</ele><time>2005-04-18T18:28:53Z</time></trkpt><trkpt lat="42.26007" lon="-71.451516"><ele>63.1</ele><time>2005-04-18T18:29:01Z</time></trkpt><trkpt lat="42.260392" lon="-71.451023"><ele>64.1</ele><time>2005-04-18T18:29:15Z</time></trkpt><trkpt lat="42.260671" lon="-71.450615"><ele>63.6</ele><time>2005-04-18T18:29:27Z</time></trkpt><trkpt lat="42.261035" lon="-71.450186"><ele>63.6</ele><time>2005-04-18T18:29:41Z</time></trkpt><trkpt lat="42.2614" lon="-71.449864"><ele>63.6</ele><time>2005-04-18T18:29:54Z</time></trkpt><trkpt lat="42.261937" lon="-71.449521"><ele>62.1</ele><time>2005-04-18T18:30:11Z</time></trkpt><trkpt lat="42.262387" lon="-71.449349"><ele>64.5</ele><time>2005-04-18T18:30:25Z</time></trkpt><trkpt lat="42.262795" lon="-71.449113"><ele>66</ele><time>2005-04-18T18:30:37Z</time></trkpt><trkpt lat="42.263074" lon="-71.448834"><ele>68.4</ele><time>2005-04-18T18:30:47Z</time></trkpt><trkpt lat="42.263374" lon="-71.448491"><ele>69.8</ele><time>2005-04-18T18:30:58Z</time></trkpt><trkpt lat="42.263696" lon="-71.448212"><ele>72.7</ele><time>2005-04-18T18:31:09Z</time></trkpt><trkpt lat="42.264168" lon="-71.44789"><ele>73.2</ele><time>2005-04-18T18:31:24Z</time></trkpt><trkpt lat="42.264619" lon="-71.447546"><ele>74.6</ele><time>2005-04-18T18:31:38Z</time></trkpt><trkpt lat="42.265048" lon="-71.447096"><ele>73.2</ele><time>2005-04-18T18:31:54Z</time></trkpt><trkpt lat="42.265391" lon="-71.446753"><ele>72.7</ele><time>2005-04-18T18:32:06Z</time></trkpt><trkpt lat="42.266099" lon="-71.446195"><ele>75.1</ele><time>2005-04-18T18:32:28Z</time></trkpt><trkpt lat="42.266657" lon="-71.445916"><ele>73.2</ele><time>2005-04-18T18:32:44Z</time></trkpt><trkpt lat="42.267087" lon="-71.445744"><ele>73.7</ele><time>2005-04-18T18:32:56Z</time></trkpt><trkpt lat="42.267559" lon="-71.445572"><ele>74.6</ele><time>2005-04-18T18:33:09Z</time></trkpt><trkpt lat="42.268095" lon="-71.445358"><ele>74.2</ele><time>2005-04-18T18:33:24Z</time></trkpt><trkpt lat="42.268567" lon="-71.445186"><ele>74.6</ele><time>2005-04-18T18:33:37Z</time></trkpt><trkpt lat="42.269061" lon="-71.445014"><ele>71.8</ele><time>2005-04-18T18:33:50Z</time></trkpt><trkpt lat="42.269661" lon="-71.444821"><ele>72.2</ele><time>2005-04-18T18:34:06Z</time></trkpt><trkpt lat="42.270026" lon="-71.444585"><ele>68.4</ele><time>2005-04-18T18:34:17Z</time></trkpt><trkpt lat="42.270241" lon="-71.444392"><ele>66.9</ele><time>2005-04-18T18:34:24Z</time></trkpt><trkpt lat="42.270455" lon="-71.444199"><ele>66.9</ele><time>2005-04-18T18:34:31Z</time></trkpt><trkpt lat="42.270713" lon="-71.443963"><ele>66.5</ele><time>2005-04-18T18:34:40Z</time></trkpt><trkpt lat="42.271142" lon="-71.443577"><ele>66.5</ele><time>2005-04-18T18:34:55Z</time></trkpt><trkpt lat="42.271593" lon="-71.443169"><ele>67.4</ele><time>2005-04-18T18:35:10Z</time></trkpt><trkpt lat="42.271807" lon="-71.442847"><ele>65.5</ele><time>2005-04-18T18:35:19Z</time></trkpt><trkpt lat="42.271914" lon="-71.442568"><ele>66.5</ele><time>2005-04-18T18:35:25Z</time></trkpt><trkpt lat="42.272172" lon="-71.441967"><ele>67.9</ele><time>2005-04-18T18:35:38Z</time></trkpt><trkpt lat="42.272387" lon="-71.441453"><ele>64.1</ele><time>2005-04-18T18:35:49Z</time></trkpt><trkpt lat="42.272623" lon="-71.441023"><ele>63.6</ele><time>2005-04-18T18:35:59Z</time></trkpt><trkpt lat="42.272859" lon="-71.440487"><ele>63.6</ele><time>2005-04-18T18:36:11Z</time></trkpt><trkpt lat="42.273073" lon="-71.439972"><ele>63.6</ele><time>2005-04-18T18:36:23Z</time></trkpt><trkpt lat="42.273309" lon="-71.439521"><ele>63.1</ele><time>2005-04-18T18:36:34Z</time></trkpt><trkpt lat="42.273588" lon="-71.439092"><ele>63.6</ele><time>2005-04-18T18:36:46Z</time></trkpt><trkpt lat="42.273889" lon="-71.43862"><ele>65</ele><time>2005-04-18T18:36:58Z</time></trkpt><trkpt lat="42.274103" lon="-71.438084"><ele>62.6</ele><time>2005-04-18T18:37:10Z</time></trkpt><trkpt lat="42.274253" lon="-71.437547"><ele>63.6</ele><time>2005-04-18T18:37:22Z</time></trkpt><trkpt lat="42.274275" lon="-71.436925"><ele>66</ele><time>2005-04-18T18:37:35Z</time></trkpt><trkpt lat="42.274275" lon="-71.436646"><ele>66.5</ele><time>2005-04-18T18:37:41Z</time></trkpt><trkpt lat="42.274189" lon="-71.436388"><ele>66.5</ele><time>2005-04-18T18:37:47Z</time></trkpt><trkpt lat="42.274146" lon="-71.436152"><ele>66</ele><time>2005-04-18T18:37:52Z</time></trkpt><trkpt lat="42.273996" lon="-71.435573"><ele>66</ele><time>2005-04-18T18:38:04Z</time></trkpt><trkpt lat="42.27391" lon="-71.43508"><ele>66</ele><time>2005-04-18T18:38:14Z</time></trkpt><trkpt lat="42.273781" lon="-71.434414"><ele>65.5</ele><time>2005-04-18T18:38:28Z</time></trkpt><trkpt lat="42.273695" lon="-71.433921"><ele>64.5</ele><time>2005-04-18T18:38:38Z</time></trkpt><trkpt lat="42.273567" lon="-71.433277"><ele>62.6</ele><time>2005-04-18T18:38:52Z</time></trkpt><trkpt lat="42.273374" lon="-71.432462"><ele>63.1</ele><time>2005-04-18T18:39:10Z</time></trkpt><trkpt lat="42.273202" lon="-71.431711"><ele>63.1</ele><time>2005-04-18T18:39:26Z</time></trkpt><trkpt lat="42.272987" lon="-71.431088"><ele>66</ele><time>2005-04-18T18:39:40Z</time></trkpt><trkpt lat="42.272666" lon="-71.430552"><ele>65.5</ele><time>2005-04-18T18:39:54Z</time></trkpt><trkpt lat="42.272322" lon="-71.430016"><ele>64.1</ele><time>2005-04-18T18:40:08Z</time></trkpt><trkpt lat="42.272129" lon="-71.429565"><ele>63.1</ele><time>2005-04-18T18:40:19Z</time></trkpt><trkpt lat="42.272086" lon="-71.429179"><ele>63.6</ele><time>2005-04-18T18:40:27Z</time></trkpt><trkpt lat="42.272172" lon="-71.428986"><ele>63.6</ele><time>2005-04-18T18:40:31Z</time></trkpt><trkpt lat="42.272408" lon="-71.428599"><ele>63.1</ele><time>2005-04-18T18:40:40Z</time></trkpt><trkpt lat="42.272666" lon="-71.428192"><ele>62.6</ele><time>2005-04-18T18:40:50Z</time></trkpt><trkpt lat="42.272816" lon="-71.427913"><ele>61.7</ele><time>2005-04-18T18:40:57Z</time></trkpt><trkpt lat="42.272966" lon="-71.427612"><ele>63.1</ele><time>2005-04-18T18:41:04Z</time></trkpt><trkpt lat="42.273245" lon="-71.427076"><ele>62.1</ele><time>2005-04-18T18:41:17Z</time></trkpt><trkpt lat="42.273459" lon="-71.426604"><ele>61.2</ele><time>2005-04-18T18:41:28Z</time></trkpt><trkpt lat="42.273674" lon="-71.426153"><ele>59.3</ele><time>2005-04-18T18:41:38Z</time></trkpt><trkpt lat="42.273932" lon="-71.42566"><ele>59.7</ele><time>2005-04-18T18:41:50Z</time></trkpt><trkpt lat="42.274125" lon="-71.425252"><ele>59.3</ele><time>2005-04-18T18:42:00Z</time></trkpt><trkpt lat="42.274404" lon="-71.424737"><ele>57.8</ele><time>2005-04-18T18:42:13Z</time></trkpt><trkpt lat="42.274554" lon="-71.424243"><ele>56.9</ele><time>2005-04-18T18:42:24Z</time></trkpt><trkpt lat="42.274683" lon="-71.423793"><ele>56.4</ele><time>2005-04-18T18:42:34Z</time></trkpt><trkpt lat="42.274854" lon="-71.423256"><ele>58.3</ele><time>2005-04-18T18:42:45Z</time></trkpt><trkpt lat="42.275047" lon="-71.422698"><ele>58.8</ele><time>2005-04-18T18:42:57Z</time></trkpt><trkpt lat="42.275198" lon="-71.422162"><ele>57.8</ele><time>2005-04-18T18:43:09Z</time></trkpt><trkpt lat="42.275369" lon="-71.421626"><ele>57.8</ele><time>2005-04-18T18:43:21Z</time></trkpt><trkpt lat="42.275541" lon="-71.421003"><ele>59.3</ele><time>2005-04-18T18:43:34Z</time></trkpt><trkpt lat="42.275691" lon="-71.420424"><ele>57.3</ele><time>2005-04-18T18:43:47Z</time></trkpt><trkpt lat="42.275884" lon="-71.419802"><ele>57.8</ele><time>2005-04-18T18:44:01Z</time></trkpt><trkpt lat="42.276056" lon="-71.419265"><ele>57.3</ele><time>2005-04-18T18:44:13Z</time></trkpt><trkpt lat="42.276206" lon="-71.418707"><ele>58.3</ele><time>2005-04-18T18:44:25Z</time></trkpt><trkpt lat="42.276335" lon="-71.418214"><ele>58.8</ele><time>2005-04-18T18:44:36Z</time></trkpt><trkpt lat="42.276464" lon="-71.417634"><ele>58.8</ele><time>2005-04-18T18:44:48Z</time></trkpt><trkpt lat="42.276592" lon="-71.417205"><ele>58.3</ele><time>2005-04-18T18:44:57Z</time></trkpt><trkpt lat="42.276764" lon="-71.416626"><ele>57.3</ele><time>2005-04-18T18:45:10Z</time></trkpt><trkpt lat="42.276914" lon="-71.41609"><ele>57.3</ele><time>2005-04-18T18:45:21Z</time></trkpt><trkpt lat="42.277043" lon="-71.415532"><ele>56.9</ele><time>2005-04-18T18:45:33Z</time></trkpt><trkpt lat="42.277193" lon="-71.415017"><ele>57.3</ele><time>2005-04-18T18:45:44Z</time></trkpt><trkpt lat="42.277322" lon="-71.414394"><ele>57.3</ele><time>2005-04-18T18:45:57Z</time></trkpt><trkpt lat="42.277429" lon="-71.413815"><ele>57.3</ele><time>2005-04-18T18:46:09Z</time></trkpt><trkpt lat="42.277558" lon="-71.413236"><ele>55.9</ele><time>2005-04-18T18:46:21Z</time></trkpt><trkpt lat="42.277665" lon="-71.412656"><ele>54.9</ele><time>2005-04-18T18:46:33Z</time></trkpt><trkpt lat="42.277794" lon="-71.412098"><ele>53.5</ele><time>2005-04-18T18:46:45Z</time></trkpt><trkpt lat="42.27788" lon="-71.411541"><ele>53</ele><time>2005-04-18T18:46:57Z</time></trkpt><trkpt lat="42.277987" lon="-71.411004"><ele>53.5</ele><time>2005-04-18T18:47:09Z</time></trkpt><trkpt lat="42.278094" lon="-71.410446"><ele>53</ele><time>2005-04-18T18:47:21Z</time></trkpt><trkpt lat="42.278202" lon="-71.409931"><ele>54.5</ele><time>2005-04-18T18:47:32Z</time></trkpt><trkpt lat="42.27833" lon="-71.409309"><ele>54.5</ele><time>2005-04-18T18:47:45Z</time></trkpt><trkpt lat="42.278416" lon="-71.408944"><ele>54.9</ele><time>2005-04-18T18:47:53Z</time></trkpt><trkpt lat="42.278502" lon="-71.408601"><ele>54.9</ele><time>2005-04-18T18:48:00Z</time></trkpt><trkpt lat="42.278588" lon="-71.408172"><ele>54.5</ele><time>2005-04-18T18:48:09Z</time></trkpt><trkpt lat="42.278717" lon="-71.407657"><ele>54</ele><time>2005-04-18T18:48:20Z</time></trkpt><trkpt lat="42.278845" lon="-71.407185"><ele>53.5</ele><time>2005-04-18T18:48:30Z</time></trkpt><trkpt lat="42.278953" lon="-71.406648"><ele>52</ele><time>2005-04-18T18:48:41Z</time></trkpt><trkpt lat="42.279081" lon="-71.406069"><ele>52</ele><time>2005-04-18T18:48:53Z</time></trkpt><trkpt lat="42.279189" lon="-71.405683"><ele>54</ele><time>2005-04-18T18:49:01Z</time></trkpt><trkpt lat="42.279253" lon="-71.405168"><ele>53</ele><time>2005-04-18T18:49:11Z</time></trkpt><trkpt lat="42.279425" lon="-71.404502"><ele>54.9</ele><time>2005-04-18T18:49:25Z</time></trkpt><trkpt lat="42.279532" lon="-71.403944"><ele>55.4</ele><time>2005-04-18T18:49:37Z</time></trkpt><trkpt lat="42.279682" lon="-71.403387"><ele>54.5</ele><time>2005-04-18T18:49:49Z</time></trkpt><trkpt lat="42.279789" lon="-71.402872"><ele>54.5</ele><time>2005-04-18T18:50:00Z</time></trkpt><trkpt lat="42.27994" lon="-71.402206"><ele>53</ele><time>2005-04-18T18:50:14Z</time></trkpt><trkpt lat="42.280068" lon="-71.401627"><ele>53.5</ele><time>2005-04-18T18:50:26Z</time></trkpt><trkpt lat="42.280154" lon="-71.401262"><ele>53.5</ele><time>2005-04-18T18:50:34Z</time></trkpt><trkpt lat="42.280262" lon="-71.40079"><ele>54</ele><time>2005-04-18T18:50:44Z</time></trkpt><trkpt lat="42.280347" lon="-71.400404"><ele>53.5</ele><time>2005-04-18T18:50:52Z</time></trkpt><trkpt lat="42.280455" lon="-71.399953"><ele>53</ele><time>2005-04-18T18:51:02Z</time></trkpt><trkpt lat="42.280583" lon="-71.399374"><ele>52</ele><time>2005-04-18T18:51:14Z</time></trkpt><trkpt lat="42.280734" lon="-71.398709"><ele>53.5</ele><time>2005-04-18T18:51:28Z</time></trkpt><trkpt lat="42.280841" lon="-71.398172"><ele>54.9</ele><time>2005-04-18T18:51:40Z</time></trkpt><trkpt lat="42.280948" lon="-71.397679"><ele>54.9</ele><time>2005-04-18T18:51:51Z</time></trkpt><trkpt lat="42.281077" lon="-71.397121"><ele>55.9</ele><time>2005-04-18T18:52:03Z</time></trkpt><trkpt lat="42.281184" lon="-71.396585"><ele>53.5</ele><time>2005-04-18T18:52:14Z</time></trkpt><trkpt lat="42.281313" lon="-71.395962"><ele>55.9</ele><time>2005-04-18T18:52:28Z</time></trkpt><trkpt lat="42.281442" lon="-71.395447"><ele>58.3</ele><time>2005-04-18T18:52:40Z</time></trkpt><trkpt lat="42.281442" lon="-71.395361"><ele>57.8</ele><time>2005-04-18T18:52:42Z</time></trkpt><trkpt lat="42.281485" lon="-71.395276"><ele>57.3</ele><time>2005-04-18T18:52:44Z</time></trkpt><trkpt lat="42.281528" lon="-71.39504"><ele>58.8</ele><time>2005-04-18T18:52:49Z</time></trkpt><trkpt lat="42.281592" lon="-71.394589"><ele>60.7</ele><time>2005-04-18T18:52:59Z</time></trkpt><trkpt lat="42.281721" lon="-71.393924"><ele>59.3</ele><time>2005-04-18T18:53:13Z</time></trkpt><trkpt lat="42.281764" lon="-71.393259"><ele>60.7</ele><time>2005-04-18T18:53:27Z</time></trkpt><trkpt lat="42.281785" lon="-71.392636"><ele>57.8</ele><time>2005-04-18T18:53:39Z</time></trkpt><trkpt lat="42.281828" lon="-71.391971"><ele>56.4</ele><time>2005-04-18T18:53:52Z</time></trkpt><trkpt lat="42.281871" lon="-71.391392"><ele>56.4</ele><time>2005-04-18T18:54:03Z</time></trkpt><trkpt lat="42.281892" lon="-71.391134"><ele>56.9</ele><time>2005-04-18T18:54:08Z</time></trkpt><trkpt lat="42.281914" lon="-71.390791"><ele>55.4</ele><time>2005-04-18T18:54:15Z</time></trkpt><trkpt lat="42.281935" lon="-71.390254"><ele>54.9</ele><time>2005-04-18T18:54:26Z</time></trkpt><trkpt lat="42.281957" lon="-71.389997"><ele>54</ele><time>2005-04-18T18:54:32Z</time></trkpt><trkpt lat="42.281978" lon="-71.389761"><ele>53.5</ele><time>2005-04-18T18:54:37Z</time></trkpt><trkpt lat="42.282" lon="-71.389482"><ele>53</ele><time>2005-04-18T18:54:43Z</time></trkpt><trkpt lat="42.282043" lon="-71.388903"><ele>54.9</ele><time>2005-04-18T18:54:55Z</time></trkpt><trkpt lat="42.282064" lon="-71.388259"><ele>55.9</ele><time>2005-04-18T18:55:08Z</time></trkpt><trkpt lat="42.282107" lon="-71.38768"><ele>55.9</ele><time>2005-04-18T18:55:20Z</time></trkpt><trkpt lat="42.28215" lon="-71.387014"><ele>55.9</ele><time>2005-04-18T18:55:34Z</time></trkpt><trkpt lat="42.282171" lon="-71.386349"><ele>55.9</ele><time>2005-04-18T18:55:48Z</time></trkpt><trkpt lat="42.282214" lon="-71.385748"><ele>56.9</ele><time>2005-04-18T18:56:00Z</time></trkpt><trkpt lat="42.282257" lon="-71.385126"><ele>57.8</ele><time>2005-04-18T18:56:12Z</time></trkpt><trkpt lat="42.282321" lon="-71.384482"><ele>56.4</ele><time>2005-04-18T18:56:25Z</time></trkpt><trkpt lat="42.282364" lon="-71.383924"><ele>54.9</ele><time>2005-04-18T18:56:36Z</time></trkpt><trkpt lat="42.282407" lon="-71.383324"><ele>54.5</ele><time>2005-04-18T18:56:48Z</time></trkpt><trkpt lat="42.282407" lon="-71.38268"><ele>54</ele><time>2005-04-18T18:57:01Z</time></trkpt><trkpt lat="42.28245" lon="-71.382015"><ele>55.9</ele><time>2005-04-18T18:57:15Z</time></trkpt><trkpt lat="42.282472" lon="-71.381478"><ele>56.9</ele><time>2005-04-18T18:57:26Z</time></trkpt><trkpt lat="42.282493" lon="-71.380835"><ele>56.9</ele><time>2005-04-18T18:57:39Z</time></trkpt><trkpt lat="42.282515" lon="-71.380148"><ele>56.9</ele><time>2005-04-18T18:57:53Z</time></trkpt><trkpt lat="42.282557" lon="-71.37944"><ele>56.9</ele><time>2005-04-18T18:58:07Z</time></trkpt><trkpt lat="42.282557" lon="-71.378796"><ele>54.9</ele><time>2005-04-18T18:58:20Z</time></trkpt><trkpt lat="42.282536" lon="-71.378195"><ele>58.3</ele><time>2005-04-18T18:58:32Z</time></trkpt><trkpt lat="42.282515" lon="-71.37753"><ele>54</ele><time>2005-04-18T18:58:46Z</time></trkpt><trkpt lat="42.282557" lon="-71.376951"><ele>54.5</ele><time>2005-04-18T18:58:58Z</time></trkpt><trkpt lat="42.282536" lon="-71.376328"><ele>52.5</ele><time>2005-04-18T18:59:11Z</time></trkpt><trkpt lat="42.282557" lon="-71.375685"><ele>52.5</ele><time>2005-04-18T18:59:24Z</time></trkpt><trkpt lat="42.282643" lon="-71.374998"><ele>51.6</ele><time>2005-04-18T18:59:38Z</time></trkpt><trkpt lat="42.282751" lon="-71.374311"><ele>52.5</ele><time>2005-04-18T18:59:52Z</time></trkpt><trkpt lat="42.282879" lon="-71.373668"><ele>51.6</ele><time>2005-04-18T19:00:06Z</time></trkpt><trkpt lat="42.282987" lon="-71.373045"><ele>52</ele><time>2005-04-18T19:00:19Z</time></trkpt><trkpt lat="42.283094" lon="-71.372402"><ele>52.5</ele><time>2005-04-18T19:00:32Z</time></trkpt><trkpt lat="42.283158" lon="-71.37193"><ele>53</ele><time>2005-04-18T19:00:42Z</time></trkpt><trkpt lat="42.28318" lon="-71.371737"><ele>53.5</ele><time>2005-04-18T19:00:46Z</time></trkpt><trkpt lat="42.283223" lon="-71.371479"><ele>53.5</ele><time>2005-04-18T19:00:51Z</time></trkpt><trkpt lat="42.283309" lon="-71.370943"><ele>53</ele><time>2005-04-18T19:01:02Z</time></trkpt><trkpt lat="42.283437" lon="-71.370299"><ele>51.1</ele><time>2005-04-18T19:01:15Z</time></trkpt><trkpt lat="42.283523" lon="-71.369805"><ele>50.6</ele><time>2005-04-18T19:01:25Z</time></trkpt><trkpt lat="42.283587" lon="-71.369355"><ele>50.6</ele><time>2005-04-18T19:01:34Z</time></trkpt><trkpt lat="42.283673" lon="-71.368883"><ele>49.6</ele><time>2005-04-18T19:01:44Z</time></trkpt><trkpt lat="42.283759" lon="-71.368303"><ele>49.6</ele><time>2005-04-18T19:01:56Z</time></trkpt><trkpt lat="42.283823" lon="-71.367724"><ele>51.1</ele><time>2005-04-18T19:02:08Z</time></trkpt><trkpt lat="42.283802" lon="-71.367188"><ele>50.6</ele><time>2005-04-18T19:02:19Z</time></trkpt><trkpt lat="42.283673" lon="-71.366673"><ele>50.6</ele><time>2005-04-18T19:02:30Z</time></trkpt><trkpt lat="42.283459" lon="-71.365986"><ele>52</ele><time>2005-04-18T19:02:46Z</time></trkpt><trkpt lat="42.283244" lon="-71.365321"><ele>53</ele><time>2005-04-18T19:03:01Z</time></trkpt><trkpt lat="42.283137" lon="-71.364784"><ele>52</ele><time>2005-04-18T19:03:12Z</time></trkpt><trkpt lat="42.282944" lon="-71.364183"><ele>52</ele><time>2005-04-18T19:03:25Z</time></trkpt><trkpt lat="42.282579" lon="-71.363068"><ele>51.6</ele><time>2005-04-18T19:03:50Z</time></trkpt><trkpt lat="42.282085" lon="-71.361179"><ele>52.5</ele><time>2005-04-18T19:04:32Z</time></trkpt><trkpt lat="42.282214" lon="-71.359141"><ele>56.9</ele><time>2005-04-18T19:05:14Z</time></trkpt><trkpt lat="42.282236" lon="-71.358883"><ele>63.1</ele><time>2005-04-18T19:05:20Z</time></trkpt><trkpt lat="42.282386" lon="-71.35824"><ele>63.6</ele><time>2005-04-18T19:05:34Z</time></trkpt><trkpt lat="42.282515" lon="-71.357467"><ele>61.2</ele><time>2005-04-18T19:05:50Z</time></trkpt><trkpt lat="42.2826" lon="-71.356802"><ele>65</ele><time>2005-04-18T19:06:04Z</time></trkpt><trkpt lat="42.282686" lon="-71.356008"><ele>65.5</ele><time>2005-04-18T19:06:21Z</time></trkpt><trkpt lat="42.282794" lon="-71.355472"><ele>66.5</ele><time>2005-04-18T19:06:32Z</time></trkpt><trkpt lat="42.282858" lon="-71.354721"><ele>64.5</ele><time>2005-04-18T19:06:48Z</time></trkpt><trkpt lat="42.282879" lon="-71.354527"><ele>64.1</ele><time>2005-04-18T19:06:52Z</time></trkpt><trkpt lat="42.282879" lon="-71.354334"><ele>64.1</ele><time>2005-04-18T19:06:56Z</time></trkpt><trkpt lat="42.282879" lon="-71.354291"><ele>64.1</ele><time>2005-04-18T19:06:57Z</time></trkpt><trkpt lat="42.282922" lon="-71.353712"><ele>63.6</ele><time>2005-04-18T19:07:08Z</time></trkpt><trkpt lat="42.283008" lon="-71.353111"><ele>63.6</ele><time>2005-04-18T19:07:20Z</time></trkpt><trkpt lat="42.283094" lon="-71.352575"><ele>64.5</ele><time>2005-04-18T19:07:31Z</time></trkpt><trkpt lat="42.283223" lon="-71.35191"><ele>61.7</ele><time>2005-04-18T19:07:45Z</time></trkpt><trkpt lat="42.283373" lon="-71.351137"><ele>62.1</ele><time>2005-04-18T19:08:01Z</time></trkpt><trkpt lat="42.28348" lon="-71.350515"><ele>60.7</ele><time>2005-04-18T19:08:15Z</time></trkpt><trkpt lat="42.283545" lon="-71.349785"><ele>61.2</ele><time>2005-04-18T19:08:31Z</time></trkpt><trkpt lat="42.28363" lon="-71.349034"><ele>62.6</ele><time>2005-04-18T19:08:47Z</time></trkpt><trkpt lat="42.283673" lon="-71.348476"><ele>63.1</ele><time>2005-04-18T19:08:59Z</time></trkpt><trkpt lat="42.283781" lon="-71.347768"><ele>63.1</ele><time>2005-04-18T19:09:14Z</time></trkpt><trkpt lat="42.283823" lon="-71.347103"><ele>59.7</ele><time>2005-04-18T19:09:28Z</time></trkpt><trkpt lat="42.283931" lon="-71.346459"><ele>60.2</ele><time>2005-04-18T19:09:42Z</time></trkpt><trkpt lat="42.284081" lon="-71.345794"><ele>61.2</ele><time>2005-04-18T19:09:56Z</time></trkpt><trkpt lat="42.284188" lon="-71.345172"><ele>61.2</ele><time>2005-04-18T19:10:09Z</time></trkpt><trkpt lat="42.284274" lon="-71.344657"><ele>61.7</ele><time>2005-04-18T19:10:19Z</time></trkpt><trkpt lat="42.284467" lon="-71.343884"><ele>65</ele><time>2005-04-18T19:10:34Z</time></trkpt><trkpt lat="42.284575" lon="-71.343262"><ele>64.5</ele><time>2005-04-18T19:10:47Z</time></trkpt><trkpt lat="42.284682" lon="-71.342511"><ele>64.5</ele><time>2005-04-18T19:11:02Z</time></trkpt><trkpt lat="42.284768" lon="-71.341996"><ele>64.5</ele><time>2005-04-18T19:11:13Z</time></trkpt><trkpt lat="42.284875" lon="-71.341438"><ele>65.5</ele><time>2005-04-18T19:11:25Z</time></trkpt><trkpt lat="42.285004" lon="-71.340666"><ele>65</ele><time>2005-04-18T19:11:41Z</time></trkpt><trkpt lat="42.285154" lon="-71.340151"><ele>66.5</ele><time>2005-04-18T19:11:53Z</time></trkpt><trkpt lat="42.285368" lon="-71.33955"><ele>66.5</ele><time>2005-04-18T19:12:07Z</time></trkpt><trkpt lat="42.285733" lon="-71.338542"><ele>66.9</ele><time>2005-04-18T19:12:31Z</time></trkpt><trkpt lat="42.285948" lon="-71.338005"><ele>66</ele><time>2005-04-18T19:12:43Z</time></trkpt><trkpt lat="42.286227" lon="-71.33734"><ele>67.9</ele><time>2005-04-18T19:12:59Z</time></trkpt><trkpt lat="42.28642" lon="-71.336739"><ele>66.9</ele><time>2005-04-18T19:13:13Z</time></trkpt><trkpt lat="42.286656" lon="-71.336138"><ele>66.5</ele><time>2005-04-18T19:13:27Z</time></trkpt><trkpt lat="42.28687" lon="-71.335516"><ele>66.9</ele><time>2005-04-18T19:13:41Z</time></trkpt><trkpt lat="42.287021" lon="-71.335065"><ele>66.5</ele><time>2005-04-18T19:13:51Z</time></trkpt><trkpt lat="42.287192" lon="-71.334636"><ele>68.9</ele><time>2005-04-18T19:14:01Z</time></trkpt><trkpt lat="42.287257" lon="-71.334465"><ele>68.4</ele><time>2005-04-18T19:14:05Z</time></trkpt><trkpt lat="42.287493" lon="-71.333885"><ele>68.9</ele><time>2005-04-18T19:14:19Z</time></trkpt><trkpt lat="42.287729" lon="-71.333306"><ele>67.9</ele><time>2005-04-18T19:14:33Z</time></trkpt><trkpt lat="42.288051" lon="-71.332598"><ele>69.4</ele><time>2005-04-18T19:14:51Z</time></trkpt><trkpt lat="42.288351" lon="-71.331761"><ele>77.5</ele><time>2005-04-18T19:15:12Z</time></trkpt><trkpt lat="42.288952" lon="-71.330495"><ele>77.5</ele><time>2005-04-18T19:15:45Z</time></trkpt><trkpt lat="42.289381" lon="-71.329722"><ele>76.1</ele><time>2005-04-18T19:16:05Z</time></trkpt><trkpt lat="42.289939" lon="-71.328821"><ele>72.7</ele><time>2005-04-18T19:16:28Z</time></trkpt><trkpt lat="42.290432" lon="-71.328027"><ele>72.2</ele><time>2005-04-18T19:16:48Z</time></trkpt><trkpt lat="42.291098" lon="-71.326954"><ele>73.2</ele><time>2005-04-18T19:17:15Z</time></trkpt><trkpt lat="42.291806" lon="-71.325753"><ele>74.6</ele><time>2005-04-18T19:17:45Z</time></trkpt><trkpt lat="42.291999" lon="-71.325302"><ele>70.8</ele><time>2005-04-18T19:17:56Z</time></trkpt><trkpt lat="42.293243" lon="-71.322856"><ele>66</ele><time>2005-04-18T19:18:57Z</time></trkpt><trkpt lat="42.293351" lon="-71.322556"><ele>68.9</ele><time>2005-04-18T19:19:06Z</time></trkpt><trkpt lat="42.293544" lon="-71.321955"><ele>64.5</ele><time>2005-04-18T19:19:19Z</time></trkpt><trkpt lat="42.293758" lon="-71.321332"><ele>61.2</ele><time>2005-04-18T19:19:32Z</time></trkpt><trkpt lat="42.29393" lon="-71.320732"><ele>58.3</ele><time>2005-04-18T19:19:45Z</time></trkpt><trkpt lat="42.294166" lon="-71.320131"><ele>58.8</ele><time>2005-04-18T19:19:58Z</time></trkpt><trkpt lat="42.294402" lon="-71.319337"><ele>54.9</ele><time>2005-04-18T19:20:14Z</time></trkpt><trkpt lat="42.294531" lon="-71.3188"><ele>52</ele><time>2005-04-18T19:20:25Z</time></trkpt><trkpt lat="42.294617" lon="-71.318285"><ele>49.6</ele><time>2005-04-18T19:20:35Z</time></trkpt><trkpt lat="42.294681" lon="-71.318092"><ele>49.2</ele><time>2005-04-18T19:20:39Z</time></trkpt><trkpt lat="42.29481" lon="-71.317663"><ele>48.7</ele><time>2005-04-18T19:20:48Z</time></trkpt><trkpt lat="42.29511" lon="-71.316869"><ele>50.6</ele><time>2005-04-18T19:21:05Z</time></trkpt><trkpt lat="42.295282" lon="-71.316354"><ele>51.1</ele><time>2005-04-18T19:21:17Z</time></trkpt><trkpt lat="42.295432" lon="-71.315861"><ele>52</ele><time>2005-04-18T19:21:28Z</time></trkpt><trkpt lat="42.295561" lon="-71.31526"><ele>53</ele><time>2005-04-18T19:21:41Z</time></trkpt><trkpt lat="42.29569" lon="-71.314702"><ele>54.9</ele><time>2005-04-18T19:21:53Z</time></trkpt><trkpt lat="42.295754" lon="-71.314187"><ele>56.4</ele><time>2005-04-18T19:22:05Z</time></trkpt><trkpt lat="42.295818" lon="-71.313715"><ele>55.9</ele><time>2005-04-18T19:22:16Z</time></trkpt><trkpt lat="42.295969" lon="-71.312857"><ele>56.9</ele><time>2005-04-18T19:22:35Z</time></trkpt><trkpt lat="42.296054" lon="-71.312256"><ele>57.8</ele><time>2005-04-18T19:22:47Z</time></trkpt><trkpt lat="42.296226" lon="-71.311097"><ele>58.3</ele><time>2005-04-18T19:23:11Z</time></trkpt><trkpt lat="42.296419" lon="-71.309016"><ele>56.9</ele><time>2005-04-18T19:23:51Z</time></trkpt><trkpt lat="42.296398" lon="-71.308458"><ele>56.9</ele><time>2005-04-18T19:24:01Z</time></trkpt><trkpt lat="42.296333" lon="-71.308329"><ele>57.3</ele><time>2005-04-18T19:24:05Z</time></trkpt><trkpt lat="42.296119" lon="-71.307385"><ele>57.3</ele><time>2005-04-18T19:24:24Z</time></trkpt><trkpt lat="42.296226" lon="-71.306248"><ele>58.3</ele><time>2005-04-18T19:24:45Z</time></trkpt><trkpt lat="42.296247" lon="-71.305196"><ele>58.3</ele><time>2005-04-18T19:25:06Z</time></trkpt><trkpt lat="42.296205" lon="-71.30408"><ele>58.3</ele><time>2005-04-18T19:25:29Z</time></trkpt><trkpt lat="42.296119" lon="-71.303394"><ele>58.3</ele><time>2005-04-18T19:25:44Z</time></trkpt><trkpt lat="42.296076" lon="-71.302707"><ele>58.3</ele><time>2005-04-18T19:25:58Z</time></trkpt><trkpt lat="42.296076" lon="-71.301913"><ele>54.9</ele><time>2005-04-18T19:26:14Z</time></trkpt><trkpt lat="42.296011" lon="-71.301012"><ele>51.1</ele><time>2005-04-18T19:26:33Z</time></trkpt><trkpt lat="42.296011" lon="-71.300132"><ele>53.5</ele><time>2005-04-18T19:26:51Z</time></trkpt><trkpt lat="42.295904" lon="-71.299553"><ele>54</ele><time>2005-04-18T19:27:04Z</time></trkpt><trkpt lat="42.295904" lon="-71.298931"><ele>54</ele><time>2005-04-18T19:27:17Z</time></trkpt><trkpt lat="42.295904" lon="-71.298866"><ele>54</ele><time>2005-04-18T19:27:18Z</time></trkpt><trkpt lat="42.295926" lon="-71.298308"><ele>54</ele><time>2005-04-18T19:27:29Z</time></trkpt><trkpt lat="42.295969" lon="-71.297665"><ele>52</ele><time>2005-04-18T19:27:42Z</time></trkpt><trkpt lat="42.296033" lon="-71.296978"><ele>50.6</ele><time>2005-04-18T19:27:56Z</time></trkpt><trkpt lat="42.296097" lon="-71.29627"><ele>50.6</ele><time>2005-04-18T19:28:10Z</time></trkpt><trkpt lat="42.296205" lon="-71.295669"><ele>51.6</ele><time>2005-04-18T19:28:22Z</time></trkpt><trkpt lat="42.296312" lon="-71.294918"><ele>51.1</ele><time>2005-04-18T19:28:37Z</time></trkpt><trkpt lat="42.296398" lon="-71.294339"><ele>52</ele><time>2005-04-18T19:28:49Z</time></trkpt><trkpt lat="42.296526" lon="-71.293738"><ele>50.6</ele><time>2005-04-18T19:29:02Z</time></trkpt><trkpt lat="42.296634" lon="-71.293137"><ele>49.6</ele><time>2005-04-18T19:29:14Z</time></trkpt><trkpt lat="42.296741" lon="-71.292515"><ele>48.2</ele><time>2005-04-18T19:29:27Z</time></trkpt><trkpt lat="42.296891" lon="-71.291957"><ele>46.3</ele><time>2005-04-18T19:29:39Z</time></trkpt><trkpt lat="42.29702" lon="-71.291614"><ele>46.3</ele><time>2005-04-18T19:29:47Z</time></trkpt><trkpt lat="42.297235" lon="-71.29112"><ele>47.2</ele><time>2005-04-18T19:29:59Z</time></trkpt><trkpt lat="42.297556" lon="-71.290455"><ele>49.2</ele><time>2005-04-18T19:30:14Z</time></trkpt><trkpt lat="42.297943" lon="-71.289532"><ele>49.6</ele><time>2005-04-18T19:30:35Z</time></trkpt><trkpt lat="42.298779" lon="-71.28818"><ele>49.6</ele><time>2005-04-18T19:31:12Z</time></trkpt><trkpt lat="42.299531" lon="-71.287279"><ele>49.6</ele><time>2005-04-18T19:31:43Z</time></trkpt><trkpt lat="42.301033" lon="-71.287236"><ele>49.6</ele><time>2005-04-18T19:32:16Z</time></trkpt><trkpt lat="42.301548" lon="-71.286871"><ele>49.6</ele><time>2005-04-18T19:32:32Z</time></trkpt><trkpt lat="42.302148" lon="-71.286399"><ele>49.6</ele><time>2005-04-18T19:32:51Z</time></trkpt><trkpt lat="42.302685" lon="-71.285949"><ele>49.6</ele><time>2005-04-18T19:33:08Z</time></trkpt><trkpt lat="42.303371" lon="-71.285348"><ele>49.6</ele><time>2005-04-18T19:33:30Z</time></trkpt><trkpt lat="42.30423" lon="-71.284575"><ele>49.6</ele><time>2005-04-18T19:33:58Z</time></trkpt><trkpt lat="42.304788" lon="-71.284039"><ele>50.6</ele><time>2005-04-18T19:34:17Z</time></trkpt><trkpt lat="42.305388" lon="-71.283245"><ele>49.2</ele><time>2005-04-18T19:34:41Z</time></trkpt><trkpt lat="42.306397" lon="-71.281829"><ele>48.7</ele><time>2005-04-18T19:35:22Z</time></trkpt><trkpt lat="42.307405" lon="-71.280284"><ele>50.1</ele><time>2005-04-18T19:36:06Z</time></trkpt><trkpt lat="42.307727" lon="-71.279705"><ele>51.1</ele><time>2005-04-18T19:36:21Z</time></trkpt><trkpt lat="42.308285" lon="-71.278803"><ele>53.5</ele><time>2005-04-18T19:36:46Z</time></trkpt><trkpt lat="42.308714" lon="-71.278203"><ele>54</ele><time>2005-04-18T19:37:03Z</time></trkpt><trkpt lat="42.309573" lon="-71.277215"><ele>54.9</ele><time>2005-04-18T19:37:34Z</time></trkpt><trkpt lat="42.310216" lon="-71.276507"><ele>54.9</ele><time>2005-04-18T19:37:58Z</time></trkpt><trkpt lat="42.310967" lon="-71.275799"><ele>54.9</ele><time>2005-04-18T19:38:23Z</time></trkpt><trkpt lat="42.311954" lon="-71.274877"><ele>54.9</ele><time>2005-04-18T19:38:56Z</time></trkpt><trkpt lat="42.312491" lon="-71.274319"><ele>55.4</ele><time>2005-04-18T19:39:16Z</time></trkpt><trkpt lat="42.312984" lon="-71.273847"><ele>55.9</ele><time>2005-04-18T19:39:34Z</time></trkpt><trkpt lat="42.313521" lon="-71.27331"><ele>56.4</ele><time>2005-04-18T19:39:54Z</time></trkpt><trkpt lat="42.314165" lon="-71.272452"><ele>55.4</ele><time>2005-04-18T19:40:20Z</time></trkpt><trkpt lat="42.314444" lon="-71.271915"><ele>56.9</ele><time>2005-04-18T19:40:34Z</time></trkpt><trkpt lat="42.314894" lon="-71.271272"><ele>57.8</ele><time>2005-04-18T19:40:52Z</time></trkpt><trkpt lat="42.315559" lon="-71.270392"><ele>55.9</ele><time>2005-04-18T19:41:18Z</time></trkpt><trkpt lat="42.315967" lon="-71.269727"><ele>56.9</ele><time>2005-04-18T19:41:36Z</time></trkpt><trkpt lat="42.316611" lon="-71.26874"><ele>58.3</ele><time>2005-04-18T19:42:03Z</time></trkpt><trkpt lat="42.317362" lon="-71.267753"><ele>57.8</ele><time>2005-04-18T19:42:32Z</time></trkpt><trkpt lat="42.317727" lon="-71.267238"><ele>57.3</ele><time>2005-04-18T19:42:47Z</time></trkpt><trkpt lat="42.318327" lon="-71.266358"><ele>57.3</ele><time>2005-04-18T19:43:13Z</time></trkpt><trkpt lat="42.319357" lon="-71.264899"><ele>55.4</ele><time>2005-04-18T19:43:57Z</time></trkpt><trkpt lat="42.320302" lon="-71.263869"><ele>55.4</ele><time>2005-04-18T19:44:31Z</time></trkpt><trkpt lat="42.32116" lon="-71.263182"><ele>55.4</ele><time>2005-04-18T19:44:58Z</time></trkpt><trkpt lat="42.322876" lon="-71.262753"><ele>55.4</ele><time>2005-04-18T19:45:37Z</time></trkpt><trkpt lat="42.32352" lon="-71.262388"><ele>52.5</ele><time>2005-04-18T19:45:57Z</time></trkpt><trkpt lat="42.324121" lon="-71.261938"><ele>46.8</ele><time>2005-04-18T19:46:16Z</time></trkpt><trkpt lat="42.324915" lon="-71.261101"><ele>42</ele><time>2005-04-18T19:46:45Z</time></trkpt><trkpt lat="42.325215" lon="-71.260543"><ele>35.7</ele><time>2005-04-18T19:46:59Z</time></trkpt><trkpt lat="42.325344" lon="-71.259942"><ele>29.9</ele><time>2005-04-18T19:47:11Z</time></trkpt><trkpt lat="42.325408" lon="-71.259105"><ele>25.1</ele><time>2005-04-18T19:47:27Z</time></trkpt><trkpt lat="42.325408" lon="-71.258998"><ele>25.1</ele><time>2005-04-18T19:47:29Z</time></trkpt><trkpt lat="42.325387" lon="-71.258376"><ele>25.1</ele><time>2005-04-18T19:47:42Z</time></trkpt><trkpt lat="42.32543" lon="-71.257753"><ele>23.2</ele><time>2005-04-18T19:47:55Z</time></trkpt><trkpt lat="42.325516" lon="-71.25711"><ele>23.2</ele><time>2005-04-18T19:48:09Z</time></trkpt><trkpt lat="42.325623" lon="-71.256766"><ele>23.2</ele><time>2005-04-18T19:48:17Z</time></trkpt><trkpt lat="42.325838" lon="-71.256208"><ele>23.7</ele><time>2005-04-18T19:48:31Z</time></trkpt><trkpt lat="42.326031" lon="-71.255629"><ele>25.1</ele><time>2005-04-18T19:48:45Z</time></trkpt><trkpt lat="42.326224" lon="-71.255157"><ele>28</ele><time>2005-04-18T19:48:57Z</time></trkpt><trkpt lat="42.326245" lon="-71.255114"><ele>28</ele><time>2005-04-18T19:48:58Z</time></trkpt><trkpt lat="42.326245" lon="-71.255007"><ele>28.5</ele><time>2005-04-18T19:49:01Z</time></trkpt><trkpt lat="42.326267" lon="-71.254964"><ele>28.5</ele><time>2005-04-18T19:49:02Z</time></trkpt><trkpt lat="42.326374" lon="-71.254663"><ele>29</ele><time>2005-04-18T19:49:10Z</time></trkpt><trkpt lat="42.326546" lon="-71.254342"><ele>28</ele><time>2005-04-18T19:49:20Z</time></trkpt><trkpt lat="42.327039" lon="-71.253655"><ele>30.4</ele><time>2005-04-18T19:49:41Z</time></trkpt><trkpt lat="42.327404" lon="-71.253119"><ele>31.9</ele><time>2005-04-18T19:49:57Z</time></trkpt><trkpt lat="42.327919" lon="-71.252367"><ele>32.8</ele><time>2005-04-18T19:50:19Z</time></trkpt><trkpt lat="42.32837" lon="-71.251745"><ele>34.3</ele><time>2005-04-18T19:50:39Z</time></trkpt><trkpt lat="42.328842" lon="-71.251101"><ele>36.2</ele><time>2005-04-18T19:51:00Z</time></trkpt><trkpt lat="42.3294" lon="-71.250286"><ele>39.6</ele><time>2005-04-18T19:51:25Z</time></trkpt><trkpt lat="42.329807" lon="-71.249492"><ele>41.5</ele><time>2005-04-18T19:51:48Z</time></trkpt><trkpt lat="42.330022" lon="-71.248677"><ele>43.9</ele><time>2005-04-18T19:52:07Z</time></trkpt><trkpt lat="42.330344" lon="-71.248119"><ele>42.4</ele><time>2005-04-18T19:52:23Z</time></trkpt><trkpt lat="42.331138" lon="-71.247175"><ele>43.4</ele><time>2005-04-18T19:52:55Z</time></trkpt><trkpt lat="42.33191" lon="-71.246488"><ele>43.4</ele><time>2005-04-18T19:53:22Z</time></trkpt><trkpt lat="42.332618" lon="-71.246016"><ele>43.9</ele><time>2005-04-18T19:53:41Z</time></trkpt><trkpt lat="42.333047" lon="-71.245651"><ele>44.8</ele><time>2005-04-18T19:53:54Z</time></trkpt><trkpt lat="42.333584" lon="-71.245093"><ele>44.8</ele><time>2005-04-18T19:54:12Z</time></trkpt><trkpt lat="42.33397" lon="-71.2446"><ele>46.3</ele><time>2005-04-18T19:54:27Z</time></trkpt><trkpt lat="42.334206" lon="-71.244299"><ele>46.8</ele><time>2005-04-18T19:54:36Z</time></trkpt><trkpt lat="42.334378" lon="-71.244063"><ele>45.3</ele><time>2005-04-18T19:54:43Z</time></trkpt><trkpt lat="42.334721" lon="-71.243613"><ele>43.4</ele><time>2005-04-18T19:54:56Z</time></trkpt><trkpt lat="42.334957" lon="-71.243291"><ele>42.9</ele><time>2005-04-18T19:55:06Z</time></trkpt><trkpt lat="42.335279" lon="-71.242862"><ele>42</ele><time>2005-04-18T19:55:18Z</time></trkpt><trkpt lat="42.335751" lon="-71.242282"><ele>41.5</ele><time>2005-04-18T19:55:36Z</time></trkpt><trkpt lat="42.336202" lon="-71.241853"><ele>42</ele><time>2005-04-18T19:55:52Z</time></trkpt><trkpt lat="42.336717" lon="-71.241488"><ele>42</ele><time>2005-04-18T19:56:09Z</time></trkpt><trkpt lat="42.338047" lon="-71.240587"><ele>42</ele><time>2005-04-18T19:56:53Z</time></trkpt><trkpt lat="42.33897" lon="-71.240029"><ele>42.4</ele><time>2005-04-18T19:57:23Z</time></trkpt><trkpt lat="42.339764" lon="-71.239579"><ele>41.5</ele><time>2005-04-18T19:57:50Z</time></trkpt><trkpt lat="42.340386" lon="-71.239278"><ele>41.5</ele><time>2005-04-18T19:58:07Z</time></trkpt><trkpt lat="42.340944" lon="-71.238828"><ele>40.5</ele><time>2005-04-18T19:58:25Z</time></trkpt><trkpt lat="42.34103" lon="-71.238656"><ele>38.6</ele><time>2005-04-18T19:58:29Z</time></trkpt><trkpt lat="42.340944" lon="-71.23842"><ele>36.7</ele><time>2005-04-18T19:58:34Z</time></trkpt><trkpt lat="42.340729" lon="-71.238077"><ele>35.2</ele><time>2005-04-18T19:58:42Z</time></trkpt><trkpt lat="42.340343" lon="-71.237476"><ele>34.7</ele><time>2005-04-18T19:58:58Z</time></trkpt><trkpt lat="42.34" lon="-71.236982"><ele>31.4</ele><time>2005-04-18T19:59:12Z</time></trkpt><trkpt lat="42.339742" lon="-71.236382"><ele>35.2</ele><time>2005-04-18T19:59:27Z</time></trkpt><trkpt lat="42.339506" lon="-71.235759"><ele>37.1</ele><time>2005-04-18T19:59:43Z</time></trkpt><trkpt lat="42.339313" lon="-71.234965"><ele>36.7</ele><time>2005-04-18T20:00:02Z</time></trkpt><trkpt lat="42.339249" lon="-71.234515"><ele>38.6</ele><time>2005-04-18T20:00:14Z</time></trkpt><trkpt lat="42.339206" lon="-71.233957"><ele>39.1</ele><time>2005-04-18T20:00:27Z</time></trkpt><trkpt lat="42.339227" lon="-71.233399"><ele>42.9</ele><time>2005-04-18T20:00:41Z</time></trkpt><trkpt lat="42.33927" lon="-71.232862"><ele>45.3</ele><time>2005-04-18T20:00:54Z</time></trkpt><trkpt lat="42.339292" lon="-71.232262"><ele>47.2</ele><time>2005-04-18T20:01:09Z</time></trkpt><trkpt lat="42.339356" lon="-71.231661"><ele>49.6</ele><time>2005-04-18T20:01:23Z</time></trkpt><trkpt lat="42.339356" lon="-71.230974"><ele>51.6</ele><time>2005-04-18T20:01:38Z</time></trkpt><trkpt lat="42.339356" lon="-71.230803"><ele>51.1</ele><time>2005-04-18T20:01:42Z</time></trkpt><trkpt lat="42.339313" lon="-71.230309"><ele>51.6</ele><time>2005-04-18T20:01:52Z</time></trkpt><trkpt lat="42.33927" lon="-71.229644"><ele>51.6</ele><time>2005-04-18T20:02:05Z</time></trkpt><trkpt lat="42.339184" lon="-71.229043"><ele>49.6</ele><time>2005-04-18T20:02:17Z</time></trkpt><trkpt lat="42.339034" lon="-71.228228"><ele>46.3</ele><time>2005-04-18T20:02:33Z</time></trkpt><trkpt lat="42.338841" lon="-71.227584"><ele>44.8</ele><time>2005-04-18T20:02:48Z</time></trkpt><trkpt lat="42.338605" lon="-71.226962"><ele>47.7</ele><time>2005-04-18T20:03:04Z</time></trkpt><trkpt lat="42.338262" lon="-71.226296"><ele>48.7</ele><time>2005-04-18T20:03:22Z</time></trkpt><trkpt lat="42.33794" lon="-71.225846"><ele>47.7</ele><time>2005-04-18T20:03:36Z</time></trkpt><trkpt lat="42.337596" lon="-71.225352"><ele>48.2</ele><time>2005-04-18T20:03:51Z</time></trkpt><trkpt lat="42.337232" lon="-71.224859"><ele>48.2</ele><time>2005-04-18T20:04:05Z</time></trkpt><trkpt lat="42.336953" lon="-71.224301"><ele>43.4</ele><time>2005-04-18T20:04:19Z</time></trkpt><trkpt lat="42.336717" lon="-71.223593"><ele>44.8</ele><time>2005-04-18T20:04:35Z</time></trkpt><trkpt lat="42.336695" lon="-71.223443"><ele>44.4</ele><time>2005-04-18T20:04:38Z</time></trkpt><trkpt lat="42.336695" lon="-71.223292"><ele>45.3</ele><time>2005-04-18T20:04:41Z</time></trkpt><trkpt lat="42.336674" lon="-71.223121"><ele>45.3</ele><time>2005-04-18T20:04:44Z</time></trkpt><trkpt lat="42.336695" lon="-71.222863"><ele>45.3</ele><time>2005-04-18T20:04:49Z</time></trkpt><trkpt lat="42.336738" lon="-71.222219"><ele>44.8</ele><time>2005-04-18T20:05:02Z</time></trkpt><trkpt lat="42.336802" lon="-71.221383"><ele>43.9</ele><time>2005-04-18T20:05:20Z</time></trkpt><trkpt lat="42.336845" lon="-71.220889"><ele>43.9</ele><time>2005-04-18T20:05:31Z</time></trkpt><trkpt lat="42.337039" lon="-71.220331"><ele>44.8</ele><time>2005-04-18T20:05:45Z</time></trkpt><trkpt lat="42.337296" lon="-71.219859"><ele>48.2</ele><time>2005-04-18T20:05:57Z</time></trkpt><trkpt lat="42.337575" lon="-71.219215"><ele>47.7</ele><time>2005-04-18T20:06:14Z</time></trkpt><trkpt lat="42.337575" lon="-71.218636"><ele>46.8</ele><time>2005-04-18T20:06:26Z</time></trkpt><trkpt lat="42.337468" lon="-71.217992"><ele>44.4</ele><time>2005-04-18T20:06:40Z</time></trkpt><trkpt lat="42.337253" lon="-71.217477"><ele>42.9</ele><time>2005-04-18T20:06:52Z</time></trkpt><trkpt lat="42.337039" lon="-71.216877"><ele>41</ele><time>2005-04-18T20:07:06Z</time></trkpt><trkpt lat="42.336888" lon="-71.216233"><ele>41</ele><time>2005-04-18T20:07:20Z</time></trkpt><trkpt lat="42.336888" lon="-71.215739"><ele>41</ele><time>2005-04-18T20:07:30Z</time></trkpt><trkpt lat="42.337017" lon="-71.215096"><ele>39.1</ele><time>2005-04-18T20:07:44Z</time></trkpt><trkpt lat="42.337253" lon="-71.214559"><ele>42</ele><time>2005-04-18T20:07:56Z</time></trkpt><trkpt lat="42.337554" lon="-71.214023"><ele>41.5</ele><time>2005-04-18T20:08:10Z</time></trkpt><trkpt lat="42.337897" lon="-71.213336"><ele>41</ele><time>2005-04-18T20:08:27Z</time></trkpt><trkpt lat="42.337983" lon="-71.2131"><ele>40.5</ele><time>2005-04-18T20:08:32Z</time></trkpt><trkpt lat="42.338047" lon="-71.212842"><ele>39.1</ele><time>2005-04-18T20:08:38Z</time></trkpt><trkpt lat="42.338133" lon="-71.212285"><ele>37.1</ele><time>2005-04-18T20:08:49Z</time></trkpt><trkpt lat="42.338176" lon="-71.211534"><ele>34.7</ele><time>2005-04-18T20:09:03Z</time></trkpt><trkpt lat="42.338111" lon="-71.210847"><ele>33.3</ele><time>2005-04-18T20:09:16Z</time></trkpt><trkpt lat="42.338026" lon="-71.210139"><ele>34.3</ele><time>2005-04-18T20:09:30Z</time></trkpt><trkpt lat="42.337983" lon="-71.209495"><ele>31.9</ele><time>2005-04-18T20:09:43Z</time></trkpt><trkpt lat="42.338047" lon="-71.208851"><ele>30.9</ele><time>2005-04-18T20:09:56Z</time></trkpt><trkpt lat="42.338197" lon="-71.208315"><ele>31.4</ele><time>2005-04-18T20:10:08Z</time></trkpt><trkpt lat="42.338455" lon="-71.207693"><ele>30.4</ele><time>2005-04-18T20:10:22Z</time></trkpt><trkpt lat="42.338626" lon="-71.207199"><ele>29.5</ele><time>2005-04-18T20:10:33Z</time></trkpt><trkpt lat="42.338734" lon="-71.206641"><ele>31.4</ele><time>2005-04-18T20:10:45Z</time></trkpt><trkpt lat="42.338777" lon="-71.20604"><ele>33.8</ele><time>2005-04-18T20:10:58Z</time></trkpt><trkpt lat="42.338734" lon="-71.20544"><ele>33.8</ele><time>2005-04-18T20:11:12Z</time></trkpt><trkpt lat="42.338626" lon="-71.20486"><ele>34.3</ele><time>2005-04-18T20:11:26Z</time></trkpt><trkpt lat="42.338476" lon="-71.204302"><ele>34.3</ele><time>2005-04-18T20:11:40Z</time></trkpt><trkpt lat="42.338283" lon="-71.203766"><ele>35.2</ele><time>2005-04-18T20:11:54Z</time></trkpt><trkpt lat="42.33809" lon="-71.203272"><ele>40.5</ele><time>2005-04-18T20:12:07Z</time></trkpt><trkpt lat="42.33794" lon="-71.202693"><ele>42.9</ele><time>2005-04-18T20:12:21Z</time></trkpt><trkpt lat="42.337854" lon="-71.202049"><ele>44.8</ele><time>2005-04-18T20:12:36Z</time></trkpt><trkpt lat="42.337832" lon="-71.201427"><ele>46.3</ele><time>2005-04-18T20:12:50Z</time></trkpt><trkpt lat="42.337854" lon="-71.200762"><ele>44.8</ele><time>2005-04-18T20:13:05Z</time></trkpt><trkpt lat="42.337918" lon="-71.200075"><ele>45.3</ele><time>2005-04-18T20:13:20Z</time></trkpt><trkpt lat="42.337983" lon="-71.199389"><ele>46.3</ele><time>2005-04-18T20:13:35Z</time></trkpt><trkpt lat="42.337961" lon="-71.198852"><ele>49.6</ele><time>2005-04-18T20:13:47Z</time></trkpt><trkpt lat="42.337897" lon="-71.198251"><ele>52.5</ele><time>2005-04-18T20:14:00Z</time></trkpt><trkpt lat="42.337725" lon="-71.197715"><ele>53</ele><time>2005-04-18T20:14:13Z</time></trkpt><trkpt lat="42.337575" lon="-71.197436"><ele>52</ele><time>2005-04-18T20:14:20Z</time></trkpt><trkpt lat="42.337253" lon="-71.196921"><ele>52.5</ele><time>2005-04-18T20:14:33Z</time></trkpt><trkpt lat="42.336824" lon="-71.196363"><ele>50.6</ele><time>2005-04-18T20:14:49Z</time></trkpt><trkpt lat="42.336438" lon="-71.196041"><ele>50.6</ele><time>2005-04-18T20:15:02Z</time></trkpt><trkpt lat="42.336094" lon="-71.195655"><ele>51.1</ele><time>2005-04-18T20:15:15Z</time></trkpt><trkpt lat="42.335815" lon="-71.195226"><ele>52</ele><time>2005-04-18T20:15:27Z</time></trkpt><trkpt lat="42.335815" lon="-71.195183"><ele>52</ele><time>2005-04-18T20:15:28Z</time></trkpt><trkpt lat="42.335708" lon="-71.194689"><ele>51.1</ele><time>2005-04-18T20:15:38Z</time></trkpt><trkpt lat="42.335751" lon="-71.194067"><ele>50.6</ele><time>2005-04-18T20:15:51Z</time></trkpt><trkpt lat="42.335944" lon="-71.193552"><ele>51.6</ele><time>2005-04-18T20:16:03Z</time></trkpt><trkpt lat="42.336116" lon="-71.192908"><ele>50.6</ele><time>2005-04-18T20:16:18Z</time></trkpt><trkpt lat="42.336245" lon="-71.192329"><ele>50.6</ele><time>2005-04-18T20:16:31Z</time></trkpt><trkpt lat="42.336309" lon="-71.191728"><ele>51.6</ele><time>2005-04-18T20:16:44Z</time></trkpt><trkpt lat="42.336309" lon="-71.191192"><ele>52</ele><time>2005-04-18T20:16:56Z</time></trkpt><trkpt lat="42.336287" lon="-71.190548"><ele>50.1</ele><time>2005-04-18T20:17:10Z</time></trkpt><trkpt lat="42.336287" lon="-71.189818"><ele>52</ele><time>2005-04-18T20:17:25Z</time></trkpt><trkpt lat="42.336287" lon="-71.18926"><ele>48.2</ele><time>2005-04-18T20:17:38Z</time></trkpt><trkpt lat="42.336287" lon="-71.18866"><ele>48.2</ele><time>2005-04-18T20:17:51Z</time></trkpt><trkpt lat="42.336309" lon="-71.188016"><ele>48.7</ele><time>2005-04-18T20:18:05Z</time></trkpt><trkpt lat="42.336373" lon="-71.187479"><ele>50.1</ele><time>2005-04-18T20:18:17Z</time></trkpt><trkpt lat="42.336395" lon="-71.186857"><ele>51.6</ele><time>2005-04-18T20:18:31Z</time></trkpt><trkpt lat="42.336438" lon="-71.186428"><ele>51.1</ele><time>2005-04-18T20:18:42Z</time></trkpt><trkpt lat="42.336481" lon="-71.185935"><ele>51.6</ele><time>2005-04-18T20:18:54Z</time></trkpt><trkpt lat="42.336545" lon="-71.185398"><ele>53</ele><time>2005-04-18T20:19:06Z</time></trkpt><trkpt lat="42.336631" lon="-71.184797"><ele>54</ele><time>2005-04-18T20:19:20Z</time></trkpt><trkpt lat="42.336695" lon="-71.184368"><ele>55.4</ele><time>2005-04-18T20:19:31Z</time></trkpt><trkpt lat="42.336695" lon="-71.18381"><ele>59.7</ele><time>2005-04-18T20:19:46Z</time></trkpt><trkpt lat="42.336652" lon="-71.183252"><ele>63.6</ele><time>2005-04-18T20:20:00Z</time></trkpt><trkpt lat="42.336588" lon="-71.182737"><ele>64.5</ele><time>2005-04-18T20:20:13Z</time></trkpt><trkpt lat="42.336566" lon="-71.182287"><ele>66</ele><time>2005-04-18T20:20:25Z</time></trkpt><trkpt lat="42.336502" lon="-71.181707"><ele>69.4</ele><time>2005-04-18T20:20:39Z</time></trkpt><trkpt lat="42.336438" lon="-71.181321"><ele>70.8</ele><time>2005-04-18T20:20:49Z</time></trkpt><trkpt lat="42.336373" lon="-71.180849"><ele>72.2</ele><time>2005-04-18T20:21:02Z</time></trkpt><trkpt lat="42.336287" lon="-71.180205"><ele>73.7</ele><time>2005-04-18T20:21:18Z</time></trkpt><trkpt lat="42.336245" lon="-71.17954"><ele>73.2</ele><time>2005-04-18T20:21:35Z</time></trkpt><trkpt lat="42.33618" lon="-71.179025"><ele>75.1</ele><time>2005-04-18T20:21:47Z</time></trkpt><trkpt lat="42.336137" lon="-71.178403"><ele>77</ele><time>2005-04-18T20:22:01Z</time></trkpt><trkpt lat="42.336202" lon="-71.177909"><ele>78</ele><time>2005-04-18T20:22:12Z</time></trkpt><trkpt lat="42.336352" lon="-71.177394"><ele>78.5</ele><time>2005-04-18T20:22:24Z</time></trkpt><trkpt lat="42.336588" lon="-71.176944"><ele>78</ele><time>2005-04-18T20:22:36Z</time></trkpt><trkpt lat="42.336845" lon="-71.176536"><ele>78</ele><time>2005-04-18T20:22:47Z</time></trkpt><trkpt lat="42.337017" lon="-71.176236"><ele>77.5</ele><time>2005-04-18T20:22:55Z</time></trkpt><trkpt lat="42.337167" lon="-71.175935"><ele>77.5</ele><time>2005-04-18T20:23:03Z</time></trkpt><trkpt lat="42.337317" lon="-71.175377"><ele>78</ele><time>2005-04-18T20:23:16Z</time></trkpt><trkpt lat="42.337382" lon="-71.174798"><ele>77.5</ele><time>2005-04-18T20:23:29Z</time></trkpt><trkpt lat="42.337317" lon="-71.174133"><ele>76.6</ele><time>2005-04-18T20:23:43Z</time></trkpt><trkpt lat="42.337189" lon="-71.173403"><ele>75.1</ele><time>2005-04-18T20:23:59Z</time></trkpt><trkpt lat="42.337167" lon="-71.172888"><ele>75.1</ele><time>2005-04-18T20:24:10Z</time></trkpt><trkpt lat="42.33721" lon="-71.172416"><ele>75.1</ele><time>2005-04-18T20:24:20Z</time></trkpt><trkpt lat="42.337382" lon="-71.171923"><ele>75.1</ele><time>2005-04-18T20:24:32Z</time></trkpt><trkpt lat="42.337639" lon="-71.171536"><ele>75.6</ele><time>2005-04-18T20:24:43Z</time></trkpt><trkpt lat="42.33809" lon="-71.171086"><ele>76.6</ele><time>2005-04-18T20:24:58Z</time></trkpt><trkpt lat="42.338455" lon="-71.170678"><ele>75.6</ele><time>2005-04-18T20:25:10Z</time></trkpt><trkpt lat="42.338884" lon="-71.170142"><ele>71.8</ele><time>2005-04-18T20:25:26Z</time></trkpt><trkpt lat="42.339163" lon="-71.169584"><ele>66.9</ele><time>2005-04-18T20:25:39Z</time></trkpt><trkpt lat="42.339399" lon="-71.168983"><ele>64.1</ele><time>2005-04-18T20:25:52Z</time></trkpt><trkpt lat="42.339592" lon="-71.168275"><ele>60.2</ele><time>2005-04-18T20:26:07Z</time></trkpt><trkpt lat="42.339699" lon="-71.167738"><ele>58.3</ele><time>2005-04-18T20:26:18Z</time></trkpt><trkpt lat="42.339807" lon="-71.167181"><ele>56.4</ele><time>2005-04-18T20:26:29Z</time></trkpt><trkpt lat="42.339892" lon="-71.166515"><ele>54</ele><time>2005-04-18T20:26:42Z</time></trkpt><trkpt lat="42.34" lon="-71.165786"><ele>53.5</ele><time>2005-04-18T20:26:57Z</time></trkpt><trkpt lat="42.340064" lon="-71.165099"><ele>54</ele><time>2005-04-18T20:27:12Z</time></trkpt><trkpt lat="42.340107" lon="-71.164455"><ele>54.9</ele><time>2005-04-18T20:27:26Z</time></trkpt><trkpt lat="42.340107" lon="-71.16364"><ele>54.5</ele><time>2005-04-18T20:27:43Z</time></trkpt><trkpt lat="42.340086" lon="-71.163146"><ele>54</ele><time>2005-04-18T20:27:54Z</time></trkpt><trkpt lat="42.340107" lon="-71.162632"><ele>54</ele><time>2005-04-18T20:28:05Z</time></trkpt><trkpt lat="42.340064" lon="-71.161902"><ele>51.6</ele><time>2005-04-18T20:28:20Z</time></trkpt><trkpt lat="42.340021" lon="-71.161387"><ele>51.6</ele><time>2005-04-18T20:28:31Z</time></trkpt><trkpt lat="42.339978" lon="-71.160722"><ele>51.1</ele><time>2005-04-18T20:28:45Z</time></trkpt><trkpt lat="42.339978" lon="-71.160228"><ele>51.1</ele><time>2005-04-18T20:28:56Z</time></trkpt><trkpt lat="42.339935" lon="-71.159692"><ele>51.1</ele><time>2005-04-18T20:29:08Z</time></trkpt><trkpt lat="42.339871" lon="-71.158855"><ele>52.5</ele><time>2005-04-18T20:29:27Z</time></trkpt><trkpt lat="42.339721" lon="-71.158168"><ele>53</ele><time>2005-04-18T20:29:43Z</time></trkpt><trkpt lat="42.339528" lon="-71.157589"><ele>53</ele><time>2005-04-18T20:29:56Z</time></trkpt><trkpt lat="42.339313" lon="-71.156924"><ele>51.6</ele><time>2005-04-18T20:30:11Z</time></trkpt><trkpt lat="42.339056" lon="-71.156344"><ele>52.5</ele><time>2005-04-18T20:30:25Z</time></trkpt><trkpt lat="42.338734" lon="-71.155636"><ele>51.6</ele><time>2005-04-18T20:30:42Z</time></trkpt><trkpt lat="42.338476" lon="-71.155078"><ele>52</ele><time>2005-04-18T20:30:56Z</time></trkpt><trkpt lat="42.33824" lon="-71.154585"><ele>50.6</ele><time>2005-04-18T20:31:08Z</time></trkpt><trkpt lat="42.338047" lon="-71.154091"><ele>48.7</ele><time>2005-04-18T20:31:20Z</time></trkpt><trkpt lat="42.337897" lon="-71.153491"><ele>49.2</ele><time>2005-04-18T20:31:33Z</time></trkpt><trkpt lat="42.337768" lon="-71.152976"><ele>48.7</ele><time>2005-04-18T20:31:44Z</time></trkpt><trkpt lat="42.337511" lon="-71.152568"><ele>47.2</ele><time>2005-04-18T20:31:55Z</time></trkpt><trkpt lat="42.33706" lon="-71.152096"><ele>45.3</ele><time>2005-04-18T20:32:10Z</time></trkpt><trkpt lat="42.336631" lon="-71.151559"><ele>43.4</ele><time>2005-04-18T20:32:25Z</time></trkpt><trkpt lat="42.336202" lon="-71.151087"><ele>42.9</ele><time>2005-04-18T20:32:39Z</time></trkpt><trkpt lat="42.335858" lon="-71.150594"><ele>40.5</ele><time>2005-04-18T20:32:53Z</time></trkpt><trkpt lat="42.335815" lon="-71.150422"><ele>39.6</ele><time>2005-04-18T20:32:57Z</time></trkpt><trkpt lat="42.335923" lon="-71.149993"><ele>38.6</ele><time>2005-04-18T20:33:06Z</time></trkpt><trkpt lat="42.335987" lon="-71.14965"><ele>38.1</ele><time>2005-04-18T20:33:13Z</time></trkpt><trkpt lat="42.336094" lon="-71.14922"><ele>39.6</ele><time>2005-04-18T20:33:22Z</time></trkpt><trkpt lat="42.336245" lon="-71.148663"><ele>40</ele><time>2005-04-18T20:33:34Z</time></trkpt><trkpt lat="42.336416" lon="-71.14804"><ele>36.7</ele><time>2005-04-18T20:33:48Z</time></trkpt><trkpt lat="42.336566" lon="-71.147332"><ele>37.1</ele><time>2005-04-18T20:34:04Z</time></trkpt><trkpt lat="42.336738" lon="-71.146581"><ele>36.7</ele><time>2005-04-18T20:34:20Z</time></trkpt><trkpt lat="42.33691" lon="-71.145787"><ele>35.2</ele><time>2005-04-18T20:34:38Z</time></trkpt><trkpt lat="42.336996" lon="-71.145272"><ele>35.7</ele><time>2005-04-18T20:34:50Z</time></trkpt><trkpt lat="42.337103" lon="-71.144757"><ele>35.7</ele><time>2005-04-18T20:35:02Z</time></trkpt><trkpt lat="42.337253" lon="-71.144221"><ele>33.8</ele><time>2005-04-18T20:35:15Z</time></trkpt><trkpt lat="42.337382" lon="-71.143513"><ele>35.7</ele><time>2005-04-18T20:35:32Z</time></trkpt><trkpt lat="42.337554" lon="-71.142654"><ele>36.7</ele><time>2005-04-18T20:35:52Z</time></trkpt><trkpt lat="42.337682" lon="-71.141989"><ele>34.3</ele><time>2005-04-18T20:36:08Z</time></trkpt><trkpt lat="42.33779" lon="-71.141431"><ele>34.3</ele><time>2005-04-18T20:36:21Z</time></trkpt><trkpt lat="42.337897" lon="-71.140873"><ele>36.7</ele><time>2005-04-18T20:36:35Z</time></trkpt><trkpt lat="42.337897" lon="-71.140831"><ele>36.7</ele><time>2005-04-18T20:36:36Z</time></trkpt><trkpt lat="42.338004" lon="-71.140294"><ele>37.6</ele><time>2005-04-18T20:36:49Z</time></trkpt><trkpt lat="42.338133" lon="-71.139693"><ele>39.6</ele><time>2005-04-18T20:37:05Z</time></trkpt><trkpt lat="42.338262" lon="-71.139221"><ele>40</ele><time>2005-04-18T20:37:17Z</time></trkpt><trkpt lat="42.338498" lon="-71.13847"><ele>38.6</ele><time>2005-04-18T20:37:35Z</time></trkpt><trkpt lat="42.338605" lon="-71.137912"><ele>38.6</ele><time>2005-04-18T20:37:48Z</time></trkpt><trkpt lat="42.338734" lon="-71.137419"><ele>40</ele><time>2005-04-18T20:38:00Z</time></trkpt><trkpt lat="42.338841" lon="-71.136947"><ele>41.5</ele><time>2005-04-18T20:38:11Z</time></trkpt><trkpt lat="42.338927" lon="-71.136496"><ele>40</ele><time>2005-04-18T20:38:21Z</time></trkpt><trkpt lat="42.339034" lon="-71.136003"><ele>37.6</ele><time>2005-04-18T20:38:32Z</time></trkpt><trkpt lat="42.339184" lon="-71.135359"><ele>35.7</ele><time>2005-04-18T20:38:46Z</time></trkpt><trkpt lat="42.339334" lon="-71.134758"><ele>36.2</ele><time>2005-04-18T20:38:59Z</time></trkpt><trkpt lat="42.33942" lon="-71.134157"><ele>33.3</ele><time>2005-04-18T20:39:12Z</time></trkpt><trkpt lat="42.339528" lon="-71.133106"><ele>32.3</ele><time>2005-04-18T20:39:36Z</time></trkpt><trkpt lat="42.339528" lon="-71.132526"><ele>31.9</ele><time>2005-04-18T20:39:50Z</time></trkpt><trkpt lat="42.339485" lon="-71.131968"><ele>34.3</ele><time>2005-04-18T20:40:04Z</time></trkpt><trkpt lat="42.339506" lon="-71.131411"><ele>36.7</ele><time>2005-04-18T20:40:17Z</time></trkpt><trkpt lat="42.339549" lon="-71.130745"><ele>35.2</ele><time>2005-04-18T20:40:33Z</time></trkpt><trkpt lat="42.339635" lon="-71.130166"><ele>32.8</ele><time>2005-04-18T20:40:46Z</time></trkpt><trkpt lat="42.339764" lon="-71.129265"><ele>28.5</ele><time>2005-04-18T20:41:05Z</time></trkpt><trkpt lat="42.339892" lon="-71.128621"><ele>29</ele><time>2005-04-18T20:41:19Z</time></trkpt><trkpt lat="42.340086" lon="-71.127999"><ele>28.5</ele><time>2005-04-18T20:41:33Z</time></trkpt><trkpt lat="42.340322" lon="-71.127377"><ele>29.9</ele><time>2005-04-18T20:41:48Z</time></trkpt><trkpt lat="42.340558" lon="-71.126754"><ele>29.5</ele><time>2005-04-18T20:42:03Z</time></trkpt><trkpt lat="42.340815" lon="-71.126132"><ele>31.9</ele><time>2005-04-18T20:42:18Z</time></trkpt><trkpt lat="42.34103" lon="-71.125467"><ele>31.4</ele><time>2005-04-18T20:42:33Z</time></trkpt><trkpt lat="42.341158" lon="-71.124887"><ele>29.5</ele><time>2005-04-18T20:42:46Z</time></trkpt><trkpt lat="42.34133" lon="-71.124201"><ele>25.1</ele><time>2005-04-18T20:43:02Z</time></trkpt><trkpt lat="42.34148" lon="-71.123536"><ele>23.7</ele><time>2005-04-18T20:43:17Z</time></trkpt><trkpt lat="42.341588" lon="-71.122892"><ele>22.2</ele><time>2005-04-18T20:43:31Z</time></trkpt><trkpt lat="42.341716" lon="-71.122377"><ele>22.7</ele><time>2005-04-18T20:43:42Z</time></trkpt><trkpt lat="42.341738" lon="-71.122184"><ele>21.8</ele><time>2005-04-18T20:43:46Z</time></trkpt><trkpt lat="42.341845" lon="-71.121819"><ele>19.8</ele><time>2005-04-18T20:43:54Z</time></trkpt><trkpt lat="42.342017" lon="-71.121283"><ele>19.4</ele><time>2005-04-18T20:44:06Z</time></trkpt><trkpt lat="42.342188" lon="-71.120725"><ele>19.4</ele><time>2005-04-18T20:44:19Z</time></trkpt><trkpt lat="42.342446" lon="-71.119823"><ele>18.4</ele><time>2005-04-18T20:44:39Z</time></trkpt><trkpt lat="42.342618" lon="-71.119266"><ele>16.5</ele><time>2005-04-18T20:44:51Z</time></trkpt><trkpt lat="42.342789" lon="-71.118622"><ele>13.1</ele><time>2005-04-18T20:45:04Z</time></trkpt><trkpt lat="42.343004" lon="-71.117892"><ele>14.1</ele><time>2005-04-18T20:45:19Z</time></trkpt><trkpt lat="42.343154" lon="-71.117291"><ele>12.6</ele><time>2005-04-18T20:45:31Z</time></trkpt><trkpt lat="42.343304" lon="-71.116734"><ele>11.2</ele><time>2005-04-18T20:45:43Z</time></trkpt><trkpt lat="42.343454" lon="-71.116176"><ele>8.3</ele><time>2005-04-18T20:45:56Z</time></trkpt><trkpt lat="42.343669" lon="-71.115425"><ele>8.8</ele><time>2005-04-18T20:46:14Z</time></trkpt><trkpt lat="42.343841" lon="-71.114845"><ele>6.4</ele><time>2005-04-18T20:46:29Z</time></trkpt><trkpt lat="42.343948" lon="-71.11433"><ele>8.8</ele><time>2005-04-18T20:46:42Z</time></trkpt><trkpt lat="42.344098" lon="-71.113772"><ele>4</ele><time>2005-04-18T20:46:56Z</time></trkpt><trkpt lat="42.344184" lon="-71.113214"><ele>4.5</ele><time>2005-04-18T20:47:09Z</time></trkpt><trkpt lat="42.344248" lon="-71.112828"><ele>5.9</ele><time>2005-04-18T20:47:18Z</time></trkpt><trkpt lat="42.344441" lon="-71.112313"><ele>8.3</ele><time>2005-04-18T20:47:30Z</time></trkpt><trkpt lat="42.344592" lon="-71.111777"><ele>6.4</ele><time>2005-04-18T20:47:43Z</time></trkpt><trkpt lat="42.344763" lon="-71.11124"><ele>5.9</ele><time>2005-04-18T20:47:56Z</time></trkpt><trkpt lat="42.344956" lon="-71.110618"><ele>5.4</ele><time>2005-04-18T20:48:11Z</time></trkpt><trkpt lat="42.34515" lon="-71.109931"><ele>8.8</ele><time>2005-04-18T20:48:28Z</time></trkpt><trkpt lat="42.345386" lon="-71.109374"><ele>10.7</ele><time>2005-04-18T20:48:42Z</time></trkpt><trkpt lat="42.345557" lon="-71.108751"><ele>7.8</ele><time>2005-04-18T20:48:57Z</time></trkpt><trkpt lat="42.345665" lon="-71.108215"><ele>6.4</ele><time>2005-04-18T20:49:10Z</time></trkpt><trkpt lat="42.345793" lon="-71.1077"><ele>8.3</ele><time>2005-04-18T20:49:23Z</time></trkpt><trkpt lat="42.345943" lon="-71.107142"><ele>6.4</ele><time>2005-04-18T20:49:37Z</time></trkpt><trkpt lat="42.346115" lon="-71.10652"><ele>5.4</ele><time>2005-04-18T20:49:52Z</time></trkpt><trkpt lat="42.346244" lon="-71.106048"><ele>3.5</ele><time>2005-04-18T20:50:04Z</time></trkpt><trkpt lat="42.346394" lon="-71.105533"><ele>3</ele><time>2005-04-18T20:50:17Z</time></trkpt><trkpt lat="42.346587" lon="-71.104953"><ele>3</ele><time>2005-04-18T20:50:32Z</time></trkpt><trkpt lat="42.346759" lon="-71.104503"><ele>0.6</ele><time>2005-04-18T20:50:43Z</time></trkpt><trkpt lat="42.346888" lon="-71.104031"><ele>1.6</ele><time>2005-04-18T20:50:55Z</time></trkpt><trkpt lat="42.346931" lon="-71.103945"><ele>1.1</ele><time>2005-04-18T20:50:57Z</time></trkpt><trkpt lat="42.347102" lon="-71.103344"><ele>-0.3</ele><time>2005-04-18T20:51:12Z</time></trkpt><trkpt lat="42.347167" lon="-71.102915"><ele>6.4</ele><time>2005-04-18T20:51:22Z</time></trkpt><trkpt lat="42.347317" lon="-71.1024"><ele>10.2</ele><time>2005-04-18T20:51:34Z</time></trkpt><trkpt lat="42.347467" lon="-71.101863"><ele>12.6</ele><time>2005-04-18T20:51:48Z</time></trkpt><trkpt lat="42.347574" lon="-71.101456"><ele>14.1</ele><time>2005-04-18T20:51:58Z</time></trkpt><trkpt lat="42.347703" lon="-71.100984"><ele>13.6</ele><time>2005-04-18T20:52:10Z</time></trkpt><trkpt lat="42.347875" lon="-71.100533"><ele>14.6</ele><time>2005-04-18T20:52:22Z</time></trkpt><trkpt lat="42.347939" lon="-71.100383"><ele>12.6</ele><time>2005-04-18T20:52:26Z</time></trkpt><trkpt lat="42.347982" lon="-71.100233"><ele>12.2</ele><time>2005-04-18T20:52:30Z</time></trkpt><trkpt lat="42.348046" lon="-71.100061"><ele>12.2</ele><time>2005-04-18T20:52:34Z</time></trkpt><trkpt lat="42.348068" lon="-71.099975"><ele>11.2</ele><time>2005-04-18T20:52:36Z</time></trkpt><trkpt lat="42.348218" lon="-71.099524"><ele>12.2</ele><time>2005-04-18T20:52:47Z</time></trkpt><trkpt lat="42.348368" lon="-71.098859"><ele>13.6</ele><time>2005-04-18T20:53:02Z</time></trkpt><trkpt lat="42.348475" lon="-71.098323"><ele>13.6</ele><time>2005-04-18T20:53:14Z</time></trkpt><trkpt lat="42.348647" lon="-71.097765"><ele>15.5</ele><time>2005-04-18T20:53:27Z</time></trkpt><trkpt lat="42.348754" lon="-71.097143"><ele>10.7</ele><time>2005-04-18T20:53:41Z</time></trkpt><trkpt lat="42.348819" lon="-71.096499"><ele>10.2</ele><time>2005-04-18T20:53:55Z</time></trkpt><trkpt lat="42.348819" lon="-71.095898"><ele>10.7</ele><time>2005-04-18T20:54:08Z</time></trkpt><trkpt lat="42.348819" lon="-71.095297"><ele>10.2</ele><time>2005-04-18T20:54:21Z</time></trkpt><trkpt lat="42.348776" lon="-71.094718"><ele>9.8</ele><time>2005-04-18T20:54:34Z</time></trkpt><trkpt lat="42.348797" lon="-71.09416"><ele>11.7</ele><time>2005-04-18T20:54:47Z</time></trkpt><trkpt lat="42.348797" lon="-71.093516"><ele>11.7</ele><time>2005-04-18T20:55:02Z</time></trkpt><trkpt lat="42.348797" lon="-71.09298"><ele>10.2</ele><time>2005-04-18T20:55:14Z</time></trkpt><trkpt lat="42.348797" lon="-71.0921"><ele>10.2</ele><time>2005-04-18T20:55:33Z</time></trkpt><trkpt lat="42.348819" lon="-71.091499"><ele>9.8</ele><time>2005-04-18T20:55:46Z</time></trkpt><trkpt lat="42.34884" lon="-71.090534"><ele>8.3</ele><time>2005-04-18T20:56:07Z</time></trkpt><trkpt lat="42.348862" lon="-71.08989"><ele>8.3</ele><time>2005-04-18T20:56:22Z</time></trkpt><trkpt lat="42.348883" lon="-71.089246"><ele>8.8</ele><time>2005-04-18T20:56:38Z</time></trkpt><trkpt lat="42.348862" lon="-71.088731"><ele>8.3</ele><time>2005-04-18T20:56:50Z</time></trkpt><trkpt lat="42.348926" lon="-71.088152"><ele>4.5</ele><time>2005-04-18T20:57:04Z</time></trkpt><trkpt lat="42.349033" lon="-71.087766"><ele>8.3</ele><time>2005-04-18T20:57:14Z</time></trkpt><trkpt lat="42.349226" lon="-71.087186"><ele>9.8</ele><time>2005-04-18T20:57:28Z</time></trkpt><trkpt lat="42.349334" lon="-71.086714"><ele>10.2</ele><time>2005-04-18T20:57:39Z</time></trkpt><trkpt lat="42.349527" lon="-71.086156"><ele>7.8</ele><time>2005-04-18T20:57:53Z</time></trkpt><trkpt lat="42.348883" lon="-71.085448"><ele>6.9</ele><time>2005-04-18T20:58:19Z</time></trkpt><trkpt lat="42.348561" lon="-71.085191"><ele>6.9</ele><time>2005-04-18T20:58:30Z</time></trkpt><trkpt lat="42.348025" lon="-71.085255"><ele>6.9</ele><time>2005-04-18T20:58:43Z</time></trkpt><trkpt lat="42.348583" lon="-71.083195"><ele>6.4</ele><time>2005-04-18T20:59:27Z</time></trkpt><trkpt lat="42.348711" lon="-71.082852"><ele>6.9</ele><time>2005-04-18T20:59:34Z</time></trkpt><trkpt lat="42.348819" lon="-71.082423"><ele>6.9</ele><time>2005-04-18T20:59:43Z</time></trkpt><trkpt lat="42.348862" lon="-71.082337"><ele>6.9</ele><time>2005-04-18T20:59:45Z</time></trkpt><trkpt lat="42.348926" lon="-71.082273"><ele>6.9</ele><time>2005-04-18T20:59:47Z</time></trkpt><trkpt lat="42.349098" lon="-71.081779"><ele>7.3</ele><time>2005-04-18T20:59:58Z</time></trkpt><trkpt lat="42.349141" lon="-71.081522"><ele>7.3</ele><time>2005-04-18T21:00:03Z</time></trkpt><trkpt lat="42.349291" lon="-71.080792"><ele>5.4</ele><time>2005-04-18T21:00:18Z</time></trkpt><trkpt lat="42.349548" lon="-71.079719"><ele>5.4</ele><time>2005-04-18T21:00:40Z</time></trkpt><trkpt lat="42.349699" lon="-71.079569"><ele>5.4</ele><time>2005-04-18T21:00:44Z</time></trkpt><trkpt lat="42.349892" lon="-71.078882"><ele>6.9</ele><time>2005-04-18T21:00:58Z</time></trkpt></trkseg></trk></gpx>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/denver.gpx b/kura/org.eclipse.kura.emulator/src/main/resources/denver.gpx
new file mode 100644
index 0000000000000000000000000000000000000000..390760fd28678b1669da755a45d82e50617769f2
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/denver.gpx
@@ -0,0 +1,1338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="MotionX Live" version="1.1">
+  <trk>
+    <name>Track 002</name>
+    <desc>Mar 25, 2010 10:19 am</desc>
+    <trkseg>
+      <trkpt lat="39.757509" lon="-104.902044">
+        <ele>1602.000000</ele>
+        <time>2010-03-25T16:19:20Z</time>
+      </trkpt>
+      <trkpt lat="39.757484" lon="-104.902000">
+        <ele>1605.000000</ele>
+        <time>2010-03-25T16:19:22Z</time>
+      </trkpt>
+      <trkpt lat="39.757424" lon="-104.901952">
+        <ele>1606.000000</ele>
+        <time>2010-03-25T16:19:25Z</time>
+      </trkpt>
+      <trkpt lat="39.757336" lon="-104.901900">
+        <ele>1608.000000</ele>
+        <time>2010-03-25T16:19:27Z</time>
+      </trkpt>
+      <trkpt lat="39.757266" lon="-104.901870">
+        <ele>1608.000000</ele>
+        <time>2010-03-25T16:19:29Z</time>
+      </trkpt>
+      <trkpt lat="39.757215" lon="-104.901857">
+        <ele>1607.000000</ele>
+        <time>2010-03-25T16:19:31Z</time>
+      </trkpt>
+      <trkpt lat="39.757112" lon="-104.901898">
+        <ele>1607.000000</ele>
+        <time>2010-03-25T16:19:34Z</time>
+      </trkpt>
+      <trkpt lat="39.757058" lon="-104.902024">
+        <ele>1607.000000</ele>
+        <time>2010-03-25T16:19:37Z</time>
+      </trkpt>
+      <trkpt lat="39.757033" lon="-104.902128">
+        <ele>1608.000000</ele>
+        <time>2010-03-25T16:19:39Z</time>
+      </trkpt>
+      <trkpt lat="39.757035" lon="-104.902465">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:19:41Z</time>
+      </trkpt>
+      <trkpt lat="39.757070" lon="-104.902841">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:19:44Z</time>
+      </trkpt>
+      <trkpt lat="39.757109" lon="-104.903020">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:19:46Z</time>
+      </trkpt>
+      <trkpt lat="39.757125" lon="-104.903049">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:19:48Z</time>
+      </trkpt>
+      <trkpt lat="39.757136" lon="-104.903147">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:20:00Z</time>
+      </trkpt>
+      <trkpt lat="39.757182" lon="-104.903329">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:20:03Z</time>
+      </trkpt>
+      <trkpt lat="39.757324" lon="-104.903434">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:20:06Z</time>
+      </trkpt>
+      <trkpt lat="39.757858" lon="-104.903452">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:20:09Z</time>
+      </trkpt>
+      <trkpt lat="39.758390" lon="-104.903485">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:20:12Z</time>
+      </trkpt>
+      <trkpt lat="39.758770" lon="-104.903476">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:20:14Z</time>
+      </trkpt>
+      <trkpt lat="39.759124" lon="-104.903450">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:20:16Z</time>
+      </trkpt>
+      <trkpt lat="39.759446" lon="-104.903386">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:20:18Z</time>
+      </trkpt>
+      <trkpt lat="39.759743" lon="-104.903212">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:20Z</time>
+      </trkpt>
+      <trkpt lat="39.760028" lon="-104.903071">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:22Z</time>
+      </trkpt>
+      <trkpt lat="39.760313" lon="-104.902947">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:24Z</time>
+      </trkpt>
+      <trkpt lat="39.760608" lon="-104.902876">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:26Z</time>
+      </trkpt>
+      <trkpt lat="39.760931" lon="-104.902853">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:29Z</time>
+      </trkpt>
+      <trkpt lat="39.761267" lon="-104.902855">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:31Z</time>
+      </trkpt>
+      <trkpt lat="39.761527" lon="-104.902851">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:20:33Z</time>
+      </trkpt>
+      <trkpt lat="39.761769" lon="-104.902855">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:36Z</time>
+      </trkpt>
+      <trkpt lat="39.761964" lon="-104.902866">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:38Z</time>
+      </trkpt>
+      <trkpt lat="39.762122" lon="-104.902989">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:20:40Z</time>
+      </trkpt>
+      <trkpt lat="39.762051" lon="-104.903268">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:20:43Z</time>
+      </trkpt>
+      <trkpt lat="39.761864" lon="-104.903486">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:20:46Z</time>
+      </trkpt>
+      <trkpt lat="39.761700" lon="-104.903558">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:48Z</time>
+      </trkpt>
+      <trkpt lat="39.761646" lon="-104.903576">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:50Z</time>
+      </trkpt>
+      <trkpt lat="39.761549" lon="-104.903554">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:03Z</time>
+      </trkpt>
+      <trkpt lat="39.761395" lon="-104.903555">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:05Z</time>
+      </trkpt>
+      <trkpt lat="39.761157" lon="-104.903561">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:07Z</time>
+      </trkpt>
+      <trkpt lat="39.760899" lon="-104.903571">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:09Z</time>
+      </trkpt>
+      <trkpt lat="39.760583" lon="-104.903578">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:12Z</time>
+      </trkpt>
+      <trkpt lat="39.760263" lon="-104.903588">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:14Z</time>
+      </trkpt>
+      <trkpt lat="39.759937" lon="-104.903596">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:21:16Z</time>
+      </trkpt>
+      <trkpt lat="39.759608" lon="-104.903603">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:21:18Z</time>
+      </trkpt>
+      <trkpt lat="39.759181" lon="-104.903587">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:21:20Z</time>
+      </trkpt>
+      <trkpt lat="39.758748" lon="-104.903560">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:21:22Z</time>
+      </trkpt>
+      <trkpt lat="39.758352" lon="-104.903544">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:21:25Z</time>
+      </trkpt>
+      <trkpt lat="39.757973" lon="-104.903544">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:21:27Z</time>
+      </trkpt>
+      <trkpt lat="39.757615" lon="-104.903542">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:21:29Z</time>
+      </trkpt>
+      <trkpt lat="39.757248" lon="-104.903539">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:21:31Z</time>
+      </trkpt>
+      <trkpt lat="39.756862" lon="-104.903540">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:21:34Z</time>
+      </trkpt>
+      <trkpt lat="39.756371" lon="-104.903537">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:21:37Z</time>
+      </trkpt>
+      <trkpt lat="39.755914" lon="-104.903532">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:21:39Z</time>
+      </trkpt>
+      <trkpt lat="39.755457" lon="-104.903526">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:21:42Z</time>
+      </trkpt>
+      <trkpt lat="39.755106" lon="-104.903537">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:21:44Z</time>
+      </trkpt>
+      <trkpt lat="39.754636" lon="-104.903554">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:21:47Z</time>
+      </trkpt>
+      <trkpt lat="39.754276" lon="-104.903554">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:21:49Z</time>
+      </trkpt>
+      <trkpt lat="39.753752" lon="-104.903541">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:21:53Z</time>
+      </trkpt>
+      <trkpt lat="39.753350" lon="-104.903531">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:21:55Z</time>
+      </trkpt>
+      <trkpt lat="39.752965" lon="-104.903529">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:21:58Z</time>
+      </trkpt>
+      <trkpt lat="39.752577" lon="-104.903526">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:22:00Z</time>
+      </trkpt>
+      <trkpt lat="39.752184" lon="-104.903515">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:22:03Z</time>
+      </trkpt>
+      <trkpt lat="39.751782" lon="-104.903510">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:22:05Z</time>
+      </trkpt>
+      <trkpt lat="39.751373" lon="-104.903508">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:22:08Z</time>
+      </trkpt>
+      <trkpt lat="39.750967" lon="-104.903503">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:22:11Z</time>
+      </trkpt>
+      <trkpt lat="39.750566" lon="-104.903503">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:22:13Z</time>
+      </trkpt>
+      <trkpt lat="39.750174" lon="-104.903499">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:22:16Z</time>
+      </trkpt>
+      <trkpt lat="39.749787" lon="-104.903496">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:22:18Z</time>
+      </trkpt>
+      <trkpt lat="39.749458" lon="-104.903495">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:22:20Z</time>
+      </trkpt>
+      <trkpt lat="39.749140" lon="-104.903496">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:22:23Z</time>
+      </trkpt>
+      <trkpt lat="39.748812" lon="-104.903499">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:22:25Z</time>
+      </trkpt>
+      <trkpt lat="39.748478" lon="-104.903502">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:22:27Z</time>
+      </trkpt>
+      <trkpt lat="39.748153" lon="-104.903509">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:22:29Z</time>
+      </trkpt>
+      <trkpt lat="39.747833" lon="-104.903517">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:22:31Z</time>
+      </trkpt>
+      <trkpt lat="39.747526" lon="-104.903514">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:22:33Z</time>
+      </trkpt>
+      <trkpt lat="39.747233" lon="-104.903507">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:22:35Z</time>
+      </trkpt>
+      <trkpt lat="39.746908" lon="-104.903513">
+        <ele>1620.000000</ele>
+        <time>2010-03-25T16:22:38Z</time>
+      </trkpt>
+      <trkpt lat="39.746632" lon="-104.903531">
+        <ele>1620.000000</ele>
+        <time>2010-03-25T16:22:40Z</time>
+      </trkpt>
+      <trkpt lat="39.746338" lon="-104.903546">
+        <ele>1620.000000</ele>
+        <time>2010-03-25T16:22:42Z</time>
+      </trkpt>
+      <trkpt lat="39.746025" lon="-104.903555">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:44Z</time>
+      </trkpt>
+      <trkpt lat="39.745701" lon="-104.903553">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:46Z</time>
+      </trkpt>
+      <trkpt lat="39.745338" lon="-104.903557">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:49Z</time>
+      </trkpt>
+      <trkpt lat="39.745041" lon="-104.903542">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:51Z</time>
+      </trkpt>
+      <trkpt lat="39.744774" lon="-104.903539">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:53Z</time>
+      </trkpt>
+      <trkpt lat="39.744530" lon="-104.903528">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:55Z</time>
+      </trkpt>
+      <trkpt lat="39.744308" lon="-104.903525">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:57Z</time>
+      </trkpt>
+      <trkpt lat="39.744085" lon="-104.903527">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:22:59Z</time>
+      </trkpt>
+      <trkpt lat="39.743778" lon="-104.903521">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:02Z</time>
+      </trkpt>
+      <trkpt lat="39.743562" lon="-104.903519">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:23:04Z</time>
+      </trkpt>
+      <trkpt lat="39.743235" lon="-104.903511">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:23:07Z</time>
+      </trkpt>
+      <trkpt lat="39.742889" lon="-104.903506">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:23:10Z</time>
+      </trkpt>
+      <trkpt lat="39.742546" lon="-104.903497">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:13Z</time>
+      </trkpt>
+      <trkpt lat="39.742288" lon="-104.903492">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:15Z</time>
+      </trkpt>
+      <trkpt lat="39.741945" lon="-104.903486">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:18Z</time>
+      </trkpt>
+      <trkpt lat="39.741454" lon="-104.903481">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:22Z</time>
+      </trkpt>
+      <trkpt lat="39.741155" lon="-104.903482">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:24Z</time>
+      </trkpt>
+      <trkpt lat="39.740856" lon="-104.903485">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:23:26Z</time>
+      </trkpt>
+      <trkpt lat="39.740501" lon="-104.903493">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:23:28Z</time>
+      </trkpt>
+      <trkpt lat="39.740264" lon="-104.903501">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:23:31Z</time>
+      </trkpt>
+      <trkpt lat="39.740127" lon="-104.903628">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:23:34Z</time>
+      </trkpt>
+      <trkpt lat="39.740112" lon="-104.903809">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:23:36Z</time>
+      </trkpt>
+      <trkpt lat="39.740119" lon="-104.904130">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:23:39Z</time>
+      </trkpt>
+      <trkpt lat="39.740132" lon="-104.904616">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:23:41Z</time>
+      </trkpt>
+      <trkpt lat="39.740140" lon="-104.904995">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:23:43Z</time>
+      </trkpt>
+      <trkpt lat="39.740149" lon="-104.905544">
+        <ele>1625.000000</ele>
+        <time>2010-03-25T16:23:46Z</time>
+      </trkpt>
+      <trkpt lat="39.740155" lon="-104.905976">
+        <ele>1627.000000</ele>
+        <time>2010-03-25T16:23:48Z</time>
+      </trkpt>
+      <trkpt lat="39.740159" lon="-104.906382">
+        <ele>1627.000000</ele>
+        <time>2010-03-25T16:23:51Z</time>
+      </trkpt>
+      <trkpt lat="39.740157" lon="-104.906782">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:23:53Z</time>
+      </trkpt>
+      <trkpt lat="39.740158" lon="-104.907183">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:23:55Z</time>
+      </trkpt>
+      <trkpt lat="39.740158" lon="-104.907729">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:23:58Z</time>
+      </trkpt>
+      <trkpt lat="39.740156" lon="-104.908155">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:00Z</time>
+      </trkpt>
+      <trkpt lat="39.740151" lon="-104.908655">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:02Z</time>
+      </trkpt>
+      <trkpt lat="39.740159" lon="-104.909104">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:05Z</time>
+      </trkpt>
+      <trkpt lat="39.740170" lon="-104.909731">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:07Z</time>
+      </trkpt>
+      <trkpt lat="39.740177" lon="-104.910187">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:09Z</time>
+      </trkpt>
+      <trkpt lat="39.740180" lon="-104.910685">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:12Z</time>
+      </trkpt>
+      <trkpt lat="39.740185" lon="-104.911317">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:14Z</time>
+      </trkpt>
+      <trkpt lat="39.740195" lon="-104.911940">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:18Z</time>
+      </trkpt>
+      <trkpt lat="39.740202" lon="-104.912238">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:20Z</time>
+      </trkpt>
+      <trkpt lat="39.740210" lon="-104.912492">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:22Z</time>
+      </trkpt>
+      <trkpt lat="39.740214" lon="-104.912546">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:25Z</time>
+      </trkpt>
+      <trkpt lat="39.740300" lon="-104.912465">
+        <ele>1630.000000</ele>
+        <time>2010-03-25T16:24:37Z</time>
+      </trkpt>
+      <trkpt lat="39.740661" lon="-104.912478">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:39Z</time>
+      </trkpt>
+      <trkpt lat="39.741089" lon="-104.912493">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:41Z</time>
+      </trkpt>
+      <trkpt lat="39.741511" lon="-104.912495">
+        <ele>1629.000000</ele>
+        <time>2010-03-25T16:24:43Z</time>
+      </trkpt>
+      <trkpt lat="39.741880" lon="-104.912497">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:45Z</time>
+      </trkpt>
+      <trkpt lat="39.742227" lon="-104.912490">
+        <ele>1628.000000</ele>
+        <time>2010-03-25T16:24:48Z</time>
+      </trkpt>
+      <trkpt lat="39.742538" lon="-104.912474">
+        <ele>1627.000000</ele>
+        <time>2010-03-25T16:24:50Z</time>
+      </trkpt>
+      <trkpt lat="39.742812" lon="-104.912459">
+        <ele>1627.000000</ele>
+        <time>2010-03-25T16:24:52Z</time>
+      </trkpt>
+      <trkpt lat="39.743025" lon="-104.912464">
+        <ele>1627.000000</ele>
+        <time>2010-03-25T16:24:54Z</time>
+      </trkpt>
+      <trkpt lat="39.743190" lon="-104.912477">
+        <ele>1626.000000</ele>
+        <time>2010-03-25T16:24:56Z</time>
+      </trkpt>
+      <trkpt lat="39.743325" lon="-104.912490">
+        <ele>1626.000000</ele>
+        <time>2010-03-25T16:24:58Z</time>
+      </trkpt>
+      <trkpt lat="39.743383" lon="-104.912489">
+        <ele>1626.000000</ele>
+        <time>2010-03-25T16:25:00Z</time>
+      </trkpt>
+      <trkpt lat="39.743403" lon="-104.912487">
+        <ele>1626.000000</ele>
+        <time>2010-03-25T16:25:03Z</time>
+      </trkpt>
+      <trkpt lat="39.743400" lon="-104.912484">
+        <ele>1626.000000</ele>
+        <time>2010-03-25T16:25:03Z</time>
+      </trkpt>
+      <trkpt lat="39.743443" lon="-104.912469">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:25:22Z</time>
+      </trkpt>
+      <trkpt lat="39.743690" lon="-104.912443">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:25:25Z</time>
+      </trkpt>
+      <trkpt lat="39.743971" lon="-104.912447">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:25:27Z</time>
+      </trkpt>
+      <trkpt lat="39.744267" lon="-104.912457">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:25:29Z</time>
+      </trkpt>
+      <trkpt lat="39.744599" lon="-104.912458">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:25:31Z</time>
+      </trkpt>
+      <trkpt lat="39.744947" lon="-104.912451">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:25:33Z</time>
+      </trkpt>
+      <trkpt lat="39.745313" lon="-104.912444">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:25:36Z</time>
+      </trkpt>
+      <trkpt lat="39.745678" lon="-104.912441">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:38Z</time>
+      </trkpt>
+      <trkpt lat="39.746037" lon="-104.912442">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:40Z</time>
+      </trkpt>
+      <trkpt lat="39.746380" lon="-104.912457">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:42Z</time>
+      </trkpt>
+      <trkpt lat="39.746711" lon="-104.912471">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:44Z</time>
+      </trkpt>
+      <trkpt lat="39.746944" lon="-104.912469">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:47Z</time>
+      </trkpt>
+      <trkpt lat="39.747123" lon="-104.912465">
+        <ele>1625.000000</ele>
+        <time>2010-03-25T16:25:49Z</time>
+      </trkpt>
+      <trkpt lat="39.747302" lon="-104.912459">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:51Z</time>
+      </trkpt>
+      <trkpt lat="39.747450" lon="-104.912437">
+        <ele>1624.000000</ele>
+        <time>2010-03-25T16:25:53Z</time>
+      </trkpt>
+      <trkpt lat="39.747543" lon="-104.912326">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:25:55Z</time>
+      </trkpt>
+      <trkpt lat="39.747507" lon="-104.912047">
+        <ele>1623.000000</ele>
+        <time>2010-03-25T16:25:57Z</time>
+      </trkpt>
+      <trkpt lat="39.747480" lon="-104.911673">
+        <ele>1622.000000</ele>
+        <time>2010-03-25T16:26:00Z</time>
+      </trkpt>
+      <trkpt lat="39.747465" lon="-104.911244">
+        <ele>1621.000000</ele>
+        <time>2010-03-25T16:26:02Z</time>
+      </trkpt>
+      <trkpt lat="39.747464" lon="-104.910810">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:26:04Z</time>
+      </trkpt>
+      <trkpt lat="39.747464" lon="-104.910390">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:26:06Z</time>
+      </trkpt>
+      <trkpt lat="39.747459" lon="-104.909984">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:26:08Z</time>
+      </trkpt>
+      <trkpt lat="39.747455" lon="-104.909591">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:26:11Z</time>
+      </trkpt>
+      <trkpt lat="39.747455" lon="-104.909203">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:26:13Z</time>
+      </trkpt>
+      <trkpt lat="39.747452" lon="-104.908792">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:26:15Z</time>
+      </trkpt>
+      <trkpt lat="39.747453" lon="-104.908389">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:26:17Z</time>
+      </trkpt>
+      <trkpt lat="39.747458" lon="-104.907988">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:26:19Z</time>
+      </trkpt>
+      <trkpt lat="39.747457" lon="-104.907592">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:26:22Z</time>
+      </trkpt>
+      <trkpt lat="39.747453" lon="-104.907204">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:26:24Z</time>
+      </trkpt>
+      <trkpt lat="39.747449" lon="-104.906805">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:26:26Z</time>
+      </trkpt>
+      <trkpt lat="39.747449" lon="-104.906404">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:26:28Z</time>
+      </trkpt>
+      <trkpt lat="39.747453" lon="-104.906004">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:26:31Z</time>
+      </trkpt>
+      <trkpt lat="39.747449" lon="-104.905613">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:26:33Z</time>
+      </trkpt>
+      <trkpt lat="39.747454" lon="-104.905258">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:26:35Z</time>
+      </trkpt>
+      <trkpt lat="39.747452" lon="-104.904906">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:26:37Z</time>
+      </trkpt>
+      <trkpt lat="39.747444" lon="-104.904577">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:26:39Z</time>
+      </trkpt>
+      <trkpt lat="39.747435" lon="-104.904270">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:26:42Z</time>
+      </trkpt>
+      <trkpt lat="39.747425" lon="-104.904014">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:26:44Z</time>
+      </trkpt>
+      <trkpt lat="39.747417" lon="-104.903880">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:26:46Z</time>
+      </trkpt>
+      <trkpt lat="39.747414" lon="-104.903807">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:26:48Z</time>
+      </trkpt>
+      <trkpt lat="39.747414" lon="-104.903799">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:26:49Z</time>
+      </trkpt>
+      <trkpt lat="39.747391" lon="-104.903680">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:28Z</time>
+      </trkpt>
+      <trkpt lat="39.747392" lon="-104.903395">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:31Z</time>
+      </trkpt>
+      <trkpt lat="39.747392" lon="-104.902957">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:34Z</time>
+      </trkpt>
+      <trkpt lat="39.747390" lon="-104.902597">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:36Z</time>
+      </trkpt>
+      <trkpt lat="39.747388" lon="-104.902221">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:27:38Z</time>
+      </trkpt>
+      <trkpt lat="39.747387" lon="-104.901833">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:27:40Z</time>
+      </trkpt>
+      <trkpt lat="39.747389" lon="-104.901246">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:27:43Z</time>
+      </trkpt>
+      <trkpt lat="39.747394" lon="-104.900852">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:27:45Z</time>
+      </trkpt>
+      <trkpt lat="39.747394" lon="-104.900450">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:27:47Z</time>
+      </trkpt>
+      <trkpt lat="39.747400" lon="-104.900032">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:27:50Z</time>
+      </trkpt>
+      <trkpt lat="39.747410" lon="-104.899623">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:27:52Z</time>
+      </trkpt>
+      <trkpt lat="39.747418" lon="-104.899213">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:54Z</time>
+      </trkpt>
+      <trkpt lat="39.747422" lon="-104.898812">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:56Z</time>
+      </trkpt>
+      <trkpt lat="39.747422" lon="-104.898422">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:27:58Z</time>
+      </trkpt>
+      <trkpt lat="39.747417" lon="-104.898034">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:28:00Z</time>
+      </trkpt>
+      <trkpt lat="39.747415" lon="-104.897662">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:28:03Z</time>
+      </trkpt>
+      <trkpt lat="39.747413" lon="-104.897173">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:05Z</time>
+      </trkpt>
+      <trkpt lat="39.747413" lon="-104.896798">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:07Z</time>
+      </trkpt>
+      <trkpt lat="39.747415" lon="-104.896431">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:10Z</time>
+      </trkpt>
+      <trkpt lat="39.747416" lon="-104.896052">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:12Z</time>
+      </trkpt>
+      <trkpt lat="39.747414" lon="-104.895632">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:14Z</time>
+      </trkpt>
+      <trkpt lat="39.747415" lon="-104.895104">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:28:17Z</time>
+      </trkpt>
+      <trkpt lat="39.747424" lon="-104.894549">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:28:20Z</time>
+      </trkpt>
+      <trkpt lat="39.747422" lon="-104.894083">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:22Z</time>
+      </trkpt>
+      <trkpt lat="39.747420" lon="-104.893707">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:24Z</time>
+      </trkpt>
+      <trkpt lat="39.747422" lon="-104.893223">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:27Z</time>
+      </trkpt>
+      <trkpt lat="39.747415" lon="-104.892739">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:29Z</time>
+      </trkpt>
+      <trkpt lat="39.747412" lon="-104.892294">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:32Z</time>
+      </trkpt>
+      <trkpt lat="39.747409" lon="-104.891842">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:35Z</time>
+      </trkpt>
+      <trkpt lat="39.747400" lon="-104.891427">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:28:37Z</time>
+      </trkpt>
+      <trkpt lat="39.747393" lon="-104.890889">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:28:40Z</time>
+      </trkpt>
+      <trkpt lat="39.747402" lon="-104.890341">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:28:43Z</time>
+      </trkpt>
+      <trkpt lat="39.747412" lon="-104.889916">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:28:45Z</time>
+      </trkpt>
+      <trkpt lat="39.747414" lon="-104.889483">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:28:47Z</time>
+      </trkpt>
+      <trkpt lat="39.747411" lon="-104.888996">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:28:50Z</time>
+      </trkpt>
+      <trkpt lat="39.747408" lon="-104.888580">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:28:52Z</time>
+      </trkpt>
+      <trkpt lat="39.747410" lon="-104.888223">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:28:54Z</time>
+      </trkpt>
+      <trkpt lat="39.747403" lon="-104.887836">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:28:57Z</time>
+      </trkpt>
+      <trkpt lat="39.747399" lon="-104.887542">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:28:59Z</time>
+      </trkpt>
+      <trkpt lat="39.747425" lon="-104.887225">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:29:01Z</time>
+      </trkpt>
+      <trkpt lat="39.747449" lon="-104.886896">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:29:03Z</time>
+      </trkpt>
+      <trkpt lat="39.747453" lon="-104.886542">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:29:06Z</time>
+      </trkpt>
+      <trkpt lat="39.747445" lon="-104.886181">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:29:08Z</time>
+      </trkpt>
+      <trkpt lat="39.747421" lon="-104.885833">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:29:10Z</time>
+      </trkpt>
+      <trkpt lat="39.747420" lon="-104.885489">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:29:12Z</time>
+      </trkpt>
+      <trkpt lat="39.747422" lon="-104.885176">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:29:14Z</time>
+      </trkpt>
+      <trkpt lat="39.747423" lon="-104.884868">
+        <ele>1619.000000</ele>
+        <time>2010-03-25T16:29:17Z</time>
+      </trkpt>
+      <trkpt lat="39.747428" lon="-104.884748">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:29:19Z</time>
+      </trkpt>
+      <trkpt lat="39.747432" lon="-104.884702">
+        <ele>1618.000000</ele>
+        <time>2010-03-25T16:29:21Z</time>
+      </trkpt>
+      <trkpt lat="39.747435" lon="-104.884637">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:23Z</time>
+      </trkpt>
+      <trkpt lat="39.747464" lon="-104.884546">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:29:26Z</time>
+      </trkpt>
+      <trkpt lat="39.747656" lon="-104.884470">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:29Z</time>
+      </trkpt>
+      <trkpt lat="39.747906" lon="-104.884577">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:31Z</time>
+      </trkpt>
+      <trkpt lat="39.748128" lon="-104.884733">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:33Z</time>
+      </trkpt>
+      <trkpt lat="39.748339" lon="-104.884907">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:35Z</time>
+      </trkpt>
+      <trkpt lat="39.748553" lon="-104.885116">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:38Z</time>
+      </trkpt>
+      <trkpt lat="39.748764" lon="-104.885362">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:40Z</time>
+      </trkpt>
+      <trkpt lat="39.748984" lon="-104.885646">
+        <ele>1617.000000</ele>
+        <time>2010-03-25T16:29:42Z</time>
+      </trkpt>
+      <trkpt lat="39.749193" lon="-104.885957">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:29:44Z</time>
+      </trkpt>
+      <trkpt lat="39.749541" lon="-104.886439">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:29:48Z</time>
+      </trkpt>
+      <trkpt lat="39.749833" lon="-104.886834">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:29:50Z</time>
+      </trkpt>
+      <trkpt lat="39.750056" lon="-104.887142">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:29:52Z</time>
+      </trkpt>
+      <trkpt lat="39.750273" lon="-104.887462">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:29:55Z</time>
+      </trkpt>
+      <trkpt lat="39.750479" lon="-104.887757">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:29:57Z</time>
+      </trkpt>
+      <trkpt lat="39.750677" lon="-104.888052">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:29:59Z</time>
+      </trkpt>
+      <trkpt lat="39.750873" lon="-104.888343">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:30:01Z</time>
+      </trkpt>
+      <trkpt lat="39.751136" lon="-104.888712">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:30:04Z</time>
+      </trkpt>
+      <trkpt lat="39.751327" lon="-104.888981">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:30:06Z</time>
+      </trkpt>
+      <trkpt lat="39.751513" lon="-104.889252">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:30:08Z</time>
+      </trkpt>
+      <trkpt lat="39.751693" lon="-104.889523">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:30:11Z</time>
+      </trkpt>
+      <trkpt lat="39.751835" lon="-104.889738">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:30:13Z</time>
+      </trkpt>
+      <trkpt lat="39.751906" lon="-104.889857">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:30:15Z</time>
+      </trkpt>
+      <trkpt lat="39.751934" lon="-104.889908">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:30:19Z</time>
+      </trkpt>
+      <trkpt lat="39.752094" lon="-104.890106">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:30:32Z</time>
+      </trkpt>
+      <trkpt lat="39.752285" lon="-104.890288">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:30:34Z</time>
+      </trkpt>
+      <trkpt lat="39.752540" lon="-104.890509">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:30:37Z</time>
+      </trkpt>
+      <trkpt lat="39.753119" lon="-104.890627">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:30:41Z</time>
+      </trkpt>
+      <trkpt lat="39.753617" lon="-104.890615">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:30:44Z</time>
+      </trkpt>
+      <trkpt lat="39.754066" lon="-104.890590">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:30:47Z</time>
+      </trkpt>
+      <trkpt lat="39.754430" lon="-104.890554">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:30:49Z</time>
+      </trkpt>
+      <trkpt lat="39.754749" lon="-104.890541">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:30:52Z</time>
+      </trkpt>
+      <trkpt lat="39.755137" lon="-104.890538">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:30:54Z</time>
+      </trkpt>
+      <trkpt lat="39.755656" lon="-104.890536">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:30:58Z</time>
+      </trkpt>
+      <trkpt lat="39.756021" lon="-104.890531">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:01Z</time>
+      </trkpt>
+      <trkpt lat="39.756348" lon="-104.890522">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:03Z</time>
+      </trkpt>
+      <trkpt lat="39.756699" lon="-104.890516">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:06Z</time>
+      </trkpt>
+      <trkpt lat="39.757009" lon="-104.890508">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:08Z</time>
+      </trkpt>
+      <trkpt lat="39.757293" lon="-104.890503">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:10Z</time>
+      </trkpt>
+      <trkpt lat="39.757539" lon="-104.890500">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:12Z</time>
+      </trkpt>
+      <trkpt lat="39.757727" lon="-104.890501">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:14Z</time>
+      </trkpt>
+      <trkpt lat="39.757880" lon="-104.890494">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:17Z</time>
+      </trkpt>
+      <trkpt lat="39.757948" lon="-104.890491">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:19Z</time>
+      </trkpt>
+      <trkpt lat="39.758014" lon="-104.890473">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:22Z</time>
+      </trkpt>
+      <trkpt lat="39.758104" lon="-104.890460">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:31:24Z</time>
+      </trkpt>
+      <trkpt lat="39.758189" lon="-104.890458">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:26Z</time>
+      </trkpt>
+      <trkpt lat="39.758170" lon="-104.890457">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:31:28Z</time>
+      </trkpt>
+      <trkpt lat="39.758217" lon="-104.890639">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:31:32Z</time>
+      </trkpt>
+      <trkpt lat="39.758241" lon="-104.890834">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:31:36Z</time>
+      </trkpt>
+      <trkpt lat="39.758203" lon="-104.891245">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:31:38Z</time>
+      </trkpt>
+      <trkpt lat="39.758185" lon="-104.891572">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:31:40Z</time>
+      </trkpt>
+      <trkpt lat="39.758177" lon="-104.891905">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:31:43Z</time>
+      </trkpt>
+      <trkpt lat="39.758174" lon="-104.892251">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:31:45Z</time>
+      </trkpt>
+      <trkpt lat="39.758172" lon="-104.892593">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:31:47Z</time>
+      </trkpt>
+      <trkpt lat="39.758165" lon="-104.892926">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:31:49Z</time>
+      </trkpt>
+      <trkpt lat="39.758165" lon="-104.893260">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:31:51Z</time>
+      </trkpt>
+      <trkpt lat="39.758162" lon="-104.893607">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:31:53Z</time>
+      </trkpt>
+      <trkpt lat="39.758160" lon="-104.893963">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:31:56Z</time>
+      </trkpt>
+      <trkpt lat="39.758160" lon="-104.894326">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:31:58Z</time>
+      </trkpt>
+      <trkpt lat="39.758158" lon="-104.894693">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:32:00Z</time>
+      </trkpt>
+      <trkpt lat="39.758154" lon="-104.895059">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:32:02Z</time>
+      </trkpt>
+      <trkpt lat="39.758145" lon="-104.895427">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:32:05Z</time>
+      </trkpt>
+      <trkpt lat="39.758140" lon="-104.895807">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:32:07Z</time>
+      </trkpt>
+      <trkpt lat="39.758136" lon="-104.896199">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:32:09Z</time>
+      </trkpt>
+      <trkpt lat="39.758133" lon="-104.896593">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:32:11Z</time>
+      </trkpt>
+      <trkpt lat="39.758132" lon="-104.896986">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:32:13Z</time>
+      </trkpt>
+      <trkpt lat="39.758131" lon="-104.897373">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:16Z</time>
+      </trkpt>
+      <trkpt lat="39.758133" lon="-104.897747">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:18Z</time>
+      </trkpt>
+      <trkpt lat="39.758138" lon="-104.898103">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:20Z</time>
+      </trkpt>
+      <trkpt lat="39.758145" lon="-104.898377">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:22Z</time>
+      </trkpt>
+      <trkpt lat="39.758147" lon="-104.898485">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:25Z</time>
+      </trkpt>
+      <trkpt lat="39.758167" lon="-104.898562">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:27Z</time>
+      </trkpt>
+      <trkpt lat="39.758215" lon="-104.898645">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:29Z</time>
+      </trkpt>
+      <trkpt lat="39.758282" lon="-104.898742">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:31Z</time>
+      </trkpt>
+      <trkpt lat="39.758384" lon="-104.898908">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:34Z</time>
+      </trkpt>
+      <trkpt lat="39.758394" lon="-104.898906">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:35Z</time>
+      </trkpt>
+      <trkpt lat="39.758406" lon="-104.899072">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:32:39Z</time>
+      </trkpt>
+      <trkpt lat="39.758403" lon="-104.899273">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:41Z</time>
+      </trkpt>
+      <trkpt lat="39.758404" lon="-104.899692">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:44Z</time>
+      </trkpt>
+      <trkpt lat="39.758402" lon="-104.900017">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:47Z</time>
+      </trkpt>
+      <trkpt lat="39.758393" lon="-104.900269">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:49Z</time>
+      </trkpt>
+      <trkpt lat="39.758381" lon="-104.900442">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:51Z</time>
+      </trkpt>
+      <trkpt lat="39.758381" lon="-104.900456">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:52Z</time>
+      </trkpt>
+      <trkpt lat="39.758323" lon="-104.900566">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:55Z</time>
+      </trkpt>
+      <trkpt lat="39.758192" lon="-104.900600">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:32:57Z</time>
+      </trkpt>
+      <trkpt lat="39.758023" lon="-104.900596">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:00Z</time>
+      </trkpt>
+      <trkpt lat="39.757883" lon="-104.900586">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:33:02Z</time>
+      </trkpt>
+      <trkpt lat="39.757798" lon="-104.900574">
+        <ele>1616.000000</ele>
+        <time>2010-03-25T16:33:04Z</time>
+      </trkpt>
+      <trkpt lat="39.757737" lon="-104.900574">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:33:06Z</time>
+      </trkpt>
+      <trkpt lat="39.757631" lon="-104.900577">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:33:08Z</time>
+      </trkpt>
+      <trkpt lat="39.757454" lon="-104.900579">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:33:11Z</time>
+      </trkpt>
+      <trkpt lat="39.757267" lon="-104.900569">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:13Z</time>
+      </trkpt>
+      <trkpt lat="39.757098" lon="-104.900553">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:15Z</time>
+      </trkpt>
+      <trkpt lat="39.757030" lon="-104.900628">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:18Z</time>
+      </trkpt>
+      <trkpt lat="39.757024" lon="-104.900715">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:20Z</time>
+      </trkpt>
+      <trkpt lat="39.757043" lon="-104.900889">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:22Z</time>
+      </trkpt>
+      <trkpt lat="39.757053" lon="-104.901147">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:24Z</time>
+      </trkpt>
+      <trkpt lat="39.757068" lon="-104.901403">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:26Z</time>
+      </trkpt>
+      <trkpt lat="39.757081" lon="-104.901614">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:29Z</time>
+      </trkpt>
+      <trkpt lat="39.757080" lon="-104.901716">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:31Z</time>
+      </trkpt>
+      <trkpt lat="39.757153" lon="-104.901788">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:33Z</time>
+      </trkpt>
+      <trkpt lat="39.757280" lon="-104.901830">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:35Z</time>
+      </trkpt>
+      <trkpt lat="39.757459" lon="-104.901849">
+        <ele>1615.000000</ele>
+        <time>2010-03-25T16:33:37Z</time>
+      </trkpt>
+      <trkpt lat="39.757636" lon="-104.901859">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:33:39Z</time>
+      </trkpt>
+      <trkpt lat="39.757747" lon="-104.901902">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:33:42Z</time>
+      </trkpt>
+      <trkpt lat="39.757800" lon="-104.901993">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:33:44Z</time>
+      </trkpt>
+      <trkpt lat="39.757800" lon="-104.902119">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:33:46Z</time>
+      </trkpt>
+      <trkpt lat="39.757759" lon="-104.902223">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:33:48Z</time>
+      </trkpt>
+    </trkseg>
+  </trk>
+</gpx>
+
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/kura.properties b/kura/org.eclipse.kura.emulator/src/main/resources/kura.properties
new file mode 100644
index 0000000000000000000000000000000000000000..55ab3c8a2be585d6a8dc44340f8473d9016fccd5
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/kura.properties
@@ -0,0 +1,128 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+## -----------------------------------------------------------------------------
+##  Kura Properties
+## -----------------------------------------------------------------------------
+kura.name=Kura
+kura.version=1.0.0.SNAPSHOT
+kura.company=Eclipse
+kura.project=Dev
+kura.platform=dynacor
+kura.device.name=DevEmulator
+kura.model.id=DevModelId
+kura.model.name=DevModelName
+kura.partNumber=DevPartNumber
+kura.serialNumber=DevSerialNumber
+kura.bios.version=DevBiosVersion
+kura.firmware.version=DevFirmwareVersion
+# kura.mac.address= Fetch from Java
+kura.home=/tmp/kura
+kura.plugins=/tmp/kura/plugins
+kura.packages=/tmp/kura/packages
+kura.data=/tmp/kura
+kura.tmp=/tmp/kura/tmp
+kura.snapshots=/tmp/kura/snapshots
+kura.snapshots.count=10
+kura.have.net.admin=false
+# os.arch= Fetch from Java
+# os.name= Fetch from Java
+# os.version= Fetch from Java
+os.distribution=DevOsDitribution
+os.distribution.version=DevOsDitributionVersion
+# java.version= Fetch from Java
+# java.vendor= Fetch from Java
+# java.vm.name= Fetch from Java
+# java.vm.version= Fetch from Java
+# java.home= Fetch from Java
+# file.separator= Fetch from Java
+
+
+## -----------------------------------------------------------------------------
+## Java Key Store Settings
+## -----------------------------------------------------------------------------
+kura.ssl.keyStorePassword=everyware
+kura.ssl.trustStorePassword=everyware
+
+
+## -----------------------------------------------------------------------------
+## HSQLDB Service Properties
+## -----------------------------------------------------------------------------
+# The following configurations represent different trade-offs between data durability
+# and wearing of the physical storage. This aspect is particularly important for
+# embedded devices where the storage is tipically a flash based device (NAND, SD etc.)
+# with a limited number of write/erase cycles.
+
+## 1. In-memory configuration.
+## This configuration is suggested for high publish rates.
+## DB survives to network/connection drops but all messages are lost
+## in case of a crash or power failure.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:mem:kuradb
+
+## 2. Mostly persistent.
+## This configuration is suggested for medium publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## all the messages stored since the last checkpoint will be lost.
+## A checkpoint should be run periodically to control the desired consistency of the database.
+## As data logging is disabled, the defragmentation is operated periodically by the ESF Housekeeper task.
+## This will flush the .data and perform a defragmentation.
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## Applications can call manual \u201Ccheckpoint\u201D if they need further durability.
+## see http://hsqldb.org/doc/guide/ch04.html
+db.service.hsqldb.url=jdbc:hsqldb:file:/tmp/kura/data/db/data;hsqldb.lock_file=false;
+db.service.hsqldb.log_data=false
+db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=Does not apply
+# db.service.hsqldb.write_delay_millis=Does not apply
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+## 3. Most persistent.
+## This configuration is suggested for slow publish rates.
+## DB survives to network/connection drops. In case of a crash or power failure,
+## most of the data can be recovered from the data.log file.
+## A periodic checkpoint is not needed in this case.
+## An automatic defragmentation is operated by HSQLDB as set in the db.service.hsqldb.defrag_limit which should NOT be set to 0.
+## In this configuration with logging enabled, the Housekeeper task will NOT perform any defragmentation.  
+## The defragmentation will keep the data.data file to a relatively small size.
+## The CPU utilization will rise significantly while this is in progress.
+## The configuration parameter db.service.hsqldb.write_delay_millis controls the delay with which the data is flushed to disk.
+## The default is 500ms. In the case of power interruption you would loose the last X millies of data.
+## see http://hsqldb.org/doc/guide/ch04.html
+# db.service.hsqldb.url=jdbc:hsqldb:file:/tmp/kura/data/db/data;hsqldb.lock_file=false;
+# db.service.hsqldb.log_data=true
+# db.service.hsqldb.nio_data_file=false
+# db.service.hsqldb.defrag_limit=50
+# db.service.hsqldb.write_delay_millis=Rely on defaults if not set
+# db.service.hsqldb.cache_rows=Rely on defaults if not set
+# db.service.hsqldb.lob_file_scale=Rely on defaults if not set
+# db.service.hsqldb.log_size=Rely on defaults if not set
+
+
+## -----------------------------------------------------------------------------
+## File upload settings
+## -----------------------------------------------------------------------------
+# default 10240
+file.upload.in.memory.size.threshold=10240
+# -1: unlimited (default)
+file.upload.size.max=-1
+
+
+## -----------------------------------------------------------------------------
+## Deployment Agent settings
+## -----------------------------------------------------------------------------
+# see copyURLToFile() http://commons.apache.org/proper/commons-io/javadocs/api-2.4/index.html
+dpa.connection.timeout = 60000
+dpa.read.timeout = 60000
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/log4j.properties b/kura/org.eclipse.kura.emulator/src/main/resources/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3c9386784befb703ac31e9eb18e96393b0fe9999
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/log4j.properties
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+### direct log messages to stdout ###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} [%t] %-5p %c{1}:%L %X{username} - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+log4j.rootLogger=INFO,stdout
+
+## eclipse
+log4j.logger.org.eclipse.kura.emulator.position=INFO
+log4j.logger.org.eclipse=INFO
+
+
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/paris.gpx b/kura/org.eclipse.kura.emulator/src/main/resources/paris.gpx
new file mode 100644
index 0000000000000000000000000000000000000000..1cc43bc20f401f0dcddccc416f0fa28ab4584bbf
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/paris.gpx
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<gpx version="1.1" creator="GPS Runner" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"><trk><number>1</number><trkseg><trkpt lat="48.8723487854004" lon="2.29986023902893"><ele>62.0776</ele><time>2007-04-15T08:53:30Z</time></trkpt><trkpt lat="48.8723068237305" lon="2.2999861240387"><ele>61.7964</ele><time>2007-04-15T08:53:31Z</time></trkpt><trkpt lat="48.8722686767578" lon="2.3001344203949"><ele>61.8929</ele><time>2007-04-15T08:53:32Z</time></trkpt><trkpt lat="48.8722381591797" lon="2.3003101348877"><ele>61.9837</ele><time>2007-04-15T08:53:33Z</time></trkpt><trkpt lat="48.8721351623535" lon="2.3004777431488"><ele>61.5251</ele><time>2007-04-15T08:53:34Z</time></trkpt><trkpt lat="48.8720893859863" lon="2.30063438415527"><ele>61.1653</ele><time>2007-04-15T08:53:35Z</time></trkpt><trkpt lat="48.872013092041" lon="2.30082821846008"><ele>60.3324</ele><time>2007-04-15T08:53:36Z</time></trkpt><trkpt lat="48.8719024658203" lon="2.30098080635071"><ele>58.8597</ele><time>2007-04-15T08:53:37Z</time></trkpt><trkpt lat="48.871883392334" lon="2.30100584030151"><ele>58.6127</ele><time>2007-04-15T08:53:38Z</time></trkpt><trkpt lat="48.8717994689941" lon="2.30117106437683"><ele>57.3998</ele><time>2007-04-15T08:53:39Z</time></trkpt><trkpt lat="48.8717575073242" lon="2.30130171775818"><ele>56.6867</ele><time>2007-04-15T08:53:40Z</time></trkpt><trkpt lat="48.871711730957" lon="2.30152010917664"><ele>55.7398</ele><time>2007-04-15T08:53:41Z</time></trkpt><trkpt lat="48.8716697692871" lon="2.30173563957214"><ele>55.0242</ele><time>2007-04-15T08:53:42Z</time></trkpt><trkpt lat="48.8716278076172" lon="2.30187392234802"><ele>54.8717</ele><time>2007-04-15T08:53:43Z</time></trkpt><trkpt lat="48.8716011047363" lon="2.30205392837524"><ele>54.8005</ele><time>2007-04-15T08:53:44Z</time></trkpt><trkpt lat="48.8715896606445" lon="2.30224180221558"><ele>54.7866</ele><time>2007-04-15T08:53:45Z</time></trkpt><trkpt lat="48.8714981079102" lon="2.30245757102966"><ele>54.5852</ele><time>2007-04-15T08:53:46Z</time></trkpt><trkpt lat="48.8714294433594" lon="2.30264925956726"><ele>54.7889</ele><time>2007-04-15T08:53:47Z</time></trkpt><trkpt lat="48.8714027404785" lon="2.3028461933136"><ele>55.1974</ele><time>2007-04-15T08:53:48Z</time></trkpt><trkpt lat="48.871395111084" lon="2.30305695533752"><ele>55.685</ele><time>2007-04-15T08:53:49Z</time></trkpt><trkpt lat="48.8713760375977" lon="2.30333876609802"><ele>56.3067</ele><time>2007-04-15T08:53:50Z</time></trkpt><trkpt lat="48.8713150024414" lon="2.30353450775146"><ele>56.2955</ele><time>2007-04-15T08:53:51Z</time></trkpt><trkpt lat="48.8712615966797" lon="2.30371379852295"><ele>56.2625</ele><time>2007-04-15T08:53:52Z</time></trkpt><trkpt lat="48.8712043762207" lon="2.30398011207581"><ele>56.2361</ele><time>2007-04-15T08:53:53Z</time></trkpt><trkpt lat="48.8711471557617" lon="2.30423498153687"><ele>55.8838</ele><time>2007-04-15T08:53:54Z</time></trkpt><trkpt lat="48.8711090087891" lon="2.30440974235535"><ele>55.1174</ele><time>2007-04-15T08:53:55Z</time></trkpt><trkpt lat="48.8710250854492" lon="2.30458950996399"><ele>54.1681</ele><time>2007-04-15T08:53:56Z</time></trkpt><trkpt lat="48.8709259033203" lon="2.30483794212341"><ele>52.9167</ele><time>2007-04-15T08:53:57Z</time></trkpt><trkpt lat="48.8708000183106" lon="2.30502724647522"><ele>51.9234</ele><time>2007-04-15T08:53:58Z</time></trkpt><trkpt lat="48.870719909668" lon="2.30520534515381"><ele>51.5169</ele><time>2007-04-15T08:53:59Z</time></trkpt><trkpt lat="48.8706703186035" lon="2.3053765296936"><ele>51.0874</ele><time>2007-04-15T08:54:00Z</time></trkpt><trkpt lat="48.8706169128418" lon="2.30560851097107"><ele>50.4412</ele><time>2007-04-15T08:54:01Z</time></trkpt><trkpt lat="48.8705711364746" lon="2.30584454536438"><ele>49.7492</ele><time>2007-04-15T08:54:02Z</time></trkpt><trkpt lat="48.8705253601074" lon="2.30603861808777"><ele>49.7306</ele><time>2007-04-15T08:54:03Z</time></trkpt><trkpt lat="48.8704605102539" lon="2.30619883537292"><ele>49.753</ele><time>2007-04-15T08:54:04Z</time></trkpt><trkpt lat="48.8703804016113" lon="2.30642080307007"><ele>50.0368</ele><time>2007-04-15T08:54:05Z</time></trkpt><trkpt lat="48.8703384399414" lon="2.30663371086121"><ele>50.516</ele><time>2007-04-15T08:54:06Z</time></trkpt><trkpt lat="48.870246887207" lon="2.30685210227966"><ele>50.3494</ele><time>2007-04-15T08:54:07Z</time></trkpt><trkpt lat="48.8701782226562" lon="2.30710005760193"><ele>50.0436</ele><time>2007-04-15T08:54:08Z</time></trkpt><trkpt lat="48.8701477050781" lon="2.30732297897339"><ele>49.756</ele><time>2007-04-15T08:54:09Z</time></trkpt><trkpt lat="48.8700942993164" lon="2.30757093429565"><ele>49.2172</ele><time>2007-04-15T08:54:10Z</time></trkpt><trkpt lat="48.8700256347656" lon="2.30778956413269"><ele>47.8977</ele><time>2007-04-15T08:54:11Z</time></trkpt><trkpt lat="48.869945526123" lon="2.30793976783752"><ele>46.5831</ele><time>2007-04-15T08:54:12Z</time></trkpt><trkpt lat="48.8698387145996" lon="2.30811786651611"><ele>45.0576</ele><time>2007-04-15T08:54:13Z</time></trkpt><trkpt lat="48.869701385498" lon="2.30820965766907"><ele>44.213</ele><time>2007-04-15T08:54:14Z</time></trkpt><trkpt lat="48.8696060180664" lon="2.30830454826355"><ele>43.6365</ele><time>2007-04-15T08:54:15Z</time></trkpt><trkpt lat="48.8695106506348" lon="2.3084614276886"><ele>43.3493</ele><time>2007-04-15T08:54:16Z</time></trkpt><trkpt lat="48.8694152832031" lon="2.30865859985352"><ele>43.1819</ele><time>2007-04-15T08:54:17Z</time></trkpt><trkpt lat="48.8693313598633" lon="2.30887341499329"><ele>43.0695</ele><time>2007-04-15T08:54:18Z</time></trkpt><trkpt lat="48.8692512512207" lon="2.30908060073853"><ele>43.0105</ele><time>2007-04-15T08:54:19Z</time></trkpt><trkpt lat="48.8691787719727" lon="2.30924391746521"><ele>43.0967</ele><time>2007-04-15T08:54:20Z</time></trkpt><trkpt lat="48.8691215515137" lon="2.30933380126953"><ele>43.0489</ele><time>2007-04-15T08:54:21Z</time></trkpt><trkpt lat="48.8690643310547" lon="2.30941772460938"><ele>42.9077</ele><time>2007-04-15T08:54:22Z</time></trkpt><trkpt lat="48.8690528869629" lon="2.30945086479187"><ele>42.8817</ele><time>2007-04-15T08:54:23Z</time></trkpt><trkpt lat="48.8690490722656" lon="2.30944752693176"><ele>42.8646</ele><time>2007-04-15T08:54:24Z</time></trkpt><trkpt lat="48.8690414428711" lon="2.30944085121155"><ele>42.8307</ele><time>2007-04-15T08:54:25Z</time></trkpt><trkpt lat="48.8689613342285" lon="2.30954074859619"><ele>42.5137</ele><time>2007-04-15T08:54:26Z</time></trkpt><trkpt lat="48.8689384460449" lon="2.30955934524536"><ele>42.4073</ele><time>2007-04-15T08:54:27Z</time></trkpt><trkpt lat="48.8689117431641" lon="2.30958604812622"><ele>42.2756</ele><time>2007-04-15T08:54:28Z</time></trkpt><trkpt lat="48.8689651489258" lon="2.30955600738525"><ele>42.5316</ele><time>2007-04-15T08:54:29Z</time></trkpt><trkpt lat="48.8689613342285" lon="2.30945682525635"><ele>42.5122</ele><time>2007-04-15T08:54:30Z</time></trkpt><trkpt lat="48.868968963623" lon="2.30945897102356"><ele>42.5434</ele><time>2007-04-15T08:54:31Z</time></trkpt><trkpt lat="48.868968963623" lon="2.30946397781372"><ele>42.5437</ele><time>2007-04-15T08:54:32Z</time></trkpt><trkpt lat="48.8689651489258" lon="2.30947375297546"><ele>42.5284</ele><time>2007-04-15T08:54:33Z</time></trkpt><trkpt lat="48.8689460754394" lon="2.30951476097107"><ele>42.446</ele><time>2007-04-15T08:54:34Z</time></trkpt><trkpt lat="48.8689079284668" lon="2.30960202217102"><ele>42.2526</ele><time>2007-04-15T08:54:35Z</time></trkpt><trkpt lat="48.8689002990723" lon="2.30962300300598"><ele>42.2082</ele><time>2007-04-15T08:54:36Z</time></trkpt><trkpt lat="48.8688812255859" lon="2.30966520309448"><ele>42.0935</ele><time>2007-04-15T08:54:37Z</time></trkpt><trkpt lat="48.8690071105957" lon="2.30954170227051"><ele>42.7224</ele><time>2007-04-15T08:54:38Z</time></trkpt><trkpt lat="48.8690452575684" lon="2.30949020385742"><ele>42.8706</ele><time>2007-04-15T08:54:39Z</time></trkpt><trkpt lat="48.8690376281738" lon="2.30958080291748"><ele>42.8795</ele><time>2007-04-15T08:54:40Z</time></trkpt><trkpt lat="48.8690147399902" lon="2.30966091156006"><ele>42.796</ele><time>2007-04-15T08:54:41Z</time></trkpt><trkpt lat="48.8689651489258" lon="2.30989336967468"><ele>42.5449</ele><time>2007-04-15T08:54:42Z</time></trkpt><trkpt lat="48.8689270019531" lon="2.31004071235657"><ele>42.2182</ele><time>2007-04-15T08:54:43Z</time></trkpt><trkpt lat="48.8688430786133" lon="2.31030416488647"><ele>41.1032</ele><time>2007-04-15T08:54:44Z</time></trkpt><trkpt lat="48.8687744140625" lon="2.31054639816284"><ele>39.9413</ele><time>2007-04-15T08:54:45Z</time></trkpt><trkpt lat="48.8687210083008" lon="2.31071925163269"><ele>38.9449</ele><time>2007-04-15T08:54:46Z</time></trkpt><trkpt lat="48.8686599731445" lon="2.31089401245117"><ele>37.8212</ele><time>2007-04-15T08:54:47Z</time></trkpt><trkpt lat="48.8685760498047" lon="2.31118011474609"><ele>36.6015</ele><time>2007-04-15T08:54:48Z</time></trkpt><trkpt lat="48.8684883117676" lon="2.3114230632782"><ele>35.7778</ele><time>2007-04-15T08:54:49Z</time></trkpt><trkpt lat="48.8684043884277" lon="2.31162548065186"><ele>35.3169</ele><time>2007-04-15T08:54:50Z</time></trkpt><trkpt lat="48.868350982666" lon="2.31179285049438"><ele>34.624</ele><time>2007-04-15T08:54:51Z</time></trkpt><trkpt lat="48.8683166503906" lon="2.31190514564514"><ele>34.253</ele><time>2007-04-15T08:54:52Z</time></trkpt><trkpt lat="48.868293762207" lon="2.31198287010193"><ele>34.1351</ele><time>2007-04-15T08:54:53Z</time></trkpt><trkpt lat="48.8682441711426" lon="2.31217312812805"><ele>33.8418</ele><time>2007-04-15T08:54:54Z</time></trkpt><trkpt lat="48.8681869506836" lon="2.31234192848206"><ele>33.732</ele><time>2007-04-15T08:54:55Z</time></trkpt><trkpt lat="48.8681221008301" lon="2.31259369850159"><ele>34.0262</ele><time>2007-04-15T08:54:56Z</time></trkpt><trkpt lat="48.8680686950684" lon="2.31279397010803"><ele>34.9452</ele><time>2007-04-15T08:54:57Z</time></trkpt><trkpt lat="48.8680076599121" lon="2.31299567222595"><ele>35.8227</ele><time>2007-04-15T08:54:58Z</time></trkpt><trkpt lat="48.8679542541504" lon="2.31315994262695"><ele>36.4793</ele><time>2007-04-15T08:54:59Z</time></trkpt><trkpt lat="48.8678855895996" lon="2.31334114074707"><ele>37.1471</ele><time>2007-04-15T08:55:00Z</time></trkpt><trkpt lat="48.8678283691406" lon="2.31350493431091"><ele>37.2929</ele><time>2007-04-15T08:55:01Z</time></trkpt><trkpt lat="48.867790222168" lon="2.31363224983215"><ele>37.2804</ele><time>2007-04-15T08:55:02Z</time></trkpt><trkpt lat="48.8677406311035" lon="2.31380748748779"><ele>37.1238</ele><time>2007-04-15T08:55:03Z</time></trkpt><trkpt lat="48.8676605224609" lon="2.31405830383301"><ele>36.6251</ele><time>2007-04-15T08:55:04Z</time></trkpt><trkpt lat="48.867618560791" lon="2.31419110298157"><ele>36.2845</ele><time>2007-04-15T08:55:05Z</time></trkpt><trkpt lat="48.867546081543" lon="2.31440830230713"><ele>36.1106</ele><time>2007-04-15T08:55:06Z</time></trkpt><trkpt lat="48.8674697875977" lon="2.31467604637146"><ele>36.0161</ele><time>2007-04-15T08:55:07Z</time></trkpt><trkpt lat="48.8674125671387" lon="2.31484317779541"><ele>36.1309</ele><time>2007-04-15T08:55:08Z</time></trkpt><trkpt lat="48.8673324584961" lon="2.31509137153626"><ele>36.4462</ele><time>2007-04-15T08:55:09Z</time></trkpt><trkpt lat="48.8672904968262" lon="2.31522941589355"><ele>36.6412</ele><time>2007-04-15T08:55:10Z</time></trkpt><trkpt lat="48.8672409057617" lon="2.3153703212738"><ele>36.8982</ele><time>2007-04-15T08:55:11Z</time></trkpt><trkpt lat="48.8671875" lon="2.31559300422668"><ele>37.2837</ele><time>2007-04-15T08:55:12Z</time></trkpt><trkpt lat="48.8670959472656" lon="2.31584787368774"><ele>37.9558</ele><time>2007-04-15T08:55:13Z</time></trkpt><trkpt lat="48.8670196533203" lon="2.31605505943298"><ele>38.6531</ele><time>2007-04-15T08:55:14Z</time></trkpt><trkpt lat="48.8669624328613" lon="2.3162100315094"><ele>39.2947</ele><time>2007-04-15T08:55:15Z</time></trkpt><trkpt lat="48.8668937683106" lon="2.31637978553772"><ele>40.1623</ele><time>2007-04-15T08:55:16Z</time></trkpt><trkpt lat="48.8668403625488" lon="2.31654405593872"><ele>41.0138</ele><time>2007-04-15T08:55:17Z</time></trkpt><trkpt lat="48.866771697998" lon="2.31673359870911"><ele>41.5003</ele><time>2007-04-15T08:55:18Z</time></trkpt><trkpt lat="48.8667068481445" lon="2.31694555282593"><ele>40.3846</ele><time>2007-04-15T08:55:19Z</time></trkpt><trkpt lat="48.8666458129883" lon="2.31714200973511"><ele>38.9749</ele><time>2007-04-15T08:55:20Z</time></trkpt><trkpt lat="48.8666000366211" lon="2.31731629371643"><ele>37.4903</ele><time>2007-04-15T08:55:21Z</time></trkpt><trkpt lat="48.8665542602539" lon="2.31744837760925"><ele>36.4086</ele><time>2007-04-15T08:55:22Z</time></trkpt><trkpt lat="48.8664932250977" lon="2.3176109790802"><ele>36.2332</ele><time>2007-04-15T08:55:23Z</time></trkpt><trkpt lat="48.8664093017578" lon="2.31781077384949"><ele>36.4277</ele><time>2007-04-15T08:55:24Z</time></trkpt><trkpt lat="48.8663711547852" lon="2.31798458099365"><ele>36.5072</ele><time>2007-04-15T08:55:25Z</time></trkpt><trkpt lat="48.8663024902344" lon="2.31818771362305"><ele>36.3119</ele><time>2007-04-15T08:55:26Z</time></trkpt><trkpt lat="48.8662643432617" lon="2.3183217048645"><ele>36.1018</ele><time>2007-04-15T08:55:27Z</time></trkpt><trkpt lat="48.8662033081055" lon="2.31849765777588"><ele>35.7735</ele><time>2007-04-15T08:55:28Z</time></trkpt><trkpt lat="48.8661346435547" lon="2.3187050819397"><ele>35.4542</ele><time>2007-04-15T08:55:29Z</time></trkpt><trkpt lat="48.8660888671875" lon="2.3188591003418"><ele>35.2773</ele><time>2007-04-15T08:55:30Z</time></trkpt><trkpt lat="48.866039276123" lon="2.31902670860291"><ele>35.1092</ele><time>2007-04-15T08:55:31Z</time></trkpt><trkpt lat="48.8659820556641" lon="2.31920504570007"><ele>34.8249</ele><time>2007-04-15T08:55:32Z</time></trkpt><trkpt lat="48.8659324645996" lon="2.31938910484314"><ele>34.1562</ele><time>2007-04-15T08:55:33Z</time></trkpt><trkpt lat="48.8658561706543" lon="2.31959390640259"><ele>33.1538</ele><time>2007-04-15T08:55:34Z</time></trkpt><trkpt lat="48.8658447265625" lon="2.31963014602661"><ele>32.9788</ele><time>2007-04-15T08:55:35Z</time></trkpt><trkpt lat="48.8657913208008" lon="2.31981897354126"><ele>32.4016</ele><time>2007-04-15T08:55:36Z</time></trkpt><trkpt lat="48.8657493591309" lon="2.31996607780457"><ele>32.0691</ele><time>2007-04-15T08:55:37Z</time></trkpt><trkpt lat="48.8656997680664" lon="2.32011437416077"><ele>32.1592</ele><time>2007-04-15T08:55:38Z</time></trkpt><trkpt lat="48.8656349182129" lon="2.32030367851257"><ele>32.4512</ele><time>2007-04-15T08:55:39Z</time></trkpt><trkpt lat="48.8656120300293" lon="2.32035756111145"><ele>32.543</ele><time>2007-04-15T08:55:40Z</time></trkpt><trkpt lat="48.865478515625" lon="2.32042765617371"><ele>32.7317</ele><time>2007-04-15T08:55:41Z</time></trkpt><trkpt lat="48.8653335571289" lon="2.32043051719666"><ele>32.8265</ele><time>2007-04-15T08:55:42Z</time></trkpt><trkpt lat="48.8652305603027" lon="2.32044553756714"><ele>32.9214</ele><time>2007-04-15T08:55:43Z</time></trkpt><trkpt lat="48.8651275634766" lon="2.32046175003052"><ele>33.0234</ele><time>2007-04-15T08:55:44Z</time></trkpt><trkpt lat="48.8650093078613" lon="2.32045292854309"><ele>33.081</ele><time>2007-04-15T08:55:45Z</time></trkpt><trkpt lat="48.8649139404297" lon="2.32045269012451"><ele>32.936</ele><time>2007-04-15T08:55:46Z</time></trkpt><trkpt lat="48.8647880554199" lon="2.32053565979004"><ele>32.9404</ele><time>2007-04-15T08:55:47Z</time></trkpt><trkpt lat="48.8647613525391" lon="2.32058262825012"><ele>33.0258</ele><time>2007-04-15T08:55:48Z</time></trkpt><trkpt lat="48.8647308349609" lon="2.32080268859863"><ele>33.5916</ele><time>2007-04-15T08:55:49Z</time></trkpt><trkpt lat="48.8647613525391" lon="2.32099533081055"><ele>34.4355</ele><time>2007-04-15T08:55:50Z</time></trkpt><trkpt lat="48.8648262023926" lon="2.32113456726074"><ele>35.162</ele><time>2007-04-15T08:55:51Z</time></trkpt><trkpt lat="48.8649215698242" lon="2.32129096984863"><ele>36.0509</ele><time>2007-04-15T08:55:52Z</time></trkpt><trkpt lat="48.8650093078613" lon="2.32141971588135"><ele>36.7877</ele><time>2007-04-15T08:55:53Z</time></trkpt><trkpt lat="48.865119934082" lon="2.32153367996216"><ele>36.9758</ele><time>2007-04-15T08:55:54Z</time></trkpt><trkpt lat="48.8652191162109" lon="2.32164907455444"><ele>37.1378</ele><time>2007-04-15T08:55:55Z</time></trkpt><trkpt lat="48.8653373718262" lon="2.321772813797"><ele>36.6338</ele><time>2007-04-15T08:55:56Z</time></trkpt><trkpt lat="48.8654441833496" lon="2.32187366485596"><ele>36.1689</ele><time>2007-04-15T08:55:57Z</time></trkpt><trkpt lat="48.865550994873" lon="2.32196617126465"><ele>35.7729</ele><time>2007-04-15T08:55:58Z</time></trkpt><trkpt lat="48.8656806945801" lon="2.32204341888428"><ele>35.3839</ele><time>2007-04-15T08:55:59Z</time></trkpt><trkpt lat="48.8658065795898" lon="2.32209706306458"><ele>35.0632</ele><time>2007-04-15T08:56:00Z</time></trkpt><trkpt lat="48.8659210205078" lon="2.32212257385254"><ele>35.6889</ele><time>2007-04-15T08:56:01Z</time></trkpt><trkpt lat="48.8660163879394" lon="2.3221321105957"><ele>36.4407</ele><time>2007-04-15T08:56:02Z</time></trkpt><trkpt lat="48.8661155700684" lon="2.32213830947876"><ele>37.2238</ele><time>2007-04-15T08:56:03Z</time></trkpt><trkpt lat="48.8661613464356" lon="2.32213544845581"><ele>37.5831</ele><time>2007-04-15T08:56:04Z</time></trkpt><trkpt lat="48.8662796020508" lon="2.32210922241211"><ele>38.4975</ele><time>2007-04-15T08:56:05Z</time></trkpt><trkpt lat="48.8663444519043" lon="2.32209086418152"><ele>38.9923</ele><time>2007-04-15T08:56:06Z</time></trkpt><trkpt lat="48.866455078125" lon="2.32219123840332"><ele>39.9462</ele><time>2007-04-15T08:56:07Z</time></trkpt><trkpt lat="48.8664207458496" lon="2.32244300842285"><ele>39.8861</ele><time>2007-04-15T08:56:08Z</time></trkpt><trkpt lat="48.866397857666" lon="2.32262849807739"><ele>39.8415</ele><time>2007-04-15T08:56:09Z</time></trkpt><trkpt lat="48.8663787841797" lon="2.32290410995483"><ele>39.9168</ele><time>2007-04-15T08:56:10Z</time></trkpt><trkpt lat="48.8663711547852" lon="2.32310461997986"><ele>40.0323</ele><time>2007-04-15T08:56:11Z</time></trkpt><trkpt lat="48.8663673400879" lon="2.32326626777649"><ele>40.1462</ele><time>2007-04-15T08:56:12Z</time></trkpt><trkpt lat="48.8663597106934" lon="2.32346248626709"><ele>40.4111</ele><time>2007-04-15T08:56:13Z</time></trkpt><trkpt lat="48.8663558959961" lon="2.32368731498718"><ele>40.8265</ele><time>2007-04-15T08:56:14Z</time></trkpt><trkpt lat="48.8663482666016" lon="2.32394576072693"><ele>41.2786</ele><time>2007-04-15T08:56:15Z</time></trkpt><trkpt lat="48.8663101196289" lon="2.32413768768311"><ele>41.3782</ele><time>2007-04-15T08:56:16Z</time></trkpt><trkpt lat="48.8662338256836" lon="2.32438158988953"><ele>41.5433</ele><time>2007-04-15T08:56:17Z</time></trkpt><trkpt lat="48.8661727905273" lon="2.32457375526428"><ele>41.8011</ele><time>2007-04-15T08:56:18Z</time></trkpt><trkpt lat="48.8661041259766" lon="2.32477116584778"><ele>42.1441</ele><time>2007-04-15T08:56:19Z</time></trkpt><trkpt lat="48.8660659790039" lon="2.32494974136353"><ele>42.6468</ele><time>2007-04-15T08:56:20Z</time></trkpt><trkpt lat="48.8659706115723" lon="2.3251781463623"><ele>42.8865</ele><time>2007-04-15T08:56:21Z</time></trkpt><trkpt lat="48.8659057617188" lon="2.32539129257202"><ele>43.159</ele><time>2007-04-15T08:56:22Z</time></trkpt><trkpt lat="48.8658561706543" lon="2.32559156417847"><ele>43.4825</ele><time>2007-04-15T08:56:23Z</time></trkpt><trkpt lat="48.8657913208008" lon="2.32577347755432"><ele>43.5611</ele><time>2007-04-15T08:56:24Z</time></trkpt><trkpt lat="48.8657417297363" lon="2.32594156265259"><ele>43.6145</ele><time>2007-04-15T08:56:25Z</time></trkpt><trkpt lat="48.8656768798828" lon="2.32609629631042"><ele>43.5639</ele><time>2007-04-15T08:56:26Z</time></trkpt><trkpt lat="48.8656272888184" lon="2.32623100280762"><ele>43.5889</ele><time>2007-04-15T08:56:27Z</time></trkpt><trkpt lat="48.8655853271484" lon="2.32641696929932"><ele>43.8235</ele><time>2007-04-15T08:56:28Z</time></trkpt><trkpt lat="48.8655586242676" lon="2.32659721374512"><ele>44.1576</ele><time>2007-04-15T08:56:29Z</time></trkpt><trkpt lat="48.8655281066894" lon="2.32675623893738"><ele>44.4624</ele><time>2007-04-15T08:56:30Z</time></trkpt><trkpt lat="48.8654747009277" lon="2.32693791389465"><ele>44.7794</ele><time>2007-04-15T08:56:31Z</time></trkpt><trkpt lat="48.8653984069824" lon="2.32714200019836"><ele>45.1266</ele><time>2007-04-15T08:56:32Z</time></trkpt><trkpt lat="48.8653297424316" lon="2.32726907730103"><ele>45.2979</ele><time>2007-04-15T08:56:33Z</time></trkpt><trkpt lat="48.8652420043945" lon="2.32743883132935"><ele>45.6202</ele><time>2007-04-15T08:56:34Z</time></trkpt><trkpt lat="48.8651657104492" lon="2.3276674747467"><ele>45.7176</ele><time>2007-04-15T08:56:35Z</time></trkpt><trkpt lat="48.865119934082" lon="2.32792663574219"><ele>45.7964</ele><time>2007-04-15T08:56:36Z</time></trkpt><trkpt lat="48.8650894165039" lon="2.32805943489075"><ele>45.8492</ele><time>2007-04-15T08:56:37Z</time></trkpt><trkpt lat="48.865047454834" lon="2.32824397087097"><ele>45.9619</ele><time>2007-04-15T08:56:38Z</time></trkpt><trkpt lat="48.8649940490723" lon="2.32839870452881"><ele>45.9852</ele><time>2007-04-15T08:56:39Z</time></trkpt><trkpt lat="48.8649291992188" lon="2.32859539985657"><ele>45.8034</ele><time>2007-04-15T08:56:40Z</time></trkpt><trkpt lat="48.8648796081543" lon="2.328777551651"><ele>45.634</ele><time>2007-04-15T08:56:41Z</time></trkpt><trkpt lat="48.8648300170898" lon="2.32893466949463"><ele>45.4448</ele><time>2007-04-15T08:56:42Z</time></trkpt><trkpt lat="48.8647880554199" lon="2.32910394668579"><ele>45.2561</ele><time>2007-04-15T08:56:43Z</time></trkpt><trkpt lat="48.8646850585938" lon="2.32929158210754"><ele>44.9595</ele><time>2007-04-15T08:56:44Z</time></trkpt><trkpt lat="48.8646202087402" lon="2.32941746711731"><ele>44.7966</ele><time>2007-04-15T08:56:45Z</time></trkpt><trkpt lat="48.8645286560059" lon="2.32965731620789"><ele>44.5589</ele><time>2007-04-15T08:56:46Z</time></trkpt><trkpt lat="48.8644561767578" lon="2.32981276512146"><ele>44.3116</ele><time>2007-04-15T08:56:47Z</time></trkpt><trkpt lat="48.8644180297852" lon="2.32995367050171"><ele>44.1898</ele><time>2007-04-15T08:56:48Z</time></trkpt><trkpt lat="48.8643417358398" lon="2.33019542694092"><ele>44.2601</ele><time>2007-04-15T08:56:49Z</time></trkpt><trkpt lat="48.8642539978027" lon="2.33034992218018"><ele>44.215</ele><time>2007-04-15T08:56:50Z</time></trkpt><trkpt lat="48.8641929626465" lon="2.33051323890686"><ele>44.3386</ele><time>2007-04-15T08:56:51Z</time></trkpt><trkpt lat="48.8641548156738" lon="2.3307363986969"><ele>44.7171</ele><time>2007-04-15T08:56:52Z</time></trkpt><trkpt lat="48.8641128540039" lon="2.33087682723999"><ele>44.6861</ele><time>2007-04-15T08:56:53Z</time></trkpt><trkpt lat="48.8640632629394" lon="2.33108496665955"><ele>44.1642</ele><time>2007-04-15T08:56:54Z</time></trkpt><trkpt lat="48.8640213012695" lon="2.33126187324524"><ele>43.6983</ele><time>2007-04-15T08:56:55Z</time></trkpt><trkpt lat="48.863941192627" lon="2.3314197063446"><ele>43.0237</ele><time>2007-04-15T08:56:56Z</time></trkpt><trkpt lat="48.8638458251953" lon="2.33163118362427"><ele>42.1339</ele><time>2007-04-15T08:56:57Z</time></trkpt><trkpt lat="48.8638076782227" lon="2.33184719085693"><ele>42.6826</ele><time>2007-04-15T08:56:58Z</time></trkpt><trkpt lat="48.8637542724609" lon="2.3320484161377"><ele>43.3533</ele><time>2007-04-15T08:56:59Z</time></trkpt><trkpt lat="48.863712310791" lon="2.33222150802612"><ele>43.9973</ele><time>2007-04-15T08:57:00Z</time></trkpt><trkpt lat="48.8635902404785" lon="2.33239960670471"><ele>44.3968</ele><time>2007-04-15T08:57:01Z</time></trkpt><trkpt lat="48.8635101318359" lon="2.33255743980408"><ele>44.8683</ele><time>2007-04-15T08:57:02Z</time></trkpt><trkpt lat="48.8634643554688" lon="2.33277106285095"><ele>45.6194</ele><time>2007-04-15T08:57:03Z</time></trkpt><trkpt lat="48.8633804321289" lon="2.33288979530334"><ele>45.9613</ele><time>2007-04-15T08:57:04Z</time></trkpt><trkpt lat="48.8633270263672" lon="2.33302402496338"><ele>46.5039</ele><time>2007-04-15T08:57:05Z</time></trkpt><trkpt lat="48.8632507324219" lon="2.33319973945618"><ele>47.1249</ele><time>2007-04-15T08:57:06Z</time></trkpt><trkpt lat="48.8630714416504" lon="2.33329772949219"><ele>46.94</ele><time>2007-04-15T08:57:07Z</time></trkpt><trkpt lat="48.8630905151367" lon="2.33351230621338"><ele>47.4573</ele><time>2007-04-15T08:57:08Z</time></trkpt><trkpt lat="48.863151550293" lon="2.33370447158813"><ele>48.1959</ele><time>2007-04-15T08:57:09Z</time></trkpt><trkpt lat="48.8630676269531" lon="2.33386468887329"><ele>47.9398</ele><time>2007-04-15T08:57:10Z</time></trkpt><trkpt lat="48.8630180358887" lon="2.33392238616943"><ele>47.6483</ele><time>2007-04-15T08:57:11Z</time></trkpt><trkpt lat="48.8629722595215" lon="2.33402109146118"><ele>47.3881</ele><time>2007-04-15T08:57:12Z</time></trkpt><trkpt lat="48.8628768920898" lon="2.3341691493988"><ele>46.6158</ele><time>2007-04-15T08:57:13Z</time></trkpt><trkpt lat="48.8628540039062" lon="2.334388256073"><ele>46.2125</ele><time>2007-04-15T08:57:14Z</time></trkpt><trkpt lat="48.862922668457" lon="2.33461141586304"><ele>46.5085</ele><time>2007-04-15T08:57:15Z</time></trkpt><trkpt lat="48.8628921508789" lon="2.33474516868591"><ele>46.1521</ele><time>2007-04-15T08:57:16Z</time></trkpt><trkpt lat="48.8628463745117" lon="2.33498859405518"><ele>45.6717</ele><time>2007-04-15T08:57:17Z</time></trkpt><trkpt lat="48.8628425598144" lon="2.33521318435669"><ele>46.1418</ele><time>2007-04-15T08:57:18Z</time></trkpt><trkpt lat="48.862720489502" lon="2.33535289764404"><ele>46.192</ele><time>2007-04-15T08:57:19Z</time></trkpt><trkpt lat="48.8627166748047" lon="2.3354754447937"><ele>46.5805</ele><time>2007-04-15T08:57:20Z</time></trkpt><trkpt lat="48.862678527832" lon="2.33564782142639"><ele>47.1338</ele><time>2007-04-15T08:57:21Z</time></trkpt><trkpt lat="48.8625640869141" lon="2.33586740493774"><ele>47.8759</ele><time>2007-04-15T08:57:22Z</time></trkpt><trkpt lat="48.8625259399414" lon="2.33610200881958"><ele>47.6264</ele><time>2007-04-15T08:57:23Z</time></trkpt><trkpt lat="48.8625144958496" lon="2.33637356758118"><ele>47.3118</ele><time>2007-04-15T08:57:24Z</time></trkpt><trkpt lat="48.862491607666" lon="2.3365752696991"><ele>47.1478</ele><time>2007-04-15T08:57:25Z</time></trkpt><trkpt lat="48.8625221252441" lon="2.33690595626831"><ele>46.6332</ele><time>2007-04-15T08:57:26Z</time></trkpt><trkpt lat="48.8624954223633" lon="2.3371160030365"><ele>46.4739</ele><time>2007-04-15T08:57:27Z</time></trkpt><trkpt lat="48.8624382019043" lon="2.33729696273804"><ele>46.372</ele><time>2007-04-15T08:57:28Z</time></trkpt><trkpt lat="48.8623542785644" lon="2.3374457359314"><ele>46.2741</ele><time>2007-04-15T08:57:29Z</time></trkpt><trkpt lat="48.8623237609863" lon="2.33766674995422"><ele>45.8844</ele><time>2007-04-15T08:57:30Z</time></trkpt><trkpt lat="48.8622055053711" lon="2.33779883384705"><ele>45.6146</ele><time>2007-04-15T08:57:31Z</time></trkpt><trkpt lat="48.8620071411133" lon="2.33791589736938"><ele>45.2068</ele><time>2007-04-15T08:57:32Z</time></trkpt><trkpt lat="48.8617935180664" lon="2.33801174163818"><ele>44.6719</ele><time>2007-04-15T08:57:33Z</time></trkpt><trkpt lat="48.8617362976074" lon="2.33821797370911"><ele>43.6861</ele><time>2007-04-15T08:57:34Z</time></trkpt><trkpt lat="48.8616943359375" lon="2.33841443061829"><ele>43.2643</ele><time>2007-04-15T08:57:35Z</time></trkpt><trkpt lat="48.8616523742676" lon="2.33853507041931"><ele>43.6391</ele><time>2007-04-15T08:57:36Z</time></trkpt><trkpt lat="48.8615798950195" lon="2.33880138397217"><ele>44.9306</ele><time>2007-04-15T08:57:37Z</time></trkpt><trkpt lat="48.8615798950195" lon="2.33902788162231"><ele>45.361</ele><time>2007-04-15T08:57:38Z</time></trkpt><trkpt lat="48.8615455627441" lon="2.33921670913696"><ele>46.0423</ele><time>2007-04-15T08:57:39Z</time></trkpt><trkpt lat="48.8614273071289" lon="2.33934736251831"><ele>47.0925</ele><time>2007-04-15T08:57:40Z</time></trkpt><trkpt lat="48.8613548278809" lon="2.33954572677612"><ele>47.703</ele><time>2007-04-15T08:57:41Z</time></trkpt><trkpt lat="48.8614082336426" lon="2.33978462219238"><ele>47.9872</ele><time>2007-04-15T08:57:42Z</time></trkpt><trkpt lat="48.8613777160644" lon="2.33997774124146"><ele>48.2738</ele><time>2007-04-15T08:57:43Z</time></trkpt><trkpt lat="48.8611869812012" lon="2.34010004997253"><ele>47.7796</ele><time>2007-04-15T08:57:44Z</time></trkpt><trkpt lat="48.8611335754394" lon="2.34025549888611"><ele>47.5244</ele><time>2007-04-15T08:57:45Z</time></trkpt><trkpt lat="48.8610954284668" lon="2.34036254882812"><ele>47.3308</ele><time>2007-04-15T08:57:46Z</time></trkpt><trkpt lat="48.8610496520996" lon="2.34056353569031"><ele>47.0185</ele><time>2007-04-15T08:57:47Z</time></trkpt><trkpt lat="48.861011505127" lon="2.3407666683197"><ele>46.7043</ele><time>2007-04-15T08:57:48Z</time></trkpt><trkpt lat="48.8609275817871" lon="2.34092736244202"><ele>46.5522</ele><time>2007-04-15T08:57:49Z</time></trkpt><trkpt lat="48.8608245849609" lon="2.34108567237854"><ele>46.6203</ele><time>2007-04-15T08:57:50Z</time></trkpt><trkpt lat="48.8607978820801" lon="2.34127140045166"><ele>47.0917</ele><time>2007-04-15T08:57:51Z</time></trkpt><trkpt lat="48.8607559204102" lon="2.34139919281006"><ele>47.4177</ele><time>2007-04-15T08:57:52Z</time></trkpt><trkpt lat="48.8607215881348" lon="2.34149312973022"><ele>47.6394</ele><time>2007-04-15T08:57:53Z</time></trkpt><trkpt lat="48.8606491088867" lon="2.34168863296509"><ele>48.0205</ele><time>2007-04-15T08:57:54Z</time></trkpt><trkpt lat="48.8605690002441" lon="2.34189081192017"><ele>48.1837</ele><time>2007-04-15T08:57:55Z</time></trkpt><trkpt lat="48.8605079650879" lon="2.34199738502502"><ele>48.2419</ele><time>2007-04-15T08:57:56Z</time></trkpt><trkpt lat="48.8604469299316" lon="2.34216070175171"><ele>48.318</ele><time>2007-04-15T08:57:57Z</time></trkpt><trkpt lat="48.8604469299316" lon="2.34225988388062"><ele>48.3818</ele><time>2007-04-15T08:57:58Z</time></trkpt><trkpt lat="48.8604164123535" lon="2.34242987632751"><ele>48.4576</ele><time>2007-04-15T08:57:59Z</time></trkpt><trkpt lat="48.8603019714356" lon="2.34259986877441"><ele>48.8313</ele><time>2007-04-15T08:58:00Z</time></trkpt><trkpt lat="48.8602180480957" lon="2.34269690513611"><ele>49.2576</ele><time>2007-04-15T08:58:01Z</time></trkpt><trkpt lat="48.8601379394531" lon="2.34286570549011"><ele>50.1418</ele><time>2007-04-15T08:58:02Z</time></trkpt><trkpt lat="48.8600616455078" lon="2.34309911727905"><ele>51.5091</ele><time>2007-04-15T08:58:03Z</time></trkpt><trkpt lat="48.8600769042969" lon="2.34328079223633"><ele>52.5176</ele><time>2007-04-15T08:58:04Z</time></trkpt><trkpt lat="48.8600692749023" lon="2.34342670440674"><ele>52.9272</ele><time>2007-04-15T08:58:05Z</time></trkpt><trkpt lat="48.8600654602051" lon="2.34346222877502"><ele>52.9733</ele><time>2007-04-15T08:58:06Z</time></trkpt><trkpt lat="48.8600006103516" lon="2.34362149238586"><ele>53.3438</ele><time>2007-04-15T08:58:07Z</time></trkpt><trkpt lat="48.8599586486816" lon="2.34387397766113"><ele>53.5844</ele><time>2007-04-15T08:58:08Z</time></trkpt><trkpt lat="48.8599510192871" lon="2.34391498565674"><ele>53.6159</ele><time>2007-04-15T08:58:09Z</time></trkpt><trkpt lat="48.8599662780762" lon="2.34410977363586"><ele>53.8563</ele><time>2007-04-15T08:58:10Z</time></trkpt><trkpt lat="48.8599319458008" lon="2.3442120552063"><ele>53.7822</ele><time>2007-04-15T08:58:11Z</time></trkpt><trkpt lat="48.8598442077637" lon="2.34442806243896"><ele>53.3124</ele><time>2007-04-15T08:58:12Z</time></trkpt><trkpt lat="48.8597602844238" lon="2.34459066390991"><ele>52.9159</ele><time>2007-04-15T08:58:13Z</time></trkpt><trkpt lat="48.8596687316894" lon="2.34476518630981"><ele>52.4867</ele><time>2007-04-15T08:58:14Z</time></trkpt><trkpt lat="48.8596496582031" lon="2.34495234489441"><ele>52.2164</ele><time>2007-04-15T08:58:15Z</time></trkpt><trkpt lat="48.8595695495606" lon="2.34506440162659"><ele>51.8175</ele><time>2007-04-15T08:58:16Z</time></trkpt><trkpt lat="48.8595199584961" lon="2.34524703025818"><ele>51.3452</ele><time>2007-04-15T08:58:17Z</time></trkpt><trkpt lat="48.8594436645508" lon="2.34540581703186"><ele>51.0173</ele><time>2007-04-15T08:58:18Z</time></trkpt><trkpt lat="48.8594284057617" lon="2.34558391571045"><ele>50.7479</ele><time>2007-04-15T08:58:19Z</time></trkpt><trkpt lat="48.8594017028809" lon="2.34579515457153"><ele>50.4876</ele><time>2007-04-15T08:58:20Z</time></trkpt><trkpt lat="48.8593215942383" lon="2.3459312915802"><ele>50.1798</ele><time>2007-04-15T08:58:21Z</time></trkpt><trkpt lat="48.8593063354492" lon="2.3459575176239"><ele>50.0937</ele><time>2007-04-15T08:58:22Z</time></trkpt><trkpt lat="48.8591804504394" lon="2.34617018699646"><ele>49.3567</ele><time>2007-04-15T08:58:23Z</time></trkpt><trkpt lat="48.8591270446777" lon="2.34631276130676"><ele>48.7535</ele><time>2007-04-15T08:58:24Z</time></trkpt><trkpt lat="48.859130859375" lon="2.34651160240173"><ele>47.8143</ele><time>2007-04-15T08:58:25Z</time></trkpt><trkpt lat="48.8590660095215" lon="2.3466477394104"><ele>47.3269</ele><time>2007-04-15T08:58:26Z</time></trkpt><trkpt lat="48.858959197998" lon="2.34684753417969"><ele>46.9008</ele><time>2007-04-15T08:58:27Z</time></trkpt><trkpt lat="48.8588752746582" lon="2.34712171554565"><ele>46.2521</ele><time>2007-04-15T08:58:28Z</time></trkpt><trkpt lat="48.8588256835938" lon="2.34732818603516"><ele>45.7617</ele><time>2007-04-15T08:58:29Z</time></trkpt><trkpt lat="48.858757019043" lon="2.34751558303833"><ele>45.522</ele><time>2007-04-15T08:58:30Z</time></trkpt><trkpt lat="48.858715057373" lon="2.34766101837158"><ele>46.0845</ele><time>2007-04-15T08:58:31Z</time></trkpt><trkpt lat="48.8586463928223" lon="2.3478319644928"><ele>46.7203</ele><time>2007-04-15T08:58:32Z</time></trkpt><trkpt lat="48.8586349487305" lon="2.34786152839661"><ele>46.8191</ele><time>2007-04-15T08:58:33Z</time></trkpt><trkpt lat="48.858585357666" lon="2.34805822372437"><ele>47.3703</ele><time>2007-04-15T08:58:34Z</time></trkpt><trkpt lat="48.858512878418" lon="2.34826135635376"><ele>47.8578</ele><time>2007-04-15T08:58:35Z</time></trkpt><trkpt lat="48.8584403991699" lon="2.34845280647278"><ele>48</ele><time>2007-04-15T08:58:36Z</time></trkpt><trkpt lat="48.8583831787109" lon="2.34865784645081"><ele>48</ele><time>2007-04-15T08:58:37Z</time></trkpt><trkpt lat="48.8582916259766" lon="2.34885478019714"><ele>47.5935</ele><time>2007-04-15T08:58:38Z</time></trkpt><trkpt lat="48.8582534790039" lon="2.34903407096863"><ele>47.2835</ele><time>2007-04-15T08:58:39Z</time></trkpt><trkpt lat="48.8581733703613" lon="2.34918403625488"><ele>46.6675</ele><time>2007-04-15T08:58:40Z</time></trkpt><trkpt lat="48.8581008911133" lon="2.34935307502747"><ele>46.3229</ele><time>2007-04-15T08:58:41Z</time></trkpt><trkpt lat="48.8580551147461" lon="2.34957957267761"><ele>46.4909</ele><time>2007-04-15T08:58:42Z</time></trkpt><trkpt lat="48.858024597168" lon="2.34974050521851"><ele>46.7589</ele><time>2007-04-15T08:58:43Z</time></trkpt><trkpt lat="48.8580207824707" lon="2.34996008872986"><ele>47.2793</ele><time>2007-04-15T08:58:44Z</time></trkpt><trkpt lat="48.8580284118652" lon="2.35018348693848"><ele>47.4034</ele><time>2007-04-15T08:58:45Z</time></trkpt><trkpt lat="48.8579292297363" lon="2.35037040710449"><ele>47.2962</ele><time>2007-04-15T08:58:46Z</time></trkpt><trkpt lat="48.8577995300293" lon="2.35056972503662"><ele>46.8182</ele><time>2007-04-15T08:58:47Z</time></trkpt><trkpt lat="48.8576812744141" lon="2.3507604598999"><ele>46.0373</ele><time>2007-04-15T08:58:48Z</time></trkpt><trkpt lat="48.8576622009277" lon="2.35093474388123"><ele>45.3629</ele><time>2007-04-15T08:58:49Z</time></trkpt><trkpt lat="48.8575782775879" lon="2.35113263130188"><ele>44.0403</ele><time>2007-04-15T08:58:50Z</time></trkpt><trkpt lat="48.8575401306152" lon="2.35132050514221"><ele>42.9387</ele><time>2007-04-15T08:58:51Z</time></trkpt><trkpt lat="48.8574066162109" lon="2.35153865814209"><ele>41.287</ele><time>2007-04-15T08:58:52Z</time></trkpt><trkpt lat="48.857292175293" lon="2.35167598724365"><ele>40.5655</ele><time>2007-04-15T08:58:53Z</time></trkpt><trkpt lat="48.8572387695312" lon="2.35186147689819"><ele>41.7618</ele><time>2007-04-15T08:58:54Z</time></trkpt><trkpt lat="48.8572158813477" lon="2.35205984115601"><ele>43.1597</ele><time>2007-04-15T08:58:55Z</time></trkpt><trkpt lat="48.8572235107422" lon="2.35228705406189"><ele>44.7998</ele><time>2007-04-15T08:58:56Z</time></trkpt><trkpt lat="48.8572311401367" lon="2.3523850440979"><ele>45.4994</ele><time>2007-04-15T08:58:57Z</time></trkpt><trkpt lat="48.8571891784668" lon="2.35261249542236"><ele>46.9312</ele><time>2007-04-15T08:58:58Z</time></trkpt><trkpt lat="48.8571472167969" lon="2.35281562805176"><ele>47.8942</ele><time>2007-04-15T08:58:59Z</time></trkpt><trkpt lat="48.8570899963379" lon="2.35299181938171"><ele>48.5812</ele><time>2007-04-15T08:59:00Z</time></trkpt><trkpt lat="48.8570327758789" lon="2.35317635536194"><ele>49.1552</ele><time>2007-04-15T08:59:01Z</time></trkpt><trkpt lat="48.8569869995117" lon="2.35324668884277"><ele>49.2338</ele><time>2007-04-15T08:59:02Z</time></trkpt><trkpt lat="48.8568992614746" lon="2.35345792770386"><ele>48.7514</ele><time>2007-04-15T08:59:03Z</time></trkpt><trkpt lat="48.8568572998047" lon="2.35369086265564"><ele>47.8242</ele><time>2007-04-15T08:59:04Z</time></trkpt><trkpt lat="48.8568992614746" lon="2.35391163825989"><ele>47.4219</ele><time>2007-04-15T08:59:05Z</time></trkpt><trkpt lat="48.8568916320801" lon="2.35412073135376"><ele>46.7554</ele><time>2007-04-15T08:59:06Z</time></trkpt><trkpt lat="48.8568572998047" lon="2.3543210029602"><ele>46.4464</ele><time>2007-04-15T08:59:07Z</time></trkpt><trkpt lat="48.8567962646484" lon="2.35455369949341"><ele>46.3564</ele><time>2007-04-15T08:59:08Z</time></trkpt><trkpt lat="48.8567581176758" lon="2.35482168197632"><ele>46.6267</ele><time>2007-04-15T08:59:09Z</time></trkpt><trkpt lat="48.8567314147949" lon="2.35503816604614"><ele>46.8765</ele><time>2007-04-15T08:59:10Z</time></trkpt><trkpt lat="48.8566665649414" lon="2.35521960258484"><ele>46.7357</ele><time>2007-04-15T08:59:11Z</time></trkpt><trkpt lat="48.8566017150879" lon="2.35545420646667"><ele>46.0438</ele><time>2007-04-15T08:59:12Z</time></trkpt><trkpt lat="48.856559753418" lon="2.35559606552124"><ele>45.7172</ele><time>2007-04-15T08:59:13Z</time></trkpt><trkpt lat="48.8565216064453" lon="2.35578179359436"><ele>45.4858</ele><time>2007-04-15T08:59:14Z</time></trkpt><trkpt lat="48.8564796447754" lon="2.35594248771667"><ele>45.3561</ele><time>2007-04-15T08:59:15Z</time></trkpt><trkpt lat="48.8564224243164" lon="2.35612082481384"><ele>45.2218</ele><time>2007-04-15T08:59:16Z</time></trkpt><trkpt lat="48.8563346862793" lon="2.3563756942749"><ele>45.0641</ele><time>2007-04-15T08:59:17Z</time></trkpt><trkpt lat="48.8563232421875" lon="2.35659980773926"><ele>45.1427</ele><time>2007-04-15T08:59:18Z</time></trkpt><trkpt lat="48.8562660217285" lon="2.35680913925171"><ele>45.2982</ele><time>2007-04-15T08:59:19Z</time></trkpt><trkpt lat="48.8562316894531" lon="2.35699987411499"><ele>45.547</ele><time>2007-04-15T08:59:20Z</time></trkpt><trkpt lat="48.8562088012695" lon="2.35723233222961"><ele>45.8858</ele><time>2007-04-15T08:59:21Z</time></trkpt><trkpt lat="48.8561172485352" lon="2.35743975639343"><ele>45.9252</ele><time>2007-04-15T08:59:22Z</time></trkpt><trkpt lat="48.8560409545898" lon="2.357661485672"><ele>45.8929</ele><time>2007-04-15T08:59:23Z</time></trkpt><trkpt lat="48.8560066223144" lon="2.35782551765442"><ele>45.9332</ele><time>2007-04-15T08:59:24Z</time></trkpt><trkpt lat="48.8559608459473" lon="2.35804486274719"><ele>46.0128</ele><time>2007-04-15T08:59:25Z</time></trkpt><trkpt lat="48.8559303283691" lon="2.35822606086731"><ele>46.119</ele><time>2007-04-15T08:59:26Z</time></trkpt><trkpt lat="48.8558921813965" lon="2.35834670066834"><ele>46.1378</ele><time>2007-04-15T08:59:27Z</time></trkpt><trkpt lat="48.8558654785156" lon="2.35847306251526"><ele>46.0577</ele><time>2007-04-15T08:59:28Z</time></trkpt><trkpt lat="48.8558387756348" lon="2.35870385169983"><ele>46.0043</ele><time>2007-04-15T08:59:29Z</time></trkpt><trkpt lat="48.8558082580566" lon="2.35899686813354"><ele>45.9214</ele><time>2007-04-15T08:59:30Z</time></trkpt><trkpt lat="48.855785369873" lon="2.3591616153717"><ele>45.8838</ele><time>2007-04-15T08:59:31Z</time></trkpt><trkpt lat="48.8557052612305" lon="2.35930442810059"><ele>45.718</ele><time>2007-04-15T08:59:32Z</time></trkpt><trkpt lat="48.855583190918" lon="2.35952115058899"><ele>45.5273</ele><time>2007-04-15T08:59:33Z</time></trkpt><trkpt lat="48.8555145263672" lon="2.35967564582825"><ele>45.4685</ele><time>2007-04-15T08:59:34Z</time></trkpt><trkpt lat="48.8554916381836" lon="2.35977792739868"><ele>45.4807</ele><time>2007-04-15T08:59:35Z</time></trkpt><trkpt lat="48.8554801940918" lon="2.35986757278442"><ele>45.5089</ele><time>2007-04-15T08:59:36Z</time></trkpt><trkpt lat="48.8554573059082" lon="2.35999870300293"><ele>45.5481</ele><time>2007-04-15T08:59:37Z</time></trkpt><trkpt lat="48.8554496765137" lon="2.36021184921265"><ele>45.2854</ele><time>2007-04-15T08:59:38Z</time></trkpt><trkpt lat="48.8553886413574" lon="2.36035323143005"><ele>45.0425</ele><time>2007-04-15T08:59:39Z</time></trkpt><trkpt lat="48.855339050293" lon="2.36055612564087"><ele>44.7395</ele><time>2007-04-15T08:59:40Z</time></trkpt><trkpt lat="48.8552780151367" lon="2.36075711250305"><ele>44.4251</ele><time>2007-04-15T08:59:41Z</time></trkpt><trkpt lat="48.8552436828613" lon="2.3609607219696"><ele>44.3112</ele><time>2007-04-15T08:59:42Z</time></trkpt><trkpt lat="48.8552513122559" lon="2.36100244522095"><ele>44.3209</ele><time>2007-04-15T08:59:43Z</time></trkpt><trkpt lat="48.855224609375" lon="2.36123013496399"><ele>44.3607</ele><time>2007-04-15T08:59:44Z</time></trkpt><trkpt lat="48.8551940917969" lon="2.36145758628845"><ele>44.4586</ele><time>2007-04-15T08:59:45Z</time></trkpt><trkpt lat="48.8551635742188" lon="2.36159873008728"><ele>44.5739</ele><time>2007-04-15T08:59:46Z</time></trkpt><trkpt lat="48.855110168457" lon="2.36183619499207"><ele>44.3556</ele><time>2007-04-15T08:59:47Z</time></trkpt><trkpt lat="48.85498046875" lon="2.36197733879089"><ele>44.1869</ele><time>2007-04-15T08:59:48Z</time></trkpt><trkpt lat="48.8549118041992" lon="2.36214327812195"><ele>43.6144</ele><time>2007-04-15T08:59:49Z</time></trkpt><trkpt lat="48.8548431396484" lon="2.36228895187378"><ele>43.1753</ele><time>2007-04-15T08:59:50Z</time></trkpt><trkpt lat="48.8547821044922" lon="2.36244654655457"><ele>42.8165</ele><time>2007-04-15T08:59:51Z</time></trkpt><trkpt lat="48.8547248840332" lon="2.36262822151184"><ele>42.8223</ele><time>2007-04-15T08:59:52Z</time></trkpt><trkpt lat="48.8546600341797" lon="2.36275625228882"><ele>42.9684</ele><time>2007-04-15T08:59:53Z</time></trkpt><trkpt lat="48.8545951843262" lon="2.36294436454773"><ele>43.2913</ele><time>2007-04-15T08:59:54Z</time></trkpt><trkpt lat="48.8545532226562" lon="2.36312246322632"><ele>43.6653</ele><time>2007-04-15T08:59:55Z</time></trkpt><trkpt lat="48.8544769287109" lon="2.36328625679016"><ele>44.149</ele><time>2007-04-15T08:59:56Z</time></trkpt><trkpt lat="48.8544044494629" lon="2.36347055435181"><ele>44.5</ele><time>2007-04-15T08:59:57Z</time></trkpt><trkpt lat="48.8543891906738" lon="2.36365914344788"><ele>44.6481</ele><time>2007-04-15T08:59:58Z</time></trkpt><trkpt lat="48.8543128967285" lon="2.363844871521"><ele>45.0475</ele><time>2007-04-15T08:59:59Z</time></trkpt><trkpt lat="48.8542098999023" lon="2.36411380767822"><ele>45.7356</ele><time>2007-04-15T09:00:00Z</time></trkpt><trkpt lat="48.8540687561035" lon="2.36432695388794"><ele>45.7102</ele><time>2007-04-15T09:00:01Z</time></trkpt><trkpt lat="48.8540229797363" lon="2.36443448066711"><ele>45.4743</ele><time>2007-04-15T09:00:02Z</time></trkpt><trkpt lat="48.853946685791" lon="2.3645658493042"><ele>45.1795</ele><time>2007-04-15T09:00:03Z</time></trkpt><trkpt lat="48.8539009094238" lon="2.3647952079773"><ele>44.5699</ele><time>2007-04-15T09:00:04Z</time></trkpt><trkpt lat="48.853889465332" lon="2.36497068405151"><ele>44.0821</ele><time>2007-04-15T09:00:05Z</time></trkpt><trkpt lat="48.8538932800293" lon="2.36516809463501"><ele>43.7289</ele><time>2007-04-15T09:00:06Z</time></trkpt><trkpt lat="48.8538284301758" lon="2.36539745330811"><ele>43.4333</ele><time>2007-04-15T09:00:07Z</time></trkpt><trkpt lat="48.8537788391113" lon="2.36560320854187"><ele>43.226</ele><time>2007-04-15T09:00:08Z</time></trkpt><trkpt lat="48.853759765625" lon="2.36578488349915"><ele>43.0361</ele><time>2007-04-15T09:00:09Z</time></trkpt><trkpt lat="48.8536834716797" lon="2.36600971221924"><ele>43.181</ele><time>2007-04-15T09:00:10Z</time></trkpt><trkpt lat="48.8536262512207" lon="2.36617040634155"><ele>43.1989</ele><time>2007-04-15T09:00:11Z</time></trkpt><trkpt lat="48.8535804748535" lon="2.36633467674255"><ele>43.0957</ele><time>2007-04-15T09:00:12Z</time></trkpt><trkpt lat="48.853515625" lon="2.36654853820801"><ele>42.7847</ele><time>2007-04-15T09:00:13Z</time></trkpt><trkpt lat="48.8535079956055" lon="2.36674118041992"><ele>43.0571</ele><time>2007-04-15T09:00:14Z</time></trkpt><trkpt lat="48.8535385131836" lon="2.36695051193237"><ele>44.3579</ele><time>2007-04-15T09:00:15Z</time></trkpt><trkpt lat="48.8535423278809" lon="2.36719250679016"><ele>45.7492</ele><time>2007-04-15T09:00:16Z</time></trkpt><trkpt lat="48.853515625" lon="2.36740684509277"><ele>46.903</ele><time>2007-04-15T09:00:17Z</time></trkpt><trkpt lat="48.8535041809082" lon="2.36761689186096"><ele>47.464</ele><time>2007-04-15T09:00:18Z</time></trkpt><trkpt lat="48.853443145752" lon="2.36778855323792"><ele>47.4729</ele><time>2007-04-15T09:00:19Z</time></trkpt><trkpt lat="48.8533782958984" lon="2.36795878410339"><ele>47.5693</ele><time>2007-04-15T09:00:20Z</time></trkpt><trkpt lat="48.853328704834" lon="2.36809992790222"><ele>47.6777</ele><time>2007-04-15T09:00:21Z</time></trkpt><trkpt lat="48.8533134460449" lon="2.36823844909668"><ele>47.6849</ele><time>2007-04-15T09:00:22Z</time></trkpt><trkpt lat="48.8532867431641" lon="2.36840391159058"><ele>47.1207</ele><time>2007-04-15T09:00:23Z</time></trkpt><trkpt lat="48.8531837463379" lon="2.36855316162109"><ele>45.539</ele><time>2007-04-15T09:00:24Z</time></trkpt><trkpt lat="48.853141784668" lon="2.36859893798828"><ele>45.0703</ele><time>2007-04-15T09:00:25Z</time></trkpt><trkpt lat="48.8530311584473" lon="2.36875081062317"><ele>44.0482</ele><time>2007-04-15T09:00:26Z</time></trkpt><trkpt lat="48.8530120849609" lon="2.36879396438599"><ele>43.8976</ele><time>2007-04-15T09:00:27Z</time></trkpt><trkpt lat="48.8530426025391" lon="2.36888360977173"><ele>43.8622</ele><time>2007-04-15T09:00:28Z</time></trkpt><trkpt lat="48.8530502319336" lon="2.36887884140015"><ele>43.8933</ele><time>2007-04-15T09:00:29Z</time></trkpt><trkpt lat="48.8529930114746" lon="2.36893963813782"><ele>43.658</ele><time>2007-04-15T09:00:30Z</time></trkpt><trkpt lat="48.8529396057129" lon="2.36911416053772"><ele>43.4898</ele><time>2007-04-15T09:00:31Z</time></trkpt><trkpt lat="48.8529472351074" lon="2.36920833587646"><ele>43.5755</ele><time>2007-04-15T09:00:32Z</time></trkpt><trkpt lat="48.8529663085938" lon="2.36924266815186"><ele>43.6304</ele><time>2007-04-15T09:00:33Z</time></trkpt><trkpt lat="48.8529663085938" lon="2.36933422088623"><ele>43.8592</ele><time>2007-04-15T09:00:34Z</time></trkpt><trkpt lat="48.852970123291" lon="2.36933493614197"><ele>43.85</ele><time>2007-04-15T09:00:35Z</time></trkpt><trkpt lat="48.8529739379883" lon="2.36934161186218"><ele>43.8551</ele><time>2007-04-15T09:00:36Z</time></trkpt><trkpt lat="48.8530120849609" lon="2.36940336227417"><ele>43.8679</ele><time>2007-04-15T09:00:37Z</time></trkpt><trkpt lat="48.8530960083008" lon="2.36955189704895"><ele>43.7441</ele><time>2007-04-15T09:00:38Z</time></trkpt><trkpt lat="48.8531875610352" lon="2.3697521686554"><ele>43.3327</ele><time>2007-04-15T09:00:39Z</time></trkpt><trkpt lat="48.8532485961914" lon="2.36992120742798"><ele>42.8407</ele><time>2007-04-15T09:00:40Z</time></trkpt><trkpt lat="48.8532867431641" lon="2.37008285522461"><ele>42.4361</ele><time>2007-04-15T09:00:41Z</time></trkpt><trkpt lat="48.8532981872559" lon="2.37018346786499"><ele>42.3188</ele><time>2007-04-15T09:00:42Z</time></trkpt><trkpt lat="48.8532943725586" lon="2.37023401260376"><ele>42.3478</ele><time>2007-04-15T09:00:43Z</time></trkpt><trkpt lat="48.8532867431641" lon="2.37023711204529"><ele>42.4155</ele><time>2007-04-15T09:00:44Z</time></trkpt><trkpt lat="48.8532867431641" lon="2.37024116516113"><ele>42.4149</ele><time>2007-04-15T09:00:45Z</time></trkpt><trkpt lat="48.853199005127" lon="2.37039470672607"><ele>43.1369</ele><time>2007-04-15T09:00:46Z</time></trkpt><trkpt lat="48.8531303405762" lon="2.3705723285675"><ele>43.6141</ele><time>2007-04-15T09:00:47Z</time></trkpt><trkpt lat="48.8529472351074" lon="2.37073063850403"><ele>44.8941</ele><time>2007-04-15T09:00:48Z</time></trkpt><trkpt lat="48.8529281616211" lon="2.37076187133789"><ele>45.0006</ele><time>2007-04-15T09:00:49Z</time></trkpt><trkpt lat="48.8528327941894" lon="2.37091302871704"><ele>45.2592</ele><time>2007-04-15T09:00:50Z</time></trkpt><trkpt lat="48.8526992797852" lon="2.37108826637268"><ele>45.1686</ele><time>2007-04-15T09:00:51Z</time></trkpt><trkpt lat="48.8525543212891" lon="2.37131357192993"><ele>44.3766</ele><time>2007-04-15T09:00:52Z</time></trkpt><trkpt lat="48.852466583252" lon="2.37151002883911"><ele>43.4184</ele><time>2007-04-15T09:00:53Z</time></trkpt><trkpt lat="48.8524131774902" lon="2.37175178527832"><ele>42.759</ele><time>2007-04-15T09:00:54Z</time></trkpt><trkpt lat="48.8523445129394" lon="2.37196493148804"><ele>43.0252</ele><time>2007-04-15T09:00:55Z</time></trkpt><trkpt lat="48.8522644042969" lon="2.37222099304199"><ele>42.9453</ele><time>2007-04-15T09:00:56Z</time></trkpt><trkpt lat="48.8521919250488" lon="2.37248134613037"><ele>42.4276</ele><time>2007-04-15T09:00:57Z</time></trkpt><trkpt lat="48.8521041870117" lon="2.37278819084167"><ele>42.8208</ele><time>2007-04-15T09:00:58Z</time></trkpt><trkpt lat="48.8520317077637" lon="2.3731210231781"><ele>43.3072</ele><time>2007-04-15T09:00:59Z</time></trkpt><trkpt lat="48.8519744873047" lon="2.3734233379364"><ele>43.6705</ele><time>2007-04-15T09:01:00Z</time></trkpt><trkpt lat="48.8519287109375" lon="2.37369227409363"><ele>43.821</ele><time>2007-04-15T09:01:01Z</time></trkpt><trkpt lat="48.8518676757812" lon="2.37398886680603"><ele>43.9485</ele><time>2007-04-15T09:01:02Z</time></trkpt><trkpt lat="48.8517532348633" lon="2.37422299385071"><ele>43.9789</ele><time>2007-04-15T09:01:03Z</time></trkpt><trkpt lat="48.8516731262207" lon="2.3744637966156"><ele>43.9917</ele><time>2007-04-15T09:01:04Z</time></trkpt><trkpt lat="48.8516120910644" lon="2.37473464012146"><ele>43.9554</ele><time>2007-04-15T09:01:05Z</time></trkpt><trkpt lat="48.8515319824219" lon="2.37498664855957"><ele>43.841</ele><time>2007-04-15T09:01:06Z</time></trkpt><trkpt lat="48.8514785766602" lon="2.37523245811462"><ele>44.1162</ele><time>2007-04-15T09:01:07Z</time></trkpt><trkpt lat="48.8514251708984" lon="2.3754711151123"><ele>44.4394</ele><time>2007-04-15T09:01:08Z</time></trkpt><trkpt lat="48.8513565063477" lon="2.37573981285095"><ele>44.846</ele><time>2007-04-15T09:01:09Z</time></trkpt><trkpt lat="48.8513031005859" lon="2.37604713439941"><ele>45.2239</ele><time>2007-04-15T09:01:10Z</time></trkpt><trkpt lat="48.8512382507324" lon="2.37632465362549"><ele>45.6062</ele><time>2007-04-15T09:01:11Z</time></trkpt><trkpt lat="48.8511924743652" lon="2.37653541564941"><ele>45.9588</ele><time>2007-04-15T09:01:12Z</time></trkpt><trkpt lat="48.851131439209" lon="2.37683081626892"><ele>45.6376</ele><time>2007-04-15T09:01:13Z</time></trkpt><trkpt lat="48.8510093688965" lon="2.37718415260315"><ele>44.3559</ele><time>2007-04-15T09:01:14Z</time></trkpt><trkpt lat="48.8509407043457" lon="2.37744355201721"><ele>43.2535</ele><time>2007-04-15T09:01:15Z</time></trkpt><trkpt lat="48.8509101867676" lon="2.37772798538208"><ele>42.7769</ele><time>2007-04-15T09:01:16Z</time></trkpt><trkpt lat="48.850830078125" lon="2.37805080413818"><ele>42.339</ele><time>2007-04-15T09:01:17Z</time></trkpt><trkpt lat="48.8507270812988" lon="2.37834000587463"><ele>41.992</ele><time>2007-04-15T09:01:18Z</time></trkpt><trkpt lat="48.8506851196289" lon="2.37850785255432"><ele>41.7906</ele><time>2007-04-15T09:01:19Z</time></trkpt><trkpt lat="48.8506278991699" lon="2.37879300117493"><ele>41.4484</ele><time>2007-04-15T09:01:20Z</time></trkpt><trkpt lat="48.8505706787109" lon="2.37900280952454"><ele>41.1966</ele><time>2007-04-15T09:01:21Z</time></trkpt><trkpt lat="48.8505363464356" lon="2.37911009788513"><ele>41.0679</ele><time>2007-04-15T09:01:22Z</time></trkpt><trkpt lat="48.8504981994629" lon="2.37930154800415"><ele>40.9032</ele><time>2007-04-15T09:01:23Z</time></trkpt><trkpt lat="48.8504676818848" lon="2.37948322296143"><ele>40.7868</ele><time>2007-04-15T09:01:24Z</time></trkpt><trkpt lat="48.850456237793" lon="2.37961840629578"><ele>40.7032</ele><time>2007-04-15T09:01:25Z</time></trkpt><trkpt lat="48.8504333496094" lon="2.37978577613831"><ele>40.6137</ele><time>2007-04-15T09:01:26Z</time></trkpt><trkpt lat="48.8503875732422" lon="2.38002967834473"><ele>40.6252</ele><time>2007-04-15T09:01:27Z</time></trkpt><trkpt lat="48.8503684997559" lon="2.38017058372498"><ele>41.0814</ele><time>2007-04-15T09:01:28Z</time></trkpt><trkpt lat="48.8503913879394" lon="2.38038873672485"><ele>41.7107</ele><time>2007-04-15T09:01:29Z</time></trkpt><trkpt lat="48.8503761291504" lon="2.38062310218811"><ele>42.4543</ele><time>2007-04-15T09:01:30Z</time></trkpt><trkpt lat="48.850399017334" lon="2.38087701797485"><ele>43.015</ele><time>2007-04-15T09:01:31Z</time></trkpt><trkpt lat="48.850399017334" lon="2.38109159469604"><ele>42.8808</ele><time>2007-04-15T09:01:32Z</time></trkpt><trkpt lat="48.8503952026367" lon="2.38117861747742"><ele>42.8337</ele><time>2007-04-15T09:01:33Z</time></trkpt><trkpt lat="48.850399017334" lon="2.38152050971985"><ele>42.6126</ele><time>2007-04-15T09:01:34Z</time></trkpt><trkpt lat="48.8503723144531" lon="2.38177347183228"><ele>42.5259</ele><time>2007-04-15T09:01:35Z</time></trkpt><trkpt lat="48.8503646850586" lon="2.38199043273926"><ele>42.4654</ele><time>2007-04-15T09:01:36Z</time></trkpt><trkpt lat="48.8503761291504" lon="2.38217306137085"><ele>42.4304</ele><time>2007-04-15T09:01:37Z</time></trkpt><trkpt lat="48.8504028320312" lon="2.38236284255981"><ele>42.4611</ele><time>2007-04-15T09:01:38Z</time></trkpt><trkpt lat="48.8504371643066" lon="2.38261890411377"><ele>42.3025</ele><time>2007-04-15T09:01:39Z</time></trkpt><trkpt lat="48.8504295349121" lon="2.3828444480896"><ele>41.7452</ele><time>2007-04-15T09:01:40Z</time></trkpt><trkpt lat="48.8504180908203" lon="2.38300204277039"><ele>41.3043</ele><time>2007-04-15T09:01:41Z</time></trkpt><trkpt lat="48.8504066467285" lon="2.38315200805664"><ele>40.8615</ele><time>2007-04-15T09:01:42Z</time></trkpt><trkpt lat="48.8504028320312" lon="2.3833475112915"><ele>40.4195</ele><time>2007-04-15T09:01:43Z</time></trkpt><trkpt lat="48.8503761291504" lon="2.38348031044006"><ele>40.5637</ele><time>2007-04-15T09:01:44Z</time></trkpt><trkpt lat="48.8503723144531" lon="2.38351321220398"><ele>40.6281</ele><time>2007-04-15T09:01:45Z</time></trkpt><trkpt lat="48.8503913879394" lon="2.38370299339294"><ele>41.2556</ele><time>2007-04-15T09:01:46Z</time></trkpt><trkpt lat="48.8503952026367" lon="2.38381958007812"><ele>41.5769</ele><time>2007-04-15T09:01:47Z</time></trkpt><trkpt lat="48.8503837585449" lon="2.38408708572388"><ele>42.2469</ele><time>2007-04-15T09:01:48Z</time></trkpt><trkpt lat="48.8503684997559" lon="2.38431167602539"><ele>42.8103</ele><time>2007-04-15T09:01:49Z</time></trkpt><trkpt lat="48.8503303527832" lon="2.38450407981873"><ele>43.2901</ele><time>2007-04-15T09:01:50Z</time></trkpt><trkpt lat="48.8502769470215" lon="2.38475751876831"><ele>43.9881</ele><time>2007-04-15T09:01:51Z</time></trkpt><trkpt lat="48.8502311706543" lon="2.38493728637695"><ele>44.5386</ele><time>2007-04-15T09:01:52Z</time></trkpt><trkpt lat="48.8501968383789" lon="2.3850998878479"><ele>45.0318</ele><time>2007-04-15T09:01:53Z</time></trkpt><trkpt lat="48.8501625061035" lon="2.3852436542511"><ele>45.4468</ele><time>2007-04-15T09:01:54Z</time></trkpt><trkpt lat="48.8501167297363" lon="2.38542079925537"><ele>45.9406</ele><time>2007-04-15T09:01:55Z</time></trkpt><trkpt lat="48.8500633239746" lon="2.38557553291321"><ele>46.3578</ele><time>2007-04-15T09:01:56Z</time></trkpt><trkpt lat="48.8499908447266" lon="2.38574910163879"><ele>46.7353</ele><time>2007-04-15T09:01:57Z</time></trkpt><trkpt lat="48.8499221801758" lon="2.38592600822449"><ele>46.3493</ele><time>2007-04-15T09:01:58Z</time></trkpt><trkpt lat="48.8498916625977" lon="2.38612985610962"><ele>45.9567</ele><time>2007-04-15T09:01:59Z</time></trkpt><trkpt lat="48.8498840332031" lon="2.38627767562866"><ele>45.7802</ele><time>2007-04-15T09:02:00Z</time></trkpt><trkpt lat="48.8498764038086" lon="2.38631796836853"><ele>45.7011</ele><time>2007-04-15T09:02:01Z</time></trkpt><trkpt lat="48.8498497009277" lon="2.3865385055542"><ele>45.3769</ele><time>2007-04-15T09:02:02Z</time></trkpt><trkpt lat="48.8498306274414" lon="2.38665246963501"><ele>45.1971</ele><time>2007-04-15T09:02:03Z</time></trkpt><trkpt lat="48.8498306274414" lon="2.38686609268188"><ele>45.3329</ele><time>2007-04-15T09:02:04Z</time></trkpt><trkpt lat="48.8498268127441" lon="2.38707518577576"><ele>45.4743</ele><time>2007-04-15T09:02:05Z</time></trkpt><trkpt lat="48.8498344421387" lon="2.38730382919312"><ele>45.661</ele><time>2007-04-15T09:02:06Z</time></trkpt><trkpt lat="48.8498306274414" lon="2.38752722740173"><ele>45.7707</ele><time>2007-04-15T09:02:07Z</time></trkpt><trkpt lat="48.849781036377" lon="2.38771867752075"><ele>45.5438</ele><time>2007-04-15T09:02:08Z</time></trkpt><trkpt lat="48.8497352600098" lon="2.3879280090332"><ele>45.3319</ele><time>2007-04-15T09:02:09Z</time></trkpt><trkpt lat="48.8497047424316" lon="2.3881356716156"><ele>45.1532</ele><time>2007-04-15T09:02:10Z</time></trkpt><trkpt lat="48.8496856689453" lon="2.38826084136963"><ele>45.0542</ele><time>2007-04-15T09:02:11Z</time></trkpt><trkpt lat="48.8496780395508" lon="2.38847637176514"><ele>45.5149</ele><time>2007-04-15T09:02:12Z</time></trkpt><trkpt lat="48.8496551513672" lon="2.38866186141968"><ele>46.1827</ele><time>2007-04-15T09:02:13Z</time></trkpt><trkpt lat="48.8496513366699" lon="2.38870525360107"><ele>46.3389</ele><time>2007-04-15T09:02:14Z</time></trkpt><trkpt lat="48.8496513366699" lon="2.38871693611145"><ele>46.381</ele><time>2007-04-15T09:02:15Z</time></trkpt><trkpt lat="48.8496513366699" lon="2.38874006271362"><ele>46.4642</ele><time>2007-04-15T09:02:16Z</time></trkpt><trkpt lat="48.8496398925781" lon="2.38889169692993"><ele>47.0101</ele><time>2007-04-15T09:02:17Z</time></trkpt><trkpt lat="48.8496170043945" lon="2.38910341262817"><ele>47.7723</ele><time>2007-04-15T09:02:18Z</time></trkpt><trkpt lat="48.8496131896973" lon="2.38926339149475"><ele>48.2488</ele><time>2007-04-15T09:02:19Z</time></trkpt><trkpt lat="48.8495826721191" lon="2.38940739631653"><ele>48.5768</ele><time>2007-04-15T09:02:20Z</time></trkpt><trkpt lat="48.8495483398438" lon="2.38957929611206"><ele>48.9071</ele><time>2007-04-15T09:02:21Z</time></trkpt><trkpt lat="48.849536895752" lon="2.38961958885193"><ele>48.9659</ele><time>2007-04-15T09:02:22Z</time></trkpt><trkpt lat="48.8495063781738" lon="2.38980674743652"><ele>49.2525</ele><time>2007-04-15T09:02:23Z</time></trkpt><trkpt lat="48.8494911193848" lon="2.38987922668457"><ele>49.3317</ele><time>2007-04-15T09:02:24Z</time></trkpt><trkpt lat="48.8494491577148" lon="2.39009642601013"><ele>49.4344</ele><time>2007-04-15T09:02:25Z</time></trkpt><trkpt lat="48.8494071960449" lon="2.39035534858704"><ele>49.4007</ele><time>2007-04-15T09:02:26Z</time></trkpt><trkpt lat="48.8493728637695" lon="2.39055776596069"><ele>49.321</ele><time>2007-04-15T09:02:27Z</time></trkpt><trkpt lat="48.8493347167969" lon="2.39074492454529"><ele>49.1672</ele><time>2007-04-15T09:02:28Z</time></trkpt><trkpt lat="48.8493156433106" lon="2.39090609550476"><ele>49.2317</ele><time>2007-04-15T09:02:29Z</time></trkpt><trkpt lat="48.8492851257324" lon="2.39110541343689"><ele>49.4595</ele><time>2007-04-15T09:02:30Z</time></trkpt><trkpt lat="48.8492813110352" lon="2.39114117622376"><ele>49.5134</ele><time>2007-04-15T09:02:31Z</time></trkpt><trkpt lat="48.8492774963379" lon="2.39117050170898"><ele>49.5534</ele><time>2007-04-15T09:02:32Z</time></trkpt><trkpt lat="48.8492279052734" lon="2.39155006408691"><ele>50.0979</ele><time>2007-04-15T09:02:33Z</time></trkpt><trkpt lat="48.8492126464844" lon="2.39170169830322"><ele>50.3156</ele><time>2007-04-15T09:02:34Z</time></trkpt><trkpt lat="48.8491821289062" lon="2.39185333251953"><ele>50.3126</ele><time>2007-04-15T09:02:35Z</time></trkpt><trkpt lat="48.8491477966309" lon="2.39202260971069"><ele>50.4561</ele><time>2007-04-15T09:02:36Z</time></trkpt><trkpt lat="48.8491058349609" lon="2.39218401908874"><ele>50.7568</ele><time>2007-04-15T09:02:37Z</time></trkpt><trkpt lat="48.8490295410156" lon="2.39235401153564"><ele>51.232</ele><time>2007-04-15T09:02:38Z</time></trkpt><trkpt lat="48.848991394043" lon="2.39247798919678"><ele>51.5879</ele><time>2007-04-15T09:02:39Z</time></trkpt><trkpt lat="48.8489570617676" lon="2.39264869689941"><ele>52.6457</ele><time>2007-04-15T09:02:40Z</time></trkpt><trkpt lat="48.8489418029785" lon="2.39283204078674"><ele>53.7701</ele><time>2007-04-15T09:02:41Z</time></trkpt><trkpt lat="48.8488998413086" lon="2.39306855201721"><ele>55.1803</ele><time>2007-04-15T09:02:42Z</time></trkpt><trkpt lat="48.8488540649414" lon="2.39325642585754"><ele>56.2096</ele><time>2007-04-15T09:02:43Z</time></trkpt><trkpt lat="48.848819732666" lon="2.39344692230225"><ele>56.6632</ele><time>2007-04-15T09:02:44Z</time></trkpt><trkpt lat="48.8487930297852" lon="2.39360737800598"><ele>56.733</ele><time>2007-04-15T09:02:45Z</time></trkpt><trkpt lat="48.848747253418" lon="2.39376664161682"><ele>56.755</ele><time>2007-04-15T09:02:46Z</time></trkpt><trkpt lat="48.8487167358398" lon="2.39396619796753"><ele>56.8095</ele><time>2007-04-15T09:02:47Z</time></trkpt><trkpt lat="48.8486785888672" lon="2.39412689208984"><ele>56.8088</ele><time>2007-04-15T09:02:48Z</time></trkpt><trkpt lat="48.8486518859863" lon="2.39431953430176"><ele>55.8473</ele><time>2007-04-15T09:02:49Z</time></trkpt><trkpt lat="48.8486099243164" lon="2.39449334144592"><ele>54.7038</ele><time>2007-04-15T09:02:50Z</time></trkpt><trkpt lat="48.8485641479492" lon="2.39468741416931"><ele>53.4295</ele><time>2007-04-15T09:02:51Z</time></trkpt><trkpt lat="48.8485374450684" lon="2.39487075805664"><ele>52.2653</ele><time>2007-04-15T09:02:52Z</time></trkpt><trkpt lat="48.8484840393066" lon="2.39501881599426"><ele>51.3658</ele><time>2007-04-15T09:02:53Z</time></trkpt><trkpt lat="48.8484077453613" lon="2.39515018463135"><ele>51.1947</ele><time>2007-04-15T09:02:54Z</time></trkpt><trkpt lat="48.8483200073242" lon="2.39531826972961"><ele>51.1058</ele><time>2007-04-15T09:02:55Z</time></trkpt><trkpt lat="48.8482246398926" lon="2.39542603492737"><ele>51.8463</ele><time>2007-04-15T09:02:56Z</time></trkpt><trkpt lat="48.8481101989746" lon="2.39553904533386"><ele>52.7011</ele><time>2007-04-15T09:02:57Z</time></trkpt><trkpt lat="48.8480415344238" lon="2.39566993713379"><ele>53.1696</ele><time>2007-04-15T09:02:58Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.395840883255"><ele>53.3501</ele><time>2007-04-15T09:02:59Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.39602541923523"><ele>53.3982</ele><time>2007-04-15T09:03:00Z</time></trkpt><trkpt lat="48.8480415344238" lon="2.39623093605042"><ele>53.2439</ele><time>2007-04-15T09:03:01Z</time></trkpt><trkpt lat="48.8480834960938" lon="2.39639639854431"><ele>53.0694</ele><time>2007-04-15T09:03:02Z</time></trkpt><trkpt lat="48.8481369018555" lon="2.39661812782288"><ele>52.9121</ele><time>2007-04-15T09:03:03Z</time></trkpt><trkpt lat="48.8481903076172" lon="2.39680790901184"><ele>53.3063</ele><time>2007-04-15T09:03:04Z</time></trkpt><trkpt lat="48.8481941223144" lon="2.39684081077576"><ele>53.4343</ele><time>2007-04-15T09:03:05Z</time></trkpt><trkpt lat="48.8482093811035" lon="2.3970205783844"><ele>54.1674</ele><time>2007-04-15T09:03:06Z</time></trkpt><trkpt lat="48.8482055664062" lon="2.39718198776245"><ele>54.8972</ele><time>2007-04-15T09:03:07Z</time></trkpt><trkpt lat="48.8481979370117" lon="2.39733862876892"><ele>55.6133</ele><time>2007-04-15T09:03:08Z</time></trkpt><trkpt lat="48.848201751709" lon="2.39755654335022"><ele>56.4515</ele><time>2007-04-15T09:03:09Z</time></trkpt><trkpt lat="48.8482055664062" lon="2.39782238006592"><ele>57.0804</ele><time>2007-04-15T09:03:10Z</time></trkpt><trkpt lat="48.8481979370117" lon="2.39796590805054"><ele>57.4431</ele><time>2007-04-15T09:03:11Z</time></trkpt><trkpt lat="48.8481903076172" lon="2.39821720123291"><ele>58.0645</ele><time>2007-04-15T09:03:12Z</time></trkpt><trkpt lat="48.8481903076172" lon="2.39839267730713"><ele>58.0217</ele><time>2007-04-15T09:03:13Z</time></trkpt><trkpt lat="48.8481712341309" lon="2.3985435962677"><ele>57.2325</ele><time>2007-04-15T09:03:14Z</time></trkpt><trkpt lat="48.8481483459473" lon="2.39880514144897"><ele>55.8022</ele><time>2007-04-15T09:03:15Z</time></trkpt><trkpt lat="48.8481101989746" lon="2.399080991745"><ele>54.2261</ele><time>2007-04-15T09:03:16Z</time></trkpt><trkpt lat="48.8480911254883" lon="2.39931654930115"><ele>53.9415</ele><time>2007-04-15T09:03:17Z</time></trkpt><trkpt lat="48.8480796813965" lon="2.39956855773926"><ele>54.3247</ele><time>2007-04-15T09:03:18Z</time></trkpt><trkpt lat="48.8480644226074" lon="2.39987468719482"><ele>54.8011</ele><time>2007-04-15T09:03:19Z</time></trkpt><trkpt lat="48.8480491638184" lon="2.40018486976624"><ele>55.595</ele><time>2007-04-15T09:03:20Z</time></trkpt><trkpt lat="48.848014831543" lon="2.40040302276611"><ele>56.3369</ele><time>2007-04-15T09:03:21Z</time></trkpt><trkpt lat="48.8479843139648" lon="2.40059375762939"><ele>57.0219</ele><time>2007-04-15T09:03:22Z</time></trkpt><trkpt lat="48.8479423522949" lon="2.40091133117676"><ele>57.8944</ele><time>2007-04-15T09:03:23Z</time></trkpt><trkpt lat="48.8479042053223" lon="2.40112709999084"><ele>57.8484</ele><time>2007-04-15T09:03:24Z</time></trkpt><trkpt lat="48.8478851318359" lon="2.40136742591858"><ele>57.731</ele><time>2007-04-15T09:03:25Z</time></trkpt><trkpt lat="48.8478622436523" lon="2.40163660049438"><ele>57.5857</ele><time>2007-04-15T09:03:26Z</time></trkpt><trkpt lat="48.8478507995606" lon="2.40183234214783"><ele>57.4117</ele><time>2007-04-15T09:03:27Z</time></trkpt><trkpt lat="48.8478202819824" lon="2.40213918685913"><ele>57.1798</ele><time>2007-04-15T09:03:28Z</time></trkpt><trkpt lat="48.8478012084961" lon="2.40232181549072"><ele>57.0702</ele><time>2007-04-15T09:03:29Z</time></trkpt><trkpt lat="48.847785949707" lon="2.40249228477478"><ele>56.9769</ele><time>2007-04-15T09:03:30Z</time></trkpt><trkpt lat="48.8477516174316" lon="2.40273332595825"><ele>57.9342</ele><time>2007-04-15T09:03:31Z</time></trkpt><trkpt lat="48.8477478027344" lon="2.40300464630127"><ele>58.9246</ele><time>2007-04-15T09:03:32Z</time></trkpt><trkpt lat="48.8477325439453" lon="2.40327501296997"><ele>59.9529</ele><time>2007-04-15T09:03:33Z</time></trkpt><trkpt lat="48.8477210998535" lon="2.40352177619934"><ele>59.5856</ele><time>2007-04-15T09:03:34Z</time></trkpt><trkpt lat="48.8477058410644" lon="2.40372586250305"><ele>58.9622</ele><time>2007-04-15T09:03:35Z</time></trkpt><trkpt lat="48.8477058410644" lon="2.40398597717285"><ele>58.1029</ele><time>2007-04-15T09:03:36Z</time></trkpt><trkpt lat="48.8476905822754" lon="2.40418410301208"><ele>57.4763</ele><time>2007-04-15T09:03:37Z</time></trkpt><trkpt lat="48.8476829528809" lon="2.40443444252014"><ele>56.5186</ele><time>2007-04-15T09:03:38Z</time></trkpt><trkpt lat="48.8476638793945" lon="2.40461707115173"><ele>55.7546</ele><time>2007-04-15T09:03:39Z</time></trkpt><trkpt lat="48.8476371765137" lon="2.4048330783844"><ele>54.7254</ele><time>2007-04-15T09:03:40Z</time></trkpt><trkpt lat="48.8476104736328" lon="2.40503764152527"><ele>53.8346</ele><time>2007-04-15T09:03:41Z</time></trkpt><trkpt lat="48.8475875854492" lon="2.40526103973389"><ele>53.9109</ele><time>2007-04-15T09:03:42Z</time></trkpt><trkpt lat="48.8475379943848" lon="2.40549612045288"><ele>53.8418</ele><time>2007-04-15T09:03:43Z</time></trkpt><trkpt lat="48.8475227355957" lon="2.40555953979492"><ele>53.8168</ele><time>2007-04-15T09:03:44Z</time></trkpt><trkpt lat="48.8475227355957" lon="2.40578627586365"><ele>54.0815</ele><time>2007-04-15T09:03:45Z</time></trkpt><trkpt lat="48.8475036621094" lon="2.40594410896301"><ele>53.7544</ele><time>2007-04-15T09:03:46Z</time></trkpt><trkpt lat="48.8474731445312" lon="2.40614199638367"><ele>53.3356</ele><time>2007-04-15T09:03:47Z</time></trkpt><trkpt lat="48.8474578857422" lon="2.40639281272888"><ele>52.7923</ele><time>2007-04-15T09:03:48Z</time></trkpt><trkpt lat="48.8474388122559" lon="2.40662813186646"><ele>52.3094</ele><time>2007-04-15T09:03:49Z</time></trkpt><trkpt lat="48.8474082946777" lon="2.40680861473084"><ele>52.4442</ele><time>2007-04-15T09:03:50Z</time></trkpt><trkpt lat="48.8473739624023" lon="2.40704822540283"><ele>52.7039</ele><time>2007-04-15T09:03:51Z</time></trkpt><trkpt lat="48.8473472595215" lon="2.4072699546814"><ele>52.8757</ele><time>2007-04-15T09:03:52Z</time></trkpt><trkpt lat="48.8473320007324" lon="2.40754151344299"><ele>52.99</ele><time>2007-04-15T09:03:53Z</time></trkpt><trkpt lat="48.8473320007324" lon="2.40771007537842"><ele>52.9492</ele><time>2007-04-15T09:03:54Z</time></trkpt><trkpt lat="48.8473167419434" lon="2.40791058540344"><ele>52.8917</ele><time>2007-04-15T09:03:55Z</time></trkpt><trkpt lat="48.8472938537598" lon="2.40815377235413"><ele>52.8059</ele><time>2007-04-15T09:03:56Z</time></trkpt><trkpt lat="48.8472709655762" lon="2.40832448005676"><ele>52.7281</ele><time>2007-04-15T09:03:57Z</time></trkpt><trkpt lat="48.8472366333008" lon="2.408527135849"><ele>53.5286</ele><time>2007-04-15T09:03:58Z</time></trkpt><trkpt lat="48.8472061157227" lon="2.40870356559753"><ele>54.2935</ele><time>2007-04-15T09:03:59Z</time></trkpt><trkpt lat="48.8471717834473" lon="2.40895485877991"><ele>55.4311</ele><time>2007-04-15T09:04:00Z</time></trkpt><trkpt lat="48.8471641540527" lon="2.4092583656311"><ele>56.1172</ele><time>2007-04-15T09:04:01Z</time></trkpt><trkpt lat="48.8471527099609" lon="2.409428358078"><ele>55.6055</ele><time>2007-04-15T09:04:02Z</time></trkpt><trkpt lat="48.8471336364746" lon="2.40958070755005"><ele>55.1675</ele><time>2007-04-15T09:04:03Z</time></trkpt><trkpt lat="48.8471336364746" lon="2.40973877906799"><ele>54.6819</ele><time>2007-04-15T09:04:04Z</time></trkpt><trkpt lat="48.8471145629883" lon="2.40993332862854"><ele>54.1281</ele><time>2007-04-15T09:04:05Z</time></trkpt><trkpt lat="48.8471031188965" lon="2.41013383865356"><ele>54.0443</ele><time>2007-04-15T09:04:06Z</time></trkpt><trkpt lat="48.847095489502" lon="2.41028213500977"><ele>54.1549</ele><time>2007-04-15T09:04:07Z</time></trkpt><trkpt lat="48.8470840454102" lon="2.41037511825562"><ele>54.2245</ele><time>2007-04-15T09:04:08Z</time></trkpt><trkpt lat="48.8470649719238" lon="2.41052746772766"><ele>54.3187</ele><time>2007-04-15T09:04:09Z</time></trkpt><trkpt lat="48.847038269043" lon="2.41071724891663"><ele>54.3989</ele><time>2007-04-15T09:04:10Z</time></trkpt><trkpt lat="48.8469467163086" lon="2.41084098815918"><ele>54.3422</ele><time>2007-04-15T09:04:11Z</time></trkpt><trkpt lat="48.8468055725098" lon="2.41095185279846"><ele>54.2141</ele><time>2007-04-15T09:04:12Z</time></trkpt><trkpt lat="48.8466758728027" lon="2.41099762916565"><ele>54.0154</ele><time>2007-04-15T09:04:13Z</time></trkpt><trkpt lat="48.846549987793" lon="2.41096425056458"><ele>54.324</ele><time>2007-04-15T09:04:14Z</time></trkpt><trkpt lat="48.8464012145996" lon="2.41091108322144"><ele>54.6965</ele><time>2007-04-15T09:04:15Z</time></trkpt><trkpt lat="48.8462753295898" lon="2.41086864471436"><ele>54.979</ele><time>2007-04-15T09:04:16Z</time></trkpt><trkpt lat="48.8461837768555" lon="2.4108304977417"><ele>55.1604</ele><time>2007-04-15T09:04:17Z</time></trkpt><trkpt lat="48.8460807800293" lon="2.41081142425537"><ele>55.4139</ele><time>2007-04-15T09:04:18Z</time></trkpt><trkpt lat="48.8460311889648" lon="2.41079688072205"><ele>55.5355</ele><time>2007-04-15T09:04:19Z</time></trkpt><trkpt lat="48.8460235595703" lon="2.4107928276062"><ele>55.5546</ele><time>2007-04-15T09:04:20Z</time></trkpt><trkpt lat="48.8460083007812" lon="2.41078448295593"><ele>55.5924</ele><time>2007-04-15T09:04:21Z</time></trkpt><trkpt lat="48.8459320068359" lon="2.41075897216797"><ele>55.7738</ele><time>2007-04-15T09:04:22Z</time></trkpt><trkpt lat="48.8458099365234" lon="2.41074681282043"><ele>55.9778</ele><time>2007-04-15T09:04:23Z</time></trkpt><trkpt lat="48.8457183837891" lon="2.41075825691223"><ele>55.8869</ele><time>2007-04-15T09:04:24Z</time></trkpt><trkpt lat="48.845573425293" lon="2.41076326370239"><ele>55.7406</ele><time>2007-04-15T09:04:25Z</time></trkpt><trkpt lat="48.845458984375" lon="2.41075205802917"><ele>55.6384</ele><time>2007-04-15T09:04:26Z</time></trkpt><trkpt lat="48.8453025817871" lon="2.41072177886963"><ele>55.5336</ele><time>2007-04-15T09:04:27Z</time></trkpt><trkpt lat="48.8451805114746" lon="2.41068005561829"><ele>55.5048</ele><time>2007-04-15T09:04:28Z</time></trkpt><trkpt lat="48.8450584411621" lon="2.41063952445984"><ele>55.5027</ele><time>2007-04-15T09:04:29Z</time></trkpt><trkpt lat="48.8449249267578" lon="2.41059422492981"><ele>55.4579</ele><time>2007-04-15T09:04:30Z</time></trkpt><trkpt lat="48.8447685241699" lon="2.41056180000305"><ele>55.2834</ele><time>2007-04-15T09:04:31Z</time></trkpt><trkpt lat="48.8446807861328" lon="2.41049575805664"><ele>55.2719</ele><time>2007-04-15T09:04:32Z</time></trkpt><trkpt lat="48.844554901123" lon="2.4104585647583"><ele>55.1251</ele><time>2007-04-15T09:04:33Z</time></trkpt><trkpt lat="48.8444519042969" lon="2.41043901443481"><ele>54.9774</ele><time>2007-04-15T09:04:34Z</time></trkpt><trkpt lat="48.8443260192871" lon="2.41041207313538"><ele>54.7934</ele><time>2007-04-15T09:04:35Z</time></trkpt><trkpt lat="48.8442077636719" lon="2.41032314300537"><ele>54.6917</ele><time>2007-04-15T09:04:36Z</time></trkpt><trkpt lat="48.844066619873" lon="2.41020894050598"><ele>55.1395</ele><time>2007-04-15T09:04:37Z</time></trkpt><trkpt lat="48.8439025878906" lon="2.4101710319519"><ele>55.8105</ele><time>2007-04-15T09:04:38Z</time></trkpt><trkpt lat="48.8437194824219" lon="2.41009330749512"><ele>56.558</ele><time>2007-04-15T09:04:39Z</time></trkpt><trkpt lat="48.8435897827148" lon="2.41004681587219"><ele>57.0595</ele><time>2007-04-15T09:04:40Z</time></trkpt><trkpt lat="48.8434600830078" lon="2.40999341011047"><ele>57.5382</ele><time>2007-04-15T09:04:41Z</time></trkpt><trkpt lat="48.8433303833008" lon="2.4099428653717"><ele>57.9314</ele><time>2007-04-15T09:04:42Z</time></trkpt><trkpt lat="48.8431816101074" lon="2.4098756313324"><ele>57.8508</ele><time>2007-04-15T09:04:43Z</time></trkpt><trkpt lat="48.8430328369141" lon="2.40984201431274"><ele>57.8104</ele><time>2007-04-15T09:04:44Z</time></trkpt><trkpt lat="48.8428802490234" lon="2.40982007980347"><ele>57.7841</ele><time>2007-04-15T09:04:45Z</time></trkpt><trkpt lat="48.8427238464356" lon="2.40985894203186"><ele>57.8307</ele><time>2007-04-15T09:04:46Z</time></trkpt><trkpt lat="48.8425750732422" lon="2.40982007980347"><ele>57.7841</ele><time>2007-04-15T09:04:47Z</time></trkpt><trkpt lat="48.8424758911133" lon="2.40978169441223"><ele>57.6237</ele><time>2007-04-15T09:04:48Z</time></trkpt><trkpt lat="48.84228515625" lon="2.40975165367126"><ele>56.7202</ele><time>2007-04-15T09:04:49Z</time></trkpt><trkpt lat="48.8422317504883" lon="2.40973353385925"><ele>56.4825</ele><time>2007-04-15T09:04:50Z</time></trkpt><trkpt lat="48.8422241210938" lon="2.40972805023193"><ele>56.4505</ele><time>2007-04-15T09:04:51Z</time></trkpt><trkpt lat="48.842212677002" lon="2.4097170829773"><ele>56.4048</ele><time>2007-04-15T09:04:52Z</time></trkpt><trkpt lat="48.8421096801758" lon="2.40964531898499"><ele>56.0299</ele><time>2007-04-15T09:04:53Z</time></trkpt><trkpt lat="48.8419609069824" lon="2.40954899787903"><ele>55.6247</ele><time>2007-04-15T09:04:54Z</time></trkpt><trkpt lat="48.8417739868164" lon="2.40946650505066"><ele>55.2347</ele><time>2007-04-15T09:04:55Z</time></trkpt><trkpt lat="48.8416481018066" lon="2.40940618515015"><ele>55.1091</ele><time>2007-04-15T09:04:56Z</time></trkpt><trkpt lat="48.8415222167969" lon="2.40934801101685"><ele>55.1361</ele><time>2007-04-15T09:04:57Z</time></trkpt><trkpt lat="48.8413772583008" lon="2.40929174423218"><ele>55.1503</ele><time>2007-04-15T09:04:58Z</time></trkpt><trkpt lat="48.8412551879883" lon="2.40924119949341"><ele>55.1937</ele><time>2007-04-15T09:04:59Z</time></trkpt><trkpt lat="48.8411331176758" lon="2.40917944908142"><ele>55.3039</ele><time>2007-04-15T09:05:00Z</time></trkpt><trkpt lat="48.8410034179688" lon="2.40913081169128"><ele>55.1874</ele><time>2007-04-15T09:05:01Z</time></trkpt><trkpt lat="48.8408737182617" lon="2.40911269187927"><ele>54.9931</ele><time>2007-04-15T09:05:02Z</time></trkpt><trkpt lat="48.8407135009766" lon="2.40910696983337"><ele>54.0965</ele><time>2007-04-15T09:05:03Z</time></trkpt><trkpt lat="48.8405494689941" lon="2.40908026695251"><ele>52.9585</ele><time>2007-04-15T09:05:04Z</time></trkpt><trkpt lat="48.8404083251953" lon="2.40906000137329"><ele>52.0078</ele><time>2007-04-15T09:05:05Z</time></trkpt><trkpt lat="48.8402633666992" lon="2.40901494026184"><ele>51.0878</ele><time>2007-04-15T09:05:06Z</time></trkpt><trkpt lat="48.8401336669922" lon="2.40900659561157"><ele>50.2541</ele><time>2007-04-15T09:05:07Z</time></trkpt><trkpt lat="48.8400115966797" lon="2.4089777469635"><ele>49.5274</ele><time>2007-04-15T09:05:08Z</time></trkpt><trkpt lat="48.8398590087891" lon="2.40894246101379"><ele>49.3363</ele><time>2007-04-15T09:05:09Z</time></trkpt><trkpt lat="48.8396911621094" lon="2.4088888168335"><ele>49.2963</ele><time>2007-04-15T09:05:10Z</time></trkpt><trkpt lat="48.8395614624023" lon="2.40883612632751"><ele>49.367</ele><time>2007-04-15T09:05:11Z</time></trkpt><trkpt lat="48.8394088745117" lon="2.40876770019531"><ele>49.5576</ele><time>2007-04-15T09:05:12Z</time></trkpt><trkpt lat="48.8392601013184" lon="2.40869903564453"><ele>49.8413</ele><time>2007-04-15T09:05:13Z</time></trkpt><trkpt lat="48.8391036987305" lon="2.40865969657898"><ele>49.9663</ele><time>2007-04-15T09:05:14Z</time></trkpt><trkpt lat="48.8389511108398" lon="2.408611536026"><ele>50.0721</ele><time>2007-04-15T09:05:15Z</time></trkpt><trkpt lat="48.8388061523438" lon="2.40855550765991"><ele>50.2343</ele><time>2007-04-15T09:05:16Z</time></trkpt><trkpt lat="48.8386573791504" lon="2.40851759910584"><ele>50.2833</ele><time>2007-04-15T09:05:17Z</time></trkpt><trkpt lat="48.8385391235352" lon="2.40847754478455"><ele>50.3817</ele><time>2007-04-15T09:05:18Z</time></trkpt><trkpt lat="48.8385200500488" lon="2.40846943855286"><ele>50.4074</ele><time>2007-04-15T09:05:19Z</time></trkpt><trkpt lat="48.8383636474609" lon="2.40839767456055"><ele>50.6503</ele><time>2007-04-15T09:05:20Z</time></trkpt><trkpt lat="48.8381996154785" lon="2.40832662582397"><ele>51.4801</ele><time>2007-04-15T09:05:21Z</time></trkpt><trkpt lat="48.8380661010742" lon="2.40827202796936"><ele>51.9384</ele><time>2007-04-15T09:05:22Z</time></trkpt><trkpt lat="48.837947845459" lon="2.40822505950928"><ele>52.3277</ele><time>2007-04-15T09:05:23Z</time></trkpt><trkpt lat="48.837833404541" lon="2.4081757068634"><ele>52.6863</ele><time>2007-04-15T09:05:24Z</time></trkpt><trkpt lat="48.8377075195312" lon="2.40816211700439"><ele>53.0986</ele><time>2007-04-15T09:05:25Z</time></trkpt><trkpt lat="48.8375968933106" lon="2.40816140174866"><ele>53.4689</ele><time>2007-04-15T09:05:26Z</time></trkpt><trkpt lat="48.8374557495117" lon="2.40815138816834"><ele>53.6871</ele><time>2007-04-15T09:05:27Z</time></trkpt><trkpt lat="48.8373222351074" lon="2.40806579589844"><ele>53.3208</ele><time>2007-04-15T09:05:28Z</time></trkpt><trkpt lat="48.8371429443359" lon="2.40807366371155"><ele>52.965</ele><time>2007-04-15T09:05:29Z</time></trkpt><trkpt lat="48.8369827270508" lon="2.40807104110718"><ele>52.6392</ele><time>2007-04-15T09:05:30Z</time></trkpt><trkpt lat="48.8368835449219" lon="2.40795063972473"><ele>52.401</ele><time>2007-04-15T09:05:31Z</time></trkpt><trkpt lat="48.8368225097656" lon="2.40787887573242"><ele>52.272</ele><time>2007-04-15T09:05:32Z</time></trkpt><trkpt lat="48.8368110656738" lon="2.4078574180603"><ele>52.2476</ele><time>2007-04-15T09:05:33Z</time></trkpt><trkpt lat="48.8367805480957" lon="2.40778803825378"><ele>52.1839</ele><time>2007-04-15T09:05:34Z</time></trkpt><trkpt lat="48.8367729187012" lon="2.40776300430298"><ele>52.1677</ele><time>2007-04-15T09:05:35Z</time></trkpt><trkpt lat="48.8367691040039" lon="2.4077627658844"><ele>52.1617</ele><time>2007-04-15T09:05:36Z</time></trkpt><trkpt lat="48.8367004394531" lon="2.40776038169861"><ele>52.0532</ele><time>2007-04-15T09:05:37Z</time></trkpt><trkpt lat="48.8367080688477" lon="2.40771865844727"><ele>52.0627</ele><time>2007-04-15T09:05:38Z</time></trkpt><trkpt lat="48.8367118835449" lon="2.40772104263306"><ele>52.0687</ele><time>2007-04-15T09:05:39Z</time></trkpt><trkpt lat="48.8367118835449" lon="2.40771508216858"><ele>52.0683</ele><time>2007-04-15T09:05:40Z</time></trkpt><trkpt lat="48.8367118835449" lon="2.40769696235657"><ele>52.0671</ele><time>2007-04-15T09:05:41Z</time></trkpt><trkpt lat="48.8366889953613" lon="2.40771675109863"><ele>52.0338</ele><time>2007-04-15T09:05:42Z</time></trkpt><trkpt lat="48.8366394042969" lon="2.40772080421448"><ele>52.0674</ele><time>2007-04-15T09:05:43Z</time></trkpt><trkpt lat="48.836555480957" lon="2.4076566696167"><ele>52.2338</ele><time>2007-04-15T09:05:44Z</time></trkpt><trkpt lat="48.8365058898926" lon="2.40761375427246"><ele>52.2983</ele><time>2007-04-15T09:05:45Z</time></trkpt><trkpt lat="48.836483001709" lon="2.40760278701782"><ele>52.3291</ele><time>2007-04-15T09:05:46Z</time></trkpt><trkpt lat="48.8364791870117" lon="2.40760016441345"><ele>52.3331</ele><time>2007-04-15T09:05:47Z</time></trkpt><trkpt lat="48.8364105224609" lon="2.40754675865173"><ele>52.3764</ele><time>2007-04-15T09:05:48Z</time></trkpt><trkpt lat="48.8362617492676" lon="2.40739130973816"><ele>51.8374</ele><time>2007-04-15T09:05:49Z</time></trkpt><trkpt lat="48.8361358642578" lon="2.40726327896118"><ele>51.1388</ele><time>2007-04-15T09:05:50Z</time></trkpt><trkpt lat="48.8360176086426" lon="2.40716361999512"><ele>50.5355</ele><time>2007-04-15T09:05:51Z</time></trkpt><trkpt lat="48.8359298706055" lon="2.40707087516785"><ele>49.9138</ele><time>2007-04-15T09:05:52Z</time></trkpt><trkpt lat="48.8358573913574" lon="2.407057762146"><ele>49.8177</ele><time>2007-04-15T09:05:53Z</time></trkpt><trkpt lat="48.8357276916504" lon="2.40700197219849"><ele>49.5395</ele><time>2007-04-15T09:05:54Z</time></trkpt><trkpt lat="48.8355751037598" lon="2.40695858001709"><ele>49.4887</ele><time>2007-04-15T09:05:55Z</time></trkpt><trkpt lat="48.8354072570801" lon="2.40691757202148"><ele>49.5707</ele><time>2007-04-15T09:05:56Z</time></trkpt><trkpt lat="48.8352851867676" lon="2.40696477890015"><ele>49.9432</ele><time>2007-04-15T09:05:57Z</time></trkpt><trkpt lat="48.8352241516113" lon="2.40708017349243"><ele>50.3566</ele><time>2007-04-15T09:05:58Z</time></trkpt><trkpt lat="48.8351516723633" lon="2.40727305412292"><ele>50.8438</ele><time>2007-04-15T09:05:59Z</time></trkpt><trkpt lat="48.8350982666016" lon="2.40742874145508"><ele>51.0999</ele><time>2007-04-15T09:06:00Z</time></trkpt><trkpt lat="48.8350410461426" lon="2.4075779914856"><ele>51.2949</ele><time>2007-04-15T09:06:01Z</time></trkpt><trkpt lat="48.8349609375" lon="2.40780735015869"><ele>51.8733</ele><time>2007-04-15T09:06:02Z</time></trkpt><trkpt lat="48.8349342346191" lon="2.40802955627441"><ele>52.4362</ele><time>2007-04-15T09:06:03Z</time></trkpt><trkpt lat="48.8349227905273" lon="2.40827226638794"><ele>52.9665</ele><time>2007-04-15T09:06:04Z</time></trkpt><trkpt lat="48.8348922729492" lon="2.40847373008728"><ele>52.8955</ele><time>2007-04-15T09:06:05Z</time></trkpt><trkpt lat="48.834831237793" lon="2.40871906280518"><ele>52.4584</ele><time>2007-04-15T09:06:06Z</time></trkpt><trkpt lat="48.8347663879394" lon="2.40888690948486"><ele>52.0574</ele><time>2007-04-15T09:06:07Z</time></trkpt><trkpt lat="48.8346786499023" lon="2.40913605690002"><ele>51.308</ele><time>2007-04-15T09:06:08Z</time></trkpt><trkpt lat="48.8346099853516" lon="2.40933632850647"><ele>50.8604</ele><time>2007-04-15T09:06:09Z</time></trkpt><trkpt lat="48.8345603942871" lon="2.40950202941895"><ele>50.5425</ele><time>2007-04-15T09:06:10Z</time></trkpt><trkpt lat="48.8344955444336" lon="2.40972495079041"><ele>50.1194</ele><time>2007-04-15T09:06:11Z</time></trkpt><trkpt lat="48.8344459533691" lon="2.40991306304932"><ele>49.7746</ele><time>2007-04-15T09:06:12Z</time></trkpt><trkpt lat="48.834400177002" lon="2.41008615493774"><ele>49.3412</ele><time>2007-04-15T09:06:13Z</time></trkpt><trkpt lat="48.8343467712402" lon="2.4102988243103"><ele>48.7637</ele><time>2007-04-15T09:06:14Z</time></trkpt><trkpt lat="48.8343048095703" lon="2.41047215461731"><ele>48.3893</ele><time>2007-04-15T09:06:15Z</time></trkpt><trkpt lat="48.8342552185059" lon="2.41064786911011"><ele>48.1046</ele><time>2007-04-15T09:06:16Z</time></trkpt><trkpt lat="48.8341903686523" lon="2.41088604927063"><ele>48.0714</ele><time>2007-04-15T09:06:17Z</time></trkpt><trkpt lat="48.8341255187988" lon="2.41113448143005"><ele>48.6912</ele><time>2007-04-15T09:06:18Z</time></trkpt><trkpt lat="48.8340530395508" lon="2.4113597869873"><ele>49.2133</ele><time>2007-04-15T09:06:19Z</time></trkpt><trkpt lat="48.8340072631836" lon="2.41150546073914"><ele>49.5761</ele><time>2007-04-15T09:06:20Z</time></trkpt><trkpt lat="48.8339691162109" lon="2.41168546676636"><ele>50.0398</ele><time>2007-04-15T09:06:21Z</time></trkpt><trkpt lat="48.8339424133301" lon="2.41183304786682"><ele>50.3456</ele><time>2007-04-15T09:06:22Z</time></trkpt><trkpt lat="48.833911895752" lon="2.41203713417053"><ele>50.7532</ele><time>2007-04-15T09:06:23Z</time></trkpt><trkpt lat="48.8338737487793" lon="2.41229295730591"><ele>51.2389</ele><time>2007-04-15T09:06:24Z</time></trkpt><trkpt lat="48.8338394165039" lon="2.41256928443909"><ele>51.8241</ele><time>2007-04-15T09:06:25Z</time></trkpt><trkpt lat="48.8338165283203" lon="2.41285705566406"><ele>52.6852</ele><time>2007-04-15T09:06:26Z</time></trkpt><trkpt lat="48.8338165283203" lon="2.41303420066834"><ele>53.2336</ele><time>2007-04-15T09:06:27Z</time></trkpt><trkpt lat="48.8337860107422" lon="2.4132285118103"><ele>53.7665</ele><time>2007-04-15T09:06:28Z</time></trkpt><trkpt lat="48.8337593078613" lon="2.41340827941895"><ele>53.8445</ele><time>2007-04-15T09:06:29Z</time></trkpt><trkpt lat="48.8337554931641" lon="2.41362476348877"><ele>53.3184</ele><time>2007-04-15T09:06:30Z</time></trkpt><trkpt lat="48.8337516784668" lon="2.4138286113739"><ele>52.8178</ele><time>2007-04-15T09:06:31Z</time></trkpt><trkpt lat="48.8337326049805" lon="2.41394138336182"><ele>52.4685</ele><time>2007-04-15T09:06:32Z</time></trkpt><trkpt lat="48.8337249755859" lon="2.41424441337585"><ele>51.8967</ele><time>2007-04-15T09:06:33Z</time></trkpt><trkpt lat="48.8337211608887" lon="2.41444325447083"><ele>51.9305</ele><time>2007-04-15T09:06:34Z</time></trkpt><trkpt lat="48.833740234375" lon="2.41465139389038"><ele>51.994</ele><time>2007-04-15T09:06:35Z</time></trkpt><trkpt lat="48.8337516784668" lon="2.41481828689575"><ele>51.9986</ele><time>2007-04-15T09:06:36Z</time></trkpt><trkpt lat="48.8337669372559" lon="2.41500449180603"><ele>51.9622</ele><time>2007-04-15T09:06:37Z</time></trkpt><trkpt lat="48.8337707519531" lon="2.41504168510437"><ele>51.9765</ele><time>2007-04-15T09:06:38Z</time></trkpt><trkpt lat="48.833797454834" lon="2.41522574424744"><ele>52.037</ele><time>2007-04-15T09:06:39Z</time></trkpt><trkpt lat="48.8338203430176" lon="2.41544389724731"><ele>52.1425</ele><time>2007-04-15T09:06:40Z</time></trkpt><trkpt lat="48.8338203430176" lon="2.41548228263855"><ele>52.1694</ele><time>2007-04-15T09:06:41Z</time></trkpt><trkpt lat="48.8338623046875" lon="2.41575384140015"><ele>52.3047</ele><time>2007-04-15T09:06:42Z</time></trkpt><trkpt lat="48.8338928222656" lon="2.41598463058472"><ele>52.5127</ele><time>2007-04-15T09:06:43Z</time></trkpt><trkpt lat="48.8339576721191" lon="2.4162495136261"><ele>52.8739</ele><time>2007-04-15T09:06:44Z</time></trkpt><trkpt lat="48.8340034484863" lon="2.41647791862488"><ele>53.2884</ele><time>2007-04-15T09:06:45Z</time></trkpt><trkpt lat="48.8340759277344" lon="2.41672706604004"><ele>53.6531</ele><time>2007-04-15T09:06:46Z</time></trkpt><trkpt lat="48.834114074707" lon="2.41691970825195"><ele>53.3048</ele><time>2007-04-15T09:06:47Z</time></trkpt><trkpt lat="48.8341636657715" lon="2.41709685325623"><ele>52.9641</ele><time>2007-04-15T09:06:48Z</time></trkpt><trkpt lat="48.8342056274414" lon="2.41726422309876"><ele>52.6664</ele><time>2007-04-15T09:06:49Z</time></trkpt><trkpt lat="48.8342666625977" lon="2.41747069358826"><ele>52.4177</ele><time>2007-04-15T09:06:50Z</time></trkpt><trkpt lat="48.8342742919922" lon="2.41750526428223"><ele>52.3803</ele><time>2007-04-15T09:06:51Z</time></trkpt><trkpt lat="48.8343620300293" lon="2.41767621040344"><ele>52.4423</ele><time>2007-04-15T09:06:52Z</time></trkpt><trkpt lat="48.8344230651856" lon="2.41784453392029"><ele>52.3824</ele><time>2007-04-15T09:06:53Z</time></trkpt><trkpt lat="48.8344993591309" lon="2.41800928115845"><ele>52.3426</ele><time>2007-04-15T09:06:54Z</time></trkpt><trkpt lat="48.8345375061035" lon="2.41814303398132"><ele>52.22</ele><time>2007-04-15T09:06:55Z</time></trkpt><trkpt lat="48.8345794677734" lon="2.41837620735168"><ele>52.0941</ele><time>2007-04-15T09:06:56Z</time></trkpt><trkpt lat="48.8346290588379" lon="2.41851472854614"><ele>52.5212</ele><time>2007-04-15T09:06:57Z</time></trkpt><trkpt lat="48.8346900939941" lon="2.41868662834167"><ele>52.9955</ele><time>2007-04-15T09:06:58Z</time></trkpt><trkpt lat="48.834716796875" lon="2.41875386238098"><ele>53.1679</ele><time>2007-04-15T09:06:59Z</time></trkpt><trkpt lat="48.8347930908203" lon="2.41900873184204"><ele>53.7164</ele><time>2007-04-15T09:07:00Z</time></trkpt><trkpt lat="48.8348655700684" lon="2.41924214363098"><ele>54.0906</ele><time>2007-04-15T09:07:01Z</time></trkpt><trkpt lat="48.8349113464356" lon="2.41944766044617"><ele>54.3372</ele><time>2007-04-15T09:07:02Z</time></trkpt><trkpt lat="48.8349647521973" lon="2.41962289810181"><ele>54.5475</ele><time>2007-04-15T09:07:03Z</time></trkpt><trkpt lat="48.8350257873535" lon="2.41983342170715"><ele>54.8682</ele><time>2007-04-15T09:07:04Z</time></trkpt><trkpt lat="48.8350791931152" lon="2.41999793052673"><ele>55.1878</ele><time>2007-04-15T09:07:05Z</time></trkpt><trkpt lat="48.8351211547852" lon="2.42013621330261"><ele>55.1273</ele><time>2007-04-15T09:07:06Z</time></trkpt><trkpt lat="48.835205078125" lon="2.42033672332764"><ele>55.0881</ele><time>2007-04-15T09:07:07Z</time></trkpt><trkpt lat="48.8352813720703" lon="2.42058491706848"><ele>54.9734</ele><time>2007-04-15T09:07:08Z</time></trkpt><trkpt lat="48.8353271484375" lon="2.42076516151428"><ele>54.867</ele><time>2007-04-15T09:07:09Z</time></trkpt><trkpt lat="48.8354072570801" lon="2.42103576660156"><ele>55.3445</ele><time>2007-04-15T09:07:10Z</time></trkpt><trkpt lat="48.8354911804199" lon="2.42126822471619"><ele>55.915</ele><time>2007-04-15T09:07:11Z</time></trkpt><trkpt lat="48.8355598449707" lon="2.42147636413574"><ele>56.3685</ele><time>2007-04-15T09:07:12Z</time></trkpt><trkpt lat="48.8356323242188" lon="2.42167735099792"><ele>56.7234</ele><time>2007-04-15T09:07:13Z</time></trkpt><trkpt lat="48.8357086181641" lon="2.42192459106445"><ele>55.9681</ele><time>2007-04-15T09:07:14Z</time></trkpt><trkpt lat="48.8357925415039" lon="2.42211389541626"><ele>55.3673</ele><time>2007-04-15T09:07:15Z</time></trkpt><trkpt lat="48.8358573913574" lon="2.42228364944458"><ele>54.7852</ele><time>2007-04-15T09:07:16Z</time></trkpt><trkpt lat="48.8359451293945" lon="2.42246723175049"><ele>54.2363</ele><time>2007-04-15T09:07:17Z</time></trkpt><trkpt lat="48.8360214233398" lon="2.42265224456787"><ele>53.6776</ele><time>2007-04-15T09:07:18Z</time></trkpt><trkpt lat="48.8361053466797" lon="2.42281746864319"><ele>53.1835</ele><time>2007-04-15T09:07:19Z</time></trkpt><trkpt lat="48.8361778259277" lon="2.4229633808136"><ele>52.7452</ele><time>2007-04-15T09:07:20Z</time></trkpt><trkpt lat="48.8362655639648" lon="2.42315697669983"><ele>52.1536</ele><time>2007-04-15T09:07:21Z</time></trkpt><trkpt lat="48.8363418579102" lon="2.42330026626587"><ele>51.7293</ele><time>2007-04-15T09:07:22Z</time></trkpt><trkpt lat="48.8364295959473" lon="2.42346501350403"><ele>51.8054</ele><time>2007-04-15T09:07:23Z</time></trkpt><trkpt lat="48.8365058898926" lon="2.42361211776733"><ele>51.9362</ele><time>2007-04-15T09:07:24Z</time></trkpt><trkpt lat="48.8366088867188" lon="2.42378950119019"><ele>52.0066</ele><time>2007-04-15T09:07:25Z</time></trkpt><trkpt lat="48.836727142334" lon="2.42399048805237"><ele>51.8702</ele><time>2007-04-15T09:07:26Z</time></trkpt><trkpt lat="48.8368301391602" lon="2.42417049407959"><ele>51.6132</ele><time>2007-04-15T09:07:27Z</time></trkpt><trkpt lat="48.8369178771973" lon="2.42435598373413"><ele>51.6928</ele><time>2007-04-15T09:07:28Z</time></trkpt><trkpt lat="48.8370018005371" lon="2.42449903488159"><ele>51.7549</ele><time>2007-04-15T09:07:29Z</time></trkpt><trkpt lat="48.8370742797852" lon="2.42465472221374"><ele>51.8939</ele><time>2007-04-15T09:07:30Z</time></trkpt><trkpt lat="48.8371772766113" lon="2.42478847503662"><ele>51.9779</ele><time>2007-04-15T09:07:31Z</time></trkpt><trkpt lat="48.8372840881348" lon="2.42495894432068"><ele>52.1733</ele><time>2007-04-15T09:07:32Z</time></trkpt><trkpt lat="48.8373870849609" lon="2.42514419555664"><ele>52.2851</ele><time>2007-04-15T09:07:33Z</time></trkpt><trkpt lat="48.8375053405762" lon="2.4253466129303"><ele>52.394</ele><time>2007-04-15T09:07:34Z</time></trkpt><trkpt lat="48.8376045227051" lon="2.42549991607666"><ele>52.1484</ele><time>2007-04-15T09:07:35Z</time></trkpt><trkpt lat="48.8377304077148" lon="2.42567038536072"><ele>51.7526</ele><time>2007-04-15T09:07:36Z</time></trkpt><trkpt lat="48.837833404541" lon="2.42584228515625"><ele>51.3889</ele><time>2007-04-15T09:07:37Z</time></trkpt><trkpt lat="48.8379364013672" lon="2.42601299285889"><ele>50.6897</ele><time>2007-04-15T09:07:38Z</time></trkpt><trkpt lat="48.8380355834961" lon="2.42618846893311"><ele>50.003</ele><time>2007-04-15T09:07:39Z</time></trkpt><trkpt lat="48.8381500244141" lon="2.42639851570129"><ele>49.2017</ele><time>2007-04-15T09:07:40Z</time></trkpt><trkpt lat="48.8382225036621" lon="2.42656230926514"><ele>48.6572</ele><time>2007-04-15T09:07:41Z</time></trkpt><trkpt lat="48.8382377624512" lon="2.42659401893616"><ele>48.5459</ele><time>2007-04-15T09:07:42Z</time></trkpt><trkpt lat="48.8383255004883" lon="2.42678332328796"><ele>47.7589</ele><time>2007-04-15T09:07:43Z</time></trkpt><trkpt lat="48.8384132385254" lon="2.42698216438293"><ele>47.2791</ele><time>2007-04-15T09:07:44Z</time></trkpt><trkpt lat="48.8384971618652" lon="2.42718410491943"><ele>46.8802</ele><time>2007-04-15T09:07:45Z</time></trkpt><trkpt lat="48.8385734558106" lon="2.42738366127014"><ele>46.5271</ele><time>2007-04-15T09:07:46Z</time></trkpt><trkpt lat="48.8386421203613" lon="2.42754197120666"><ele>46.4022</ele><time>2007-04-15T09:07:47Z</time></trkpt><trkpt lat="48.8387145996094" lon="2.42769932746887"><ele>46.5873</ele><time>2007-04-15T09:07:48Z</time></trkpt><trkpt lat="48.8387680053711" lon="2.42783236503601"><ele>46.7124</ele><time>2007-04-15T09:07:49Z</time></trkpt><trkpt lat="48.8388366699219" lon="2.42800641059876"><ele>46.8446</ele><time>2007-04-15T09:07:50Z</time></trkpt><trkpt lat="48.8389167785644" lon="2.42821335792542"><ele>46.9568</ele><time>2007-04-15T09:07:51Z</time></trkpt><trkpt lat="48.8389778137207" lon="2.42837381362915"><ele>47.011</ele><time>2007-04-15T09:07:52Z</time></trkpt><trkpt lat="48.8390312194824" lon="2.42854285240173"><ele>47.0409</ele><time>2007-04-15T09:07:53Z</time></trkpt><trkpt lat="48.8390808105469" lon="2.42871785163879"><ele>47.0475</ele><time>2007-04-15T09:07:54Z</time></trkpt><trkpt lat="48.8391609191894" lon="2.42895317077637"><ele>47.0051</ele><time>2007-04-15T09:07:55Z</time></trkpt><trkpt lat="48.8392295837402" lon="2.42915344238281"><ele>47.0731</ele><time>2007-04-15T09:07:56Z</time></trkpt><trkpt lat="48.8392677307129" lon="2.42934083938599"><ele>47.1213</ele><time>2007-04-15T09:07:57Z</time></trkpt><trkpt lat="48.8393211364746" lon="2.42955732345581"><ele>47.1854</ele><time>2007-04-15T09:07:58Z</time></trkpt><trkpt lat="48.8393745422363" lon="2.42977786064148"><ele>47.2495</ele><time>2007-04-15T09:07:59Z</time></trkpt><trkpt lat="48.8394355773926" lon="2.4300365447998"><ele>47.2661</ele><time>2007-04-15T09:08:00Z</time></trkpt><trkpt lat="48.8395042419434" lon="2.43028855323792"><ele>46.844</ele><time>2007-04-15T09:08:01Z</time></trkpt><trkpt lat="48.8395729064941" lon="2.43049573898315"><ele>46.3275</ele><time>2007-04-15T09:08:02Z</time></trkpt><trkpt lat="48.8396224975586" lon="2.43063545227051"><ele>45.8786</ele><time>2007-04-15T09:08:03Z</time></trkpt><trkpt lat="48.839656829834" lon="2.43079423904419"><ele>45.3458</ele><time>2007-04-15T09:08:04Z</time></trkpt><trkpt lat="48.8397026062012" lon="2.43101096153259"><ele>45.4058</ele><time>2007-04-15T09:08:05Z</time></trkpt><trkpt lat="48.8397445678711" lon="2.4311900138855"><ele>45.6788</ele><time>2007-04-15T09:08:06Z</time></trkpt><trkpt lat="48.839786529541" lon="2.43135738372803"><ele>46.0107</ele><time>2007-04-15T09:08:07Z</time></trkpt><trkpt lat="48.8398284912109" lon="2.43153142929077"><ele>46.4409</ele><time>2007-04-15T09:08:08Z</time></trkpt><trkpt lat="48.8398704528809" lon="2.43174457550049"><ele>47.0025</ele><time>2007-04-15T09:08:09Z</time></trkpt><trkpt lat="48.8399200439453" lon="2.43195366859436"><ele>47.5268</ele><time>2007-04-15T09:08:10Z</time></trkpt><trkpt lat="48.839973449707" lon="2.4321186542511"><ele>48.0183</ele><time>2007-04-15T09:08:11Z</time></trkpt><trkpt lat="48.8400115966797" lon="2.43228816986084"><ele>48.5298</ele><time>2007-04-15T09:08:12Z</time></trkpt><trkpt lat="48.8400611877441" lon="2.43246507644653"><ele>49.1334</ele><time>2007-04-15T09:08:13Z</time></trkpt><trkpt lat="48.8401412963867" lon="2.43272423744202"><ele>49.6865</ele><time>2007-04-15T09:08:14Z</time></trkpt><trkpt lat="48.8401870727539" lon="2.43290543556213"><ele>49.9415</ele><time>2007-04-15T09:08:15Z</time></trkpt><trkpt lat="48.8402519226074" lon="2.43312835693359"><ele>50.2051</ele><time>2007-04-15T09:08:16Z</time></trkpt><trkpt lat="48.8402976989746" lon="2.43336462974548"><ele>50.3814</ele><time>2007-04-15T09:08:17Z</time></trkpt><trkpt lat="48.8403625488281" lon="2.43362522125244"><ele>50.6329</ele><time>2007-04-15T09:08:18Z</time></trkpt><trkpt lat="48.840404510498" lon="2.43375611305237"><ele>50.7465</ele><time>2007-04-15T09:08:19Z</time></trkpt><trkpt lat="48.8404693603516" lon="2.43401598930359"><ele>50.921</ele><time>2007-04-15T09:08:20Z</time></trkpt><trkpt lat="48.8405151367188" lon="2.43423175811768"><ele>51.0966</ele><time>2007-04-15T09:08:21Z</time></trkpt><trkpt lat="48.8405532836914" lon="2.43443465232849"><ele>51.427</ele><time>2007-04-15T09:08:22Z</time></trkpt><trkpt lat="48.8405494689941" lon="2.43456602096558"><ele>51.632</ele><time>2007-04-15T09:08:23Z</time></trkpt><trkpt lat="48.8405227661133" lon="2.4347460269928"><ele>51.8723</ele><time>2007-04-15T09:08:24Z</time></trkpt><trkpt lat="48.8404922485352" lon="2.43494987487793"><ele>52.1103</ele><time>2007-04-15T09:08:25Z</time></trkpt><trkpt lat="48.8404693603516" lon="2.43515682220459"><ele>51.7739</ele><time>2007-04-15T09:08:26Z</time></trkpt><trkpt lat="48.8404502868652" lon="2.43537139892578"><ele>51.2253</ele><time>2007-04-15T09:08:27Z</time></trkpt><trkpt lat="48.8404350280762" lon="2.43558120727539"><ele>50.6799</ele><time>2007-04-15T09:08:28Z</time></trkpt><trkpt lat="48.8404197692871" lon="2.43579459190369"><ele>50.1075</ele><time>2007-04-15T09:08:29Z</time></trkpt><trkpt lat="48.8404121398926" lon="2.43597960472107"><ele>50.1557</ele><time>2007-04-15T09:08:30Z</time></trkpt><trkpt lat="48.8404159545898" lon="2.43617367744446"><ele>50.4057</ele><time>2007-04-15T09:08:31Z</time></trkpt><trkpt lat="48.840461730957" lon="2.43638563156128"><ele>50.8074</ele><time>2007-04-15T09:08:32Z</time></trkpt><trkpt lat="48.8405113220215" lon="2.43660473823547"><ele>51.1697</ele><time>2007-04-15T09:08:33Z</time></trkpt><trkpt lat="48.8405418395996" lon="2.43682479858398"><ele>51.2434</ele><time>2007-04-15T09:08:34Z</time></trkpt><trkpt lat="48.8405418395996" lon="2.4370424747467"><ele>51.1649</ele><time>2007-04-15T09:08:35Z</time></trkpt><trkpt lat="48.8405227661133" lon="2.43725752830505"><ele>51.0741</ele><time>2007-04-15T09:08:36Z</time></trkpt><trkpt lat="48.8405113220215" lon="2.43743205070496"><ele>51.0185</ele><time>2007-04-15T09:08:37Z</time></trkpt><trkpt lat="48.8404922485352" lon="2.43760538101196"><ele>51.0518</ele><time>2007-04-15T09:08:38Z</time></trkpt><trkpt lat="48.8404731750488" lon="2.43782353401184"><ele>51.1678</ele><time>2007-04-15T09:08:39Z</time></trkpt><trkpt lat="48.8404541015625" lon="2.43805122375488"><ele>51.301</ele><time>2007-04-15T09:08:40Z</time></trkpt><trkpt lat="48.8404426574707" lon="2.43827724456787"><ele>51.4373</ele><time>2007-04-15T09:08:41Z</time></trkpt><trkpt lat="48.8404273986816" lon="2.43853855133057"><ele>51.4871</ele><time>2007-04-15T09:08:42Z</time></trkpt><trkpt lat="48.8404197692871" lon="2.4387309551239"><ele>51.4963</ele><time>2007-04-15T09:08:43Z</time></trkpt><trkpt lat="48.8404006958008" lon="2.43898558616638"><ele>51.5192</ele><time>2007-04-15T09:08:44Z</time></trkpt><trkpt lat="48.840389251709" lon="2.4391667842865"><ele>51.5329</ele><time>2007-04-15T09:08:45Z</time></trkpt><trkpt lat="48.8403701782227" lon="2.43934464454651"><ele>51.5081</ele><time>2007-04-15T09:08:46Z</time></trkpt><trkpt lat="48.8403663635254" lon="2.43938040733337"><ele>51.4984</ele><time>2007-04-15T09:08:47Z</time></trkpt><trkpt lat="48.8403472900391" lon="2.43956184387207"><ele>51.4253</ele><time>2007-04-15T09:08:48Z</time></trkpt><trkpt lat="48.8403358459473" lon="2.43975210189819"><ele>51.3244</ele><time>2007-04-15T09:08:49Z</time></trkpt><trkpt lat="48.8403205871582" lon="2.43993306159973"><ele>51.1912</ele><time>2007-04-15T09:08:50Z</time></trkpt><trkpt lat="48.8402976989746" lon="2.44018983840942"><ele>50.8439</ele><time>2007-04-15T09:08:51Z</time></trkpt><trkpt lat="48.8402976989746" lon="2.44037818908691"><ele>50.6179</ele><time>2007-04-15T09:08:52Z</time></trkpt><trkpt lat="48.8402900695801" lon="2.44055891036987"><ele>50.3736</ele><time>2007-04-15T09:08:53Z</time></trkpt><trkpt lat="48.8402671813965" lon="2.44071102142334"><ele>50.1086</ele><time>2007-04-15T09:08:54Z</time></trkpt><trkpt lat="48.8402328491211" lon="2.44093990325928"><ele>49.7104</ele><time>2007-04-15T09:08:55Z</time></trkpt><trkpt lat="48.8401908874512" lon="2.44116306304932"><ele>49.2915</ele><time>2007-04-15T09:08:56Z</time></trkpt><trkpt lat="48.8401756286621" lon="2.44134497642517"><ele>49.0183</ele><time>2007-04-15T09:08:57Z</time></trkpt><trkpt lat="48.8401718139648" lon="2.44156908988953"><ele>48.7356</ele><time>2007-04-15T09:08:58Z</time></trkpt><trkpt lat="48.840160369873" lon="2.44175028800964"><ele>48.558</ele><time>2007-04-15T09:08:59Z</time></trkpt><trkpt lat="48.840145111084" lon="2.44201946258545"><ele>48.4487</ele><time>2007-04-15T09:09:00Z</time></trkpt><trkpt lat="48.8401260375977" lon="2.44220805168152"><ele>48.3555</ele><time>2007-04-15T09:09:01Z</time></trkpt><trkpt lat="48.8401031494141" lon="2.44240212440491"><ele>48.2621</ele><time>2007-04-15T09:09:02Z</time></trkpt><trkpt lat="48.8400840759277" lon="2.44266629219055"><ele>48.3611</ele><time>2007-04-15T09:09:03Z</time></trkpt><trkpt lat="48.8400688171387" lon="2.44289827346802"><ele>48.5642</ele><time>2007-04-15T09:09:04Z</time></trkpt><trkpt lat="48.8400344848633" lon="2.44316172599792"><ele>48.8111</ele><time>2007-04-15T09:09:05Z</time></trkpt><trkpt lat="48.8400192260742" lon="2.44339179992676"><ele>49.204</ele><time>2007-04-15T09:09:06Z</time></trkpt><trkpt lat="48.8400077819824" lon="2.4435818195343"><ele>49.8834</ele><time>2007-04-15T09:09:07Z</time></trkpt><trkpt lat="48.8399848937988" lon="2.44384145736694"><ele>50.793</ele><time>2007-04-15T09:09:08Z</time></trkpt><trkpt lat="48.839973449707" lon="2.44407415390015"><ele>51.6032</ele><time>2007-04-15T09:09:09Z</time></trkpt><trkpt lat="48.839958190918" lon="2.44430541992188"><ele>52.0745</ele><time>2007-04-15T09:09:10Z</time></trkpt><trkpt lat="48.8399391174316" lon="2.44452285766602"><ele>52.3125</ele><time>2007-04-15T09:09:11Z</time></trkpt><trkpt lat="48.8399200439453" lon="2.44472646713257"><ele>52.5443</ele><time>2007-04-15T09:09:12Z</time></trkpt><trkpt lat="48.8398933410644" lon="2.44492292404175"><ele>52.7677</ele><time>2007-04-15T09:09:13Z</time></trkpt><trkpt lat="48.8398628234863" lon="2.44517588615417"><ele>52.5175</ele><time>2007-04-15T09:09:14Z</time></trkpt><trkpt lat="48.8398399353027" lon="2.44539022445679"><ele>52.1412</ele><time>2007-04-15T09:09:15Z</time></trkpt><trkpt lat="48.8398094177246" lon="2.44565677642822"><ele>51.7358</ele><time>2007-04-15T09:09:16Z</time></trkpt><trkpt lat="48.8398132324219" lon="2.4458498954773"><ele>51.4482</ele><time>2007-04-15T09:09:17Z</time></trkpt><trkpt lat="48.8397903442383" lon="2.44602918624878"><ele>51.5032</ele><time>2007-04-15T09:09:18Z</time></trkpt><trkpt lat="48.839771270752" lon="2.44620895385742"><ele>51.549</ele><time>2007-04-15T09:09:19Z</time></trkpt><trkpt lat="48.8397560119629" lon="2.44643568992615"><ele>51.5856</ele><time>2007-04-15T09:09:20Z</time></trkpt><trkpt lat="48.8397178649902" lon="2.44674372673035"><ele>51.5533</ele><time>2007-04-15T09:09:21Z</time></trkpt><trkpt lat="48.8397026062012" lon="2.44697594642639"><ele>51.2102</ele><time>2007-04-15T09:09:22Z</time></trkpt><trkpt lat="48.8396835327148" lon="2.44715738296509"><ele>50.947</ele><time>2007-04-15T09:09:23Z</time></trkpt><trkpt lat="48.839672088623" lon="2.44732975959778"><ele>50.6782</ele><time>2007-04-15T09:09:24Z</time></trkpt><trkpt lat="48.8396682739258" lon="2.44747591018677"><ele>50.4385</ele><time>2007-04-15T09:09:25Z</time></trkpt><trkpt lat="48.8396415710449" lon="2.44768071174622"><ele>50.3998</ele><time>2007-04-15T09:09:26Z</time></trkpt><trkpt lat="48.839599609375" lon="2.44789433479309"><ele>50.462</ele><time>2007-04-15T09:09:27Z</time></trkpt><trkpt lat="48.8395309448242" lon="2.44810461997986"><ele>50.6541</ele><time>2007-04-15T09:09:28Z</time></trkpt><trkpt lat="48.8394775390625" lon="2.44828724861145"><ele>50.8668</ele><time>2007-04-15T09:09:29Z</time></trkpt><trkpt lat="48.8394165039062" lon="2.44846844673157"><ele>51.3113</ele><time>2007-04-15T09:09:30Z</time></trkpt><trkpt lat="48.8393592834473" lon="2.44859552383423"><ele>51.6939</ele><time>2007-04-15T09:09:31Z</time></trkpt><trkpt lat="48.8392944335938" lon="2.44872307777405"><ele>52.0794</ele><time>2007-04-15T09:09:32Z</time></trkpt><trkpt lat="48.839241027832" lon="2.44883251190186"><ele>52.3848</ele><time>2007-04-15T09:09:33Z</time></trkpt><trkpt lat="48.839168548584" lon="2.44896745681763"><ele>52.7559</ele><time>2007-04-15T09:09:34Z</time></trkpt><trkpt lat="48.8390884399414" lon="2.4490909576416"><ele>53.0116</ele><time>2007-04-15T09:09:35Z</time></trkpt><trkpt lat="48.8390121459961" lon="2.44922637939453"><ele>53.1854</ele><time>2007-04-15T09:09:36Z</time></trkpt><trkpt lat="48.8389511108398" lon="2.44931960105896"><ele>53.2587</ele><time>2007-04-15T09:09:37Z</time></trkpt><trkpt lat="48.8388481140137" lon="2.44952034950256"><ele>53.3823</ele><time>2007-04-15T09:09:38Z</time></trkpt><trkpt lat="48.8387680053711" lon="2.44965529441834"><ele>53.4784</ele><time>2007-04-15T09:09:39Z</time></trkpt><trkpt lat="48.838680267334" lon="2.44984173774719"><ele>53.5837</ele><time>2007-04-15T09:09:40Z</time></trkpt><trkpt lat="48.8385963439941" lon="2.45002293586731"><ele>53.6931</ele><time>2007-04-15T09:09:41Z</time></trkpt><trkpt lat="48.8385162353516" lon="2.45018267631531"><ele>53.8286</ele><time>2007-04-15T09:09:42Z</time></trkpt><trkpt lat="48.8384437561035" lon="2.4502899646759"><ele>53.9136</ele><time>2007-04-15T09:09:43Z</time></trkpt><trkpt lat="48.8383445739746" lon="2.4504382610321"><ele>53.9936</ele><time>2007-04-15T09:09:44Z</time></trkpt><trkpt lat="48.8382568359375" lon="2.45058751106262"><ele>53.9353</ele><time>2007-04-15T09:09:45Z</time></trkpt><trkpt lat="48.8381729125977" lon="2.45077013969421"><ele>53.8221</ele><time>2007-04-15T09:09:46Z</time></trkpt><trkpt lat="48.838077545166" lon="2.45094013214111"><ele>53.6931</ele><time>2007-04-15T09:09:47Z</time></trkpt><trkpt lat="48.8379859924316" lon="2.45111751556396"><ele>53.5832</ele><time>2007-04-15T09:09:48Z</time></trkpt><trkpt lat="48.8378753662109" lon="2.45130491256714"><ele>53.4504</ele><time>2007-04-15T09:09:49Z</time></trkpt><trkpt lat="48.8377647399902" lon="2.45150065422058"><ele>53.3177</ele><time>2007-04-15T09:09:50Z</time></trkpt><trkpt lat="48.8376693725586" lon="2.45168423652649"><ele>53.2032</ele><time>2007-04-15T09:09:51Z</time></trkpt><trkpt lat="48.837589263916" lon="2.45181250572205"><ele>53.1071</ele><time>2007-04-15T09:09:52Z</time></trkpt><trkpt lat="48.837574005127" lon="2.4518404006958"><ele>53.0888</ele><time>2007-04-15T09:09:53Z</time></trkpt><trkpt lat="48.8374862670898" lon="2.45195960998535"><ele>52.9728</ele><time>2007-04-15T09:09:54Z</time></trkpt><trkpt lat="48.8373603820801" lon="2.45208644866943"><ele>52.7493</ele><time>2007-04-15T09:09:55Z</time></trkpt><trkpt lat="48.8372268676758" lon="2.45216941833496"><ele>52.5422</ele><time>2007-04-15T09:09:56Z</time></trkpt><trkpt lat="48.8370933532715" lon="2.45226168632507"><ele>52.3725</ele><time>2007-04-15T09:09:57Z</time></trkpt><trkpt lat="48.8369598388672" lon="2.45234608650208"><ele>52.2321</ele><time>2007-04-15T09:09:58Z</time></trkpt><trkpt lat="48.8368530273438" lon="2.45241832733154"><ele>52.1475</ele><time>2007-04-15T09:09:59Z</time></trkpt><trkpt lat="48.8367004394531" lon="2.4525101184845"><ele>52.0765</ele><time>2007-04-15T09:10:00Z</time></trkpt><trkpt lat="48.8365745544434" lon="2.45258975028992"><ele>52.5323</ele><time>2007-04-15T09:10:01Z</time></trkpt><trkpt lat="48.8364677429199" lon="2.45266819000244"><ele>53.0347</ele><time>2007-04-15T09:10:02Z</time></trkpt><trkpt lat="48.8363609313965" lon="2.45275926589966"><ele>53.553</ele><time>2007-04-15T09:10:03Z</time></trkpt><trkpt lat="48.8362312316894" lon="2.45285248756409"><ele>54.093</ele><time>2007-04-15T09:10:04Z</time></trkpt><trkpt lat="48.8361015319824" lon="2.45293688774109"><ele>54.5736</ele><time>2007-04-15T09:10:05Z</time></trkpt><trkpt lat="48.8359756469727" lon="2.45303177833557"><ele>55.0437</ele><time>2007-04-15T09:10:06Z</time></trkpt><trkpt lat="48.8358726501465" lon="2.45308518409729"><ele>55.3432</ele><time>2007-04-15T09:10:07Z</time></trkpt><trkpt lat="48.8358345031738" lon="2.45308494567871"><ele>55.402</ele><time>2007-04-15T09:10:08Z</time></trkpt><trkpt lat="48.8357772827148" lon="2.45299863815308"><ele>55.1295</ele><time>2007-04-15T09:10:09Z</time></trkpt><trkpt lat="48.8356895446777" lon="2.45279312133789"><ele>54.5309</ele><time>2007-04-15T09:10:10Z</time></trkpt><trkpt lat="48.8356246948242" lon="2.4526252746582"><ele>54.0503</ele><time>2007-04-15T09:10:11Z</time></trkpt><trkpt lat="48.8355560302734" lon="2.45239353179932"><ele>53.4542</ele><time>2007-04-15T09:10:12Z</time></trkpt><trkpt lat="48.835506439209" lon="2.45220422744751"><ele>53.0371</ele><time>2007-04-15T09:10:13Z</time></trkpt><trkpt lat="48.8354568481445" lon="2.45204615592957"><ele>52.705</ele><time>2007-04-15T09:10:14Z</time></trkpt><trkpt lat="48.8353881835938" lon="2.45185232162476"><ele>52.3266</ele><time>2007-04-15T09:10:15Z</time></trkpt><trkpt lat="48.8353462219238" lon="2.45171093940735"><ele>52.0752</ele><time>2007-04-15T09:10:16Z</time></trkpt><trkpt lat="48.8352928161621" lon="2.45157361030579"><ele>52.0785</ele><time>2007-04-15T09:10:17Z</time></trkpt><trkpt lat="48.8352317810059" lon="2.4513783454895"><ele>52.1925</ele><time>2007-04-15T09:10:18Z</time></trkpt><trkpt lat="48.8351669311523" lon="2.45116639137268"><ele>52.2405</ele><time>2007-04-15T09:10:19Z</time></trkpt><trkpt lat="48.8351135253906" lon="2.45095777511597"><ele>52.2318</ele><time>2007-04-15T09:10:20Z</time></trkpt><trkpt lat="48.8350601196289" lon="2.4507749080658"><ele>52.2043</ele><time>2007-04-15T09:10:21Z</time></trkpt><trkpt lat="48.8350143432617" lon="2.45055723190308"><ele>52.3543</ele><time>2007-04-15T09:10:22Z</time></trkpt><trkpt lat="48.8349494934082" lon="2.45033669471741"><ele>52.4748</ele><time>2007-04-15T09:10:23Z</time></trkpt><trkpt lat="48.8348922729492" lon="2.450115442276"><ele>52.6029</ele><time>2007-04-15T09:10:24Z</time></trkpt><trkpt lat="48.834831237793" lon="2.44986510276794"><ele>52.2405</ele><time>2007-04-15T09:10:25Z</time></trkpt><trkpt lat="48.834789276123" lon="2.44969010353088"><ele>51.7548</ele><time>2007-04-15T09:10:26Z</time></trkpt><trkpt lat="48.8347549438477" lon="2.44952297210693"><ele>51.3679</ele><time>2007-04-15T09:10:27Z</time></trkpt><trkpt lat="48.834716796875" lon="2.44932460784912"><ele>50.9906</ele><time>2007-04-15T09:10:28Z</time></trkpt><trkpt lat="48.8346633911133" lon="2.44910955429077"><ele>50.8079</ele><time>2007-04-15T09:10:29Z</time></trkpt><trkpt lat="48.8346138000488" lon="2.44886493682861"><ele>50.9269</ele><time>2007-04-15T09:10:30Z</time></trkpt><trkpt lat="48.8345680236816" lon="2.44868206977844"><ele>51.0367</ele><time>2007-04-15T09:10:31Z</time></trkpt><trkpt lat="48.8345108032227" lon="2.44842314720154"><ele>51.1741</ele><time>2007-04-15T09:10:32Z</time></trkpt><trkpt lat="48.8344612121582" lon="2.44823145866394"><ele>51.3363</ele><time>2007-04-15T09:10:33Z</time></trkpt><trkpt lat="48.8344192504883" lon="2.44802522659302"><ele>51.5059</ele><time>2007-04-15T09:10:34Z</time></trkpt><trkpt lat="48.8343887329102" lon="2.4478132724762"><ele>51.6333</ele><time>2007-04-15T09:10:35Z</time></trkpt><trkpt lat="48.8343544006348" lon="2.44765567779541"><ele>51.7326</ele><time>2007-04-15T09:10:36Z</time></trkpt><trkpt lat="48.8343238830566" lon="2.44748902320862"><ele>51.7982</ele><time>2007-04-15T09:10:37Z</time></trkpt><trkpt lat="48.8342895507812" lon="2.44729232788086"><ele>51.6033</ele><time>2007-04-15T09:10:38Z</time></trkpt><trkpt lat="48.8342437744141" lon="2.4470522403717"><ele>51.3702</ele><time>2007-04-15T09:10:39Z</time></trkpt><trkpt lat="48.8342132568359" lon="2.44689226150513"><ele>51.2148</ele><time>2007-04-15T09:10:40Z</time></trkpt><trkpt lat="48.8341903686523" lon="2.44673585891724"><ele>51.0546</ele><time>2007-04-15T09:10:41Z</time></trkpt><trkpt lat="48.8341522216797" lon="2.44651484489441"><ele>51.0205</ele><time>2007-04-15T09:10:42Z</time></trkpt><trkpt lat="48.8341178894043" lon="2.44630646705627"><ele>51.0838</ele><time>2007-04-15T09:10:43Z</time></trkpt><trkpt lat="48.8340759277344" lon="2.44609427452087"><ele>51.1837</ele><time>2007-04-15T09:10:44Z</time></trkpt><trkpt lat="48.8340606689453" lon="2.44602489471436"><ele>51.2252</ele><time>2007-04-15T09:10:45Z</time></trkpt><trkpt lat="48.8340492248535" lon="2.4458315372467"><ele>51.2797</ele><time>2007-04-15T09:10:46Z</time></trkpt><trkpt lat="48.8340072631836" lon="2.44565010070801"><ele>51.1627</ele><time>2007-04-15T09:10:47Z</time></trkpt><trkpt lat="48.833911895752" lon="2.44556212425232"><ele>51.286</ele><time>2007-04-15T09:10:48Z</time></trkpt><trkpt lat="48.8337707519531" lon="2.44550371170044"><ele>51.5546</ele><time>2007-04-15T09:10:49Z</time></trkpt><trkpt lat="48.8336143493652" lon="2.44548773765564"><ele>51.9108</ele><time>2007-04-15T09:10:50Z</time></trkpt><trkpt lat="48.83349609375" lon="2.44563770294189"><ele>52.3746</ele><time>2007-04-15T09:10:51Z</time></trkpt><trkpt lat="48.8334121704102" lon="2.44578170776367"><ele>52.7488</ele><time>2007-04-15T09:10:52Z</time></trkpt><trkpt lat="48.8333129882812" lon="2.4459114074707"><ele>52.8598</ele><time>2007-04-15T09:10:53Z</time></trkpt><trkpt lat="48.8332214355469" lon="2.44608020782471"><ele>52.475</ele><time>2007-04-15T09:10:54Z</time></trkpt><trkpt lat="48.8330917358398" lon="2.4462423324585"><ele>52.0717</ele><time>2007-04-15T09:10:55Z</time></trkpt><trkpt lat="48.8330116271973" lon="2.44639229774475"><ele>51.8161</ele><time>2007-04-15T09:10:56Z</time></trkpt><trkpt lat="48.8329277038574" lon="2.44653820991516"><ele>51.5924</ele><time>2007-04-15T09:10:57Z</time></trkpt><trkpt lat="48.8328056335449" lon="2.44672679901123"><ele>51.4125</ele><time>2007-04-15T09:10:58Z</time></trkpt><trkpt lat="48.8327140808106" lon="2.44685363769531"><ele>51.4236</ele><time>2007-04-15T09:10:59Z</time></trkpt><trkpt lat="48.8326606750488" lon="2.44693326950073"><ele>51.451</ele><time>2007-04-15T09:11:00Z</time></trkpt><trkpt lat="48.8326263427734" lon="2.44698095321655"><ele>51.4716</ele><time>2007-04-15T09:11:01Z</time></trkpt><trkpt lat="48.8325271606445" lon="2.44713425636292"><ele>51.5754</ele><time>2007-04-15T09:11:02Z</time></trkpt><trkpt lat="48.8324279785156" lon="2.44729781150818"><ele>51.7783</ele><time>2007-04-15T09:11:03Z</time></trkpt><trkpt lat="48.8323287963867" lon="2.44746112823486"><ele>51.9629</ele><time>2007-04-15T09:11:04Z</time></trkpt><trkpt lat="48.8322219848633" lon="2.44761252403259"><ele>51.7749</ele><time>2007-04-15T09:11:05Z</time></trkpt><trkpt lat="48.8321228027344" lon="2.44777679443359"><ele>51.3672</ele><time>2007-04-15T09:11:06Z</time></trkpt><trkpt lat="48.8320426940918" lon="2.44790244102478"><ele>50.987</ele><time>2007-04-15T09:11:07Z</time></trkpt><trkpt lat="48.8319435119629" lon="2.4480242729187"><ele>50.5306</ele><time>2007-04-15T09:11:08Z</time></trkpt><trkpt lat="48.8318481445312" lon="2.44813585281372"><ele>50.0433</ele><time>2007-04-15T09:11:09Z</time></trkpt><trkpt lat="48.8317604064941" lon="2.44825959205627"><ele>49.4705</ele><time>2007-04-15T09:11:10Z</time></trkpt><trkpt lat="48.831657409668" lon="2.44839096069336"><ele>49.321</ele><time>2007-04-15T09:11:11Z</time></trkpt><trkpt lat="48.8315467834473" lon="2.44854593276978"><ele>50.5959</ele><time>2007-04-15T09:11:12Z</time></trkpt><trkpt lat="48.8314018249512" lon="2.44874262809753"><ele>52.2359</ele><time>2007-04-15T09:11:13Z</time></trkpt><trkpt lat="48.8312835693359" lon="2.4488742351532"><ele>53.4352</ele><time>2007-04-15T09:11:14Z</time></trkpt><trkpt lat="48.8311920166016" lon="2.44898390769958"><ele>54.4011</ele><time>2007-04-15T09:11:15Z</time></trkpt><trkpt lat="48.8310775756836" lon="2.44913530349731"><ele>55.6771</ele><time>2007-04-15T09:11:16Z</time></trkpt><trkpt lat="48.8309516906738" lon="2.44930624961853"><ele>56.9582</ele><time>2007-04-15T09:11:17Z</time></trkpt><trkpt lat="48.8308334350586" lon="2.44944167137146"><ele>57.9896</ele><time>2007-04-15T09:11:18Z</time></trkpt><trkpt lat="48.8307456970215" lon="2.4495632648468"><ele>57.9121</ele><time>2007-04-15T09:11:19Z</time></trkpt><trkpt lat="48.830638885498" lon="2.44972491264343"><ele>57.6844</ele><time>2007-04-15T09:11:20Z</time></trkpt><trkpt lat="48.8305625915527" lon="2.44984102249146"><ele>57.4014</ele><time>2007-04-15T09:11:21Z</time></trkpt><trkpt lat="48.8305320739746" lon="2.44987750053406"><ele>57.241</ele><time>2007-04-15T09:11:22Z</time></trkpt><trkpt lat="48.8304557800293" lon="2.44998168945312"><ele>56.8025</ele><time>2007-04-15T09:11:23Z</time></trkpt><trkpt lat="48.8303527832031" lon="2.4500629901886"><ele>56.0301</ele><time>2007-04-15T09:11:24Z</time></trkpt><trkpt lat="48.8303070068359" lon="2.45009112358093"><ele>55.7055</ele><time>2007-04-15T09:11:25Z</time></trkpt><trkpt lat="48.8302764892578" lon="2.45012521743774"><ele>55.524</ele><time>2007-04-15T09:11:26Z</time></trkpt><trkpt lat="48.8302459716797" lon="2.45016264915466"><ele>55.3636</ele><time>2007-04-15T09:11:27Z</time></trkpt><trkpt lat="48.830207824707" lon="2.45020508766174"><ele>55.1772</ele><time>2007-04-15T09:11:28Z</time></trkpt><trkpt lat="48.8301963806152" lon="2.45022487640381"><ele>55.1412</ele><time>2007-04-15T09:11:29Z</time></trkpt><trkpt lat="48.830192565918" lon="2.45023345947266"><ele>55.1343</ele><time>2007-04-15T09:11:30Z</time></trkpt><trkpt lat="48.8301429748535" lon="2.45032930374146"><ele>55.0475</ele><time>2007-04-15T09:11:31Z</time></trkpt><trkpt lat="48.8300704956055" lon="2.45041751861572"><ele>54.8833</ele><time>2007-04-15T09:11:32Z</time></trkpt><trkpt lat="48.8299522399902" lon="2.45055246353149"><ele>54.8936</ele><time>2007-04-15T09:11:33Z</time></trkpt><trkpt lat="48.8298645019531" lon="2.45064997673035"><ele>55.0505</ele><time>2007-04-15T09:11:34Z</time></trkpt><trkpt lat="48.8297996520996" lon="2.45073437690735"><ele>55.1915</ele><time>2007-04-15T09:11:35Z</time></trkpt><trkpt lat="48.8297157287598" lon="2.45084118843079"><ele>55.3274</ele><time>2007-04-15T09:11:36Z</time></trkpt><trkpt lat="48.8296585083008" lon="2.45094466209412"><ele>55.3447</ele><time>2007-04-15T09:11:37Z</time></trkpt><trkpt lat="48.8295516967773" lon="2.45106911659241"><ele>55.3807</ele><time>2007-04-15T09:11:38Z</time></trkpt><trkpt lat="48.8294563293457" lon="2.45121192932129"><ele>55.5844</ele><time>2007-04-15T09:11:39Z</time></trkpt><trkpt lat="48.8293838500977" lon="2.45131945610046"><ele>55.8152</ele><time>2007-04-15T09:11:40Z</time></trkpt><trkpt lat="48.8292999267578" lon="2.45144581794739"><ele>56.1722</ele><time>2007-04-15T09:11:41Z</time></trkpt><trkpt lat="48.829174041748" lon="2.45161700248718"><ele>56.8139</ele><time>2007-04-15T09:11:42Z</time></trkpt><trkpt lat="48.8290710449219" lon="2.45176243782043"><ele>56.8984</ele><time>2007-04-15T09:11:43Z</time></trkpt><trkpt lat="48.8289527893066" lon="2.45192694664001"><ele>56.8235</ele><time>2007-04-15T09:11:44Z</time></trkpt><trkpt lat="48.8288688659668" lon="2.45205330848694"><ele>56.8084</ele><time>2007-04-15T09:11:45Z</time></trkpt><trkpt lat="48.8287658691406" lon="2.45218300819397"><ele>56.817</ele><time>2007-04-15T09:11:46Z</time></trkpt><trkpt lat="48.8286514282227" lon="2.45234751701355"><ele>56.8869</ele><time>2007-04-15T09:11:47Z</time></trkpt><trkpt lat="48.8285446166992" lon="2.45248579978943"><ele>56.9873</ele><time>2007-04-15T09:11:48Z</time></trkpt><trkpt lat="48.8284111022949" lon="2.45265579223633"><ele>57.339</ele><time>2007-04-15T09:11:49Z</time></trkpt><trkpt lat="48.8283195495606" lon="2.452805519104"><ele>57.6836</ele><time>2007-04-15T09:11:50Z</time></trkpt><trkpt lat="48.8282318115234" lon="2.45293045043945"><ele>57.6676</ele><time>2007-04-15T09:11:51Z</time></trkpt><trkpt lat="48.8281555175781" lon="2.45304727554321"><ele>57.6733</ele><time>2007-04-15T09:11:52Z</time></trkpt><trkpt lat="48.828067779541" lon="2.45317125320435"><ele>57.655</ele><time>2007-04-15T09:11:53Z</time></trkpt><trkpt lat="48.827938079834" lon="2.45335841178894"><ele>57.5771</ele><time>2007-04-15T09:11:54Z</time></trkpt><trkpt lat="48.8277854919434" lon="2.45357418060303"><ele>57.0278</ele><time>2007-04-15T09:11:55Z</time></trkpt><trkpt lat="48.8276824951172" lon="2.45370435714722"><ele>56.657</ele><time>2007-04-15T09:11:56Z</time></trkpt><trkpt lat="48.8275413513184" lon="2.45388269424438"><ele>56.1489</ele><time>2007-04-15T09:11:57Z</time></trkpt><trkpt lat="48.8274040222168" lon="2.45404434204102"><ele>55.7866</ele><time>2007-04-15T09:11:58Z</time></trkpt><trkpt lat="48.8273048400879" lon="2.45418095588684"><ele>55.5316</ele><time>2007-04-15T09:11:59Z</time></trkpt><trkpt lat="48.8272476196289" lon="2.45423555374146"><ele>55.3943</ele><time>2007-04-15T09:12:00Z</time></trkpt><trkpt lat="48.8271179199219" lon="2.45415544509888"><ele>55.0892</ele><time>2007-04-15T09:12:01Z</time></trkpt><trkpt lat="48.8270874023438" lon="2.45390892028809"><ele>55.1629</ele><time>2007-04-15T09:12:02Z</time></trkpt><trkpt lat="48.8270950317383" lon="2.45372152328491"><ele>55.2877</ele><time>2007-04-15T09:12:03Z</time></trkpt><trkpt lat="48.8270950317383" lon="2.45352339744568"><ele>55.4032</ele><time>2007-04-15T09:12:04Z</time></trkpt><trkpt lat="48.8271064758301" lon="2.45329165458679"><ele>55.475</ele><time>2007-04-15T09:12:05Z</time></trkpt><trkpt lat="48.8271102905273" lon="2.45308995246887"><ele>55.2214</ele><time>2007-04-15T09:12:06Z</time></trkpt><trkpt lat="48.8271293640137" lon="2.45286583900452"><ele>54.9323</ele><time>2007-04-15T09:12:07Z</time></trkpt><trkpt lat="48.8271293640137" lon="2.45266366004944"><ele>54.6629</ele><time>2007-04-15T09:12:08Z</time></trkpt><trkpt lat="48.8271369934082" lon="2.45239853858948"><ele>54.3669</ele><time>2007-04-15T09:12:09Z</time></trkpt><trkpt lat="48.8271598815918" lon="2.45217275619507"><ele>54.1757</ele><time>2007-04-15T09:12:10Z</time></trkpt><trkpt lat="48.8271636962891" lon="2.45194602012634"><ele>54.0071</ele><time>2007-04-15T09:12:11Z</time></trkpt><trkpt lat="48.8271713256836" lon="2.45175313949585"><ele>53.8517</ele><time>2007-04-15T09:12:12Z</time></trkpt><trkpt lat="48.8271713256836" lon="2.45167446136475"><ele>53.7945</ele><time>2007-04-15T09:12:13Z</time></trkpt><trkpt lat="48.8271713256836" lon="2.45159864425659"><ele>53.8061</ele><time>2007-04-15T09:12:14Z</time></trkpt><trkpt lat="48.8271751403809" lon="2.45139956474304"><ele>53.8503</ele><time>2007-04-15T09:12:15Z</time></trkpt><trkpt lat="48.8271865844727" lon="2.45116519927978"><ele>53.9013</ele><time>2007-04-15T09:12:16Z</time></trkpt><trkpt lat="48.8271980285644" lon="2.45097947120666"><ele>53.9517</ele><time>2007-04-15T09:12:17Z</time></trkpt><trkpt lat="48.8272171020508" lon="2.45069265365601"><ele>53.6655</ele><time>2007-04-15T09:12:18Z</time></trkpt><trkpt lat="48.8272323608398" lon="2.45048356056213"><ele>53.1452</ele><time>2007-04-15T09:12:19Z</time></trkpt><trkpt lat="48.827262878418" lon="2.45025944709778"><ele>52.5219</ele><time>2007-04-15T09:12:20Z</time></trkpt><trkpt lat="48.827278137207" lon="2.45005750656128"><ele>51.9506</ele><time>2007-04-15T09:12:21Z</time></trkpt><trkpt lat="48.8272705078125" lon="2.4498450756073"><ele>52.1468</ele><time>2007-04-15T09:12:22Z</time></trkpt><trkpt lat="48.8272857666016" lon="2.4496488571167"><ele>52.5057</ele><time>2007-04-15T09:12:23Z</time></trkpt><trkpt lat="48.8273048400879" lon="2.4494948387146"><ele>52.773</ele><time>2007-04-15T09:12:24Z</time></trkpt><trkpt lat="48.8273086547852" lon="2.44928765296936"><ele>53.2022</ele><time>2007-04-15T09:12:25Z</time></trkpt><trkpt lat="48.8273010253906" lon="2.44908356666565"><ele>53.5773</ele><time>2007-04-15T09:12:26Z</time></trkpt><trkpt lat="48.8273162841797" lon="2.44884729385376"><ele>53.8242</ele><time>2007-04-15T09:12:27Z</time></trkpt><trkpt lat="48.8273544311523" lon="2.4486780166626"><ele>53.9357</ele><time>2007-04-15T09:12:28Z</time></trkpt><trkpt lat="48.8273811340332" lon="2.44849967956543"><ele>54.0857</ele><time>2007-04-15T09:12:29Z</time></trkpt><trkpt lat="48.8273811340332" lon="2.44834923744202"><ele>54.2662</ele><time>2007-04-15T09:12:30Z</time></trkpt><trkpt lat="48.8273735046387" lon="2.44815540313721"><ele>54.6982</ele><time>2007-04-15T09:12:31Z</time></trkpt><trkpt lat="48.8273620605469" lon="2.44795036315918"><ele>55.1741</ele><time>2007-04-15T09:12:32Z</time></trkpt><trkpt lat="48.8273696899414" lon="2.44773840904236"><ele>55.6289</ele><time>2007-04-15T09:12:33Z</time></trkpt><trkpt lat="48.8273963928223" lon="2.44760394096374"><ele>55.8904</ele><time>2007-04-15T09:12:34Z</time></trkpt><trkpt lat="48.8274192810059" lon="2.44735646247864"><ele>56.1135</ele><time>2007-04-15T09:12:35Z</time></trkpt><trkpt lat="48.8274230957031" lon="2.44718241691589"><ele>56.1275</ele><time>2007-04-15T09:12:36Z</time></trkpt><trkpt lat="48.8274383544922" lon="2.44693374633789"><ele>56.1242</ele><time>2007-04-15T09:12:37Z</time></trkpt><trkpt lat="48.8274421691894" lon="2.44686770439148"><ele>56.1221</ele><time>2007-04-15T09:12:38Z</time></trkpt><trkpt lat="48.8274459838867" lon="2.44673991203308"><ele>56.1239</ele><time>2007-04-15T09:12:39Z</time></trkpt><trkpt lat="48.8273429870606" lon="2.44663858413696"><ele>56.3705</ele><time>2007-04-15T09:12:40Z</time></trkpt><trkpt lat="48.8272285461426" lon="2.4465856552124"><ele>56.6198</ele><time>2007-04-15T09:12:41Z</time></trkpt><trkpt lat="48.8271141052246" lon="2.4465446472168"><ele>56.8583</ele><time>2007-04-15T09:12:42Z</time></trkpt><trkpt lat="48.8269729614258" lon="2.44651389122009"><ele>57.1489</ele><time>2007-04-15T09:12:43Z</time></trkpt><trkpt lat="48.8268394470215" lon="2.44649720191956"><ele>57.4241</ele><time>2007-04-15T09:12:44Z</time></trkpt><trkpt lat="48.8267021179199" lon="2.44650316238403"><ele>57.7271</ele><time>2007-04-15T09:12:45Z</time></trkpt><trkpt lat="48.8265342712402" lon="2.44647789001465"><ele>57.5277</ele><time>2007-04-15T09:12:46Z</time></trkpt><trkpt lat="48.8264350891113" lon="2.4464590549469"><ele>57.3335</ele><time>2007-04-15T09:12:47Z</time></trkpt><trkpt lat="48.8262596130371" lon="2.44645476341248"><ele>57.0172</ele><time>2007-04-15T09:12:48Z</time></trkpt><trkpt lat="48.8261604309082" lon="2.44645118713379"><ele>56.8406</ele><time>2007-04-15T09:12:49Z</time></trkpt><trkpt lat="48.8260612487793" lon="2.44642496109009"><ele>56.6784</ele><time>2007-04-15T09:12:50Z</time></trkpt><trkpt lat="48.8259124755859" lon="2.44639086723328"><ele>56.458</ele><time>2007-04-15T09:12:51Z</time></trkpt><trkpt lat="48.8257675170898" lon="2.44637036323547"><ele>56.5697</ele><time>2007-04-15T09:12:52Z</time></trkpt><trkpt lat="48.825611114502" lon="2.44635891914368"><ele>57.0996</ele><time>2007-04-15T09:12:53Z</time></trkpt><trkpt lat="48.825439453125" lon="2.44633340835571"><ele>57.7233</ele><time>2007-04-15T09:12:54Z</time></trkpt><trkpt lat="48.825267791748" lon="2.44629192352295"><ele>58.4174</ele><time>2007-04-15T09:12:55Z</time></trkpt><trkpt lat="48.8251495361328" lon="2.44628000259399"><ele>58.8666</ele><time>2007-04-15T09:12:56Z</time></trkpt><trkpt lat="48.8250350952148" lon="2.44626832008362"><ele>59.3096</ele><time>2007-04-15T09:12:57Z</time></trkpt><trkpt lat="48.8249168395996" lon="2.44627261161804"><ele>59.4766</ele><time>2007-04-15T09:12:58Z</time></trkpt><trkpt lat="48.8248748779297" lon="2.44626617431641"><ele>59.5256</ele><time>2007-04-15T09:12:59Z</time></trkpt><trkpt lat="48.8247528076172" lon="2.44624781608582"><ele>59.6538</ele><time>2007-04-15T09:13:00Z</time></trkpt><trkpt lat="48.8247299194336" lon="2.44624400138855"><ele>59.6766</ele><time>2007-04-15T09:13:01Z</time></trkpt><trkpt lat="48.8246116638184" lon="2.44622325897217"><ele>59.7844</ele><time>2007-04-15T09:13:02Z</time></trkpt><trkpt lat="48.8244705200195" lon="2.44619584083557"><ele>59.8888</ele><time>2007-04-15T09:13:03Z</time></trkpt><trkpt lat="48.8243179321289" lon="2.44617438316345"><ele>59.9587</ele><time>2007-04-15T09:13:04Z</time></trkpt><trkpt lat="48.8242034912109" lon="2.44615530967712"><ele>59.993</ele><time>2007-04-15T09:13:05Z</time></trkpt><trkpt lat="48.8240776062012" lon="2.44619035720825"><ele>60.0611</ele><time>2007-04-15T09:13:06Z</time></trkpt><trkpt lat="48.8239593505859" lon="2.44617652893066"><ele>60.1463</ele><time>2007-04-15T09:13:07Z</time></trkpt><trkpt lat="48.8238639831543" lon="2.44616723060608"><ele>60.2177</ele><time>2007-04-15T09:13:08Z</time></trkpt><trkpt lat="48.8236846923828" lon="2.44618248939514"><ele>60.336</ele><time>2007-04-15T09:13:09Z</time></trkpt><trkpt lat="48.823543548584" lon="2.44614362716675"><ele>60.4693</ele><time>2007-04-15T09:13:10Z</time></trkpt><trkpt lat="48.8234252929688" lon="2.44612836837769"><ele>60.5747</ele><time>2007-04-15T09:13:11Z</time></trkpt><trkpt lat="48.8232612609863" lon="2.446129322052"><ele>60.7006</ele><time>2007-04-15T09:13:12Z</time></trkpt><trkpt lat="48.8231430053711" lon="2.44610357284546"><ele>60.83</ele><time>2007-04-15T09:13:13Z</time></trkpt><trkpt lat="48.8230285644531" lon="2.44608211517334"><ele>60.958</ele><time>2007-04-15T09:13:14Z</time></trkpt><trkpt lat="48.822883605957" lon="2.44604730606079"><ele>61.1443</ele><time>2007-04-15T09:13:15Z</time></trkpt><trkpt lat="48.8227577209473" lon="2.44601225852966"><ele>61.3277</ele><time>2007-04-15T09:13:16Z</time></trkpt><trkpt lat="48.8225936889648" lon="2.44600510597229"><ele>61.4985</ele><time>2007-04-15T09:13:17Z</time></trkpt><trkpt lat="48.8224678039551" lon="2.44602179527283"><ele>61.6162</ele><time>2007-04-15T09:13:18Z</time></trkpt><trkpt lat="48.822338104248" lon="2.44600439071655"><ele>61.9381</ele><time>2007-04-15T09:13:19Z</time></trkpt><trkpt lat="48.8221626281738" lon="2.44598436355591"><ele>62.3738</ele><time>2007-04-15T09:13:20Z</time></trkpt><trkpt lat="48.8220443725586" lon="2.44595003128052"><ele>62.7369</ele><time>2007-04-15T09:13:21Z</time></trkpt><trkpt lat="48.8218574523926" lon="2.44593596458435"><ele>63.2008</ele><time>2007-04-15T09:13:22Z</time></trkpt><trkpt lat="48.8217849731445" lon="2.44592356681824"><ele>63.4066</ele><time>2007-04-15T09:13:23Z</time></trkpt><trkpt lat="48.8217582702637" lon="2.44591736793518"><ele>63.4887</ele><time>2007-04-15T09:13:24Z</time></trkpt><trkpt lat="48.8216361999512" lon="2.44588398933411"><ele>63.9617</ele><time>2007-04-15T09:13:25Z</time></trkpt><trkpt lat="48.8215141296387" lon="2.44586300849915"><ele>64.6188</ele><time>2007-04-15T09:13:26Z</time></trkpt><trkpt lat="48.8213691711426" lon="2.44582724571228"><ele>65.4259</ele><time>2007-04-15T09:13:27Z</time></trkpt><trkpt lat="48.8212471008301" lon="2.44579148292542"><ele>66.0143</ele><time>2007-04-15T09:13:28Z</time></trkpt><trkpt lat="48.8211250305176" lon="2.44574165344238"><ele>66.6329</ele><time>2007-04-15T09:13:29Z</time></trkpt><trkpt lat="48.8209838867188" lon="2.44567823410034"><ele>67.3962</ele><time>2007-04-15T09:13:30Z</time></trkpt><trkpt lat="48.8208122253418" lon="2.44558143615723"><ele>68.3553</ele><time>2007-04-15T09:13:31Z</time></trkpt><trkpt lat="48.8207092285156" lon="2.44551062583923"><ele>68.661</ele><time>2007-04-15T09:13:32Z</time></trkpt><trkpt lat="48.8205947875977" lon="2.44543170928955"><ele>68.9268</ele><time>2007-04-15T09:13:33Z</time></trkpt><trkpt lat="48.8204803466797" lon="2.44533157348633"><ele>69.1077</ele><time>2007-04-15T09:13:34Z</time></trkpt><trkpt lat="48.8203277587891" lon="2.44519734382629"><ele>69.1942</ele><time>2007-04-15T09:13:35Z</time></trkpt><trkpt lat="48.8202285766602" lon="2.4450945854187"><ele>69.1336</ele><time>2007-04-15T09:13:36Z</time></trkpt><trkpt lat="48.8201560974121" lon="2.44500541687012"><ele>69.0093</ele><time>2007-04-15T09:13:37Z</time></trkpt><trkpt lat="48.8200645446777" lon="2.44493937492371"><ele>68.9216</ele><time>2007-04-15T09:13:38Z</time></trkpt><trkpt lat="48.8199806213379" lon="2.44486451148987"><ele>68.8022</ele><time>2007-04-15T09:13:39Z</time></trkpt><trkpt lat="48.8198776245117" lon="2.44476938247681"><ele>68.5515</ele><time>2007-04-15T09:13:40Z</time></trkpt><trkpt lat="48.819751739502" lon="2.44463586807251"><ele>68.3577</ele><time>2007-04-15T09:13:41Z</time></trkpt><trkpt lat="48.8196563720703" lon="2.44452929496765"><ele>68.3092</ele><time>2007-04-15T09:13:42Z</time></trkpt><trkpt lat="48.8195571899414" lon="2.44441318511963"><ele>68.3556</ele><time>2007-04-15T09:13:43Z</time></trkpt><trkpt lat="48.8194541931152" lon="2.44429516792297"><ele>68.5062</ele><time>2007-04-15T09:13:44Z</time></trkpt><trkpt lat="48.8193511962891" lon="2.44419574737549"><ele>68.732</ele><time>2007-04-15T09:13:45Z</time></trkpt><trkpt lat="48.8192329406738" lon="2.44405198097229"><ele>68.7938</ele><time>2007-04-15T09:13:46Z</time></trkpt><trkpt lat="48.8190879821777" lon="2.44386577606201"><ele>66.9734</ele><time>2007-04-15T09:13:47Z</time></trkpt><trkpt lat="48.8190002441406" lon="2.44371819496155"><ele>64.9746</ele><time>2007-04-15T09:13:48Z</time></trkpt><trkpt lat="48.818904876709" lon="2.44354009628296"><ele>62.8297</ele><time>2007-04-15T09:13:49Z</time></trkpt><trkpt lat="48.8188133239746" lon="2.44334983825684"><ele>60.8032</ele><time>2007-04-15T09:13:50Z</time></trkpt><trkpt lat="48.818733215332" lon="2.44316458702087"><ele>59.0523</ele><time>2007-04-15T09:13:51Z</time></trkpt><trkpt lat="48.8186569213867" lon="2.44291496276855"><ele>57.2941</ele><time>2007-04-15T09:13:52Z</time></trkpt><trkpt lat="48.8186302185059" lon="2.44271945953369"><ele>56.5822</ele><time>2007-04-15T09:13:53Z</time></trkpt><trkpt lat="48.8186302185059" lon="2.44248867034912"><ele>56.4127</ele><time>2007-04-15T09:13:54Z</time></trkpt><trkpt lat="48.8186378479004" lon="2.4422869682312"><ele>56.5775</ele><time>2007-04-15T09:13:55Z</time></trkpt><trkpt lat="48.8186492919922" lon="2.44209098815918"><ele>56.8247</ele><time>2007-04-15T09:13:56Z</time></trkpt><trkpt lat="48.818660736084" lon="2.44188237190247"><ele>57.0719</ele><time>2007-04-15T09:13:57Z</time></trkpt><trkpt lat="48.8186836242676" lon="2.44169735908508"><ele>57.5663</ele><time>2007-04-15T09:13:58Z</time></trkpt><trkpt lat="48.8187026977539" lon="2.44151544570923"><ele>57.7164</ele><time>2007-04-15T09:13:59Z</time></trkpt><trkpt lat="48.8187370300293" lon="2.44130778312683"><ele>58.0806</ele><time>2007-04-15T09:14:00Z</time></trkpt><trkpt lat="48.8187484741211" lon="2.44116854667664"><ele>58.0715</ele><time>2007-04-15T09:14:01Z</time></trkpt><trkpt lat="48.8187713623047" lon="2.4409019947052"><ele>58.0615</ele><time>2007-04-15T09:14:02Z</time></trkpt><trkpt lat="48.8187866210938" lon="2.44071102142334"><ele>57.9535</ele><time>2007-04-15T09:14:03Z</time></trkpt><trkpt lat="48.8188056945801" lon="2.44052147865295"><ele>57.8877</ele><time>2007-04-15T09:14:04Z</time></trkpt><trkpt lat="48.8188285827637" lon="2.4403440952301"><ele>57.9289</ele><time>2007-04-15T09:14:05Z</time></trkpt><trkpt lat="48.8188591003418" lon="2.44013428688049"><ele>58.0479</ele><time>2007-04-15T09:14:06Z</time></trkpt><trkpt lat="48.8188781738281" lon="2.43995404243469"><ele>58.0596</ele><time>2007-04-15T09:14:07Z</time></trkpt><trkpt lat="48.818920135498" lon="2.4397087097168"><ele>58.6212</ele><time>2007-04-15T09:14:08Z</time></trkpt><trkpt lat="48.8189659118652" lon="2.43948125839233"><ele>59.2821</ele><time>2007-04-15T09:14:09Z</time></trkpt><trkpt lat="48.8189926147461" lon="2.43924021720886"><ele>59.5376</ele><time>2007-04-15T09:14:10Z</time></trkpt><trkpt lat="48.819034576416" lon="2.43905973434448"><ele>60.177</ele><time>2007-04-15T09:14:11Z</time></trkpt><trkpt lat="48.8190765380859" lon="2.43887782096863"><ele>60.8148</ele><time>2007-04-15T09:14:12Z</time></trkpt><trkpt lat="48.8191032409668" lon="2.43870735168457"><ele>61.1549</ele><time>2007-04-15T09:14:13Z</time></trkpt><trkpt lat="48.8191413879394" lon="2.43853569030762"><ele>61.7271</ele><time>2007-04-15T09:14:14Z</time></trkpt><trkpt lat="48.8191719055176" lon="2.43839240074158"><ele>62.0947</ele><time>2007-04-15T09:14:15Z</time></trkpt><trkpt lat="48.8192253112793" lon="2.43821501731873"><ele>62.1595</ele><time>2007-04-15T09:14:16Z</time></trkpt><trkpt lat="48.8192710876465" lon="2.43802905082703"><ele>62.2276</ele><time>2007-04-15T09:14:17Z</time></trkpt><trkpt lat="48.8193206787109" lon="2.43786096572876"><ele>62.3819</ele><time>2007-04-15T09:14:18Z</time></trkpt><trkpt lat="48.8193626403809" lon="2.43768429756165"><ele>62.5281</ele><time>2007-04-15T09:14:19Z</time></trkpt><trkpt lat="48.8194198608398" lon="2.43747138977051"><ele>62.7409</ele><time>2007-04-15T09:14:20Z</time></trkpt><trkpt lat="48.8194885253906" lon="2.43726062774658"><ele>62.6775</ele><time>2007-04-15T09:14:21Z</time></trkpt><trkpt lat="48.8195419311523" lon="2.43709635734558"><ele>62.685</ele><time>2007-04-15T09:14:22Z</time></trkpt><trkpt lat="48.8196029663086" lon="2.43689942359924"><ele>62.7339</ele><time>2007-04-15T09:14:23Z</time></trkpt><trkpt lat="48.8196678161621" lon="2.43673992156982"><ele>62.969</ele><time>2007-04-15T09:14:24Z</time></trkpt><trkpt lat="48.8197135925293" lon="2.43656635284424"><ele>63.1715</ele><time>2007-04-15T09:14:25Z</time></trkpt><trkpt lat="48.8197822570801" lon="2.43640637397766"><ele>63.6789</ele><time>2007-04-15T09:14:26Z</time></trkpt><trkpt lat="48.8198509216309" lon="2.43626856803894"><ele>64.1766</ele><time>2007-04-15T09:14:27Z</time></trkpt><trkpt lat="48.8199043273926" lon="2.43611431121826"><ele>64.4948</ele><time>2007-04-15T09:14:28Z</time></trkpt><trkpt lat="48.8199615478516" lon="2.43595480918884"><ele>64.816</ele><time>2007-04-15T09:14:29Z</time></trkpt><trkpt lat="48.8200378417969" lon="2.43575215339661"><ele>65.1384</ele><time>2007-04-15T09:14:30Z</time></trkpt><trkpt lat="48.8201065063477" lon="2.43558311462402"><ele>65.3897</ele><time>2007-04-15T09:14:31Z</time></trkpt><trkpt lat="48.8201293945312" lon="2.4355583190918"><ele>65.434</ele><time>2007-04-15T09:14:32Z</time></trkpt><trkpt lat="48.8201942443848" lon="2.43541240692139"><ele>65.6205</ele><time>2007-04-15T09:14:33Z</time></trkpt><trkpt lat="48.8202209472656" lon="2.43535137176514"><ele>65.6901</ele><time>2007-04-15T09:14:34Z</time></trkpt><trkpt lat="48.8202667236328" lon="2.43520927429199"><ele>65.8292</ele><time>2007-04-15T09:14:35Z</time></trkpt><trkpt lat="48.8203506469727" lon="2.43501234054565"><ele>65.9914</ele><time>2007-04-15T09:14:36Z</time></trkpt><trkpt lat="48.8204612731934" lon="2.43480062484741"><ele>66.2136</ele><time>2007-04-15T09:14:37Z</time></trkpt><trkpt lat="48.8205604553223" lon="2.43463444709778"><ele>66.2873</ele><time>2007-04-15T09:14:38Z</time></trkpt><trkpt lat="48.8206367492676" lon="2.43448305130005"><ele>66.2927</ele><time>2007-04-15T09:14:39Z</time></trkpt><trkpt lat="48.8207359313965" lon="2.43433785438538"><ele>66.1857</ele><time>2007-04-15T09:14:40Z</time></trkpt><trkpt lat="48.8208274841309" lon="2.43416523933411"><ele>66.0141</ele><time>2007-04-15T09:14:41Z</time></trkpt><trkpt lat="48.820873260498" lon="2.43407297134399"><ele>65.9521</ele><time>2007-04-15T09:14:42Z</time></trkpt><trkpt lat="48.8209838867188" lon="2.43391299247742"><ele>65.8193</ele><time>2007-04-15T09:14:43Z</time></trkpt><trkpt lat="48.8210716247559" lon="2.43383145332336"><ele>65.7141</ele><time>2007-04-15T09:14:44Z</time></trkpt><trkpt lat="48.8211441040039" lon="2.43371748924255"><ele>65.6271</ele><time>2007-04-15T09:14:45Z</time></trkpt><trkpt lat="48.8211975097656" lon="2.433598279953"><ele>65.563</ele><time>2007-04-15T09:14:46Z</time></trkpt><trkpt lat="48.8212776184082" lon="2.43351078033447"><ele>65.4669</ele><time>2007-04-15T09:14:47Z</time></trkpt><trkpt lat="48.8213310241699" lon="2.43342447280884"><ele>65.4028</ele><time>2007-04-15T09:14:48Z</time></trkpt><trkpt lat="48.8213996887207" lon="2.43331861495972"><ele>65.3444</ele><time>2007-04-15T09:14:49Z</time></trkpt><trkpt lat="48.821475982666" lon="2.4332332611084"><ele>65.414</ele><time>2007-04-15T09:14:50Z</time></trkpt><trkpt lat="48.8216094970703" lon="2.43310523033142"><ele>65.5785</ele><time>2007-04-15T09:14:51Z</time></trkpt><trkpt lat="48.821720123291" lon="2.43300533294678"><ele>65.6726</ele><time>2007-04-15T09:14:52Z</time></trkpt><trkpt lat="48.8218040466309" lon="2.43285989761353"><ele>65.7841</ele><time>2007-04-15T09:14:53Z</time></trkpt><trkpt lat="48.8219261169434" lon="2.43271207809448"><ele>65.7155</ele><time>2007-04-15T09:14:54Z</time></trkpt><trkpt lat="48.8220291137695" lon="2.43260979652405"><ele>65.5463</ele><time>2007-04-15T09:14:55Z</time></trkpt><trkpt lat="48.8221244812012" lon="2.43248200416565"><ele>65.3756</ele><time>2007-04-15T09:14:56Z</time></trkpt><trkpt lat="48.8221778869629" lon="2.43234324455261"><ele>65.3904</ele><time>2007-04-15T09:14:57Z</time></trkpt><trkpt lat="48.8223037719727" lon="2.43214559555054"><ele>65.3567</ele><time>2007-04-15T09:14:58Z</time></trkpt><trkpt lat="48.8224258422852" lon="2.43202352523804"><ele>65.3087</ele><time>2007-04-15T09:14:59Z</time></trkpt><trkpt lat="48.8224983215332" lon="2.43186664581299"><ele>65.523</ele><time>2007-04-15T09:15:00Z</time></trkpt><trkpt lat="48.8225898742676" lon="2.43171548843384"><ele>65.5719</ele><time>2007-04-15T09:15:01Z</time></trkpt><trkpt lat="48.8226547241211" lon="2.43151473999023"><ele>65.1799</ele><time>2007-04-15T09:15:02Z</time></trkpt><trkpt lat="48.8227386474609" lon="2.43138360977173"><ele>64.7533</ele><time>2007-04-15T09:15:03Z</time></trkpt><trkpt lat="48.8228034973144" lon="2.43121600151062"><ele>64.4167</ele><time>2007-04-15T09:15:04Z</time></trkpt><trkpt lat="48.8228721618652" lon="2.43111801147461"><ele>64.2255</ele><time>2007-04-15T09:15:05Z</time></trkpt><trkpt lat="48.8229560852051" lon="2.4309868812561"><ele>64.066</ele><time>2007-04-15T09:15:06Z</time></trkpt><trkpt lat="48.8230743408203" lon="2.43082022666931"><ele>63.9902</ele><time>2007-04-15T09:15:07Z</time></trkpt><trkpt lat="48.8231582641602" lon="2.43067836761475"><ele>63.9219</ele><time>2007-04-15T09:15:08Z</time></trkpt><trkpt lat="48.8232002258301" lon="2.43053984642029"><ele>63.8875</ele><time>2007-04-15T09:15:09Z</time></trkpt><trkpt lat="48.8232727050781" lon="2.43035244941711"><ele>63.916</ele><time>2007-04-15T09:15:10Z</time></trkpt><trkpt lat="48.8233337402344" lon="2.43018388748169"><ele>64.0002</ele><time>2007-04-15T09:15:11Z</time></trkpt><trkpt lat="48.8234062194824" lon="2.42999768257141"><ele>64.0789</ele><time>2007-04-15T09:15:12Z</time></trkpt><trkpt lat="48.8234939575195" lon="2.42986845970154"><ele>63.6888</ele><time>2007-04-15T09:15:13Z</time></trkpt><trkpt lat="48.8235549926758" lon="2.42966461181641"><ele>62.9515</ele><time>2007-04-15T09:15:14Z</time></trkpt><trkpt lat="48.8235778808594" lon="2.42946720123291"><ele>62.1878</ele><time>2007-04-15T09:15:15Z</time></trkpt><trkpt lat="48.8236427307129" lon="2.42926549911499"><ele>61.3998</ele><time>2007-04-15T09:15:16Z</time></trkpt><trkpt lat="48.8236885070801" lon="2.42908883094788"><ele>61.0536</ele><time>2007-04-15T09:15:17Z</time></trkpt><trkpt lat="48.8237533569336" lon="2.42892289161682"><ele>61.1451</ele><time>2007-04-15T09:15:18Z</time></trkpt><trkpt lat="48.8238105773926" lon="2.42875385284424"><ele>61.2117</ele><time>2007-04-15T09:15:19Z</time></trkpt><trkpt lat="48.8238639831543" lon="2.42858815193176"><ele>61.2522</ele><time>2007-04-15T09:15:20Z</time></trkpt><trkpt lat="48.8238677978516" lon="2.42835831642151"><ele>61.3479</ele><time>2007-04-15T09:15:21Z</time></trkpt><trkpt lat="48.8239135742188" lon="2.42808794975281"><ele>60.4203</ele><time>2007-04-15T09:15:22Z</time></trkpt><trkpt lat="48.8239517211914" lon="2.42786478996277"><ele>59.5712</ele><time>2007-04-15T09:15:23Z</time></trkpt><trkpt lat="48.8239974975586" lon="2.42763662338257"><ele>58.6948</ele><time>2007-04-15T09:15:24Z</time></trkpt><trkpt lat="48.8240280151367" lon="2.42744278907776"><ele>58.0177</ele><time>2007-04-15T09:15:25Z</time></trkpt><trkpt lat="48.8240623474121" lon="2.4272084236145"><ele>57.3816</ele><time>2007-04-15T09:15:26Z</time></trkpt><trkpt lat="48.8240814208984" lon="2.42697167396545"><ele>56.7695</ele><time>2007-04-15T09:15:27Z</time></trkpt><trkpt lat="48.8241081237793" lon="2.42675161361694"><ele>56.211</ele><time>2007-04-15T09:15:28Z</time></trkpt><trkpt lat="48.8241348266602" lon="2.42653560638428"><ele>55.994</ele><time>2007-04-15T09:15:29Z</time></trkpt><trkpt lat="48.8241500854492" lon="2.42639589309692"><ele>55.9935</ele><time>2007-04-15T09:15:30Z</time></trkpt><trkpt lat="48.8241653442383" lon="2.4261839389801"><ele>55.9991</ele><time>2007-04-15T09:15:31Z</time></trkpt><trkpt lat="48.8241691589356" lon="2.42598271369934"><ele>56.003</ele><time>2007-04-15T09:15:32Z</time></trkpt><trkpt lat="48.8241729736328" lon="2.42578315734863"><ele>55.9478</ele><time>2007-04-15T09:15:33Z</time></trkpt><trkpt lat="48.8241882324219" lon="2.42559576034546"><ele>55.7482</ele><time>2007-04-15T09:15:34Z</time></trkpt><trkpt lat="48.8241996765137" lon="2.42537546157837"><ele>55.5119</ele><time>2007-04-15T09:15:35Z</time></trkpt><trkpt lat="48.8242073059082" lon="2.42515134811401"><ele>55.2703</ele><time>2007-04-15T09:15:36Z</time></trkpt><trkpt lat="48.8241996765137" lon="2.42495322227478"><ele>55.1309</ele><time>2007-04-15T09:15:37Z</time></trkpt><trkpt lat="48.8242073059082" lon="2.42473721504211"><ele>55.3821</ele><time>2007-04-15T09:15:38Z</time></trkpt><trkpt lat="48.8242111206055" lon="2.42451214790344"><ele>55.6297</ele><time>2007-04-15T09:15:39Z</time></trkpt><trkpt lat="48.8242073059082" lon="2.42424917221069"><ele>55.9106</ele><time>2007-04-15T09:15:40Z</time></trkpt><trkpt lat="48.8241996765137" lon="2.42414093017578"><ele>56.0309</ele><time>2007-04-15T09:15:41Z</time></trkpt><trkpt lat="48.8241882324219" lon="2.42406296730042"><ele>56.1244</ele><time>2007-04-15T09:15:42Z</time></trkpt><trkpt lat="48.8241653442383" lon="2.42386054992676"><ele>56.3653</ele><time>2007-04-15T09:15:43Z</time></trkpt><trkpt lat="48.8241767883301" lon="2.42367625236511"><ele>56.5885</ele><time>2007-04-15T09:15:44Z</time></trkpt><trkpt lat="48.8241767883301" lon="2.4234766960144"><ele>56.828</ele><time>2007-04-15T09:15:45Z</time></trkpt><trkpt lat="48.8241767883301" lon="2.42324423789978"><ele>56.8918</ele><time>2007-04-15T09:15:46Z</time></trkpt><trkpt lat="48.824161529541" lon="2.4229850769043"><ele>56.5847</ele><time>2007-04-15T09:15:47Z</time></trkpt><trkpt lat="48.8241691589356" lon="2.42281794548035"><ele>56.3797</ele><time>2007-04-15T09:15:48Z</time></trkpt><trkpt lat="48.8241539001465" lon="2.42259240150452"><ele>56.1245</ele><time>2007-04-15T09:15:49Z</time></trkpt><trkpt lat="48.8241348266602" lon="2.42233800888062"><ele>55.6643</ele><time>2007-04-15T09:15:50Z</time></trkpt><trkpt lat="48.8241081237793" lon="2.42213726043701"><ele>55.2608</ele><time>2007-04-15T09:15:51Z</time></trkpt><trkpt lat="48.8240966796875" lon="2.42195701599121"><ele>54.8903</ele><time>2007-04-15T09:15:52Z</time></trkpt><trkpt lat="48.8240776062012" lon="2.42176008224487"><ele>54.5209</ele><time>2007-04-15T09:15:53Z</time></trkpt><trkpt lat="48.8240547180176" lon="2.42150497436523"><ele>54.765</ele><time>2007-04-15T09:15:54Z</time></trkpt><trkpt lat="48.8240547180176" lon="2.42130875587463"><ele>55.2043</ele><time>2007-04-15T09:15:55Z</time></trkpt><trkpt lat="48.8240509033203" lon="2.42112112045288"><ele>55.6351</ele><time>2007-04-15T09:15:56Z</time></trkpt><trkpt lat="48.8240699768066" lon="2.42098093032837"><ele>55.8984</ele><time>2007-04-15T09:15:57Z</time></trkpt><trkpt lat="48.8240737915039" lon="2.42069554328918"><ele>56.2413</ele><time>2007-04-15T09:15:58Z</time></trkpt><trkpt lat="48.8240776062012" lon="2.42041993141174"><ele>56.2668</ele><time>2007-04-15T09:15:59Z</time></trkpt><trkpt lat="48.8240966796875" lon="2.42023372650146"><ele>56.2284</ele><time>2007-04-15T09:16:00Z</time></trkpt><trkpt lat="48.8241119384766" lon="2.4200451374054"><ele>56.1935</ele><time>2007-04-15T09:16:01Z</time></trkpt><trkpt lat="48.8241386413574" lon="2.41980886459351"><ele>56.0932</ele><time>2007-04-15T09:16:02Z</time></trkpt><trkpt lat="48.824161529541" lon="2.41954040527344"><ele>56.0151</ele><time>2007-04-15T09:16:03Z</time></trkpt><trkpt lat="48.8241844177246" lon="2.41930985450745"><ele>55.975</ele><time>2007-04-15T09:16:04Z</time></trkpt><trkpt lat="48.8242225646973" lon="2.41903853416443"><ele>55.6151</ele><time>2007-04-15T09:16:05Z</time></trkpt><trkpt lat="48.8242607116699" lon="2.41884779930115"><ele>55.0787</ele><time>2007-04-15T09:16:06Z</time></trkpt><trkpt lat="48.8243026733398" lon="2.4186577796936"><ele>54.5158</ele><time>2007-04-15T09:16:07Z</time></trkpt><trkpt lat="48.8243408203125" lon="2.41845607757568"><ele>53.9074</ele><time>2007-04-15T09:16:08Z</time></trkpt><trkpt lat="48.824390411377" lon="2.41827249526978"><ele>53.4434</ele><time>2007-04-15T09:16:09Z</time></trkpt><trkpt lat="48.8244285583496" lon="2.41813111305237"><ele>53.2952</ele><time>2007-04-15T09:16:10Z</time></trkpt><trkpt lat="48.8244743347168" lon="2.41795015335083"><ele>53.0918</ele><time>2007-04-15T09:16:11Z</time></trkpt><trkpt lat="48.8245391845703" lon="2.41769933700562"><ele>52.7659</ele><time>2007-04-15T09:16:12Z</time></trkpt><trkpt lat="48.8245544433594" lon="2.4176299571991"><ele>52.6766</ele><time>2007-04-15T09:16:13Z</time></trkpt><trkpt lat="48.8246040344238" lon="2.41741943359375"><ele>52.3288</ele><time>2007-04-15T09:16:14Z</time></trkpt><trkpt lat="48.824634552002" lon="2.41727471351624"><ele>52.0453</ele><time>2007-04-15T09:16:15Z</time></trkpt><trkpt lat="48.8246765136719" lon="2.41707015037537"><ele>51.6487</ele><time>2007-04-15T09:16:16Z</time></trkpt><trkpt lat="48.82470703125" lon="2.41685700416565"><ele>51.2831</ele><time>2007-04-15T09:16:17Z</time></trkpt><trkpt lat="48.8247375488281" lon="2.41666865348816"><ele>50.9472</ele><time>2007-04-15T09:16:18Z</time></trkpt><trkpt lat="48.8247566223144" lon="2.41646027565002"><ele>51.2268</ele><time>2007-04-15T09:16:19Z</time></trkpt><trkpt lat="48.8247718811035" lon="2.41624808311462"><ele>51.5508</ele><time>2007-04-15T09:16:20Z</time></trkpt><trkpt lat="48.8247947692871" lon="2.41606044769287"><ele>51.8354</ele><time>2007-04-15T09:16:21Z</time></trkpt><trkpt lat="48.8248062133789" lon="2.41586542129517"><ele>52.1734</ele><time>2007-04-15T09:16:22Z</time></trkpt><trkpt lat="48.8248176574707" lon="2.41563558578491"><ele>51.7961</ele><time>2007-04-15T09:16:23Z</time></trkpt><trkpt lat="48.824821472168" lon="2.41540932655334"><ele>51.3056</ele><time>2007-04-15T09:16:24Z</time></trkpt><trkpt lat="48.8248100280762" lon="2.41521406173706"><ele>50.9111</ele><time>2007-04-15T09:16:25Z</time></trkpt><trkpt lat="48.8248062133789" lon="2.41503167152405"><ele>50.5323</ele><time>2007-04-15T09:16:26Z</time></trkpt><trkpt lat="48.8247947692871" lon="2.41480016708374"><ele>50.1311</ele><time>2007-04-15T09:16:27Z</time></trkpt><trkpt lat="48.8247718811035" lon="2.41449904441834"><ele>49.6743</ele><time>2007-04-15T09:16:28Z</time></trkpt><trkpt lat="48.824779510498" lon="2.4143533706665"><ele>49.3879</ele><time>2007-04-15T09:16:29Z</time></trkpt><trkpt lat="48.8247756958008" lon="2.41428327560425"><ele>49.2812</ele><time>2007-04-15T09:16:30Z</time></trkpt><trkpt lat="48.8247604370117" lon="2.41405868530273"><ele>49.3346</ele><time>2007-04-15T09:16:31Z</time></trkpt><trkpt lat="48.8247604370117" lon="2.41398334503174"><ele>49.4634</ele><time>2007-04-15T09:16:32Z</time></trkpt><trkpt lat="48.824764251709" lon="2.41381216049194"><ele>49.7417</ele><time>2007-04-15T09:16:33Z</time></trkpt><trkpt lat="48.824764251709" lon="2.41366839408874"><ele>49.9891</ele><time>2007-04-15T09:16:34Z</time></trkpt><trkpt lat="48.8247528076172" lon="2.41343545913696"><ele>50.4209</ele><time>2007-04-15T09:16:35Z</time></trkpt><trkpt lat="48.8247566223144" lon="2.41321539878845"><ele>50.5841</ele><time>2007-04-15T09:16:36Z</time></trkpt><trkpt lat="48.8247718811035" lon="2.41304659843445"><ele>50.5475</ele><time>2007-04-15T09:16:37Z</time></trkpt><trkpt lat="48.824779510498" lon="2.41286706924438"><ele>50.5292</ele><time>2007-04-15T09:16:38Z</time></trkpt><trkpt lat="48.824779510498" lon="2.41263890266418"><ele>50.5292</ele><time>2007-04-15T09:16:39Z</time></trkpt><trkpt lat="48.8247985839844" lon="2.41237854957581"><ele>50.5138</ele><time>2007-04-15T09:16:40Z</time></trkpt><trkpt lat="48.8248100280762" lon="2.41223669052124"><ele>50.5001</ele><time>2007-04-15T09:16:41Z</time></trkpt><trkpt lat="48.8248176574707" lon="2.41208028793335"><ele>50.485</ele><time>2007-04-15T09:16:42Z</time></trkpt><trkpt lat="48.8248252868652" lon="2.41192722320557"><ele>50.4525</ele><time>2007-04-15T09:16:43Z</time></trkpt><trkpt lat="48.824836730957" lon="2.41189646720886"><ele>50.3771</ele><time>2007-04-15T09:16:44Z</time></trkpt><trkpt lat="48.8248519897461" lon="2.41171026229858"><ele>50.2491</ele><time>2007-04-15T09:16:45Z</time></trkpt><trkpt lat="48.824878692627" lon="2.41145706176758"><ele>50.6271</ele><time>2007-04-15T09:16:46Z</time></trkpt><trkpt lat="48.8249130249023" lon="2.41129088401794"><ele>50.8951</ele><time>2007-04-15T09:16:47Z</time></trkpt><trkpt lat="48.8249359130859" lon="2.41107702255249"><ele>51.4434</ele><time>2007-04-15T09:16:48Z</time></trkpt><trkpt lat="48.8249702453613" lon="2.41082382202148"><ele>52.1621</ele><time>2007-04-15T09:16:49Z</time></trkpt><trkpt lat="48.8249931335449" lon="2.41071820259094"><ele>52.7098</ele><time>2007-04-15T09:16:50Z</time></trkpt><trkpt lat="48.8250122070312" lon="2.41064834594727"><ele>53.0285</ele><time>2007-04-15T09:16:51Z</time></trkpt><trkpt lat="48.8250541687012" lon="2.41047096252441"><ele>53.8407</ele><time>2007-04-15T09:16:52Z</time></trkpt><trkpt lat="48.8251190185547" lon="2.41031002998352"><ele>54.4623</ele><time>2007-04-15T09:16:53Z</time></trkpt><trkpt lat="48.8251800537109" lon="2.41013383865356"><ele>55.2633</ele><time>2007-04-15T09:16:54Z</time></trkpt><trkpt lat="48.8252220153809" lon="2.40995454788208"><ele>55.8798</ele><time>2007-04-15T09:16:55Z</time></trkpt><trkpt lat="48.8252944946289" lon="2.40975308418274"><ele>55.2901</ele><time>2007-04-15T09:16:56Z</time></trkpt><trkpt lat="48.8253631591797" lon="2.40959000587463"><ele>54.7648</ele><time>2007-04-15T09:16:57Z</time></trkpt><trkpt lat="48.8254127502441" lon="2.40946102142334"><ele>54.372</ele><time>2007-04-15T09:16:58Z</time></trkpt><trkpt lat="48.8254241943359" lon="2.40942740440369"><ele>54.2768</ele><time>2007-04-15T09:16:59Z</time></trkpt><trkpt lat="48.8254737854004" lon="2.40922594070435"><ele>53.797</ele><time>2007-04-15T09:17:00Z</time></trkpt><trkpt lat="48.8255462646484" lon="2.40904211997986"><ele>53.177</ele><time>2007-04-15T09:17:01Z</time></trkpt><trkpt lat="48.8256072998047" lon="2.40887331962585"><ele>52.6375</ele><time>2007-04-15T09:17:02Z</time></trkpt><trkpt lat="48.8257102966309" lon="2.40872287750244"><ele>51.9794</ele><time>2007-04-15T09:17:03Z</time></trkpt><trkpt lat="48.8258247375488" lon="2.40858244895935"><ele>51.333</ele><time>2007-04-15T09:17:04Z</time></trkpt><trkpt lat="48.8258972167969" lon="2.40843343734741"><ele>51.025</ele><time>2007-04-15T09:17:05Z</time></trkpt><trkpt lat="48.8259811401367" lon="2.40831780433655"><ele>50.8599</ele><time>2007-04-15T09:17:06Z</time></trkpt><trkpt lat="48.8260383605957" lon="2.40821409225464"><ele>51.0401</ele><time>2007-04-15T09:17:07Z</time></trkpt><trkpt lat="48.8260841369629" lon="2.40817880630493"><ele>51.0699</ele><time>2007-04-15T09:17:08Z</time></trkpt><trkpt lat="48.826099395752" lon="2.40815544128418"><ele>51.1077</ele><time>2007-04-15T09:17:09Z</time></trkpt><trkpt lat="48.8261032104492" lon="2.40814876556396"><ele>51.1191</ele><time>2007-04-15T09:17:10Z</time></trkpt><trkpt lat="48.8262214660644" lon="2.407958984375"><ele>51.4327</ele><time>2007-04-15T09:17:11Z</time></trkpt><trkpt lat="48.8262519836426" lon="2.40790247917175"><ele>51.5317</ele><time>2007-04-15T09:17:12Z</time></trkpt><trkpt lat="48.8262901306152" lon="2.40780115127563"><ele>51.7291</ele><time>2007-04-15T09:17:13Z</time></trkpt><trkpt lat="48.8263168334961" lon="2.40772271156311"><ele>51.8853</ele><time>2007-04-15T09:17:14Z</time></trkpt><trkpt lat="48.8263626098633" lon="2.40756130218506"><ele>52.2177</ele><time>2007-04-15T09:17:15Z</time></trkpt><trkpt lat="48.8264503479004" lon="2.40747690200806"><ele>52.3427</ele><time>2007-04-15T09:17:16Z</time></trkpt><trkpt lat="48.8265266418457" lon="2.40736269950867"><ele>52.6623</ele><time>2007-04-15T09:17:17Z</time></trkpt><trkpt lat="48.8266258239746" lon="2.40723204612732"><ele>53.0136</ele><time>2007-04-15T09:17:18Z</time></trkpt><trkpt lat="48.8266983032227" lon="2.4071536064148"><ele>53.2312</ele><time>2007-04-15T09:17:19Z</time></trkpt><trkpt lat="48.826789855957" lon="2.40706396102905"><ele>53.4924</ele><time>2007-04-15T09:17:20Z</time></trkpt><trkpt lat="48.8268775939941" lon="2.40697813034058"><ele>53.7202</ele><time>2007-04-15T09:17:21Z</time></trkpt><trkpt lat="48.8269424438477" lon="2.40689420700073"><ele>53.9403</ele><time>2007-04-15T09:17:22Z</time></trkpt><trkpt lat="48.8270072937012" lon="2.40678024291992"><ele>54.2381</ele><time>2007-04-15T09:17:23Z</time></trkpt><trkpt lat="48.8270721435547" lon="2.40665078163147"><ele>54.5613</ele><time>2007-04-15T09:17:24Z</time></trkpt><trkpt lat="48.8271522521973" lon="2.40655732154846"><ele>54.7345</ele><time>2007-04-15T09:17:25Z</time></trkpt><trkpt lat="48.8272399902344" lon="2.40645122528076"><ele>54.9097</ele><time>2007-04-15T09:17:26Z</time></trkpt><trkpt lat="48.8273506164551" lon="2.40633654594421"><ele>55.0426</ele><time>2007-04-15T09:17:27Z</time></trkpt><trkpt lat="48.827465057373" lon="2.40621089935303"><ele>55.1587</ele><time>2007-04-15T09:17:28Z</time></trkpt><trkpt lat="48.8275718688965" lon="2.40603923797607"><ele>55.2471</ele><time>2007-04-15T09:17:29Z</time></trkpt><trkpt lat="48.8276519775391" lon="2.40588974952698"><ele>55.3175</ele><time>2007-04-15T09:17:30Z</time></trkpt><trkpt lat="48.827808380127" lon="2.40578603744507"><ele>54.9403</ele><time>2007-04-15T09:17:31Z</time></trkpt><trkpt lat="48.8279075622559" lon="2.40565156936646"><ele>54.649</ele><time>2007-04-15T09:17:32Z</time></trkpt><trkpt lat="48.827995300293" lon="2.40551543235779"><ele>54.2997</ele><time>2007-04-15T09:17:33Z</time></trkpt><trkpt lat="48.8280754089356" lon="2.40536737442017"><ele>53.8886</ele><time>2007-04-15T09:17:34Z</time></trkpt><trkpt lat="48.8282012939453" lon="2.4051365852356"><ele>53.0367</ele><time>2007-04-15T09:17:35Z</time></trkpt><trkpt lat="48.8282928466797" lon="2.40503215789795"><ele>52.3245</ele><time>2007-04-15T09:17:36Z</time></trkpt><trkpt lat="48.8284111022949" lon="2.40489888191223"><ele>52.2373</ele><time>2007-04-15T09:17:37Z</time></trkpt><trkpt lat="48.8285026550293" lon="2.40471434593201"><ele>52.6853</ele><time>2007-04-15T09:17:38Z</time></trkpt><trkpt lat="48.8285865783691" lon="2.40459227561951"><ele>53.0905</ele><time>2007-04-15T09:17:39Z</time></trkpt><trkpt lat="48.8286743164062" lon="2.40445184707642"><ele>53.6053</ele><time>2007-04-15T09:17:40Z</time></trkpt><trkpt lat="48.8287658691406" lon="2.4042809009552"><ele>54.2777</ele><time>2007-04-15T09:17:41Z</time></trkpt><trkpt lat="48.8288345336914" lon="2.40414094924927"><ele>54.7549</ele><time>2007-04-15T09:17:42Z</time></trkpt><trkpt lat="48.8289031982422" lon="2.40395855903626"><ele>54.631</ele><time>2007-04-15T09:17:43Z</time></trkpt><trkpt lat="48.8289566040039" lon="2.40378451347351"><ele>54.4422</ele><time>2007-04-15T09:17:44Z</time></trkpt><trkpt lat="48.8290138244629" lon="2.40358591079712"><ele>54.1838</ele><time>2007-04-15T09:17:45Z</time></trkpt><trkpt lat="48.8291053771973" lon="2.40346789360046"><ele>54.164</ele><time>2007-04-15T09:17:46Z</time></trkpt><trkpt lat="48.8291969299316" lon="2.40329599380493"><ele>54.0629</ele><time>2007-04-15T09:17:47Z</time></trkpt><trkpt lat="48.8292770385742" lon="2.40315937995911"><ele>54.099</ele><time>2007-04-15T09:17:48Z</time></trkpt><trkpt lat="48.8293533325195" lon="2.4030065536499"><ele>53.921</ele><time>2007-04-15T09:17:49Z</time></trkpt><trkpt lat="48.8294219970703" lon="2.40281677246094"><ele>53.4732</ele><time>2007-04-15T09:17:50Z</time></trkpt><trkpt lat="48.8294830322266" lon="2.40265560150146"><ele>52.9068</ele><time>2007-04-15T09:17:51Z</time></trkpt><trkpt lat="48.8295364379883" lon="2.40248870849609"><ele>52.1935</ele><time>2007-04-15T09:17:52Z</time></trkpt><trkpt lat="48.8295745849609" lon="2.4022741317749"><ele>51.3729</ele><time>2007-04-15T09:17:53Z</time></trkpt><trkpt lat="48.8296089172363" lon="2.40205407142639"><ele>50.4901</ele><time>2007-04-15T09:17:54Z</time></trkpt><trkpt lat="48.8296356201172" lon="2.4018452167511"><ele>49.6368</ele><time>2007-04-15T09:17:55Z</time></trkpt><trkpt lat="48.8296508789062" lon="2.40164875984192"><ele>48.9091</ele><time>2007-04-15T09:17:56Z</time></trkpt><trkpt lat="48.8296928405762" lon="2.40141725540161"><ele>48.3278</ele><time>2007-04-15T09:17:57Z</time></trkpt><trkpt lat="48.8297348022461" lon="2.40111541748047"><ele>47.8366</ele><time>2007-04-15T09:17:58Z</time></trkpt><trkpt lat="48.8297653198242" lon="2.40092086791992"><ele>47.6061</ele><time>2007-04-15T09:17:59Z</time></trkpt><trkpt lat="48.8298492431641" lon="2.40071821212769"><ele>47.6763</ele><time>2007-04-15T09:18:00Z</time></trkpt><trkpt lat="48.8299446105957" lon="2.4005651473999"><ele>48.0128</ele><time>2007-04-15T09:18:01Z</time></trkpt><trkpt lat="48.8300476074219" lon="2.40041089057922"><ele>48.4057</ele><time>2007-04-15T09:18:02Z</time></trkpt><trkpt lat="48.8301277160644" lon="2.40031981468201"><ele>48.5065</ele><time>2007-04-15T09:18:03Z</time></trkpt><trkpt lat="48.8302421569824" lon="2.40016841888428"><ele>48.6394</ele><time>2007-04-15T09:18:04Z</time></trkpt><trkpt lat="48.8303565979004" lon="2.39999771118164"><ele>48.7104</ele><time>2007-04-15T09:18:05Z</time></trkpt><trkpt lat="48.8304100036621" lon="2.39990925788879"><ele>48.3045</ele><time>2007-04-15T09:18:06Z</time></trkpt><trkpt lat="48.8304481506348" lon="2.39985418319702"><ele>48.0499</ele><time>2007-04-15T09:18:07Z</time></trkpt><trkpt lat="48.8305511474609" lon="2.39968419075012"><ele>47.3802</ele><time>2007-04-15T09:18:08Z</time></trkpt><trkpt lat="48.8306503295898" lon="2.39951753616333"><ele>46.8256</ele><time>2007-04-15T09:18:09Z</time></trkpt><trkpt lat="48.8307952880859" lon="2.39931082725525"><ele>46.2344</ele><time>2007-04-15T09:18:10Z</time></trkpt><trkpt lat="48.8309059143066" lon="2.39915156364441"><ele>46.1935</ele><time>2007-04-15T09:18:11Z</time></trkpt><trkpt lat="48.8309936523438" lon="2.39902019500732"><ele>45.9755</ele><time>2007-04-15T09:18:12Z</time></trkpt><trkpt lat="48.8310699462891" lon="2.39887499809265"><ele>45.7499</ele><time>2007-04-15T09:18:13Z</time></trkpt><trkpt lat="48.8311767578125" lon="2.39870691299438"><ele>45.7116</ele><time>2007-04-15T09:18:14Z</time></trkpt><trkpt lat="48.8312797546387" lon="2.39855766296387"><ele>45.8584</ele><time>2007-04-15T09:18:15Z</time></trkpt><trkpt lat="48.8313674926758" lon="2.3984203338623"><ele>46.0628</ele><time>2007-04-15T09:18:16Z</time></trkpt><trkpt lat="48.8314933776856" lon="2.39824080467224"><ele>46.373</ele><time>2007-04-15T09:18:17Z</time></trkpt><trkpt lat="48.831615447998" lon="2.39805603027344"><ele>46.592</ele><time>2007-04-15T09:18:18Z</time></trkpt><trkpt lat="48.8317031860352" lon="2.39791703224182"><ele>46.4356</ele><time>2007-04-15T09:18:19Z</time></trkpt><trkpt lat="48.8318023681641" lon="2.39775848388672"><ele>45.7172</ele><time>2007-04-15T09:18:20Z</time></trkpt><trkpt lat="48.8318901062012" lon="2.39760756492615"><ele>45.0845</ele><time>2007-04-15T09:18:21Z</time></trkpt><trkpt lat="48.8320007324219" lon="2.39741778373718"><ele>44.5205</ele><time>2007-04-15T09:18:22Z</time></trkpt><trkpt lat="48.8321075439453" lon="2.39723682403564"><ele>44.3406</ele><time>2007-04-15T09:18:23Z</time></trkpt><trkpt lat="48.832218170166" lon="2.39708018302917"><ele>44.3308</ele><time>2007-04-15T09:18:24Z</time></trkpt><trkpt lat="48.8323211669922" lon="2.39692258834839"><ele>44.4614</ele><time>2007-04-15T09:18:25Z</time></trkpt><trkpt lat="48.8324203491211" lon="2.39676833152771"><ele>44.7218</ele><time>2007-04-15T09:18:26Z</time></trkpt><trkpt lat="48.8325004577637" lon="2.39664173126221"><ele>44.944</ele><time>2007-04-15T09:18:27Z</time></trkpt><trkpt lat="48.8325958251953" lon="2.39649224281311"><ele>45.3622</ele><time>2007-04-15T09:18:28Z</time></trkpt><trkpt lat="48.8326988220215" lon="2.39633965492249"><ele>45.7917</ele><time>2007-04-15T09:18:29Z</time></trkpt><trkpt lat="48.8327751159668" lon="2.39619708061218"><ele>45.9979</ele><time>2007-04-15T09:18:30Z</time></trkpt><trkpt lat="48.8328475952148" lon="2.39609527587891"><ele>46.2625</ele><time>2007-04-15T09:18:31Z</time></trkpt><trkpt lat="48.8329544067383" lon="2.39592862129211"><ele>46.5628</ele><time>2007-04-15T09:18:32Z</time></trkpt><trkpt lat="48.8330764770508" lon="2.3957736492157"><ele>46.7155</ele><time>2007-04-15T09:18:33Z</time></trkpt><trkpt lat="48.8331680297852" lon="2.39565443992615"><ele>46.4349</ele><time>2007-04-15T09:18:34Z</time></trkpt><trkpt lat="48.8332672119141" lon="2.39549398422241"><ele>45.7703</ele><time>2007-04-15T09:18:35Z</time></trkpt><trkpt lat="48.833366394043" lon="2.39533376693726"><ele>44.9305</ele><time>2007-04-15T09:18:36Z</time></trkpt><trkpt lat="48.8334693908691" lon="2.39517903327942"><ele>44.238</ele><time>2007-04-15T09:18:37Z</time></trkpt><trkpt lat="48.8335762023926" lon="2.395015001297"><ele>43.8379</ele><time>2007-04-15T09:18:38Z</time></trkpt><trkpt lat="48.8336868286133" lon="2.39487075805664"><ele>44.2115</ele><time>2007-04-15T09:18:39Z</time></trkpt><trkpt lat="48.8337745666504" lon="2.39474081993103"><ele>44.5732</ele><time>2007-04-15T09:18:40Z</time></trkpt><trkpt lat="48.8338623046875" lon="2.39461612701416"><ele>45.0115</ele><time>2007-04-15T09:18:41Z</time></trkpt><trkpt lat="48.8339653015137" lon="2.39445900917053"><ele>45.5872</ele><time>2007-04-15T09:18:42Z</time></trkpt><trkpt lat="48.8340454101562" lon="2.39433479309082"><ele>46.0964</ele><time>2007-04-15T09:18:43Z</time></trkpt><trkpt lat="48.8341331481934" lon="2.39420914649963"><ele>46.7333</ele><time>2007-04-15T09:18:44Z</time></trkpt><trkpt lat="48.8342170715332" lon="2.39409613609314"><ele>47.3961</ele><time>2007-04-15T09:18:45Z</time></trkpt><trkpt lat="48.834300994873" lon="2.3939938545227"><ele>48.0507</ele><time>2007-04-15T09:18:46Z</time></trkpt><trkpt lat="48.8344306945801" lon="2.39386630058289"><ele>49.0613</ele><time>2007-04-15T09:18:47Z</time></trkpt><trkpt lat="48.8344535827637" lon="2.39384984970093"><ele>49.2541</ele><time>2007-04-15T09:18:48Z</time></trkpt><trkpt lat="48.8345489501953" lon="2.39368891716003"><ele>49.5373</ele><time>2007-04-15T09:18:49Z</time></trkpt><trkpt lat="48.8345756530762" lon="2.39362645149231"><ele>49.4994</ele><time>2007-04-15T09:18:50Z</time></trkpt><trkpt lat="48.8346633911133" lon="2.3934690952301"><ele>49.5486</ele><time>2007-04-15T09:18:51Z</time></trkpt><trkpt lat="48.834774017334" lon="2.39336585998535"><ele>50.033</ele><time>2007-04-15T09:18:52Z</time></trkpt><trkpt lat="48.8348731994629" lon="2.39325547218323"><ele>50.344</ele><time>2007-04-15T09:18:53Z</time></trkpt><trkpt lat="48.8349685668945" lon="2.39314031600952"><ele>50.5576</ele><time>2007-04-15T09:18:54Z</time></trkpt><trkpt lat="48.8350677490234" lon="2.39301586151123"><ele>49.7932</ele><time>2007-04-15T09:18:55Z</time></trkpt><trkpt lat="48.8351936340332" lon="2.39290571212769"><ele>48.7555</ele><time>2007-04-15T09:18:56Z</time></trkpt><trkpt lat="48.8353424072266" lon="2.39275670051575"><ele>47.7808</ele><time>2007-04-15T09:18:57Z</time></trkpt><trkpt lat="48.8354644775391" lon="2.39262843132019"><ele>47.2552</ele><time>2007-04-15T09:18:58Z</time></trkpt><trkpt lat="48.8355484008789" lon="2.39254331588745"><ele>47.0547</ele><time>2007-04-15T09:18:59Z</time></trkpt><trkpt lat="48.8356971740723" lon="2.39242553710938"><ele>46.7775</ele><time>2007-04-15T09:19:00Z</time></trkpt><trkpt lat="48.8357582092285" lon="2.39233827590942"><ele>46.5594</ele><time>2007-04-15T09:19:01Z</time></trkpt><trkpt lat="48.8358688354492" lon="2.39226150512695"><ele>46.2694</ele><time>2007-04-15T09:19:02Z</time></trkpt><trkpt lat="48.835994720459" lon="2.39220142364502"><ele>45.5781</ele><time>2007-04-15T09:19:03Z</time></trkpt><trkpt lat="48.8361015319824" lon="2.39213061332703"><ele>44.9688</ele><time>2007-04-15T09:19:04Z</time></trkpt><trkpt lat="48.8362007141113" lon="2.39200663566589"><ele>44.3135</ele><time>2007-04-15T09:19:05Z</time></trkpt><trkpt lat="48.8363227844238" lon="2.39187598228455"><ele>43.5928</ele><time>2007-04-15T09:19:06Z</time></trkpt><trkpt lat="48.83642578125" lon="2.39178204536438"><ele>43.0457</ele><time>2007-04-15T09:19:07Z</time></trkpt><trkpt lat="48.8365097045898" lon="2.39171075820923"><ele>42.6279</ele><time>2007-04-15T09:19:08Z</time></trkpt><trkpt lat="48.8366012573242" lon="2.39161252975464"><ele>42.2202</ele><time>2007-04-15T09:19:09Z</time></trkpt><trkpt lat="48.8367118835449" lon="2.39150929450989"><ele>42.088</ele><time>2007-04-15T09:19:10Z</time></trkpt><trkpt lat="48.8368225097656" lon="2.39140701293945"><ele>42.2575</ele><time>2007-04-15T09:19:11Z</time></trkpt><trkpt lat="48.8369483947754" lon="2.39134168624878"><ele>42.4125</ele><time>2007-04-15T09:19:12Z</time></trkpt><trkpt lat="48.8370361328125" lon="2.39121341705322"><ele>42.4044</ele><time>2007-04-15T09:19:13Z</time></trkpt><trkpt lat="48.8371849060059" lon="2.39113211631775"><ele>42.4459</ele><time>2007-04-15T09:19:14Z</time></trkpt><trkpt lat="48.837230682373" lon="2.39110326766968"><ele>42.4385</ele><time>2007-04-15T09:19:15Z</time></trkpt><trkpt lat="48.8372993469238" lon="2.39105558395386"><ele>42.405</ele><time>2007-04-15T09:19:16Z</time></trkpt><trkpt lat="48.8374328613281" lon="2.39095139503479"><ele>42.2605</ele><time>2007-04-15T09:19:17Z</time></trkpt><trkpt lat="48.837532043457" lon="2.39080953598022"><ele>42.0242</ele><time>2007-04-15T09:19:18Z</time></trkpt><trkpt lat="48.8375968933106" lon="2.39063024520874"><ele>41.8585</ele><time>2007-04-15T09:19:19Z</time></trkpt><trkpt lat="48.8376693725586" lon="2.39052414894104"><ele>41.9661</ele><time>2007-04-15T09:19:20Z</time></trkpt><trkpt lat="48.8377571105957" lon="2.39040446281433"><ele>42.2229</ele><time>2007-04-15T09:19:21Z</time></trkpt><trkpt lat="48.8378410339356" lon="2.39029979705811"><ele>42.586</ele><time>2007-04-15T09:19:22Z</time></trkpt><trkpt lat="48.8379096984863" lon="2.3901572227478"><ele>42.9561</ele><time>2007-04-15T09:19:23Z</time></trkpt><trkpt lat="48.8380165100098" lon="2.39007997512817"><ele>43.6729</ele><time>2007-04-15T09:19:24Z</time></trkpt><trkpt lat="48.8381195068359" lon="2.39005064964294"><ele>44.4013</ele><time>2007-04-15T09:19:25Z</time></trkpt><trkpt lat="48.8381729125977" lon="2.39004135131836"><ele>44.7839</ele><time>2007-04-15T09:19:26Z</time></trkpt><trkpt lat="48.8382377624512" lon="2.38989949226379"><ele>45.1913</ele><time>2007-04-15T09:19:27Z</time></trkpt><trkpt lat="48.8383102416992" lon="2.38976359367371"><ele>45.5501</ele><time>2007-04-15T09:19:28Z</time></trkpt><trkpt lat="48.8383903503418" lon="2.38962411880493"><ele>45.8468</ele><time>2007-04-15T09:19:29Z</time></trkpt><trkpt lat="48.8385391235352" lon="2.38950109481812"><ele>46.5857</ele><time>2007-04-15T09:19:30Z</time></trkpt><trkpt lat="48.8386688232422" lon="2.38942766189575"><ele>47.3505</ele><time>2007-04-15T09:19:31Z</time></trkpt><trkpt lat="48.8387985229492" lon="2.38933873176575"><ele>48.2101</ele><time>2007-04-15T09:19:32Z</time></trkpt><trkpt lat="48.8389053344727" lon="2.38927483558655"><ele>48.9809</ele><time>2007-04-15T09:19:33Z</time></trkpt><trkpt lat="48.839038848877" lon="2.38918495178223"><ele>50.0459</ele><time>2007-04-15T09:19:34Z</time></trkpt><trkpt lat="48.8391571044922" lon="2.38909864425659"><ele>50.5249</ele><time>2007-04-15T09:19:35Z</time></trkpt><trkpt lat="48.8392448425293" lon="2.38902807235718"><ele>50.0746</ele><time>2007-04-15T09:19:36Z</time></trkpt><trkpt lat="48.8394012451172" lon="2.38892436027527"><ele>49.2647</ele><time>2007-04-15T09:19:37Z</time></trkpt><trkpt lat="48.8395004272461" lon="2.38876819610596"><ele>48.2087</ele><time>2007-04-15T09:19:38Z</time></trkpt><trkpt lat="48.8395690917969" lon="2.38863444328308"><ele>47.3237</ele><time>2007-04-15T09:19:39Z</time></trkpt><trkpt lat="48.8395919799805" lon="2.38861083984375"><ele>47.1547</ele><time>2007-04-15T09:19:40Z</time></trkpt><trkpt lat="48.8398094177246" lon="2.38855504989624"><ele>46.559</ele><time>2007-04-15T09:19:41Z</time></trkpt><trkpt lat="48.8400230407715" lon="2.38850355148315"><ele>46.0597</ele><time>2007-04-15T09:19:42Z</time></trkpt><trkpt lat="48.8401412963867" lon="2.38835048675537"><ele>45.4316</ele><time>2007-04-15T09:19:43Z</time></trkpt><trkpt lat="48.8402252197266" lon="2.38821578025818"><ele>45.1936</ele><time>2007-04-15T09:19:44Z</time></trkpt><trkpt lat="48.8403396606445" lon="2.3880820274353"><ele>45.1563</ele><time>2007-04-15T09:19:45Z</time></trkpt><trkpt lat="48.8404273986816" lon="2.38796281814575"><ele>45.148</ele><time>2007-04-15T09:19:46Z</time></trkpt><trkpt lat="48.8405265808106" lon="2.38784766197205"><ele>45.2519</ele><time>2007-04-15T09:19:47Z</time></trkpt><trkpt lat="48.8406524658203" lon="2.3877272605896"><ele>45.5229</ele><time>2007-04-15T09:19:48Z</time></trkpt><trkpt lat="48.8407745361328" lon="2.387610912323"><ele>45.8696</ele><time>2007-04-15T09:19:49Z</time></trkpt><trkpt lat="48.8408813476562" lon="2.38751101493835"><ele>45.8388</ele><time>2007-04-15T09:19:50Z</time></trkpt><trkpt lat="48.8409957885742" lon="2.38739013671875"><ele>45.5727</ele><time>2007-04-15T09:19:51Z</time></trkpt><trkpt lat="48.8411293029785" lon="2.3873393535614"><ele>45.1958</ele><time>2007-04-15T09:19:52Z</time></trkpt><trkpt lat="48.8412780761719" lon="2.3872652053833"><ele>44.831</ele><time>2007-04-15T09:19:53Z</time></trkpt><trkpt lat="48.8413772583008" lon="2.38714480400085"><ele>44.7463</ele><time>2007-04-15T09:19:54Z</time></trkpt><trkpt lat="48.8414840698242" lon="2.38704323768616"><ele>44.6335</ele><time>2007-04-15T09:19:55Z</time></trkpt><trkpt lat="48.8415946960449" lon="2.3869194984436"><ele>44.5921</ele><time>2007-04-15T09:19:56Z</time></trkpt><trkpt lat="48.8416481018066" lon="2.38690209388733"><ele>44.4858</ele><time>2007-04-15T09:19:57Z</time></trkpt><trkpt lat="48.8417930603027" lon="2.38675045967102"><ele>44.9811</ele><time>2007-04-15T09:19:58Z</time></trkpt><trkpt lat="48.8418731689453" lon="2.38662338256836"><ele>45.1444</ele><time>2007-04-15T09:19:59Z</time></trkpt><trkpt lat="48.841911315918" lon="2.38644504547119"><ele>44.7153</ele><time>2007-04-15T09:20:00Z</time></trkpt><trkpt lat="48.841983795166" lon="2.38631200790405"><ele>44.3071</ele><time>2007-04-15T09:20:01Z</time></trkpt><trkpt lat="48.8420524597168" lon="2.3861346244812"><ele>43.6422</ele><time>2007-04-15T09:20:02Z</time></trkpt><trkpt lat="48.8421249389648" lon="2.38601112365723"><ele>43.0329</ele><time>2007-04-15T09:20:03Z</time></trkpt><trkpt lat="48.8421363830566" lon="2.385986328125"><ele>42.9066</ele><time>2007-04-15T09:20:04Z</time></trkpt><trkpt lat="48.8421745300293" lon="2.38595271110535"><ele>42.6642</ele><time>2007-04-15T09:20:05Z</time></trkpt><trkpt lat="48.8421859741211" lon="2.38597536087036"><ele>42.7258</ele><time>2007-04-15T09:20:06Z</time></trkpt><trkpt lat="48.8421859741211" lon="2.38597345352173"><ele>42.7178</ele><time>2007-04-15T09:20:07Z</time></trkpt><trkpt lat="48.8422546386719" lon="2.38584160804749"><ele>41.9213</ele><time>2007-04-15T09:20:08Z</time></trkpt><trkpt lat="48.8423156738281" lon="2.38569116592407"><ele>41.3798</ele><time>2007-04-15T09:20:09Z</time></trkpt><trkpt lat="48.8423614501953" lon="2.3855197429657"><ele>40.9348</ele><time>2007-04-15T09:20:10Z</time></trkpt><trkpt lat="48.8424491882324" lon="2.38530111312866"><ele>40.4274</ele><time>2007-04-15T09:20:11Z</time></trkpt><trkpt lat="48.8425140380859" lon="2.38515520095825"><ele>40.1663</ele><time>2007-04-15T09:20:12Z</time></trkpt><trkpt lat="48.8426246643066" lon="2.38496160507202"><ele>39.8435</ele><time>2007-04-15T09:20:13Z</time></trkpt><trkpt lat="48.8426780700684" lon="2.38479018211365"><ele>39.7325</ele><time>2007-04-15T09:20:14Z</time></trkpt><trkpt lat="48.8427619934082" lon="2.38462376594543"><ele>39.5437</ele><time>2007-04-15T09:20:15Z</time></trkpt><trkpt lat="48.8428497314453" lon="2.38447856903076"><ele>39.3177</ele><time>2007-04-15T09:20:16Z</time></trkpt><trkpt lat="48.8429412841797" lon="2.38433313369751"><ele>39.0467</ele><time>2007-04-15T09:20:17Z</time></trkpt><trkpt lat="48.8429870605469" lon="2.38423347473145"><ele>38.8779</ele><time>2007-04-15T09:20:18Z</time></trkpt><trkpt lat="48.8430480957031" lon="2.38407206535339"><ele>38.7562</ele><time>2007-04-15T09:20:19Z</time></trkpt><trkpt lat="48.843147277832" lon="2.38388824462891"><ele>38.8164</ele><time>2007-04-15T09:20:20Z</time></trkpt><trkpt lat="48.8432579040527" lon="2.38371443748474"><ele>39.0699</ele><time>2007-04-15T09:20:21Z</time></trkpt><trkpt lat="48.8433456420898" lon="2.38355541229248"><ele>39.4966</ele><time>2007-04-15T09:20:22Z</time></trkpt><trkpt lat="48.8434295654297" lon="2.38341498374939"><ele>40.035</ele><time>2007-04-15T09:20:23Z</time></trkpt><trkpt lat="48.8434982299805" lon="2.38332724571228"><ele>40.4163</ele><time>2007-04-15T09:20:24Z</time></trkpt><trkpt lat="48.8435821533203" lon="2.38314056396484"><ele>41.108</ele><time>2007-04-15T09:20:25Z</time></trkpt><trkpt lat="48.8436164855957" lon="2.38308930397034"><ele>41.2539</ele><time>2007-04-15T09:20:26Z</time></trkpt><trkpt lat="48.8436965942383" lon="2.38288307189941"><ele>41.6199</ele><time>2007-04-15T09:20:27Z</time></trkpt><trkpt lat="48.8437538146973" lon="2.38275933265686"><ele>41.679</ele><time>2007-04-15T09:20:28Z</time></trkpt><trkpt lat="48.8438186645508" lon="2.38264942169189"><ele>41.5798</ele><time>2007-04-15T09:20:29Z</time></trkpt><trkpt lat="48.8438720703125" lon="2.38245892524719"><ele>41.3503</ele><time>2007-04-15T09:20:30Z</time></trkpt><trkpt lat="48.8439140319824" lon="2.38226079940796"><ele>40.8126</ele><time>2007-04-15T09:20:31Z</time></trkpt><trkpt lat="48.8439445495606" lon="2.38219857215881"><ele>40.5356</ele><time>2007-04-15T09:20:32Z</time></trkpt><trkpt lat="48.8439826965332" lon="2.3820960521698"><ele>40.1276</ele><time>2007-04-15T09:20:33Z</time></trkpt><trkpt lat="48.8440856933594" lon="2.38193106651306"><ele>39.1559</ele><time>2007-04-15T09:20:34Z</time></trkpt><trkpt lat="48.8441963195801" lon="2.38180661201477"><ele>38.5434</ele><time>2007-04-15T09:20:35Z</time></trkpt><trkpt lat="48.8443336486816" lon="2.38166928291321"><ele>39.2079</ele><time>2007-04-15T09:20:36Z</time></trkpt><trkpt lat="48.8443984985352" lon="2.38148641586304"><ele>39.3325</ele><time>2007-04-15T09:20:37Z</time></trkpt><trkpt lat="48.8444862365723" lon="2.38128995895386"><ele>39.5021</ele><time>2007-04-15T09:20:38Z</time></trkpt><trkpt lat="48.8445625305176" lon="2.38113451004028"><ele>39.6049</ele><time>2007-04-15T09:20:39Z</time></trkpt><trkpt lat="48.8446731567383" lon="2.38088178634644"><ele>39.56</ele><time>2007-04-15T09:20:40Z</time></trkpt><trkpt lat="48.8447532653809" lon="2.38068103790283"><ele>39.5584</ele><time>2007-04-15T09:20:41Z</time></trkpt><trkpt lat="48.8448295593262" lon="2.3805296421051"><ele>39.6021</ele><time>2007-04-15T09:20:42Z</time></trkpt><trkpt lat="48.8448905944824" lon="2.38039779663086"><ele>39.5668</ele><time>2007-04-15T09:20:43Z</time></trkpt><trkpt lat="48.8449783325195" lon="2.38020420074463"><ele>39.4253</ele><time>2007-04-15T09:20:44Z</time></trkpt><trkpt lat="48.8450164794922" lon="2.38015532493591"><ele>39.3677</ele><time>2007-04-15T09:20:45Z</time></trkpt><trkpt lat="48.8450736999512" lon="2.38003063201904"><ele>38.9981</ele><time>2007-04-15T09:20:46Z</time></trkpt><trkpt lat="48.845100402832" lon="2.37977838516235"><ele>38.5815</ele><time>2007-04-15T09:20:47Z</time></trkpt><trkpt lat="48.845085144043" lon="2.37951254844666"><ele>38.2531</ele><time>2007-04-15T09:20:48Z</time></trkpt><trkpt lat="48.845100402832" lon="2.3794846534729"><ele>38.1866</ele><time>2007-04-15T09:20:49Z</time></trkpt><trkpt lat="48.8452682495117" lon="2.3793580532074"><ele>37.6598</ele><time>2007-04-15T09:20:50Z</time></trkpt><trkpt lat="48.845386505127" lon="2.37922930717468"><ele>37.1824</ele><time>2007-04-15T09:20:51Z</time></trkpt><trkpt lat="48.845458984375" lon="2.3790807723999"><ele>37.0687</ele><time>2007-04-15T09:20:52Z</time></trkpt><trkpt lat="48.845516204834" lon="2.37890934944153"><ele>37.3349</ele><time>2007-04-15T09:20:53Z</time></trkpt><trkpt lat="48.8455848693848" lon="2.37875294685364"><ele>37.6416</ele><time>2007-04-15T09:20:54Z</time></trkpt><trkpt lat="48.8456001281738" lon="2.37866020202637"><ele>37.8727</ele><time>2007-04-15T09:20:55Z</time></trkpt><trkpt lat="48.8457183837891" lon="2.37845087051392"><ele>38.4973</ele><time>2007-04-15T09:20:56Z</time></trkpt><trkpt lat="48.8457984924316" lon="2.3783450126648"><ele>38.9179</ele><time>2007-04-15T09:20:57Z</time></trkpt><trkpt lat="48.8458709716797" lon="2.37818884849548"><ele>39.5118</ele><time>2007-04-15T09:20:58Z</time></trkpt><trkpt lat="48.8459243774414" lon="2.3780026435852"><ele>40.144</ele><time>2007-04-15T09:20:59Z</time></trkpt><trkpt lat="48.8460311889648" lon="2.37789487838745"><ele>40.7522</ele><time>2007-04-15T09:21:00Z</time></trkpt><trkpt lat="48.8461265563965" lon="2.37772297859192"><ele>41.3569</ele><time>2007-04-15T09:21:01Z</time></trkpt><trkpt lat="48.8462219238281" lon="2.37759304046631"><ele>41.8134</ele><time>2007-04-15T09:21:02Z</time></trkpt><trkpt lat="48.8463134765625" lon="2.37740802764893"><ele>42.0888</ele><time>2007-04-15T09:21:03Z</time></trkpt><trkpt lat="48.8464241027832" lon="2.37719798088074"><ele>42.1609</ele><time>2007-04-15T09:21:04Z</time></trkpt><trkpt lat="48.8465118408203" lon="2.37700986862183"><ele>42.1495</ele><time>2007-04-15T09:21:05Z</time></trkpt><trkpt lat="48.8466033935547" lon="2.37676215171814"><ele>42.03</ele><time>2007-04-15T09:21:06Z</time></trkpt><trkpt lat="48.8467102050781" lon="2.37660622596741"><ele>41.9199</ele><time>2007-04-15T09:21:07Z</time></trkpt><trkpt lat="48.8467750549316" lon="2.37648773193359"><ele>41.7294</ele><time>2007-04-15T09:21:08Z</time></trkpt><trkpt lat="48.8468322753906" lon="2.37631559371948"><ele>41.4113</ele><time>2007-04-15T09:21:09Z</time></trkpt><trkpt lat="48.8469009399414" lon="2.37614393234253"><ele>41.02</ele><time>2007-04-15T09:21:10Z</time></trkpt><trkpt lat="48.8469772338867" lon="2.37593126296997"><ele>40.4597</ele><time>2007-04-15T09:21:11Z</time></trkpt><trkpt lat="48.8470611572266" lon="2.37583327293396"><ele>40.0533</ele><time>2007-04-15T09:21:12Z</time></trkpt><trkpt lat="48.8471794128418" lon="2.37565875053406"><ele>39.9306</ele><time>2007-04-15T09:21:13Z</time></trkpt><trkpt lat="48.8472366333008" lon="2.37553000450134"><ele>39.8622</ele><time>2007-04-15T09:21:14Z</time></trkpt><trkpt lat="48.8473205566406" lon="2.37537789344788"><ele>39.666</ele><time>2007-04-15T09:21:15Z</time></trkpt><trkpt lat="48.8473815917969" lon="2.3752121925354"><ele>39.496</ele><time>2007-04-15T09:21:16Z</time></trkpt><trkpt lat="48.8474731445312" lon="2.37496471405029"><ele>39.2095</ele><time>2007-04-15T09:21:17Z</time></trkpt><trkpt lat="48.8475646972656" lon="2.37482523918152"><ele>39.3418</ele><time>2007-04-15T09:21:18Z</time></trkpt><trkpt lat="48.8476638793945" lon="2.37465643882751"><ele>39.6279</ele><time>2007-04-15T09:21:19Z</time></trkpt><trkpt lat="48.8477249145508" lon="2.37449145317078"><ele>39.9506</ele><time>2007-04-15T09:21:20Z</time></trkpt><trkpt lat="48.8478317260742" lon="2.37433052062988"><ele>40.2087</ele><time>2007-04-15T09:21:21Z</time></trkpt><trkpt lat="48.8479347229004" lon="2.37418246269226"><ele>40.4404</ele><time>2007-04-15T09:21:22Z</time></trkpt><trkpt lat="48.8479843139648" lon="2.37404656410217"><ele>40.4792</ele><time>2007-04-15T09:21:23Z</time></trkpt><trkpt lat="48.8480682373047" lon="2.37385821342468"><ele>40.4359</ele><time>2007-04-15T09:21:24Z</time></trkpt><trkpt lat="48.8481559753418" lon="2.37365436553955"><ele>40.3437</ele><time>2007-04-15T09:21:25Z</time></trkpt><trkpt lat="48.8482284545898" lon="2.37349629402161"><ele>40.2271</ele><time>2007-04-15T09:21:26Z</time></trkpt><trkpt lat="48.8483123779297" lon="2.37329745292664"><ele>40.0072</ele><time>2007-04-15T09:21:27Z</time></trkpt><trkpt lat="48.8483772277832" lon="2.37308955192566"><ele>39.7293</ele><time>2007-04-15T09:21:28Z</time></trkpt><trkpt lat="48.8484268188477" lon="2.37295389175415"><ele>39.5547</ele><time>2007-04-15T09:21:29Z</time></trkpt><trkpt lat="48.8484916687012" lon="2.37283420562744"><ele>39.3634</ele><time>2007-04-15T09:21:30Z</time></trkpt><trkpt lat="48.848575592041" lon="2.37258696556091"><ele>38.8743</ele><time>2007-04-15T09:21:31Z</time></trkpt><trkpt lat="48.848690032959" lon="2.37239646911621"><ele>38.7851</ele><time>2007-04-15T09:21:32Z</time></trkpt><trkpt lat="48.8487739562988" lon="2.37226986885071"><ele>38.8617</ele><time>2007-04-15T09:21:33Z</time></trkpt><trkpt lat="48.8488616943359" lon="2.37213134765625"><ele>38.8517</ele><time>2007-04-15T09:21:34Z</time></trkpt><trkpt lat="48.8489379882812" lon="2.37192225456238"><ele>38.8452</ele><time>2007-04-15T09:21:35Z</time></trkpt><trkpt lat="48.8489608764648" lon="2.37185168266296"><ele>38.8233</ele><time>2007-04-15T09:21:36Z</time></trkpt><trkpt lat="48.8490371704102" lon="2.37164950370789"><ele>38.6912</ele><time>2007-04-15T09:21:37Z</time></trkpt><trkpt lat="48.8491287231445" lon="2.37141442298889"><ele>39.3378</ele><time>2007-04-15T09:21:38Z</time></trkpt><trkpt lat="48.8492240905762" lon="2.37129926681519"><ele>39.8102</ele><time>2007-04-15T09:21:39Z</time></trkpt><trkpt lat="48.8493270874023" lon="2.37118744850159"><ele>40.3531</ele><time>2007-04-15T09:21:40Z</time></trkpt><trkpt lat="48.8493461608887" lon="2.37116146087646"><ele>40.464</ele><time>2007-04-15T09:21:41Z</time></trkpt><trkpt lat="48.8494491577148" lon="2.37104892730713"><ele>40.8893</ele><time>2007-04-15T09:21:42Z</time></trkpt><trkpt lat="48.8495750427246" lon="2.37091994285584"><ele>41.247</ele><time>2007-04-15T09:21:43Z</time></trkpt><trkpt lat="48.8496856689453" lon="2.37082982063293"><ele>41.3951</ele><time>2007-04-15T09:21:44Z</time></trkpt><trkpt lat="48.8498001098633" lon="2.37077283859253"><ele>41.568</ele><time>2007-04-15T09:21:45Z</time></trkpt><trkpt lat="48.8499183654785" lon="2.37065744400024"><ele>42.1119</ele><time>2007-04-15T09:21:46Z</time></trkpt><trkpt lat="48.8500061035156" lon="2.37053918838501"><ele>42.7916</ele><time>2007-04-15T09:21:47Z</time></trkpt><trkpt lat="48.85009765625" lon="2.37049794197083"><ele>43.4339</ele><time>2007-04-15T09:21:48Z</time></trkpt><trkpt lat="48.8501968383789" lon="2.37048554420471"><ele>43.933</ele><time>2007-04-15T09:21:49Z</time></trkpt><trkpt lat="48.8503150939941" lon="2.37052321434021"><ele>44.2325</ele><time>2007-04-15T09:21:50Z</time></trkpt><trkpt lat="48.8504219055176" lon="2.3704993724823"><ele>44.826</ele><time>2007-04-15T09:21:51Z</time></trkpt><trkpt lat="48.8505477905273" lon="2.37043046951294"><ele>45.7288</ele><time>2007-04-15T09:21:52Z</time></trkpt><trkpt lat="48.8506393432617" lon="2.37029433250427"><ele>46.8066</ele><time>2007-04-15T09:21:53Z</time></trkpt><trkpt lat="48.8507118225098" lon="2.37022018432617"><ele>47.4671</ele><time>2007-04-15T09:21:54Z</time></trkpt><trkpt lat="48.8508720397949" lon="2.37012100219727"><ele>48.4267</ele><time>2007-04-15T09:21:55Z</time></trkpt><trkpt lat="48.8510055541992" lon="2.37006068229675"><ele>48.6225</ele><time>2007-04-15T09:21:56Z</time></trkpt><trkpt lat="48.8510513305664" lon="2.37005805969238"><ele>48.6055</ele><time>2007-04-15T09:21:57Z</time></trkpt><trkpt lat="48.851203918457" lon="2.36991858482361"><ele>48.045</ele><time>2007-04-15T09:21:58Z</time></trkpt><trkpt lat="48.8513031005859" lon="2.36991858482361"><ele>47.8678</ele><time>2007-04-15T09:21:59Z</time></trkpt><trkpt lat="48.8514060974121" lon="2.36979222297668"><ele>46.7078</ele><time>2007-04-15T09:22:00Z</time></trkpt><trkpt lat="48.8514938354492" lon="2.3697566986084"><ele>46.1745</ele><time>2007-04-15T09:22:01Z</time></trkpt><trkpt lat="48.8516883850098" lon="2.36968970298767"><ele>45.0927</ele><time>2007-04-15T09:22:02Z</time></trkpt><trkpt lat="48.8518562316894" lon="2.36964106559753"><ele>45.2051</ele><time>2007-04-15T09:22:03Z</time></trkpt><trkpt lat="48.8520011901856" lon="2.36954045295715"><ele>44.8339</ele><time>2007-04-15T09:22:04Z</time></trkpt><trkpt lat="48.8521499633789" lon="2.36943173408508"><ele>44.4955</ele><time>2007-04-15T09:22:05Z</time></trkpt><trkpt lat="48.8522987365723" lon="2.36934399604797"><ele>44.4135</ele><time>2007-04-15T09:22:06Z</time></trkpt><trkpt lat="48.8524398803711" lon="2.36925864219666"><ele>44.3896</ele><time>2007-04-15T09:22:07Z</time></trkpt><trkpt lat="48.8525581359863" lon="2.36918663978577"><ele>44.0623</ele><time>2007-04-15T09:22:08Z</time></trkpt><trkpt lat="48.8526725769043" lon="2.36913585662842"><ele>43.6846</ele><time>2007-04-15T09:22:09Z</time></trkpt><trkpt lat="48.8527526855469" lon="2.36901879310608"><ele>43.3476</ele><time>2007-04-15T09:22:10Z</time></trkpt><trkpt lat="48.8528022766113" lon="2.36885619163513"><ele>43.1258</ele><time>2007-04-15T09:22:11Z</time></trkpt><trkpt lat="48.8528366088867" lon="2.36866211891174"><ele>43.0144</ele><time>2007-04-15T09:22:12Z</time></trkpt><trkpt lat="48.8528594970703" lon="2.36848425865173"><ele>43.0068</ele><time>2007-04-15T09:22:13Z</time></trkpt><trkpt lat="48.8528480529785" lon="2.36827802658081"><ele>42.8858</ele><time>2007-04-15T09:22:14Z</time></trkpt><trkpt lat="48.8527946472168" lon="2.36803293228149"><ele>42.9868</ele><time>2007-04-15T09:22:15Z</time></trkpt><trkpt lat="48.8527412414551" lon="2.36780381202698"><ele>43.2274</ele><time>2007-04-15T09:22:16Z</time></trkpt><trkpt lat="48.8526763916016" lon="2.36762928962708"><ele>43.3903</ele><time>2007-04-15T09:22:17Z</time></trkpt><trkpt lat="48.8526458740234" lon="2.36758232116699"><ele>43.3915</ele><time>2007-04-15T09:22:18Z</time></trkpt><trkpt lat="48.8525276184082" lon="2.36746644973755"><ele>43.2038</ele><time>2007-04-15T09:22:19Z</time></trkpt><trkpt lat="48.8524894714356" lon="2.36736726760864"><ele>43.2761</ele><time>2007-04-15T09:22:20Z</time></trkpt><trkpt lat="48.8524551391602" lon="2.36715388298035"><ele>43.7048</ele><time>2007-04-15T09:22:21Z</time></trkpt><trkpt lat="48.8523826599121" lon="2.36695957183838"><ele>44.0991</ele><time>2007-04-15T09:22:22Z</time></trkpt><trkpt lat="48.8523025512695" lon="2.36679768562317"><ele>44.5365</ele><time>2007-04-15T09:22:23Z</time></trkpt><trkpt lat="48.8522491455078" lon="2.36663126945496"><ele>44.9744</ele><time>2007-04-15T09:22:24Z</time></trkpt><trkpt lat="48.8522567749023" lon="2.36650133132935"><ele>44.8842</ele><time>2007-04-15T09:22:25Z</time></trkpt><trkpt lat="48.8522605895996" lon="2.36648607254028"><ele>44.8755</ele><time>2007-04-15T09:22:26Z</time></trkpt><trkpt lat="48.8522720336914" lon="2.36640882492065"><ele>44.8307</ele><time>2007-04-15T09:22:27Z</time></trkpt><trkpt lat="48.8522758483887" lon="2.36632061004639"><ele>44.7766</ele><time>2007-04-15T09:22:28Z</time></trkpt><trkpt lat="48.8522682189941" lon="2.36626029014587"><ele>44.7287</ele><time>2007-04-15T09:22:29Z</time></trkpt><trkpt lat="48.8522148132324" lon="2.36624884605408"><ele>44.6568</ele><time>2007-04-15T09:22:30Z</time></trkpt><trkpt lat="48.8521614074707" lon="2.3662383556366"><ele>44.5823</ele><time>2007-04-15T09:22:31Z</time></trkpt><trkpt lat="48.852108001709" lon="2.36618947982788"><ele>44.4613</ele><time>2007-04-15T09:22:32Z</time></trkpt><trkpt lat="48.85205078125" lon="2.36613202095032"><ele>44.3083</ele><time>2007-04-15T09:22:33Z</time></trkpt><trkpt lat="48.8520469665527" lon="2.36611914634705"><ele>44.2856</ele><time>2007-04-15T09:22:34Z</time></trkpt><trkpt lat="48.8520469665527" lon="2.36610460281372"><ele>44.2667</ele><time>2007-04-15T09:22:35Z</time></trkpt><trkpt lat="48.8520469665527" lon="2.36585855484009"><ele>43.9456</ele><time>2007-04-15T09:22:36Z</time></trkpt><trkpt lat="48.8520393371582" lon="2.36571478843689"><ele>43.6735</ele><time>2007-04-15T09:22:37Z</time></trkpt><trkpt lat="48.8519859313965" lon="2.36556696891785"><ele>43.2494</ele><time>2007-04-15T09:22:38Z</time></trkpt><trkpt lat="48.8518905639648" lon="2.36544942855835"><ele>42.7398</ele><time>2007-04-15T09:22:39Z</time></trkpt><trkpt lat="48.8517951965332" lon="2.36531019210815"><ele>42.1498</ele><time>2007-04-15T09:22:40Z</time></trkpt><trkpt lat="48.8517265319824" lon="2.36520481109619"><ele>41.6894</ele><time>2007-04-15T09:22:41Z</time></trkpt><trkpt lat="48.8517417907715" lon="2.36503648757935"><ele>41.3541</ele><time>2007-04-15T09:22:42Z</time></trkpt><trkpt lat="48.8517646789551" lon="2.36489510536194"><ele>41.6861</ele><time>2007-04-15T09:22:43Z</time></trkpt><trkpt lat="48.8517761230469" lon="2.36478590965271"><ele>42.0635</ele><time>2007-04-15T09:22:44Z</time></trkpt><trkpt lat="48.851749420166" lon="2.3646297454834"><ele>42.4985</ele><time>2007-04-15T09:22:45Z</time></trkpt><trkpt lat="48.8517379760742" lon="2.36440968513489"><ele>43.2</ele><time>2007-04-15T09:22:46Z</time></trkpt><trkpt lat="48.8517074584961" lon="2.36428117752075"><ele>43.6079</ele><time>2007-04-15T09:22:47Z</time></trkpt><trkpt lat="48.8516693115234" lon="2.36409735679626"><ele>43.9989</ele><time>2007-04-15T09:22:48Z</time></trkpt><trkpt lat="48.8516159057617" lon="2.36392855644226"><ele>43.6954</ele><time>2007-04-15T09:22:49Z</time></trkpt><trkpt lat="48.8515663146973" lon="2.3637900352478"><ele>43.3979</ele><time>2007-04-15T09:22:50Z</time></trkpt><trkpt lat="48.8515243530273" lon="2.36362504959106"><ele>43.1461</ele><time>2007-04-15T09:22:51Z</time></trkpt><trkpt lat="48.8514633178711" lon="2.36344838142395"><ele>42.7799</ele><time>2007-04-15T09:22:52Z</time></trkpt><trkpt lat="48.8513984680176" lon="2.36319923400879"><ele>42.0116</ele><time>2007-04-15T09:22:53Z</time></trkpt><trkpt lat="48.8513603210449" lon="2.36303758621216"><ele>41.3582</ele><time>2007-04-15T09:22:54Z</time></trkpt><trkpt lat="48.8512954711914" lon="2.36282539367676"><ele>40.4873</ele><time>2007-04-15T09:22:55Z</time></trkpt><trkpt lat="48.8512496948242" lon="2.36262559890747"><ele>39.8002</ele><time>2007-04-15T09:22:56Z</time></trkpt><trkpt lat="48.8512191772461" lon="2.36249589920044"><ele>39.3857</ele><time>2007-04-15T09:22:57Z</time></trkpt><trkpt lat="48.8512725830078" lon="2.3623628616333"><ele>39.5213</ele><time>2007-04-15T09:22:58Z</time></trkpt><trkpt lat="48.8513145446777" lon="2.36232280731201"><ele>39.7084</ele><time>2007-04-15T09:22:59Z</time></trkpt><trkpt lat="48.8514404296875" lon="2.36219239234924"><ele>40.4227</ele><time>2007-04-15T09:23:00Z</time></trkpt><trkpt lat="48.8515663146973" lon="2.36208319664001"><ele>41.3379</ele><time>2007-04-15T09:23:01Z</time></trkpt><trkpt lat="48.8516693115234" lon="2.36194467544556"><ele>42.336</ele><time>2007-04-15T09:23:02Z</time></trkpt><trkpt lat="48.8516807556152" lon="2.36191582679749"><ele>42.4189</ele><time>2007-04-15T09:23:03Z</time></trkpt><trkpt lat="48.8517799377441" lon="2.36172723770142"><ele>42.9906</ele><time>2007-04-15T09:23:04Z</time></trkpt><trkpt lat="48.8518486022949" lon="2.36158490180969"><ele>42.924</ele><time>2007-04-15T09:23:05Z</time></trkpt><trkpt lat="48.8519477844238" lon="2.36141681671143"><ele>42.4379</ele><time>2007-04-15T09:23:06Z</time></trkpt><trkpt lat="48.8520355224609" lon="2.36120629310608"><ele>41.7853</ele><time>2007-04-15T09:23:07Z</time></trkpt><trkpt lat="48.8521118164062" lon="2.36105704307556"><ele>41.3395</ele><time>2007-04-15T09:23:08Z</time></trkpt><trkpt lat="48.8521995544434" lon="2.3608717918396"><ele>40.7779</ele><time>2007-04-15T09:23:09Z</time></trkpt><trkpt lat="48.8522872924805" lon="2.3606903553009"><ele>40.314</ele><time>2007-04-15T09:23:10Z</time></trkpt><trkpt lat="48.8523178100586" lon="2.36059165000916"><ele>40.0745</ele><time>2007-04-15T09:23:11Z</time></trkpt><trkpt lat="48.8523864746094" lon="2.3603949546814"><ele>39.6683</ele><time>2007-04-15T09:23:12Z</time></trkpt><trkpt lat="48.8524398803711" lon="2.36022114753723"><ele>39.3526</ele><time>2007-04-15T09:23:13Z</time></trkpt><trkpt lat="48.8525199890137" lon="2.36000776290894"><ele>39.0184</ele><time>2007-04-15T09:23:14Z</time></trkpt><trkpt lat="48.8525924682617" lon="2.3598165512085"><ele>38.5597</ele><time>2007-04-15T09:23:15Z</time></trkpt><trkpt lat="48.8526420593262" lon="2.3596465587616"><ele>38.1517</ele><time>2007-04-15T09:23:16Z</time></trkpt><trkpt lat="48.8526992797852" lon="2.35946202278137"><ele>37.7089</ele><time>2007-04-15T09:23:17Z</time></trkpt><trkpt lat="48.8527526855469" lon="2.3593327999115"><ele>37.3987</ele><time>2007-04-15T09:23:18Z</time></trkpt><trkpt lat="48.8528175354004" lon="2.35915064811707"><ele>36.9881</ele><time>2007-04-15T09:23:19Z</time></trkpt><trkpt lat="48.8528480529785" lon="2.35902333259583"><ele>36.8998</ele><time>2007-04-15T09:23:20Z</time></trkpt><trkpt lat="48.8528289794922" lon="2.35888004302978"><ele>36.7918</ele><time>2007-04-15T09:23:21Z</time></trkpt><trkpt lat="48.8528671264648" lon="2.35871505737305"><ele>36.6968</ele><time>2007-04-15T09:23:22Z</time></trkpt><trkpt lat="48.8529357910156" lon="2.35852932929993"><ele>36.6352</ele><time>2007-04-15T09:23:23Z</time></trkpt><trkpt lat="48.8530044555664" lon="2.35832715034485"><ele>36.6157</ele><time>2007-04-15T09:23:24Z</time></trkpt><trkpt lat="48.8530616760254" lon="2.35811996459961"><ele>37.0135</ele><time>2007-04-15T09:23:25Z</time></trkpt><trkpt lat="48.8530693054199" lon="2.35791063308716"><ele>37.3511</ele><time>2007-04-15T09:23:26Z</time></trkpt><trkpt lat="48.853099822998" lon="2.35777235031128"><ele>37.5816</ele><time>2007-04-15T09:23:27Z</time></trkpt><trkpt lat="48.8531074523926" lon="2.35775351524353"><ele>37.6133</ele><time>2007-04-15T09:23:28Z</time></trkpt><trkpt lat="48.8531227111816" lon="2.35774183273315"><ele>37.6365</ele><time>2007-04-15T09:23:29Z</time></trkpt><trkpt lat="48.8531532287598" lon="2.3577184677124"><ele>37.6812</ele><time>2007-04-15T09:23:30Z</time></trkpt><trkpt lat="48.8532257080078" lon="2.35760116577148"><ele>37.8629</ele><time>2007-04-15T09:23:31Z</time></trkpt><trkpt lat="48.8532829284668" lon="2.35738968849182"><ele>38.1804</ele><time>2007-04-15T09:23:32Z</time></trkpt><trkpt lat="48.8533248901367" lon="2.35722422599792"><ele>38.351</ele><time>2007-04-15T09:23:33Z</time></trkpt><trkpt lat="48.8533668518066" lon="2.35709977149963"><ele>38.5414</ele><time>2007-04-15T09:23:34Z</time></trkpt><trkpt lat="48.8534240722656" lon="2.35695362091064"><ele>38.802</ele><time>2007-04-15T09:23:35Z</time></trkpt><trkpt lat="48.8534927368164" lon="2.35678005218506"><ele>39.0812</ele><time>2007-04-15T09:23:36Z</time></trkpt><trkpt lat="48.8535804748535" lon="2.35652112960815"><ele>38.9473</ele><time>2007-04-15T09:23:37Z</time></trkpt><trkpt lat="48.8536071777344" lon="2.35638689994812"><ele>38.6572</ele><time>2007-04-15T09:23:38Z</time></trkpt><trkpt lat="48.853645324707" lon="2.35622215270996"><ele>38.3076</ele><time>2007-04-15T09:23:39Z</time></trkpt><trkpt lat="48.8537063598633" lon="2.35601162910461"><ele>37.8755</ele><time>2007-04-15T09:23:40Z</time></trkpt><trkpt lat="48.8537902832031" lon="2.35574793815613"><ele>37.6575</ele><time>2007-04-15T09:23:41Z</time></trkpt><trkpt lat="48.8538513183594" lon="2.35555624961853"><ele>37.7565</ele><time>2007-04-15T09:23:42Z</time></trkpt><trkpt lat="48.8539085388184" lon="2.355393409729"><ele>37.5782</ele><time>2007-04-15T09:23:43Z</time></trkpt><trkpt lat="48.8539619445801" lon="2.35523056983948"><ele>37.1836</ele><time>2007-04-15T09:23:44Z</time></trkpt><trkpt lat="48.8540344238281" lon="2.35503172874451"><ele>36.3294</ele><time>2007-04-15T09:23:45Z</time></trkpt><trkpt lat="48.8540992736816" lon="2.35483694076538"><ele>34.8801</ele><time>2007-04-15T09:23:46Z</time></trkpt><trkpt lat="48.854190826416" lon="2.35463809967041"><ele>33.467</ele><time>2007-04-15T09:23:47Z</time></trkpt><trkpt lat="48.8542556762695" lon="2.35448813438416"><ele>33.4295</ele><time>2007-04-15T09:23:48Z</time></trkpt><trkpt lat="48.8543319702148" lon="2.35431170463562"><ele>33.6365</ele><time>2007-04-15T09:23:49Z</time></trkpt><trkpt lat="48.8544158935547" lon="2.35413217544556"><ele>34.0538</ele><time>2007-04-15T09:23:50Z</time></trkpt><trkpt lat="48.8544731140137" lon="2.35396838188171"><ele>33.705</ele><time>2007-04-15T09:23:51Z</time></trkpt><trkpt lat="48.8545341491699" lon="2.353835105896"><ele>33.639</ele><time>2007-04-15T09:23:52Z</time></trkpt><trkpt lat="48.8545989990234" lon="2.35370087623596"><ele>33.6431</ele><time>2007-04-15T09:23:53Z</time></trkpt><trkpt lat="48.8546600341797" lon="2.35356187820435"><ele>33.5876</ele><time>2007-04-15T09:23:54Z</time></trkpt><trkpt lat="48.8547782897949" lon="2.35329174995422"><ele>33.4645</ele><time>2007-04-15T09:23:55Z</time></trkpt><trkpt lat="48.854850769043" lon="2.35313439369202"><ele>33.0445</ele><time>2007-04-15T09:23:56Z</time></trkpt><trkpt lat="48.8549499511719" lon="2.35296869277954"><ele>32.5514</ele><time>2007-04-15T09:23:57Z</time></trkpt><trkpt lat="48.8550071716309" lon="2.35282278060913"><ele>31.5812</ele><time>2007-04-15T09:23:58Z</time></trkpt><trkpt lat="48.8550720214844" lon="2.35267019271851"><ele>30.8734</ele><time>2007-04-15T09:23:59Z</time></trkpt><trkpt lat="48.8551406860352" lon="2.35249423980713"><ele>30.1957</ele><time>2007-04-15T09:24:00Z</time></trkpt><trkpt lat="48.8552017211914" lon="2.35233116149902"><ele>31.0126</ele><time>2007-04-15T09:24:01Z</time></trkpt><trkpt lat="48.8552055358887" lon="2.35229992866516"><ele>31.0352</ele><time>2007-04-15T09:24:02Z</time></trkpt><trkpt lat="48.8552513122559" lon="2.35217046737671"><ele>31.3996</ele><time>2007-04-15T09:24:03Z</time></trkpt><trkpt lat="48.8553199768066" lon="2.35193800926208"><ele>31.492</ele><time>2007-04-15T09:24:04Z</time></trkpt><trkpt lat="48.8553924560547" lon="2.35175108909607"><ele>31.2641</ele><time>2007-04-15T09:24:05Z</time></trkpt><trkpt lat="48.8554573059082" lon="2.35158395767212"><ele>31.1677</ele><time>2007-04-15T09:24:06Z</time></trkpt><trkpt lat="48.8555679321289" lon="2.35136842727661"><ele>31.3311</ele><time>2007-04-15T09:24:07Z</time></trkpt><trkpt lat="48.8556823730469" lon="2.35121011734009"><ele>31.1375</ele><time>2007-04-15T09:24:08Z</time></trkpt><trkpt lat="48.8557929992676" lon="2.3510570526123"><ele>30.6526</ele><time>2007-04-15T09:24:09Z</time></trkpt><trkpt lat="48.8558616638184" lon="2.35091710090637"><ele>30.439</ele><time>2007-04-15T09:24:10Z</time></trkpt><trkpt lat="48.8558807373047" lon="2.35089159011841"><ele>30.538</ele><time>2007-04-15T09:24:11Z</time></trkpt><trkpt lat="48.8558883666992" lon="2.35085272789001"><ele>30.5088</ele><time>2007-04-15T09:24:12Z</time></trkpt><trkpt lat="48.8559341430664" lon="2.35061883926392"><ele>32.1026</ele><time>2007-04-15T09:24:13Z</time></trkpt><trkpt lat="48.8559608459473" lon="2.35043430328369"><ele>33.392</ele><time>2007-04-15T09:24:14Z</time></trkpt><trkpt lat="48.8560028076172" lon="2.35027360916138"><ele>34.6453</ele><time>2007-04-15T09:24:15Z</time></trkpt><trkpt lat="48.8560523986816" lon="2.35010361671448"><ele>35.9883</ele><time>2007-04-15T09:24:16Z</time></trkpt><trkpt lat="48.8561096191406" lon="2.34993529319763"><ele>37.637</ele><time>2007-04-15T09:24:17Z</time></trkpt><trkpt lat="48.8561210632324" lon="2.34990525245666"><ele>38.0123</ele><time>2007-04-15T09:24:18Z</time></trkpt><trkpt lat="48.8561973571777" lon="2.3497166633606"><ele>40.2784</ele><time>2007-04-15T09:24:19Z</time></trkpt><trkpt lat="48.8562698364258" lon="2.34952354431152"><ele>42.3629</ele><time>2007-04-15T09:24:20Z</time></trkpt><trkpt lat="48.8563499450684" lon="2.34933423995972"><ele>44.2324</ele><time>2007-04-15T09:24:21Z</time></trkpt><trkpt lat="48.8564147949219" lon="2.3491792678833"><ele>45.5993</ele><time>2007-04-15T09:24:22Z</time></trkpt><trkpt lat="48.8564872741699" lon="2.34897017478943"><ele>45.6472</ele><time>2007-04-15T09:24:23Z</time></trkpt><trkpt lat="48.8564987182617" lon="2.34875345230103"><ele>45.591</ele><time>2007-04-15T09:24:24Z</time></trkpt><trkpt lat="48.856502532959" lon="2.34873533248901"><ele>45.6149</ele><time>2007-04-15T09:24:25Z</time></trkpt><trkpt lat="48.856502532959" lon="2.34869885444641"><ele>45.599</ele><time>2007-04-15T09:24:26Z</time></trkpt><trkpt lat="48.856502532959" lon="2.34863567352295"><ele>45.5714</ele><time>2007-04-15T09:24:27Z</time></trkpt><trkpt lat="48.8565788269043" lon="2.34843897819519"><ele>46.5365</ele><time>2007-04-15T09:24:28Z</time></trkpt><trkpt lat="48.8566360473633" lon="2.34832811355591"><ele>47.4801</ele><time>2007-04-15T09:24:29Z</time></trkpt><trkpt lat="48.8567047119141" lon="2.34814929962158"><ele>46.0883</ele><time>2007-04-15T09:24:30Z</time></trkpt><trkpt lat="48.8567581176758" lon="2.34794998168945"><ele>44.1368</ele><time>2007-04-15T09:24:31Z</time></trkpt><trkpt lat="48.8568115234375" lon="2.34778618812561"><ele>42.6929</ele><time>2007-04-15T09:24:32Z</time></trkpt><trkpt lat="48.8568572998047" lon="2.3476619720459"><ele>41.7316</ele><time>2007-04-15T09:24:33Z</time></trkpt><trkpt lat="48.8569068908691" lon="2.347501039505"><ele>40.7172</ele><time>2007-04-15T09:24:34Z</time></trkpt><trkpt lat="48.8569641113281" lon="2.34729957580566"><ele>40.3855</ele><time>2007-04-15T09:24:35Z</time></trkpt><trkpt lat="48.8569984436035" lon="2.34712815284729"><ele>40.0689</ele><time>2007-04-15T09:24:36Z</time></trkpt><trkpt lat="48.8570175170898" lon="2.34689927101135"><ele>39.6685</ele><time>2007-04-15T09:24:37Z</time></trkpt><trkpt lat="48.8570594787598" lon="2.34670400619507"><ele>39.1779</ele><time>2007-04-15T09:24:38Z</time></trkpt><trkpt lat="48.8571319580078" lon="2.34654235839844"><ele>40.0258</ele><time>2007-04-15T09:24:39Z</time></trkpt><trkpt lat="48.8571929931641" lon="2.34635806083679"><ele>41.5727</ele><time>2007-04-15T09:24:40Z</time></trkpt><trkpt lat="48.8572540283203" lon="2.34620094299316"><ele>42.8166</ele><time>2007-04-15T09:24:41Z</time></trkpt><trkpt lat="48.8573188781738" lon="2.34601187705994"><ele>44.3261</ele><time>2007-04-15T09:24:42Z</time></trkpt><trkpt lat="48.8573684692383" lon="2.34581208229065"><ele>45.6738</ele><time>2007-04-15T09:24:43Z</time></trkpt><trkpt lat="48.8574333190918" lon="2.34561395645142"><ele>44.147</ele><time>2007-04-15T09:24:44Z</time></trkpt><trkpt lat="48.8574752807617" lon="2.34544515609741"><ele>42.8607</ele><time>2007-04-15T09:24:45Z</time></trkpt><trkpt lat="48.8575248718262" lon="2.34524202346802"><ele>41.6736</ele><time>2007-04-15T09:24:46Z</time></trkpt><trkpt lat="48.8575897216797" lon="2.3450038433075"><ele>40.8834</ele><time>2007-04-15T09:24:47Z</time></trkpt><trkpt lat="48.8576507568359" lon="2.34480690956116"><ele>41.5951</ele><time>2007-04-15T09:24:48Z</time></trkpt><trkpt lat="48.8577079772949" lon="2.3446090221405"><ele>42.2316</ele><time>2007-04-15T09:24:49Z</time></trkpt><trkpt lat="48.8577537536621" lon="2.34443712234497"><ele>42.7001</ele><time>2007-04-15T09:24:50Z</time></trkpt><trkpt lat="48.8578186035156" lon="2.34420275688171"><ele>43.2838</ele><time>2007-04-15T09:24:51Z</time></trkpt><trkpt lat="48.8578758239746" lon="2.34400987625122"><ele>44.5065</ele><time>2007-04-15T09:24:52Z</time></trkpt><trkpt lat="48.8579406738281" lon="2.34382128715515"><ele>46.0976</ele><time>2007-04-15T09:24:53Z</time></trkpt><trkpt lat="48.8579940795898" lon="2.34365725517273"><ele>47.5921</ele><time>2007-04-15T09:24:54Z</time></trkpt><trkpt lat="48.8580474853516" lon="2.34345865249634"><ele>49.432</ele><time>2007-04-15T09:24:55Z</time></trkpt><trkpt lat="48.8580932617188" lon="2.34327006340027"><ele>51.3291</ele><time>2007-04-15T09:24:56Z</time></trkpt><trkpt lat="48.8581390380859" lon="2.34307837486267"><ele>53.5262</ele><time>2007-04-15T09:24:57Z</time></trkpt><trkpt lat="48.8581924438477" lon="2.34287786483765"><ele>56.0507</ele><time>2007-04-15T09:24:58Z</time></trkpt><trkpt lat="48.8582382202148" lon="2.3427095413208"><ele>58.3057</ele><time>2007-04-15T09:24:59Z</time></trkpt><trkpt lat="48.858283996582" lon="2.34254503250122"><ele>60.6364</ele><time>2007-04-15T09:25:00Z</time></trkpt><trkpt lat="48.8583297729492" lon="2.34234714508057"><ele>61.0169</ele><time>2007-04-15T09:25:01Z</time></trkpt><trkpt lat="48.8583984375" lon="2.34222793579102"><ele>59.7681</ele><time>2007-04-15T09:25:02Z</time></trkpt><trkpt lat="48.8584213256836" lon="2.34201574325562"><ele>58.3111</ele><time>2007-04-15T09:25:03Z</time></trkpt><trkpt lat="48.8584594726562" lon="2.34181094169617"><ele>56.7799</ele><time>2007-04-15T09:25:04Z</time></trkpt><trkpt lat="48.8585014343262" lon="2.34158229827881"><ele>54.3552</ele><time>2007-04-15T09:25:05Z</time></trkpt><trkpt lat="48.858528137207" lon="2.34141993522644"><ele>51.8915</ele><time>2007-04-15T09:25:06Z</time></trkpt><trkpt lat="48.8585586547852" lon="2.34121155738831"><ele>48.9827</ele><time>2007-04-15T09:25:07Z</time></trkpt><trkpt lat="48.8585929870606" lon="2.34100341796875"><ele>46.3523</ele><time>2007-04-15T09:25:08Z</time></trkpt><trkpt lat="48.8586273193359" lon="2.34082937240601"><ele>44.4384</ele><time>2007-04-15T09:25:09Z</time></trkpt><trkpt lat="48.8586540222168" lon="2.340651512146"><ele>43.3179</ele><time>2007-04-15T09:25:10Z</time></trkpt><trkpt lat="48.8587112426758" lon="2.34042286872864"><ele>42.305</ele><time>2007-04-15T09:25:11Z</time></trkpt><trkpt lat="48.858757019043" lon="2.34026145935059"><ele>41.8251</ele><time>2007-04-15T09:25:12Z</time></trkpt><trkpt lat="48.858814239502" lon="2.34010553359985"><ele>41.7074</ele><time>2007-04-15T09:25:13Z</time></trkpt><trkpt lat="48.8588371276856" lon="2.3398904800415"><ele>40.7272</ele><time>2007-04-15T09:25:14Z</time></trkpt><trkpt lat="48.8588256835938" lon="2.33982920646667"><ele>40.1256</ele><time>2007-04-15T09:25:15Z</time></trkpt><trkpt lat="48.8588333129883" lon="2.33979630470276"><ele>40.0308</ele><time>2007-04-15T09:25:16Z</time></trkpt><trkpt lat="48.8612937927246" lon="2.3289110660553"><ele>34.08</ele><time>2007-04-15T09:25:17Z</time></trkpt><trkpt lat="48.861255645752" lon="2.32875299453735"><ele>33.0617</ele><time>2007-04-15T09:25:18Z</time></trkpt><trkpt lat="48.861270904541" lon="2.32874250411987"><ele>33.141</ele><time>2007-04-15T09:25:19Z</time></trkpt><trkpt lat="48.8613777160644" lon="2.32864713668823"><ele>33.6926</ele><time>2007-04-15T09:25:20Z</time></trkpt><trkpt lat="48.8614349365234" lon="2.32855176925659"><ele>33.9187</ele><time>2007-04-15T09:25:21Z</time></trkpt><trkpt lat="48.861499786377" lon="2.32840895652771"><ele>34.1972</ele><time>2007-04-15T09:25:22Z</time></trkpt><trkpt lat="48.8615608215332" lon="2.32828974723816"><ele>34.5539</ele><time>2007-04-15T09:25:23Z</time></trkpt><trkpt lat="48.861572265625" lon="2.32827162742615"><ele>34.6129</ele><time>2007-04-15T09:25:24Z</time></trkpt><trkpt lat="48.861629486084" lon="2.3281307220459"><ele>34.6355</ele><time>2007-04-15T09:25:25Z</time></trkpt><trkpt lat="48.8616676330566" lon="2.32804822921753"><ele>34.6242</ele><time>2007-04-15T09:25:26Z</time></trkpt><trkpt lat="48.8616943359375" lon="2.32794284820557"><ele>33.9513</ele><time>2007-04-15T09:25:27Z</time></trkpt><trkpt lat="48.8617630004883" lon="2.32772397994995"><ele>32.7109</ele><time>2007-04-15T09:25:28Z</time></trkpt><trkpt lat="48.8618240356445" lon="2.32753777503967"><ele>31.924</ele><time>2007-04-15T09:25:29Z</time></trkpt><trkpt lat="48.861873626709" lon="2.32738327980042"><ele>31.5054</ele><time>2007-04-15T09:25:30Z</time></trkpt><trkpt lat="48.861930847168" lon="2.32722187042236"><ele>31.2107</ele><time>2007-04-15T09:25:31Z</time></trkpt><trkpt lat="48.8619842529297" lon="2.32702684402466"><ele>30.9975</ele><time>2007-04-15T09:25:32Z</time></trkpt><trkpt lat="48.8620452880859" lon="2.32683515548706"><ele>30.9646</ele><time>2007-04-15T09:25:33Z</time></trkpt><trkpt lat="48.8621101379394" lon="2.32664942741394"><ele>31.1163</ele><time>2007-04-15T09:25:34Z</time></trkpt><trkpt lat="48.862133026123" lon="2.32655715942383"><ele>31.1493</ele><time>2007-04-15T09:25:35Z</time></trkpt><trkpt lat="48.8621482849121" lon="2.32649850845337"><ele>31.1637</ele><time>2007-04-15T09:25:36Z</time></trkpt><trkpt lat="48.8622055053711" lon="2.32630896568298"><ele>31.183</ele><time>2007-04-15T09:25:37Z</time></trkpt><trkpt lat="48.8622550964356" lon="2.32614064216614"><ele>31.1185</ele><time>2007-04-15T09:25:38Z</time></trkpt><trkpt lat="48.8623123168945" lon="2.32598447799683"><ele>31.015</ele><time>2007-04-15T09:25:39Z</time></trkpt><trkpt lat="48.8624076843262" lon="2.32574343681335"><ele>30.6854</ele><time>2007-04-15T09:25:40Z</time></trkpt><trkpt lat="48.8624801635742" lon="2.3255672454834"><ele>30.3452</ele><time>2007-04-15T09:25:41Z</time></trkpt><trkpt lat="48.8625373840332" lon="2.32542061805725"><ele>30.1214</ele><time>2007-04-15T09:25:42Z</time></trkpt><trkpt lat="48.8625869750977" lon="2.32525539398193"><ele>29.8941</ele><time>2007-04-15T09:25:43Z</time></trkpt><trkpt lat="48.8626403808594" lon="2.32505321502686"><ele>29.6223</ele><time>2007-04-15T09:25:44Z</time></trkpt><trkpt lat="48.8627052307129" lon="2.32485127449036"><ele>29.4698</ele><time>2007-04-15T09:25:45Z</time></trkpt><trkpt lat="48.8627586364746" lon="2.32469296455383"><ele>29.4229</ele><time>2007-04-15T09:25:46Z</time></trkpt><trkpt lat="48.8628082275391" lon="2.32453536987305"><ele>29.407</ele><time>2007-04-15T09:25:47Z</time></trkpt><trkpt lat="48.8628845214844" lon="2.32431244850159"><ele>29.4956</ele><time>2007-04-15T09:25:48Z</time></trkpt><trkpt lat="48.8629379272461" lon="2.32411217689514"><ele>29.6896</ele><time>2007-04-15T09:25:49Z</time></trkpt><trkpt lat="48.8629913330078" lon="2.32390952110291"><ele>30.2013</ele><time>2007-04-15T09:25:50Z</time></trkpt><trkpt lat="48.8630599975586" lon="2.32371735572815"><ele>30.7137</ele><time>2007-04-15T09:25:51Z</time></trkpt><trkpt lat="48.8631134033203" lon="2.32354736328125"><ele>31.0727</ele><time>2007-04-15T09:25:52Z</time></trkpt><trkpt lat="48.8631744384766" lon="2.32335042953491"><ele>31.4202</ele><time>2007-04-15T09:25:53Z</time></trkpt><trkpt lat="48.8632316589356" lon="2.3231520652771"><ele>31.825</ele><time>2007-04-15T09:25:54Z</time></trkpt><trkpt lat="48.8632926940918" lon="2.32293105125427"><ele>32.3129</ele><time>2007-04-15T09:25:55Z</time></trkpt><trkpt lat="48.8633499145508" lon="2.32273697853088"><ele>32.8237</ele><time>2007-04-15T09:25:56Z</time></trkpt><trkpt lat="48.8634071350098" lon="2.3225691318512"><ele>33.4337</ele><time>2007-04-15T09:25:57Z</time></trkpt><trkpt lat="48.8634605407715" lon="2.32247376441956"><ele>33.7948</ele><time>2007-04-15T09:25:58Z</time></trkpt><trkpt lat="48.8634719848633" lon="2.32245588302612"><ele>33.7953</ele><time>2007-04-15T09:25:59Z</time></trkpt><trkpt lat="48.8634757995606" lon="2.32244372367859"><ele>33.7672</ele><time>2007-04-15T09:26:00Z</time></trkpt><trkpt lat="48.8635025024414" lon="2.32230830192566"><ele>33.3446</ele><time>2007-04-15T09:26:01Z</time></trkpt><trkpt lat="48.863525390625" lon="2.32225894927978"><ele>33.2924</ele><time>2007-04-15T09:26:02Z</time></trkpt><trkpt lat="48.8635368347168" lon="2.32221150398254"><ele>33.165</ele><time>2007-04-15T09:26:03Z</time></trkpt><trkpt lat="48.8635940551758" lon="2.32198643684387"><ele>32.6049</ele><time>2007-04-15T09:26:04Z</time></trkpt><trkpt lat="48.863655090332" lon="2.32184290885925"><ele>32.4671</ele><time>2007-04-15T09:26:05Z</time></trkpt><trkpt lat="48.8636894226074" lon="2.32168889045715"><ele>32.0864</ele><time>2007-04-15T09:26:06Z</time></trkpt><trkpt lat="48.8637580871582" lon="2.32145762443542"><ele>32.0614</ele><time>2007-04-15T09:26:07Z</time></trkpt><trkpt lat="48.8638191223144" lon="2.3212993144989"><ele>32.1259</ele><time>2007-04-15T09:26:08Z</time></trkpt><trkpt lat="48.8638954162598" lon="2.32108497619629"><ele>32.0818</ele><time>2007-04-15T09:26:09Z</time></trkpt><trkpt lat="48.8639640808106" lon="2.32086420059204"><ele>31.8776</ele><time>2007-04-15T09:26:10Z</time></trkpt><trkpt lat="48.864013671875" lon="2.32068061828613"><ele>31.6332</ele><time>2007-04-15T09:26:11Z</time></trkpt><trkpt lat="48.8640747070312" lon="2.32050275802612"><ele>31.3895</ele><time>2007-04-15T09:26:12Z</time></trkpt><trkpt lat="48.8641548156738" lon="2.3203010559082"><ele>31.0399</ele><time>2007-04-15T09:26:13Z</time></trkpt><trkpt lat="48.864200592041" lon="2.3200786113739"><ele>30.3606</ele><time>2007-04-15T09:26:14Z</time></trkpt><trkpt lat="48.8642120361328" lon="2.32005524635315"><ele>30.3042</ele><time>2007-04-15T09:26:15Z</time></trkpt><trkpt lat="48.8643569946289" lon="2.31975173950195"><ele>29.6991</ele><time>2007-04-15T09:26:16Z</time></trkpt><trkpt lat="48.8643684387207" lon="2.31974530220032"><ele>29.7153</ele><time>2007-04-15T09:26:17Z</time></trkpt><trkpt lat="48.8643836975098" lon="2.31963443756104"><ele>29.4333</ele><time>2007-04-15T09:26:18Z</time></trkpt><trkpt lat="48.864444732666" lon="2.3194591999054"><ele>29.1536</ele><time>2007-04-15T09:26:19Z</time></trkpt><trkpt lat="48.8644828796387" lon="2.31935286521912"><ele>29.0186</ele><time>2007-04-15T09:26:20Z</time></trkpt><trkpt lat="48.8645286560059" lon="2.31922435760498"><ele>28.8851</ele><time>2007-04-15T09:26:21Z</time></trkpt><trkpt lat="48.8645706176758" lon="2.31903314590454"><ele>29.6673</ele><time>2007-04-15T09:26:22Z</time></trkpt><trkpt lat="48.8646392822266" lon="2.31882810592651"><ele>31.015</ele><time>2007-04-15T09:26:23Z</time></trkpt><trkpt lat="48.8646850585938" lon="2.31872987747192"><ele>31.655</ele><time>2007-04-15T09:26:24Z</time></trkpt><trkpt lat="48.8647422790527" lon="2.31856274604797"><ele>32.6094</ele><time>2007-04-15T09:26:25Z</time></trkpt><trkpt lat="48.8648071289062" lon="2.3183753490448"><ele>33.5823</ele><time>2007-04-15T09:26:26Z</time></trkpt><trkpt lat="48.8648529052734" lon="2.31816124916077"><ele>34.1151</ele><time>2007-04-15T09:26:27Z</time></trkpt><trkpt lat="48.8648681640625" lon="2.31798005104065"><ele>34.3783</ele><time>2007-04-15T09:26:28Z</time></trkpt><trkpt lat="48.8648681640625" lon="2.31793165206909"><ele>34.4519</ele><time>2007-04-15T09:26:29Z</time></trkpt><trkpt lat="48.8648681640625" lon="2.31768822669983"><ele>34.8216</ele><time>2007-04-15T09:26:30Z</time></trkpt><trkpt lat="48.8648719787598" lon="2.31741666793823"><ele>34.4218</ele><time>2007-04-15T09:26:31Z</time></trkpt><trkpt lat="48.8648719787598" lon="2.31717729568481"><ele>32.5442</ele><time>2007-04-15T09:26:32Z</time></trkpt><trkpt lat="48.8648681640625" lon="2.316890001297"><ele>30.2894</ele><time>2007-04-15T09:26:33Z</time></trkpt><trkpt lat="48.8648529052734" lon="2.31671833992004"><ele>28.89</ele><time>2007-04-15T09:26:34Z</time></trkpt><trkpt lat="48.8648529052734" lon="2.31651663780212"><ele>29.36</ele><time>2007-04-15T09:26:35Z</time></trkpt><trkpt lat="48.8648529052734" lon="2.31632328033447"><ele>30.5064</ele><time>2007-04-15T09:26:36Z</time></trkpt><trkpt lat="48.8648338317871" lon="2.31613302230835"><ele>31.4779</ele><time>2007-04-15T09:26:37Z</time></trkpt><trkpt lat="48.8648262023926" lon="2.3159544467926"><ele>32.4328</ele><time>2007-04-15T09:26:38Z</time></trkpt><trkpt lat="48.864803314209" lon="2.31572699546814"><ele>33.8435</ele><time>2007-04-15T09:26:39Z</time></trkpt><trkpt lat="48.8648109436035" lon="2.31555318832397"><ele>35.5262</ele><time>2007-04-15T09:26:40Z</time></trkpt><trkpt lat="48.8648071289062" lon="2.31536030769348"><ele>37.2374</ele><time>2007-04-15T09:26:41Z</time></trkpt><trkpt lat="48.864803314209" lon="2.31513476371765"><ele>39.2332</ele><time>2007-04-15T09:26:42Z</time></trkpt><trkpt lat="48.8648223876953" lon="2.31495428085327"><ele>40.5125</ele><time>2007-04-15T09:26:43Z</time></trkpt><trkpt lat="48.8648300170898" lon="2.31476330757141"><ele>39.4156</ele><time>2007-04-15T09:26:44Z</time></trkpt><trkpt lat="48.864818572998" lon="2.31451606750488"><ele>37.6807</ele><time>2007-04-15T09:26:45Z</time></trkpt><trkpt lat="48.8648109436035" lon="2.31421995162964"><ele>35.7435</ele><time>2007-04-15T09:26:46Z</time></trkpt><trkpt lat="48.8648071289062" lon="2.314124584198"><ele>35.6361</ele><time>2007-04-15T09:26:47Z</time></trkpt><trkpt lat="48.8647956848144" lon="2.31413316726685"><ele>35.4855</ele><time>2007-04-15T09:26:48Z</time></trkpt><trkpt lat="48.8647956848144" lon="2.31409382820129"><ele>35.7225</ele><time>2007-04-15T09:26:49Z</time></trkpt><trkpt lat="48.8648338317871" lon="2.30936908721924"><ele>38.8066</ele><time>2007-04-15T09:26:50Z</time></trkpt><trkpt lat="48.8648414611816" lon="2.30929398536682"><ele>38.9073</ele><time>2007-04-15T09:26:51Z</time></trkpt><trkpt lat="48.8648681640625" lon="2.30930638313293"><ele>39.2598</ele><time>2007-04-15T09:26:52Z</time></trkpt><trkpt lat="48.8649215698242" lon="2.30933594703674"><ele>39.9647</ele><time>2007-04-15T09:26:53Z</time></trkpt><trkpt lat="48.8648910522461" lon="2.30925869941711"><ele>39.5619</ele><time>2007-04-15T09:26:54Z</time></trkpt><trkpt lat="48.8648338317871" lon="2.30915331840515"><ele>38.813</ele><time>2007-04-15T09:26:55Z</time></trkpt><trkpt lat="48.8648109436035" lon="2.30904006958008"><ele>38.5734</ele><time>2007-04-15T09:26:56Z</time></trkpt><trkpt lat="48.8647804260254" lon="2.30892825126648"><ele>38.2524</ele><time>2007-04-15T09:26:57Z</time></trkpt><trkpt lat="48.8647384643555" lon="2.30880331993103"><ele>37.8214</ele><time>2007-04-15T09:26:58Z</time></trkpt><trkpt lat="48.8647346496582" lon="2.30878186225891"><ele>37.7914</ele><time>2007-04-15T09:26:59Z</time></trkpt><trkpt lat="48.8647308349609" lon="2.30861830711365"><ele>37.8721</ele><time>2007-04-15T09:27:00Z</time></trkpt><trkpt lat="48.8646965026856" lon="2.30840802192688"><ele>37.6569</ele><time>2007-04-15T09:27:01Z</time></trkpt><trkpt lat="48.8646812438965" lon="2.308269739151"><ele>37.6517</ele><time>2007-04-15T09:27:02Z</time></trkpt><trkpt lat="48.8646774291992" lon="2.3080952167511"><ele>37.8665</ele><time>2007-04-15T09:27:03Z</time></trkpt><trkpt lat="48.8646697998047" lon="2.30796265602112"><ele>37.971</ele><time>2007-04-15T09:27:04Z</time></trkpt><trkpt lat="48.8646621704102" lon="2.30779957771301"><ele>38.1131</ele><time>2007-04-15T09:27:05Z</time></trkpt><trkpt lat="48.8646621704102" lon="2.30776381492615"><ele>38.1642</ele><time>2007-04-15T09:27:06Z</time></trkpt><trkpt lat="48.864688873291" lon="2.30750322341919"><ele>38.8883</ele><time>2007-04-15T09:27:07Z</time></trkpt><trkpt lat="48.8646850585938" lon="2.30739116668701"><ele>39.3477</ele><time>2007-04-15T09:27:08Z</time></trkpt><trkpt lat="48.8646659851074" lon="2.30722904205322"><ele>39.8258</ele><time>2007-04-15T09:27:09Z</time></trkpt><trkpt lat="48.8646621704102" lon="2.30704522132874"><ele>40.6056</ele><time>2007-04-15T09:27:10Z</time></trkpt><trkpt lat="48.8646621704102" lon="2.30684900283813"><ele>41.4966</ele><time>2007-04-15T09:27:11Z</time></trkpt><trkpt lat="48.8646812438965" lon="2.30666923522949"><ele>42.633</ele><time>2007-04-15T09:27:12Z</time></trkpt><trkpt lat="48.8646774291992" lon="2.30650091171265"><ele>41.8173</ele><time>2007-04-15T09:27:13Z</time></trkpt><trkpt lat="48.8647079467773" lon="2.30633187294006"><ele>41.5071</ele><time>2007-04-15T09:27:14Z</time></trkpt><trkpt lat="48.8647079467773" lon="2.30616784095764"><ele>40.7299</ele><time>2007-04-15T09:27:15Z</time></trkpt><trkpt lat="48.8647155761719" lon="2.30596518516541"><ele>39.8747</ele><time>2007-04-15T09:27:16Z</time></trkpt><trkpt lat="48.8647079467773" lon="2.30579304695129"><ele>39.1594</ele><time>2007-04-15T09:27:17Z</time></trkpt><trkpt lat="48.8646812438965" lon="2.30551385879517"><ele>38.8825</ele><time>2007-04-15T09:27:18Z</time></trkpt><trkpt lat="48.8646583557129" lon="2.30531096458435"><ele>38.6032</ele><time>2007-04-15T09:27:19Z</time></trkpt><trkpt lat="48.8646469116211" lon="2.3050901889801"><ele>38.4753</ele><time>2007-04-15T09:27:20Z</time></trkpt><trkpt lat="48.8646240234375" lon="2.30491375923157"><ele>38.2281</ele><time>2007-04-15T09:27:21Z</time></trkpt><trkpt lat="48.8646049499512" lon="2.30470848083496"><ele>38.1689</ele><time>2007-04-15T09:27:22Z</time></trkpt><trkpt lat="48.8646049499512" lon="2.30446124076843"><ele>38.4502</ele><time>2007-04-15T09:27:23Z</time></trkpt><trkpt lat="48.864616394043" lon="2.30424237251282"><ele>38.8528</ele><time>2007-04-15T09:27:24Z</time></trkpt><trkpt lat="48.8646202087402" lon="2.30407929420471"><ele>38.6537</ele><time>2007-04-15T09:27:25Z</time></trkpt><trkpt lat="48.864616394043" lon="2.30386471748352"><ele>37.7919</ele><time>2007-04-15T09:27:26Z</time></trkpt><trkpt lat="48.864616394043" lon="2.30362415313721"><ele>36.88</ele><time>2007-04-15T09:27:27Z</time></trkpt><trkpt lat="48.8646087646484" lon="2.30345773696899"><ele>36.1797</ele><time>2007-04-15T09:27:28Z</time></trkpt><trkpt lat="48.8645820617676" lon="2.30321741104126"><ele>35.488</ele><time>2007-04-15T09:27:29Z</time></trkpt><trkpt lat="48.8645401000977" lon="2.30304360389709"><ele>35.0286</ele><time>2007-04-15T09:27:30Z</time></trkpt><trkpt lat="48.864501953125" lon="2.30286288261414"><ele>34.4856</ele><time>2007-04-15T09:27:31Z</time></trkpt><trkpt lat="48.8644599914551" lon="2.30267477035522"><ele>33.7621</ele><time>2007-04-15T09:27:32Z</time></trkpt><trkpt lat="48.8644561767578" lon="2.3026614189148"><ele>33.6937</ele><time>2007-04-15T09:27:33Z</time></trkpt><trkpt lat="48.8644523620606" lon="2.30262923240662"><ele>33.6031</ele><time>2007-04-15T09:27:34Z</time></trkpt><trkpt lat="48.8643798828125" lon="2.30078840255737"><ele>40.1713</ele><time>2007-04-15T09:27:35Z</time></trkpt><trkpt lat="48.864315032959" lon="2.30073523521423"><ele>39.8891</ele><time>2007-04-15T09:27:36Z</time></trkpt><trkpt lat="48.8641586303711" lon="2.3005256652832"><ele>41.08</ele><time>2007-04-15T09:27:37Z</time></trkpt><trkpt lat="48.8641395568848" lon="2.30041265487671"><ele>42.7411</ele><time>2007-04-15T09:27:38Z</time></trkpt><trkpt lat="48.8641204833984" lon="2.30026173591614"><ele>44.9868</ele><time>2007-04-15T09:27:39Z</time></trkpt><trkpt lat="48.8640937805176" lon="2.30014777183533"><ele>46.4735</ele><time>2007-04-15T09:27:40Z</time></trkpt><trkpt lat="48.8640747070312" lon="2.30000972747803"><ele>48.4097</ele><time>2007-04-15T09:27:41Z</time></trkpt><trkpt lat="48.8640747070312" lon="2.29999279975891"><ele>48.5136</ele><time>2007-04-15T09:27:42Z</time></trkpt><trkpt lat="48.8640632629394" lon="2.29985070228577"><ele>47.312</ele><time>2007-04-15T09:27:43Z</time></trkpt><trkpt lat="48.8640365600586" lon="2.29971575737"><ele>45.9238</ele><time>2007-04-15T09:27:44Z</time></trkpt><trkpt lat="48.864013671875" lon="2.29959487915039"><ele>44.6964</ele><time>2007-04-15T09:27:45Z</time></trkpt><trkpt lat="48.8639984130859" lon="2.29952549934387"><ele>43.9588</ele><time>2007-04-15T09:27:46Z</time></trkpt><trkpt lat="48.8639640808106" lon="2.29940867424011"><ele>42.5821</ele><time>2007-04-15T09:27:47Z</time></trkpt><trkpt lat="48.863941192627" lon="2.29922080039978"><ele>40.8724</ele><time>2007-04-15T09:27:48Z</time></trkpt><trkpt lat="48.8639221191406" lon="2.2990608215332"><ele>39.8109</ele><time>2007-04-15T09:27:49Z</time></trkpt><trkpt lat="48.8638954162598" lon="2.29889130592346"><ele>38.8692</ele><time>2007-04-15T09:27:50Z</time></trkpt><trkpt lat="48.8638458251953" lon="2.29875135421753"><ele>37.8462</ele><time>2007-04-15T09:27:51Z</time></trkpt><trkpt lat="48.8638000488281" lon="2.29856729507446"><ele>36.8995</ele><time>2007-04-15T09:27:52Z</time></trkpt><trkpt lat="48.8637657165527" lon="2.29845404624939"><ele>36.3496</ele><time>2007-04-15T09:27:53Z</time></trkpt><trkpt lat="48.8637504577637" lon="2.29829382896423"><ele>36.0032</ele><time>2007-04-15T09:27:54Z</time></trkpt><trkpt lat="48.863697052002" lon="2.2980751991272"><ele>35.6581</ele><time>2007-04-15T09:27:55Z</time></trkpt><trkpt lat="48.8636703491211" lon="2.29792237281799"><ele>35.5208</ele><time>2007-04-15T09:27:56Z</time></trkpt><trkpt lat="48.8636436462402" lon="2.29776835441589"><ele>35.4073</ele><time>2007-04-15T09:27:57Z</time></trkpt><trkpt lat="48.8636131286621" lon="2.29759836196899"><ele>35.3042</ele><time>2007-04-15T09:27:58Z</time></trkpt><trkpt lat="48.8635749816894" lon="2.29743313789368"><ele>35.2297</ele><time>2007-04-15T09:27:59Z</time></trkpt><trkpt lat="48.8635444641113" lon="2.29731011390686"><ele>35.1866</ele><time>2007-04-15T09:28:00Z</time></trkpt><trkpt lat="48.8635025024414" lon="2.29707169532776"><ele>35.125</ele><time>2007-04-15T09:28:01Z</time></trkpt><trkpt lat="48.8634567260742" lon="2.29693961143494"><ele>34.891</ele><time>2007-04-15T09:28:02Z</time></trkpt><trkpt lat="48.8634376525879" lon="2.29684114456177"><ele>34.7977</ele><time>2007-04-15T09:28:03Z</time></trkpt><trkpt lat="48.8633995056152" lon="2.29665803909302"><ele>34.5678</ele><time>2007-04-15T09:28:04Z</time></trkpt><trkpt lat="48.8633232116699" lon="2.29643082618713"><ele>34.2083</ele><time>2007-04-15T09:28:05Z</time></trkpt><trkpt lat="48.8632698059082" lon="2.2962703704834"><ele>34.0507</ele><time>2007-04-15T09:28:06Z</time></trkpt><trkpt lat="48.8632621765137" lon="2.29624009132385"><ele>34.0453</ele><time>2007-04-15T09:28:07Z</time></trkpt><trkpt lat="48.8632202148438" lon="2.29606699943542"><ele>34.0624</ele><time>2007-04-15T09:28:08Z</time></trkpt><trkpt lat="48.8631324768066" lon="2.29582810401916"><ele>34.0484</ele><time>2007-04-15T09:28:09Z</time></trkpt><trkpt lat="48.8630714416504" lon="2.29566860198975"><ele>34.1383</ele><time>2007-04-15T09:28:10Z</time></trkpt><trkpt lat="48.8630218505859" lon="2.29549670219421"><ele>34.3128</ele><time>2007-04-15T09:28:11Z</time></trkpt><trkpt lat="48.8629684448242" lon="2.295334815979"><ele>34.445</ele><time>2007-04-15T09:28:12Z</time></trkpt><trkpt lat="48.8629341125488" lon="2.29518604278564"><ele>34.6372</ele><time>2007-04-15T09:28:13Z</time></trkpt><trkpt lat="48.8628845214844" lon="2.29502844810486"><ele>34.7774</ele><time>2007-04-15T09:28:14Z</time></trkpt><trkpt lat="48.8628578186035" lon="2.2948739528656"><ele>35.5823</ele><time>2007-04-15T09:28:15Z</time></trkpt><trkpt lat="48.8628158569336" lon="2.29468870162964"><ele>36.5767</ele><time>2007-04-15T09:28:16Z</time></trkpt><trkpt lat="48.8627243041992" lon="2.29453468322754"><ele>36.9114</ele><time>2007-04-15T09:28:17Z</time></trkpt><trkpt lat="48.8626327514648" lon="2.29441928863525"><ele>36.8687</ele><time>2007-04-15T09:28:18Z</time></trkpt><trkpt lat="48.8625755310059" lon="2.29427671432495"><ele>37.149</ele><time>2007-04-15T09:28:19Z</time></trkpt><trkpt lat="48.8625221252441" lon="2.29413771629334"><ele>37.4574</ele><time>2007-04-15T09:28:20Z</time></trkpt><trkpt lat="48.8624801635742" lon="2.29401040077209"><ele>38.1148</ele><time>2007-04-15T09:28:21Z</time></trkpt><trkpt lat="48.8624267578125" lon="2.29388785362244"><ele>38.521</ele><time>2007-04-15T09:28:22Z</time></trkpt><trkpt lat="48.8624038696289" lon="2.29374003410339"><ele>39.3628</ele><time>2007-04-15T09:28:23Z</time></trkpt><trkpt lat="48.8623466491699" lon="2.29363203048706"><ele>39.3764</ele><time>2007-04-15T09:28:24Z</time></trkpt><trkpt lat="48.8622665405273" lon="2.29347062110901"><ele>39.2477</ele><time>2007-04-15T09:28:25Z</time></trkpt><trkpt lat="48.8622169494629" lon="2.29332828521728"><ele>39.2611</ele><time>2007-04-15T09:28:26Z</time></trkpt><trkpt lat="48.8621253967285" lon="2.29318356513977"><ele>38.2903</ele><time>2007-04-15T09:28:27Z</time></trkpt><trkpt lat="48.8620185852051" lon="2.29300832748413"><ele>37.4288</ele><time>2007-04-15T09:28:28Z</time></trkpt><trkpt lat="48.861930847168" lon="2.29286599159241"><ele>36.9142</ele><time>2007-04-15T09:28:29Z</time></trkpt><trkpt lat="48.8618583679199" lon="2.29275393486023"><ele>36.5925</ele><time>2007-04-15T09:28:30Z</time></trkpt><trkpt lat="48.8617820739746" lon="2.29265546798706"><ele>36.2562</ele><time>2007-04-15T09:28:31Z</time></trkpt><trkpt lat="48.8616638183594" lon="2.29251933097839"><ele>35.8438</ele><time>2007-04-15T09:28:32Z</time></trkpt><trkpt lat="48.8615875244141" lon="2.292396068573"><ele>36.1014</ele><time>2007-04-15T09:28:33Z</time></trkpt><trkpt lat="48.8614730834961" lon="2.29226756095886"><ele>35.974</ele><time>2007-04-15T09:28:34Z</time></trkpt><trkpt lat="48.861385345459" lon="2.29217171669006"><ele>35.7498</ele><time>2007-04-15T09:28:35Z</time></trkpt><trkpt lat="48.8612861633301" lon="2.29204964637756"><ele>35.4321</ele><time>2007-04-15T09:28:36Z</time></trkpt><trkpt lat="48.8611869812012" lon="2.2919225692749"><ele>34.991</ele><time>2007-04-15T09:28:37Z</time></trkpt><trkpt lat="48.8611030578613" lon="2.29181694984436"><ele>34.4992</ele><time>2007-04-15T09:28:38Z</time></trkpt><trkpt lat="48.8609962463379" lon="2.29168081283569"><ele>33.7292</ele><time>2007-04-15T09:28:39Z</time></trkpt><trkpt lat="48.8609046936035" lon="2.29156875610352"><ele>32.6934</ele><time>2007-04-15T09:28:40Z</time></trkpt><trkpt lat="48.8608551025391" lon="2.29146385192871"><ele>32.0172</ele><time>2007-04-15T09:28:41Z</time></trkpt><trkpt lat="48.8608474731445" lon="2.2914309501648"><ele>31.889</ele><time>2007-04-15T09:28:42Z</time></trkpt><trkpt lat="48.8607711791992" lon="2.29124999046326"><ele>31.4254</ele><time>2007-04-15T09:28:43Z</time></trkpt><trkpt lat="48.8607215881348" lon="2.29107904434204"><ele>31.3258</ele><time>2007-04-15T09:28:44Z</time></trkpt><trkpt lat="48.8606719970703" lon="2.29094195365906"><ele>31.3661</ele><time>2007-04-15T09:28:45Z</time></trkpt><trkpt lat="48.8606643676758" lon="2.29091000556946"><ele>31.3856</ele><time>2007-04-15T09:28:46Z</time></trkpt><trkpt lat="48.8606567382812" lon="2.29090452194214"><ele>31.4006</ele><time>2007-04-15T09:28:47Z</time></trkpt><trkpt lat="48.8598709106445" lon="2.29023432731628"><ele>35.9066</ele><time>2007-04-15T09:28:48Z</time></trkpt><trkpt lat="48.8597946166992" lon="2.29014587402344"><ele>35.9787</ele><time>2007-04-15T09:28:49Z</time></trkpt><trkpt lat="48.8597106933594" lon="2.29004645347595"><ele>36.0241</ele><time>2007-04-15T09:28:50Z</time></trkpt><trkpt lat="48.8596229553223" lon="2.2899432182312"><ele>36.2828</ele><time>2007-04-15T09:28:51Z</time></trkpt><trkpt lat="48.8595504760742" lon="2.28986740112305"><ele>36.5758</ele><time>2007-04-15T09:28:52Z</time></trkpt><trkpt lat="48.8594665527344" lon="2.28977179527283"><ele>36.9901</ele><time>2007-04-15T09:28:53Z</time></trkpt><trkpt lat="48.8594245910644" lon="2.28971171379089"><ele>37.3151</ele><time>2007-04-15T09:28:54Z</time></trkpt><trkpt lat="48.859375" lon="2.28963899612427"><ele>37.7156</ele><time>2007-04-15T09:28:55Z</time></trkpt><trkpt lat="48.8592758178711" lon="2.28954482078552"><ele>38.0246</ele><time>2007-04-15T09:28:56Z</time></trkpt><trkpt lat="48.8591690063477" lon="2.28942441940308"><ele>38.5396</ele><time>2007-04-15T09:28:57Z</time></trkpt><trkpt lat="48.8590545654297" lon="2.28928804397583"><ele>38.7978</ele><time>2007-04-15T09:28:58Z</time></trkpt><trkpt lat="48.8589706420898" lon="2.28918671607971"><ele>38.937</ele><time>2007-04-15T09:28:59Z</time></trkpt><trkpt lat="48.8588562011719" lon="2.28907608985901"><ele>39.0383</ele><time>2007-04-15T09:29:00Z</time></trkpt><trkpt lat="48.8587608337402" lon="2.28897905349731"><ele>39.2399</ele><time>2007-04-15T09:29:01Z</time></trkpt><trkpt lat="48.858642578125" lon="2.28884792327881"><ele>39.6517</ele><time>2007-04-15T09:29:02Z</time></trkpt><trkpt lat="48.8585205078125" lon="2.28873372077942"><ele>39.8755</ele><time>2007-04-15T09:29:03Z</time></trkpt><trkpt lat="48.8583984375" lon="2.28861284255981"><ele>40.219</ele><time>2007-04-15T09:29:04Z</time></trkpt><trkpt lat="48.8582916259766" lon="2.28845953941345"><ele>40.9683</ele><time>2007-04-15T09:29:05Z</time></trkpt><trkpt lat="48.8581962585449" lon="2.2883026599884"><ele>41.3322</ele><time>2007-04-15T09:29:06Z</time></trkpt><trkpt lat="48.8581657409668" lon="2.28825497627258"><ele>41.3961</ele><time>2007-04-15T09:29:07Z</time></trkpt><trkpt lat="48.8580741882324" lon="2.28815245628357"><ele>41.3277</ele><time>2007-04-15T09:29:08Z</time></trkpt><trkpt lat="48.8579368591309" lon="2.28799653053284"><ele>41.6582</ele><time>2007-04-15T09:29:09Z</time></trkpt><trkpt lat="48.857795715332" lon="2.2878315448761"><ele>42.5811</ele><time>2007-04-15T09:29:10Z</time></trkpt><trkpt lat="48.8576583862305" lon="2.2876672744751"><ele>44.0545</ele><time>2007-04-15T09:29:11Z</time></trkpt><trkpt lat="48.8575553894043" lon="2.28752303123474"><ele>45.866</ele><time>2007-04-15T09:29:12Z</time></trkpt><trkpt lat="48.8574562072754" lon="2.28738927841187"><ele>46.4215</ele><time>2007-04-15T09:29:13Z</time></trkpt><trkpt lat="48.8573760986328" lon="2.28724718093872"><ele>46.5904</ele><time>2007-04-15T09:29:14Z</time></trkpt><trkpt lat="48.8572540283203" lon="2.28709506988525"><ele>46.2326</ele><time>2007-04-15T09:29:15Z</time></trkpt><trkpt lat="48.8571281433106" lon="2.28694725036621"><ele>45.8682</ele><time>2007-04-15T09:29:16Z</time></trkpt><trkpt lat="48.8570365905762" lon="2.28683686256409"><ele>45.7056</ele><time>2007-04-15T09:29:17Z</time></trkpt><trkpt lat="48.856876373291" lon="2.28669142723084"><ele>44.9595</ele><time>2007-04-15T09:29:18Z</time></trkpt><trkpt lat="48.856803894043" lon="2.28658962249756"><ele>44.5737</ele><time>2007-04-15T09:29:19Z</time></trkpt><trkpt lat="48.8567504882812" lon="2.28652620315552"><ele>44.1833</ele><time>2007-04-15T09:29:20Z</time></trkpt><trkpt lat="48.8566207885742" lon="2.28637552261353"><ele>43.5649</ele><time>2007-04-15T09:29:21Z</time></trkpt><trkpt lat="48.856517791748" lon="2.28620600700378"><ele>43.629</ele><time>2007-04-15T09:29:22Z</time></trkpt><trkpt lat="48.8564300537109" lon="2.2860631942749"><ele>43.7113</ele><time>2007-04-15T09:29:23Z</time></trkpt><trkpt lat="48.8563346862793" lon="2.28593969345093"><ele>43.598</ele><time>2007-04-15T09:29:24Z</time></trkpt><trkpt lat="48.8562469482422" lon="2.28581953048706"><ele>43.4673</ele><time>2007-04-15T09:29:25Z</time></trkpt><trkpt lat="48.8561553955078" lon="2.28568601608276"><ele>42.5585</ele><time>2007-04-15T09:29:26Z</time></trkpt><trkpt lat="48.8560676574707" lon="2.2855715751648"><ele>41.8056</ele><time>2007-04-15T09:29:27Z</time></trkpt><trkpt lat="48.8559494018555" lon="2.2854106426239"><ele>40.9854</ele><time>2007-04-15T09:29:28Z</time></trkpt><trkpt lat="48.8558578491211" lon="2.28529405593872"><ele>40.4829</ele><time>2007-04-15T09:29:29Z</time></trkpt><trkpt lat="48.8557434082031" lon="2.28515315055847"><ele>40.4055</ele><time>2007-04-15T09:29:30Z</time></trkpt><trkpt lat="48.8556823730469" lon="2.2850513458252"><ele>40.6286</ele><time>2007-04-15T09:29:31Z</time></trkpt><trkpt lat="48.8555641174316" lon="2.28489470481873"><ele>40.7508</ele><time>2007-04-15T09:29:32Z</time></trkpt><trkpt lat="48.8554267883301" lon="2.28474020957947"><ele>41.1054</ele><time>2007-04-15T09:29:33Z</time></trkpt><trkpt lat="48.855339050293" lon="2.28462982177734"><ele>41.6263</ele><time>2007-04-15T09:29:34Z</time></trkpt><trkpt lat="48.8552322387695" lon="2.28449559211731"><ele>42.5609</ele><time>2007-04-15T09:29:35Z</time></trkpt><trkpt lat="48.8551177978516" lon="2.28435802459717"><ele>43.8924</ele><time>2007-04-15T09:29:36Z</time></trkpt><trkpt lat="48.8550262451172" lon="2.28424382209778"><ele>45.2473</ele><time>2007-04-15T09:29:37Z</time></trkpt><trkpt lat="48.8549766540527" lon="2.28417468070984"><ele>45.6366</ele><time>2007-04-15T09:29:38Z</time></trkpt><trkpt lat="48.8548812866211" lon="2.28404211997986"><ele>44.2405</ele><time>2007-04-15T09:29:39Z</time></trkpt><trkpt lat="48.8548622131348" lon="2.28402209281921"><ele>43.9777</ele><time>2007-04-15T09:29:40Z</time></trkpt><trkpt lat="48.854736328125" lon="2.28385806083679"><ele>42.3647</ele><time>2007-04-15T09:29:41Z</time></trkpt><trkpt lat="48.8546295166016" lon="2.28371715545654"><ele>41.2299</ele><time>2007-04-15T09:29:42Z</time></trkpt><trkpt lat="48.8544845581055" lon="2.28352403640747"><ele>40.0388</ele><time>2007-04-15T09:29:43Z</time></trkpt><trkpt lat="48.8543739318848" lon="2.28339552879334"><ele>39.3612</ele><time>2007-04-15T09:29:44Z</time></trkpt><trkpt lat="48.8542594909668" lon="2.28326559066772"><ele>38.578</ele><time>2007-04-15T09:29:45Z</time></trkpt><trkpt lat="48.854175567627" lon="2.28314781188965"><ele>37.8391</ele><time>2007-04-15T09:29:46Z</time></trkpt><trkpt lat="48.8540687561035" lon="2.2830057144165"><ele>36.4028</ele><time>2007-04-15T09:29:47Z</time></trkpt><trkpt lat="48.8539581298828" lon="2.2828733921051"><ele>35.1617</ele><time>2007-04-15T09:29:48Z</time></trkpt><trkpt lat="48.8538513183594" lon="2.28272604942322"><ele>34.2822</ele><time>2007-04-15T09:29:49Z</time></trkpt><trkpt lat="48.8537445068359" lon="2.28257727622986"><ele>33.7243</ele><time>2007-04-15T09:29:50Z</time></trkpt><trkpt lat="48.8536529541016" lon="2.2824273109436"><ele>33.919</ele><time>2007-04-15T09:29:51Z</time></trkpt><trkpt lat="48.8535537719727" lon="2.2822585105896"><ele>34.812</ele><time>2007-04-15T09:29:52Z</time></trkpt><trkpt lat="48.8534851074219" lon="2.28214406967163"><ele>35.5479</ele><time>2007-04-15T09:29:53Z</time></trkpt><trkpt lat="48.8534164428711" lon="2.28206872940063"><ele>35.998</ele><time>2007-04-15T09:29:54Z</time></trkpt><trkpt lat="48.8533248901367" lon="2.28191590309143"><ele>37.2352</ele><time>2007-04-15T09:29:55Z</time></trkpt><trkpt lat="48.8532066345215" lon="2.28174209594727"><ele>37.8996</ele><time>2007-04-15T09:29:56Z</time></trkpt><trkpt lat="48.8531112670898" lon="2.28157234191895"><ele>38.4621</ele><time>2007-04-15T09:29:57Z</time></trkpt><trkpt lat="48.8530158996582" lon="2.28141570091248"><ele>38.5508</ele><time>2007-04-15T09:29:58Z</time></trkpt><trkpt lat="48.8529434204102" lon="2.28127694129944"><ele>38.4963</ele><time>2007-04-15T09:29:59Z</time></trkpt><trkpt lat="48.852840423584" lon="2.2810788154602"><ele>37.9755</ele><time>2007-04-15T09:30:00Z</time></trkpt><trkpt lat="48.8527793884277" lon="2.28103494644165"><ele>37.0628</ele><time>2007-04-15T09:30:01Z</time></trkpt><trkpt lat="48.8526725769043" lon="2.28086304664612"><ele>35.6255</ele><time>2007-04-15T09:30:02Z</time></trkpt><trkpt lat="48.8526077270508" lon="2.28069567680359"><ele>34.9179</ele><time>2007-04-15T09:30:03Z</time></trkpt><trkpt lat="48.8525199890137" lon="2.2805278301239"><ele>34.1681</ele><time>2007-04-15T09:30:04Z</time></trkpt><trkpt lat="48.8524360656738" lon="2.28039050102234"><ele>34.4891</ele><time>2007-04-15T09:30:05Z</time></trkpt><trkpt lat="48.8523712158203" lon="2.28029346466064"><ele>34.793</ele><time>2007-04-15T09:30:06Z</time></trkpt><trkpt lat="48.8523178100586" lon="2.28017210960388"><ele>35.1451</ele><time>2007-04-15T09:30:07Z</time></trkpt><trkpt lat="48.8522300720215" lon="2.28005957603455"><ele>35.1619</ele><time>2007-04-15T09:30:08Z</time></trkpt><trkpt lat="48.852165222168" lon="2.27996349334717"><ele>35.1666</ele><time>2007-04-15T09:30:09Z</time></trkpt><trkpt lat="48.8521156311035" lon="2.27987408638"><ele>35.2982</ele><time>2007-04-15T09:30:10Z</time></trkpt><trkpt lat="48.8520584106445" lon="2.279780626297"><ele>35.4035</ele><time>2007-04-15T09:30:11Z</time></trkpt><trkpt lat="48.851993560791" lon="2.27968120574951"><ele>35.4916</ele><time>2007-04-15T09:30:12Z</time></trkpt><trkpt lat="48.8519020080566" lon="2.279536485672"><ele>35.6369</ele><time>2007-04-15T09:30:13Z</time></trkpt><trkpt lat="48.8518180847168" lon="2.27937388420105"><ele>35.9139</ele><time>2007-04-15T09:30:14Z</time></trkpt><trkpt lat="48.8517646789551" lon="2.27926015853882"><ele>36.1393</ele><time>2007-04-15T09:30:15Z</time></trkpt><trkpt lat="48.8517189025879" lon="2.27912354469299"><ele>36.3684</ele><time>2007-04-15T09:30:16Z</time></trkpt><trkpt lat="48.8516540527344" lon="2.27899765968323"><ele>36.1545</ele><time>2007-04-15T09:30:17Z</time></trkpt><trkpt lat="48.8516311645508" lon="2.27895402908325"><ele>36.1282</ele><time>2007-04-15T09:30:18Z</time></trkpt><trkpt lat="48.8515930175781" lon="2.27889251708984"><ele>36.0918</ele><time>2007-04-15T09:30:19Z</time></trkpt><trkpt lat="48.8515281677246" lon="2.27876925468445"><ele>36.1291</ele><time>2007-04-15T09:30:20Z</time></trkpt><trkpt lat="48.8514442443848" lon="2.27863478660584"><ele>36.252</ele><time>2007-04-15T09:30:21Z</time></trkpt><trkpt lat="48.8513679504394" lon="2.27849221229553"><ele>36.536</ele><time>2007-04-15T09:30:22Z</time></trkpt><trkpt lat="48.8512802124023" lon="2.27832365036011"><ele>37.0187</ele><time>2007-04-15T09:30:23Z</time></trkpt><trkpt lat="48.8511848449707" lon="2.27817988395691"><ele>37.233</ele><time>2007-04-15T09:30:24Z</time></trkpt><trkpt lat="48.8510780334473" lon="2.27806520462036"><ele>37.2834</ele><time>2007-04-15T09:30:25Z</time></trkpt><trkpt lat="48.8509979248047" lon="2.27793574333191"><ele>37.2827</ele><time>2007-04-15T09:30:26Z</time></trkpt><trkpt lat="48.8509063720703" lon="2.27778506278992"><ele>37.173</ele><time>2007-04-15T09:30:27Z</time></trkpt><trkpt lat="48.8508453369141" lon="2.27766609191895"><ele>37.0346</ele><time>2007-04-15T09:30:28Z</time></trkpt><trkpt lat="48.8507919311523" lon="2.27754497528076"><ele>36.992</ele><time>2007-04-15T09:30:29Z</time></trkpt><trkpt lat="48.8506927490234" lon="2.27740073204041"><ele>37.3387</ele><time>2007-04-15T09:30:30Z</time></trkpt><trkpt lat="48.850643157959" lon="2.27724599838257"><ele>37.9574</ele><time>2007-04-15T09:30:31Z</time></trkpt><trkpt lat="48.8505935668945" lon="2.27704381942749"><ele>38.8823</ele><time>2007-04-15T09:30:32Z</time></trkpt><trkpt lat="48.8505859375" lon="2.2770094871521"><ele>39.051</ele><time>2007-04-15T09:30:33Z</time></trkpt><trkpt lat="48.8504600524902" lon="2.27685856819153"><ele>40.2634</ele><time>2007-04-15T09:30:34Z</time></trkpt><trkpt lat="48.8503837585449" lon="2.27675032615662"><ele>41.2259</ele><time>2007-04-15T09:30:35Z</time></trkpt><trkpt lat="48.8502655029297" lon="2.27659869194031"><ele>42.2994</ele><time>2007-04-15T09:30:36Z</time></trkpt><trkpt lat="48.8502082824707" lon="2.27644562721252"><ele>42.4188</ele><time>2007-04-15T09:30:37Z</time></trkpt><trkpt lat="48.8501167297363" lon="2.2763307094574"><ele>42.84</ele><time>2007-04-15T09:30:38Z</time></trkpt><trkpt lat="48.8500175476074" lon="2.27621793746948"><ele>43.3449</ele><time>2007-04-15T09:30:39Z</time></trkpt><trkpt lat="48.8499298095703" lon="2.2761492729187"><ele>43.6725</ele><time>2007-04-15T09:30:40Z</time></trkpt><trkpt lat="48.8498382568359" lon="2.27603912353516"><ele>44.0257</ele><time>2007-04-15T09:30:41Z</time></trkpt><trkpt lat="48.8497581481934" lon="2.2759850025177"><ele>44.4218</ele><time>2007-04-15T09:30:42Z</time></trkpt><trkpt lat="48.8496856689453" lon="2.27593398094177"><ele>44.8245</ele><time>2007-04-15T09:30:43Z</time></trkpt><trkpt lat="48.8495903015137" lon="2.27581763267517"><ele>45.4301</ele><time>2007-04-15T09:30:44Z</time></trkpt><trkpt lat="48.8495254516602" lon="2.27572131156921"><ele>45.6363</ele><time>2007-04-15T09:30:45Z</time></trkpt><trkpt lat="48.8494300842285" lon="2.27558040618896"><ele>45.9084</ele><time>2007-04-15T09:30:46Z</time></trkpt><trkpt lat="48.8493728637695" lon="2.27557754516602"><ele>46.2249</ele><time>2007-04-15T09:30:47Z</time></trkpt><trkpt lat="48.8493156433106" lon="2.27552223205566"><ele>46.4262</ele><time>2007-04-15T09:30:48Z</time></trkpt><trkpt lat="48.8491859436035" lon="2.27538967132568"><ele>46.8319</ele><time>2007-04-15T09:30:49Z</time></trkpt><trkpt lat="48.8491744995117" lon="2.27537536621094"><ele>46.859</ele><time>2007-04-15T09:30:50Z</time></trkpt><trkpt lat="48.8490562438965" lon="2.27529716491699"><ele>46.6187</ele><time>2007-04-15T09:30:51Z</time></trkpt><trkpt lat="48.8490219116211" lon="2.27525925636292"><ele>46.5141</ele><time>2007-04-15T09:30:52Z</time></trkpt><trkpt lat="48.8489875793457" lon="2.2751739025116"><ele>46.3277</ele><time>2007-04-15T09:30:53Z</time></trkpt><trkpt lat="48.8488960266113" lon="2.27512693405151"><ele>46.2057</ele><time>2007-04-15T09:30:54Z</time></trkpt><trkpt lat="48.8488006591797" lon="2.27504563331604"><ele>46.0614</ele><time>2007-04-15T09:30:55Z</time></trkpt><trkpt lat="48.8487129211426" lon="2.27494835853577"><ele>45.8141</ele><time>2007-04-15T09:30:56Z</time></trkpt><trkpt lat="48.8486061096191" lon="2.27484536170959"><ele>45.4433</ele><time>2007-04-15T09:30:57Z</time></trkpt><trkpt lat="48.8485221862793" lon="2.27474308013916"><ele>45.0751</ele><time>2007-04-15T09:30:58Z</time></trkpt><trkpt lat="48.8484191894531" lon="2.27458953857422"><ele>44.5223</ele><time>2007-04-15T09:30:59Z</time></trkpt><trkpt lat="48.8483047485352" lon="2.27452254295349"><ele>44.2322</ele><time>2007-04-15T09:31:00Z</time></trkpt><trkpt lat="48.8481750488281" lon="2.27437114715576"><ele>43.4996</ele><time>2007-04-15T09:31:01Z</time></trkpt><trkpt lat="48.84814453125" lon="2.27432584762573"><ele>43.3032</ele><time>2007-04-15T09:31:02Z</time></trkpt><trkpt lat="48.848030090332" lon="2.2741847038269"><ele>42.6932</ele><time>2007-04-15T09:31:03Z</time></trkpt><trkpt lat="48.8479232788086" lon="2.27406311035156"><ele>42.7545</ele><time>2007-04-15T09:31:04Z</time></trkpt><trkpt lat="48.8478660583496" lon="2.27401185035706"><ele>42.8334</ele><time>2007-04-15T09:31:05Z</time></trkpt><trkpt lat="48.8477478027344" lon="2.27389717102051"><ele>43.0752</ele><time>2007-04-15T09:31:06Z</time></trkpt><trkpt lat="48.8476753234863" lon="2.27383756637573"><ele>43.229</ele><time>2007-04-15T09:31:07Z</time></trkpt><trkpt lat="48.8476371765137" lon="2.27378034591675"><ele>43.4027</ele><time>2007-04-15T09:31:08Z</time></trkpt><trkpt lat="48.8476448059082" lon="2.2737500667572"><ele>43.4998</ele><time>2007-04-15T09:31:09Z</time></trkpt><trkpt lat="48.8475952148438" lon="2.27366232872009"><ele>43.7916</ele><time>2007-04-15T09:31:10Z</time></trkpt><trkpt lat="48.8475341796875" lon="2.27357816696167"><ele>44.1017</ele><time>2007-04-15T09:31:11Z</time></trkpt><trkpt lat="48.8474655151367" lon="2.27346086502075"><ele>44.3466</ele><time>2007-04-15T09:31:12Z</time></trkpt><trkpt lat="48.8473281860352" lon="2.27327299118042"><ele>44.1012</ele><time>2007-04-15T09:31:13Z</time></trkpt><trkpt lat="48.8472747802734" lon="2.2731921672821"><ele>44.0012</ele><time>2007-04-15T09:31:14Z</time></trkpt><trkpt lat="48.8471565246582" lon="2.27297639846802"><ele>44.0736</ele><time>2007-04-15T09:31:15Z</time></trkpt><trkpt lat="48.847095489502" lon="2.27280735969543"><ele>44.4296</ele><time>2007-04-15T09:31:16Z</time></trkpt><trkpt lat="48.8470573425293" lon="2.27266311645508"><ele>44.8572</ele><time>2007-04-15T09:31:17Z</time></trkpt><trkpt lat="48.8470001220703" lon="2.27248883247376"><ele>45.4216</ele><time>2007-04-15T09:31:18Z</time></trkpt><trkpt lat="48.8469657897949" lon="2.27232909202576"><ele>45.6955</ele><time>2007-04-15T09:31:19Z</time></trkpt><trkpt lat="48.8468971252441" lon="2.27209091186523"><ele>46.1226</ele><time>2007-04-15T09:31:20Z</time></trkpt><trkpt lat="48.8468551635742" lon="2.27192378044128"><ele>46.4527</ele><time>2007-04-15T09:31:21Z</time></trkpt><trkpt lat="48.8467712402344" lon="2.27174615859985"><ele>46.8212</ele><time>2007-04-15T09:31:22Z</time></trkpt><trkpt lat="48.8466949462891" lon="2.27161502838135"><ele>47.0599</ele><time>2007-04-15T09:31:23Z</time></trkpt><trkpt lat="48.8466148376465" lon="2.27145552635193"><ele>47.0502</ele><time>2007-04-15T09:31:24Z</time></trkpt><trkpt lat="48.8465766906738" lon="2.27136254310608"><ele>46.952</ele><time>2007-04-15T09:31:25Z</time></trkpt><trkpt lat="48.8465576171875" lon="2.27127552032471"><ele>46.9005</ele><time>2007-04-15T09:31:26Z</time></trkpt><trkpt lat="48.8465309143066" lon="2.27119398117065"><ele>46.7794</ele><time>2007-04-15T09:31:27Z</time></trkpt><trkpt lat="48.8464241027832" lon="2.27103447914124"><ele>46.0724</ele><time>2007-04-15T09:31:28Z</time></trkpt><trkpt lat="48.8464126586914" lon="2.27086687088013"><ele>45.8874</ele><time>2007-04-15T09:31:29Z</time></trkpt><trkpt lat="48.8464050292969" lon="2.2706515789032"><ele>45.2291</ele><time>2007-04-15T09:31:30Z</time></trkpt><trkpt lat="48.8463706970215" lon="2.27046585083008"><ele>44.3187</ele><time>2007-04-15T09:31:31Z</time></trkpt><trkpt lat="48.8463439941406" lon="2.27030444145203"><ele>43.5287</ele><time>2007-04-15T09:31:32Z</time></trkpt><trkpt lat="48.846305847168" lon="2.27017879486084"><ele>42.7181</ele><time>2007-04-15T09:31:33Z</time></trkpt><trkpt lat="48.846263885498" lon="2.27002310752869"><ele>41.7322</ele><time>2007-04-15T09:31:34Z</time></trkpt><trkpt lat="48.8462181091309" lon="2.2698814868927"><ele>40.9586</ele><time>2007-04-15T09:31:35Z</time></trkpt><trkpt lat="48.8461494445801" lon="2.26971197128296"><ele>40.0207</ele><time>2007-04-15T09:31:36Z</time></trkpt><trkpt lat="48.846076965332" lon="2.26955938339233"><ele>39.1675</ele><time>2007-04-15T09:31:37Z</time></trkpt><trkpt lat="48.846019744873" lon="2.26942372322083"><ele>38.5492</ele><time>2007-04-15T09:31:38Z</time></trkpt><trkpt lat="48.8459777832031" lon="2.26925706863403"><ele>38.0965</ele><time>2007-04-15T09:31:39Z</time></trkpt><trkpt lat="48.8459663391113" lon="2.26919627189636"><ele>37.9747</ele><time>2007-04-15T09:31:40Z</time></trkpt><trkpt lat="48.8459510803223" lon="2.26909422874451"><ele>38.1586</ele><time>2007-04-15T09:31:41Z</time></trkpt><trkpt lat="48.8458862304688" lon="2.26893997192383"><ele>38.4172</ele><time>2007-04-15T09:31:42Z</time></trkpt><trkpt lat="48.8458671569824" lon="2.26888394355774"><ele>38.5593</ele><time>2007-04-15T09:31:43Z</time></trkpt><trkpt lat="48.8458404541016" lon="2.26879358291626"><ele>38.8306</ele><time>2007-04-15T09:31:44Z</time></trkpt><trkpt lat="48.8457984924316" lon="2.26863121986389"><ele>39.391</ele><time>2007-04-15T09:31:45Z</time></trkpt><trkpt lat="48.8457908630371" lon="2.26856517791748"><ele>39.6607</ele><time>2007-04-15T09:31:46Z</time></trkpt><trkpt lat="48.8457260131836" lon="2.26839351654053"><ele>40.0858</ele><time>2007-04-15T09:31:47Z</time></trkpt><trkpt lat="48.8456649780273" lon="2.26823711395264"><ele>40.1065</ele><time>2007-04-15T09:31:48Z</time></trkpt><trkpt lat="48.8455848693848" lon="2.26804852485657"><ele>40.0187</ele><time>2007-04-15T09:31:49Z</time></trkpt><trkpt lat="48.8455238342285" lon="2.26789498329163"><ele>40.1198</ele><time>2007-04-15T09:31:50Z</time></trkpt><trkpt lat="48.8454780578613" lon="2.26773381233215"><ele>40.4019</ele><time>2007-04-15T09:31:51Z</time></trkpt><trkpt lat="48.8454437255859" lon="2.26763033866882"><ele>40.6344</ele><time>2007-04-15T09:31:52Z</time></trkpt><trkpt lat="48.8453941345215" lon="2.26745843887329"><ele>41.1233</ele><time>2007-04-15T09:31:53Z</time></trkpt><trkpt lat="48.8453559875488" lon="2.26729583740234"><ele>41.5947</ele><time>2007-04-15T09:31:54Z</time></trkpt><trkpt lat="48.8453178405762" lon="2.26717925071716"><ele>41.9166</ele><time>2007-04-15T09:31:55Z</time></trkpt><trkpt lat="48.8452796936035" lon="2.26702499389648"><ele>42.3313</ele><time>2007-04-15T09:31:56Z</time></trkpt><trkpt lat="48.845272064209" lon="2.26699733734131"><ele>42.4033</ele><time>2007-04-15T09:31:57Z</time></trkpt><trkpt lat="48.8452415466309" lon="2.26684617996216"><ele>42.7966</ele><time>2007-04-15T09:31:58Z</time></trkpt><trkpt lat="48.8452301025391" lon="2.26668953895569"><ele>43.2136</ele><time>2007-04-15T09:31:59Z</time></trkpt><trkpt lat="48.8452033996582" lon="2.2665638923645"><ele>43.4636</ele><time>2007-04-15T09:32:00Z</time></trkpt><trkpt lat="48.845157623291" lon="2.26643872261047"><ele>43.7511</ele><time>2007-04-15T09:32:01Z</time></trkpt><trkpt lat="48.8451156616211" lon="2.26622867584228"><ele>44.3508</ele><time>2007-04-15T09:32:02Z</time></trkpt><trkpt lat="48.8451309204102" lon="2.26601028442383"><ele>44.9014</ele><time>2007-04-15T09:32:03Z</time></trkpt><trkpt lat="48.8451042175293" lon="2.26581645011902"><ele>45.52</ele><time>2007-04-15T09:32:04Z</time></trkpt><trkpt lat="48.845100402832" lon="2.265625"><ele>45.7681</ele><time>2007-04-15T09:32:05Z</time></trkpt><trkpt lat="48.8451080322266" lon="2.265469789505"><ele>45.9177</ele><time>2007-04-15T09:32:06Z</time></trkpt><trkpt lat="48.8451194763184" lon="2.26528739929199"><ele>46.0816</ele><time>2007-04-15T09:32:07Z</time></trkpt><trkpt lat="48.845157623291" lon="2.26510691642761"><ele>46.1151</ele><time>2007-04-15T09:32:08Z</time></trkpt><trkpt lat="48.845157623291" lon="2.26494550704956"><ele>46.3706</ele><time>2007-04-15T09:32:09Z</time></trkpt><trkpt lat="48.8451156616211" lon="2.26474571228027"><ele>46.9617</ele><time>2007-04-15T09:32:10Z</time></trkpt><trkpt lat="48.845100402832" lon="2.26460313796997"><ele>47.2812</ele><time>2007-04-15T09:32:11Z</time></trkpt><trkpt lat="48.8451118469238" lon="2.26444268226624"><ele>47.5807</ele><time>2007-04-15T09:32:12Z</time></trkpt><trkpt lat="48.8450736999512" lon="2.2642514705658"><ele>47.9417</ele><time>2007-04-15T09:32:13Z</time></trkpt><trkpt lat="48.8450508117676" lon="2.26415181159973"><ele>48.0097</ele><time>2007-04-15T09:32:14Z</time></trkpt><trkpt lat="48.8450775146484" lon="2.26391005516052"><ele>47.2265</ele><time>2007-04-15T09:32:15Z</time></trkpt><trkpt lat="48.845085144043" lon="2.26372814178467"><ele>46.631</ele><time>2007-04-15T09:32:16Z</time></trkpt><trkpt lat="48.8450622558594" lon="2.26349520683289"><ele>45.7778</ele><time>2007-04-15T09:32:17Z</time></trkpt><trkpt lat="48.8450813293457" lon="2.263338804245"><ele>45.3112</ele><time>2007-04-15T09:32:18Z</time></trkpt><trkpt lat="48.8451118469238" lon="2.26310110092163"><ele>45.4401</ele><time>2007-04-15T09:32:19Z</time></trkpt><trkpt lat="48.8451461791992" lon="2.26289176940918"><ele>45.6192</ele><time>2007-04-15T09:32:20Z</time></trkpt><trkpt lat="48.8451499938965" lon="2.26273250579834"><ele>45.6698</ele><time>2007-04-15T09:32:21Z</time></trkpt><trkpt lat="48.8451232910156" lon="2.26252388954163"><ele>45.5876</ele><time>2007-04-15T09:32:22Z</time></trkpt><trkpt lat="48.845142364502" lon="2.26233553886414"><ele>46.5353</ele><time>2007-04-15T09:32:23Z</time></trkpt><trkpt lat="48.8450889587402" lon="2.26219463348389"><ele>47.1027</ele><time>2007-04-15T09:32:24Z</time></trkpt><trkpt lat="48.845027923584" lon="2.26202988624573"><ele>47.8791</ele><time>2007-04-15T09:32:25Z</time></trkpt><trkpt lat="48.8450012207031" lon="2.26183342933655"><ele>49.0006</ele><time>2007-04-15T09:32:26Z</time></trkpt><trkpt lat="48.8450164794922" lon="2.26171517372131"><ele>49.7136</ele><time>2007-04-15T09:32:27Z</time></trkpt><trkpt lat="48.8450660705566" lon="2.26149654388428"><ele>49.8444</ele><time>2007-04-15T09:32:28Z</time></trkpt><trkpt lat="48.8451156616211" lon="2.26127767562866"><ele>49.7276</ele><time>2007-04-15T09:32:29Z</time></trkpt><trkpt lat="48.8451461791992" lon="2.26113700866699"><ele>49.6989</ele><time>2007-04-15T09:32:30Z</time></trkpt><trkpt lat="48.8451881408691" lon="2.26095843315124"><ele>49.7257</ele><time>2007-04-15T09:32:31Z</time></trkpt><trkpt lat="48.8452033996582" lon="2.26079392433166"><ele>49.6849</ele><time>2007-04-15T09:32:32Z</time></trkpt><trkpt lat="48.8451957702637" lon="2.26072263717651"><ele>49.5719</ele><time>2007-04-15T09:32:33Z</time></trkpt><trkpt lat="48.8451957702637" lon="2.26042604446411"><ele>49.216</ele><time>2007-04-15T09:32:34Z</time></trkpt><trkpt lat="48.8452033996582" lon="2.26027917861938"><ele>49.0673</ele><time>2007-04-15T09:32:35Z</time></trkpt><trkpt lat="48.8451995849609" lon="2.26006126403809"><ele>48.792</ele><time>2007-04-15T09:32:36Z</time></trkpt><trkpt lat="48.8451919555664" lon="2.25988411903381"><ele>48.552</ele><time>2007-04-15T09:32:37Z</time></trkpt><trkpt lat="48.8451728820801" lon="2.25968456268311"><ele>48.2439</ele><time>2007-04-15T09:32:38Z</time></trkpt><trkpt lat="48.8451309204102" lon="2.25949096679688"><ele>47.8605</ele><time>2007-04-15T09:32:39Z</time></trkpt><trkpt lat="48.8451309204102" lon="2.25924706459045"><ele>47.5678</ele><time>2007-04-15T09:32:40Z</time></trkpt><trkpt lat="48.8451766967773" lon="2.2590594291687"><ele>47.6284</ele><time>2007-04-15T09:32:41Z</time></trkpt><trkpt lat="48.8452339172363" lon="2.2588107585907"><ele>47.6698</ele><time>2007-04-15T09:32:42Z</time></trkpt><trkpt lat="48.8452796936035" lon="2.25866460800171"><ele>47.5983</ele><time>2007-04-15T09:32:43Z</time></trkpt><trkpt lat="48.8452682495117" lon="2.25846576690674"><ele>47.4531</ele><time>2007-04-15T09:32:44Z</time></trkpt><trkpt lat="48.8452529907227" lon="2.2582950592041"><ele>47.1492</ele><time>2007-04-15T09:32:45Z</time></trkpt><trkpt lat="48.8452529907227" lon="2.25814580917358"><ele>46.1994</ele><time>2007-04-15T09:32:46Z</time></trkpt><trkpt lat="48.8452568054199" lon="2.25792765617371"><ele>44.7996</ele><time>2007-04-15T09:32:47Z</time></trkpt><trkpt lat="48.8452911376953" lon="2.25776290893555"><ele>43.6396</ele><time>2007-04-15T09:32:48Z</time></trkpt><trkpt lat="48.8453216552734" lon="2.25758171081543"><ele>42.3702</ele><time>2007-04-15T09:32:49Z</time></trkpt><trkpt lat="48.8453407287598" lon="2.25738143920898"><ele>41.4629</ele><time>2007-04-15T09:32:50Z</time></trkpt><trkpt lat="48.845344543457" lon="2.25716662406921"><ele>40.8903</ele><time>2007-04-15T09:32:51Z</time></trkpt><trkpt lat="48.8453559875488" lon="2.25692963600159"><ele>40.2499</ele><time>2007-04-15T09:32:52Z</time></trkpt><trkpt lat="48.8453598022461" lon="2.25674915313721"><ele>39.7797</ele><time>2007-04-15T09:32:53Z</time></trkpt><trkpt lat="48.8453521728516" lon="2.25660467147827"><ele>39.4171</ele><time>2007-04-15T09:32:54Z</time></trkpt><trkpt lat="48.8453636169434" lon="2.25639843940735"><ele>38.8789</ele><time>2007-04-15T09:32:55Z</time></trkpt><trkpt lat="48.8453674316406" lon="2.25615334510803"><ele>38.2543</ele><time>2007-04-15T09:32:56Z</time></trkpt><trkpt lat="48.8453750610352" lon="2.25595450401306"><ele>37.7554</ele><time>2007-04-15T09:32:57Z</time></trkpt><trkpt lat="48.8453826904297" lon="2.25579714775085"><ele>37.3325</ele><time>2007-04-15T09:32:58Z</time></trkpt><trkpt lat="48.8453903198242" lon="2.25564026832581"><ele>36.788</ele><time>2007-04-15T09:32:59Z</time></trkpt><trkpt lat="48.845386505127" lon="2.25557374954224"><ele>36.5519</ele><time>2007-04-15T09:33:00Z</time></trkpt><trkpt lat="48.8453826904297" lon="2.25536775588989"><ele>35.8287</ele><time>2007-04-15T09:33:01Z</time></trkpt><trkpt lat="48.8453979492188" lon="2.25517821311951"><ele>35.1544</ele><time>2007-04-15T09:33:02Z</time></trkpt><trkpt lat="48.8454055786133" lon="2.25500798225403"><ele>34.5418</ele><time>2007-04-15T09:33:03Z</time></trkpt><trkpt lat="48.8454132080078" lon="2.25472235679626"><ele>34.3389</ele><time>2007-04-15T09:33:04Z</time></trkpt><trkpt lat="48.8454170227051" lon="2.25455164909363"><ele>34.2303</ele><time>2007-04-15T09:33:05Z</time></trkpt><trkpt lat="48.8454284667969" lon="2.25441074371338"><ele>34.1223</ele><time>2007-04-15T09:33:06Z</time></trkpt><trkpt lat="48.8454360961914" lon="2.25419688224792"><ele>33.9723</ele><time>2007-04-15T09:33:07Z</time></trkpt><trkpt lat="48.8454093933106" lon="2.25393986701965"><ele>34.2849</ele><time>2007-04-15T09:33:08Z</time></trkpt><trkpt lat="48.8454170227051" lon="2.25377225875854"><ele>34.4728</ele><time>2007-04-15T09:33:09Z</time></trkpt><trkpt lat="48.8454322814941" lon="2.25365114212036"><ele>34.6043</ele><time>2007-04-15T09:33:10Z</time></trkpt><trkpt lat="48.8454284667969" lon="2.25355076789856"><ele>34.7317</ele><time>2007-04-15T09:33:11Z</time></trkpt><trkpt lat="48.8454246520996" lon="2.25340914726257"><ele>34.9073</ele><time>2007-04-15T09:33:12Z</time></trkpt><trkpt lat="48.8454055786133" lon="2.2532172203064"><ele>35.4895</ele><time>2007-04-15T09:33:13Z</time></trkpt><trkpt lat="48.845386505127" lon="2.25302529335022"><ele>36.3071</ele><time>2007-04-15T09:33:14Z</time></trkpt><trkpt lat="48.8453826904297" lon="2.2529182434082"><ele>36.7637</ele><time>2007-04-15T09:33:15Z</time></trkpt><trkpt lat="48.8454513549805" lon="2.2527003288269"><ele>37.627</ele><time>2007-04-15T09:33:16Z</time></trkpt><trkpt lat="48.8454399108887" lon="2.25256252288818"><ele>38.2116</ele><time>2007-04-15T09:33:17Z</time></trkpt><trkpt lat="48.8454551696777" lon="2.25235676765442"><ele>38.4538</ele><time>2007-04-15T09:33:18Z</time></trkpt><trkpt lat="48.8454704284668" lon="2.25217127799988"><ele>38.4355</ele><time>2007-04-15T09:33:19Z</time></trkpt><trkpt lat="48.845458984375" lon="2.25199127197266"><ele>38.4492</ele><time>2007-04-15T09:33:20Z</time></trkpt><trkpt lat="48.8454513549805" lon="2.25182127952576"><ele>38.4584</ele><time>2007-04-15T09:33:21Z</time></trkpt><trkpt lat="48.845458984375" lon="2.25162768363953"><ele>38.4024</ele><time>2007-04-15T09:33:22Z</time></trkpt><trkpt lat="48.8454895019531" lon="2.25147175788879"><ele>38.1787</ele><time>2007-04-15T09:33:23Z</time></trkpt><trkpt lat="48.8455085754394" lon="2.25130915641785"><ele>37.9607</ele><time>2007-04-15T09:33:24Z</time></trkpt><trkpt lat="48.845516204834" lon="2.25113534927368"><ele>37.743</ele><time>2007-04-15T09:33:25Z</time></trkpt><trkpt lat="48.8455047607422" lon="2.25093746185303"><ele>37.5192</ele><time>2007-04-15T09:33:26Z</time></trkpt><trkpt lat="48.8455123901367" lon="2.250812292099"><ele>37.4104</ele><time>2007-04-15T09:33:27Z</time></trkpt><trkpt lat="48.845531463623" lon="2.25066590309143"><ele>37.5632</ele><time>2007-04-15T09:33:28Z</time></trkpt><trkpt lat="48.8455772399902" lon="2.25047636032104"><ele>37.7357</ele><time>2007-04-15T09:33:29Z</time></trkpt><trkpt lat="48.8456077575684" lon="2.25033187866211"><ele>37.8724</ele><time>2007-04-15T09:33:30Z</time></trkpt><trkpt lat="48.8456153869629" lon="2.2502715587616"><ele>37.9357</ele><time>2007-04-15T09:33:31Z</time></trkpt><trkpt lat="48.8456420898438" lon="2.25005340576172"><ele>38.1654</ele><time>2007-04-15T09:33:32Z</time></trkpt><trkpt lat="48.845703125" lon="2.24980878829956"><ele>38.3857</ele><time>2007-04-15T09:33:33Z</time></trkpt><trkpt lat="48.8457679748535" lon="2.24960875511169"><ele>38.5479</ele><time>2007-04-15T09:33:34Z</time></trkpt><trkpt lat="48.845817565918" lon="2.24952578544617"><ele>38.588</ele><time>2007-04-15T09:33:35Z</time></trkpt><trkpt lat="48.8458786010742" lon="2.24935007095337"><ele>38.6409</ele><time>2007-04-15T09:33:36Z</time></trkpt><trkpt lat="48.8459091186523" lon="2.24917674064636"><ele>38.7173</ele><time>2007-04-15T09:33:37Z</time></trkpt><trkpt lat="48.8459358215332" lon="2.24905228614807"><ele>39.0091</ele><time>2007-04-15T09:33:38Z</time></trkpt><trkpt lat="48.8459396362305" lon="2.24891209602356"><ele>39.4558</ele><time>2007-04-15T09:33:39Z</time></trkpt><trkpt lat="48.8459548950195" lon="2.24883270263672"><ele>39.6477</ele><time>2007-04-15T09:33:40Z</time></trkpt><trkpt lat="48.8459587097168" lon="2.24865818023682"><ele>40.1956</ele><time>2007-04-15T09:33:41Z</time></trkpt><trkpt lat="48.8460083007812" lon="2.24852705001831"><ele>40.3504</ele><time>2007-04-15T09:33:42Z</time></trkpt><trkpt lat="48.8460235595703" lon="2.24850940704346"><ele>40.3212</ele><time>2007-04-15T09:33:43Z</time></trkpt><trkpt lat="48.8460578918457" lon="2.24843668937683"><ele>40.3474</ele><time>2007-04-15T09:33:44Z</time></trkpt><trkpt lat="48.8460807800293" lon="2.24835419654846"><ele>40.4551</ele><time>2007-04-15T09:33:45Z</time></trkpt><trkpt lat="48.8461227416992" lon="2.24820590019226"><ele>40.3103</ele><time>2007-04-15T09:33:46Z</time></trkpt><trkpt lat="48.8461532592773" lon="2.24806427955627"><ele>40.1554</ele><time>2007-04-15T09:33:47Z</time></trkpt><trkpt lat="48.8461952209473" lon="2.24795317649841"><ele>39.8886</ele><time>2007-04-15T09:33:48Z</time></trkpt><trkpt lat="48.8462142944336" lon="2.24788284301758"><ele>39.7606</ele><time>2007-04-15T09:33:49Z</time></trkpt><trkpt lat="48.8462791442871" lon="2.24764347076416"><ele>39.2672</ele><time>2007-04-15T09:33:50Z</time></trkpt><trkpt lat="48.8463172912598" lon="2.24749970436096"><ele>38.935</ele><time>2007-04-15T09:33:51Z</time></trkpt><trkpt lat="48.8463439941406" lon="2.2473304271698"><ele>38.8351</ele><time>2007-04-15T09:33:52Z</time></trkpt><trkpt lat="48.8463668823242" lon="2.24719047546387"><ele>38.756</ele><time>2007-04-15T09:33:53Z</time></trkpt><trkpt lat="48.8463745117188" lon="2.2470600605011"><ele>38.7969</ele><time>2007-04-15T09:33:54Z</time></trkpt><trkpt lat="48.8463935852051" lon="2.24696040153503"><ele>38.7292</ele><time>2007-04-15T09:33:55Z</time></trkpt><trkpt lat="48.846435546875" lon="2.24678993225098"><ele>38.5572</ele><time>2007-04-15T09:33:56Z</time></trkpt><trkpt lat="48.8464698791504" lon="2.24668860435486"><ele>38.3968</ele><time>2007-04-15T09:33:57Z</time></trkpt><trkpt lat="48.8465270996094" lon="2.24652862548828"><ele>38.115</ele><time>2007-04-15T09:33:58Z</time></trkpt><trkpt lat="48.8465766906738" lon="2.24634718894958"><ele>37.9484</ele><time>2007-04-15T09:33:59Z</time></trkpt><trkpt lat="48.846622467041" lon="2.24619603157043"><ele>37.8231</ele><time>2007-04-15T09:34:00Z</time></trkpt><trkpt lat="48.8466682434082" lon="2.24602961540222"><ele>37.7626</ele><time>2007-04-15T09:34:01Z</time></trkpt><trkpt lat="48.8467407226562" lon="2.24579691886902"><ele>37.9509</ele><time>2007-04-15T09:34:02Z</time></trkpt><trkpt lat="48.8468017578125" lon="2.245600938797"><ele>38.0716</ele><time>2007-04-15T09:34:03Z</time></trkpt><trkpt lat="48.8468551635742" lon="2.24540281295776"><ele>38.1736</ele><time>2007-04-15T09:34:04Z</time></trkpt><trkpt lat="48.8469009399414" lon="2.24522972106934"><ele>38.2396</ele><time>2007-04-15T09:34:05Z</time></trkpt><trkpt lat="48.8469581604004" lon="2.24502921104431"><ele>38.2776</ele><time>2007-04-15T09:34:06Z</time></trkpt><trkpt lat="48.8469924926758" lon="2.2448787689209"><ele>38.0725</ele><time>2007-04-15T09:34:07Z</time></trkpt><trkpt lat="48.8470458984375" lon="2.24464988708496"><ele>37.6697</ele><time>2007-04-15T09:34:08Z</time></trkpt><trkpt lat="48.8470726013184" lon="2.24443769454956"><ele>37.351</ele><time>2007-04-15T09:34:09Z</time></trkpt><trkpt lat="48.847110748291" lon="2.24426603317261"><ele>37.0534</ele><time>2007-04-15T09:34:10Z</time></trkpt><trkpt lat="48.84716796875" lon="2.24410915374756"><ele>36.9349</ele><time>2007-04-15T09:34:11Z</time></trkpt><trkpt lat="48.8471908569336" lon="2.24398136138916"><ele>37.1867</ele><time>2007-04-15T09:34:12Z</time></trkpt><trkpt lat="48.8472290039062" lon="2.24385976791382"><ele>37.3869</ele><time>2007-04-15T09:34:13Z</time></trkpt><trkpt lat="48.8472633361816" lon="2.2437424659729"><ele>37.5861</ele><time>2007-04-15T09:34:14Z</time></trkpt><trkpt lat="48.8473320007324" lon="2.24357342720032"><ele>37.827</ele><time>2007-04-15T09:34:15Z</time></trkpt><trkpt lat="48.8473625183106" lon="2.24344110488892"><ele>38.0713</ele><time>2007-04-15T09:34:16Z</time></trkpt><trkpt lat="48.8474044799805" lon="2.24326777458191"><ele>38.3079</ele><time>2007-04-15T09:34:17Z</time></trkpt><trkpt lat="48.8474388122559" lon="2.24313712120056"><ele>38.3823</ele><time>2007-04-15T09:34:18Z</time></trkpt><trkpt lat="48.8474769592285" lon="2.2429940700531"><ele>38.4624</ele><time>2007-04-15T09:34:19Z</time></trkpt><trkpt lat="48.8475303649902" lon="2.24276232719421"><ele>38.6717</ele><time>2007-04-15T09:34:20Z</time></trkpt><trkpt lat="48.8475532531738" lon="2.24270248413086"><ele>38.7242</ele><time>2007-04-15T09:34:21Z</time></trkpt><trkpt lat="48.8475952148438" lon="2.24261689186096"><ele>38.7775</ele><time>2007-04-15T09:34:22Z</time></trkpt><trkpt lat="48.8476676940918" lon="2.2424795627594"><ele>38.7693</ele><time>2007-04-15T09:34:23Z</time></trkpt><trkpt lat="48.8477592468262" lon="2.24237775802612"><ele>38.4966</ele><time>2007-04-15T09:34:24Z</time></trkpt><trkpt lat="48.8478202819824" lon="2.24236965179443"><ele>38.3991</ele><time>2007-04-15T09:34:25Z</time></trkpt><trkpt lat="48.8479537963867" lon="2.24257326126099"><ele>38.4633</ele><time>2007-04-15T09:34:26Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.24273443222046"><ele>38.4525</ele><time>2007-04-15T09:34:27Z</time></trkpt><trkpt lat="48.8480415344238" lon="2.24293732643127"><ele>38.5074</ele><time>2007-04-15T09:34:28Z</time></trkpt><trkpt lat="48.8480453491211" lon="2.24310779571533"><ele>38.5708</ele><time>2007-04-15T09:34:29Z</time></trkpt><trkpt lat="48.8480491638184" lon="2.24329829216003"><ele>38.6456</ele><time>2007-04-15T09:34:30Z</time></trkpt><trkpt lat="48.8480377197266" lon="2.2435257434845"><ele>38.1835</ele><time>2007-04-15T09:34:31Z</time></trkpt><trkpt lat="48.848030090332" lon="2.24367141723633"><ele>37.8247</ele><time>2007-04-15T09:34:32Z</time></trkpt><trkpt lat="48.848030090332" lon="2.24381899833679"><ele>37.4705</ele><time>2007-04-15T09:34:33Z</time></trkpt><trkpt lat="48.8480339050293" lon="2.24391794204712"><ele>37.2376</ele><time>2007-04-15T09:34:34Z</time></trkpt><trkpt lat="48.8480491638184" lon="2.24403429031372"><ele>36.9767</ele><time>2007-04-15T09:34:35Z</time></trkpt><trkpt lat="48.8480529785156" lon="2.2441713809967"><ele>36.6617</ele><time>2007-04-15T09:34:36Z</time></trkpt><trkpt lat="48.8480453491211" lon="2.24436473846436"><ele>36.581</ele><time>2007-04-15T09:34:37Z</time></trkpt><trkpt lat="48.8480453491211" lon="2.24447751045227"><ele>36.5392</ele><time>2007-04-15T09:34:38Z</time></trkpt><trkpt lat="48.8480339050293" lon="2.24466967582703"><ele>36.4708</ele><time>2007-04-15T09:34:39Z</time></trkpt><trkpt lat="48.8480339050293" lon="2.24483489990234"><ele>36.4151</ele><time>2007-04-15T09:34:40Z</time></trkpt><trkpt lat="48.8480262756348" lon="2.24497675895691"><ele>36.3758</ele><time>2007-04-15T09:34:41Z</time></trkpt><trkpt lat="48.8480262756348" lon="2.24510598182678"><ele>36.3685</ele><time>2007-04-15T09:34:42Z</time></trkpt><trkpt lat="48.8480262756348" lon="2.24521398544312"><ele>36.3685</ele><time>2007-04-15T09:34:43Z</time></trkpt><trkpt lat="48.8480262756348" lon="2.24540567398071"><ele>36.3685</ele><time>2007-04-15T09:34:44Z</time></trkpt><trkpt lat="48.848030090332" lon="2.24550724029541"><ele>36.3639</ele><time>2007-04-15T09:34:45Z</time></trkpt><trkpt lat="48.8480262756348" lon="2.24557137489319"><ele>36.3685</ele><time>2007-04-15T09:34:46Z</time></trkpt><trkpt lat="48.848030090332" lon="2.24568128585815"><ele>36.3639</ele><time>2007-04-15T09:34:47Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.24570465087891"><ele>36.3914</ele><time>2007-04-15T09:34:48Z</time></trkpt><trkpt lat="48.8480033874512" lon="2.24570941925049"><ele>36.3959</ele><time>2007-04-15T09:34:49Z</time></trkpt><trkpt lat="48.8480033874512" lon="2.24571776390076"><ele>36.3959</ele><time>2007-04-15T09:34:50Z</time></trkpt><trkpt lat="48.848030090332" lon="2.24633193016052"><ele>36.9074</ele><time>2007-04-15T09:34:51Z</time></trkpt><trkpt lat="48.8480606079102" lon="2.24649810791016"><ele>37.1395</ele><time>2007-04-15T09:34:52Z</time></trkpt><trkpt lat="48.8480796813965" lon="2.24664378166199"><ele>37.3614</ele><time>2007-04-15T09:34:53Z</time></trkpt><trkpt lat="48.848087310791" lon="2.24677038192749"><ele>37.585</ele><time>2007-04-15T09:34:54Z</time></trkpt><trkpt lat="48.848087310791" lon="2.24692702293396"><ele>37.8499</ele><time>2007-04-15T09:34:55Z</time></trkpt><trkpt lat="48.8481063842773" lon="2.24702286720276"><ele>38.0774</ele><time>2007-04-15T09:34:56Z</time></trkpt><trkpt lat="48.8481063842773" lon="2.24713754653931"><ele>38.2777</ele><time>2007-04-15T09:34:57Z</time></trkpt><trkpt lat="48.8481025695801" lon="2.24733114242554"><ele>38.5993</ele><time>2007-04-15T09:34:58Z</time></trkpt><trkpt lat="48.848087310791" lon="2.24752926826477"><ele>38.875</ele><time>2007-04-15T09:34:59Z</time></trkpt><trkpt lat="48.848087310791" lon="2.24756360054016"><ele>38.9405</ele><time>2007-04-15T09:35:00Z</time></trkpt><trkpt lat="48.848087310791" lon="2.24771618843079"><ele>39.2317</ele><time>2007-04-15T09:35:01Z</time></trkpt><trkpt lat="48.8480911254883" lon="2.24786472320557"><ele>39.5295</ele><time>2007-04-15T09:35:02Z</time></trkpt><trkpt lat="48.8480911254883" lon="2.24788331985474"><ele>39.5648</ele><time>2007-04-15T09:35:03Z</time></trkpt><trkpt lat="48.8480758666992" lon="2.24809145927429"><ele>39.9125</ele><time>2007-04-15T09:35:04Z</time></trkpt><trkpt lat="48.8480758666992" lon="2.24821877479553"><ele>40.1597</ele><time>2007-04-15T09:35:05Z</time></trkpt><trkpt lat="48.8480796813965" lon="2.24841737747192"><ele>40.3605</ele><time>2007-04-15T09:35:06Z</time></trkpt><trkpt lat="48.8480834960938" lon="2.24863696098328"><ele>40.2912</ele><time>2007-04-15T09:35:07Z</time></trkpt><trkpt lat="48.848087310791" lon="2.24887228012085"><ele>40.2186</ele><time>2007-04-15T09:35:08Z</time></trkpt><trkpt lat="48.848072052002" lon="2.24909400939941"><ele>40.0867</ele><time>2007-04-15T09:35:09Z</time></trkpt><trkpt lat="48.8480644226074" lon="2.24927306175232"><ele>40.1184</ele><time>2007-04-15T09:35:10Z</time></trkpt><trkpt lat="48.8480682373047" lon="2.24944138526916"><ele>40.2704</ele><time>2007-04-15T09:35:11Z</time></trkpt><trkpt lat="48.8480644226074" lon="2.24964833259583"><ele>40.4234</ele><time>2007-04-15T09:35:12Z</time></trkpt><trkpt lat="48.8480682373047" lon="2.24984812736511"><ele>40.6033</ele><time>2007-04-15T09:35:13Z</time></trkpt><trkpt lat="48.848072052002" lon="2.25001978874207"><ele>40.7444</ele><time>2007-04-15T09:35:14Z</time></trkpt><trkpt lat="48.8480606079102" lon="2.25025200843811"><ele>40.6854</ele><time>2007-04-15T09:35:15Z</time></trkpt><trkpt lat="48.8480453491211" lon="2.25046372413635"><ele>40.6381</ele><time>2007-04-15T09:35:16Z</time></trkpt><trkpt lat="48.8480415344238" lon="2.25063610076904"><ele>40.6379</ele><time>2007-04-15T09:35:17Z</time></trkpt><trkpt lat="48.8480491638184" lon="2.25084924697876"><ele>40.7033</ele><time>2007-04-15T09:35:18Z</time></trkpt><trkpt lat="48.8480491638184" lon="2.25102925300598"><ele>41.204</ele><time>2007-04-15T09:35:19Z</time></trkpt><trkpt lat="48.848030090332" lon="2.25123357772827"><ele>41.7274</ele><time>2007-04-15T09:35:20Z</time></trkpt><trkpt lat="48.8480377197266" lon="2.25144863128662"><ele>42.3365</ele><time>2007-04-15T09:35:21Z</time></trkpt><trkpt lat="48.848030090332" lon="2.25170564651489"><ele>42.9083</ele><time>2007-04-15T09:35:22Z</time></trkpt><trkpt lat="48.8480224609375" lon="2.25187683105469"><ele>42.8809</ele><time>2007-04-15T09:35:23Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.25205636024475"><ele>42.8259</ele><time>2007-04-15T09:35:24Z</time></trkpt><trkpt lat="48.8479995727539" lon="2.25230026245117"><ele>42.7985</ele><time>2007-04-15T09:35:25Z</time></trkpt><trkpt lat="48.8479919433594" lon="2.25257039070129"><ele>42.6407</ele><time>2007-04-15T09:35:26Z</time></trkpt><trkpt lat="48.8479881286621" lon="2.25276660919189"><ele>42.2727</ele><time>2007-04-15T09:35:27Z</time></trkpt><trkpt lat="48.8479995727539" lon="2.25297141075134"><ele>41.8951</ele><time>2007-04-15T09:35:28Z</time></trkpt><trkpt lat="48.8480033874512" lon="2.25313425064087"><ele>41.5759</ele><time>2007-04-15T09:35:29Z</time></trkpt><trkpt lat="48.8479919433594" lon="2.25336217880249"><ele>41.317</ele><time>2007-04-15T09:35:30Z</time></trkpt><trkpt lat="48.8479919433594" lon="2.25355386734009"><ele>41.9017</ele><time>2007-04-15T09:35:31Z</time></trkpt><trkpt lat="48.8479843139648" lon="2.25378608703613"><ele>42.6077</ele><time>2007-04-15T09:35:32Z</time></trkpt><trkpt lat="48.8479843139648" lon="2.25395107269287"><ele>43.1001</ele><time>2007-04-15T09:35:33Z</time></trkpt><trkpt lat="48.8479804992676" lon="2.25414872169495"><ele>43.6768</ele><time>2007-04-15T09:35:34Z</time></trkpt><trkpt lat="48.8479881286621" lon="2.25434827804565"><ele>44.1402</ele><time>2007-04-15T09:35:35Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.2545759677887"><ele>44.7228</ele><time>2007-04-15T09:35:36Z</time></trkpt><trkpt lat="48.8480110168457" lon="2.25481271743774"><ele>45.2659</ele><time>2007-04-15T09:35:37Z</time></trkpt><trkpt lat="48.8480110168457" lon="2.25498008728027"><ele>45.6354</ele><time>2007-04-15T09:35:38Z</time></trkpt><trkpt lat="48.8480110168457" lon="2.25521802902222"><ele>45.5608</ele><time>2007-04-15T09:35:39Z</time></trkpt><trkpt lat="48.8480033874512" lon="2.25543212890625"><ele>45.4085</ele><time>2007-04-15T09:35:40Z</time></trkpt><trkpt lat="48.8480033874512" lon="2.25562715530396"><ele>45.3111</ele><time>2007-04-15T09:35:41Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.2558581829071"><ele>45.3028</ele><time>2007-04-15T09:35:42Z</time></trkpt><trkpt lat="48.8480033874512" lon="2.25589323043823"><ele>45.4117</ele><time>2007-04-15T09:35:43Z</time></trkpt><trkpt lat="48.8480072021484" lon="2.25608801841736"><ele>46.0942</ele><time>2007-04-15T09:35:44Z</time></trkpt><trkpt lat="48.848014831543" lon="2.25628709793091"><ele>46.8378</ele><time>2007-04-15T09:35:45Z</time></trkpt><trkpt lat="48.8480186462402" lon="2.25652933120728"><ele>47.7328</ele><time>2007-04-15T09:35:46Z</time></trkpt><trkpt lat="48.8479995727539" lon="2.25677275657654"><ele>47.5113</ele><time>2007-04-15T09:35:47Z</time></trkpt><trkpt lat="48.8480110168457" lon="2.25697064399719"><ele>46.7316</ele><time>2007-04-15T09:35:48Z</time></trkpt><trkpt lat="48.8480262756348" lon="2.25718951225281"><ele>45.8718</ele><time>2007-04-15T09:35:49Z</time></trkpt><trkpt lat="48.848072052002" lon="2.25736045837402"><ele>45.485</ele><time>2007-04-15T09:35:50Z</time></trkpt><trkpt lat="48.8481178283691" lon="2.25757527351379"><ele>45.3034</ele><time>2007-04-15T09:35:51Z</time></trkpt><trkpt lat="48.8481788635254" lon="2.25777173042297"><ele>46.089</ele><time>2007-04-15T09:35:52Z</time></trkpt><trkpt lat="48.8482284545898" lon="2.25792956352234"><ele>46.6994</ele><time>2007-04-15T09:35:53Z</time></trkpt><trkpt lat="48.8482933044434" lon="2.2579939365387"><ele>47.285</ele><time>2007-04-15T09:35:54Z</time></trkpt><trkpt lat="48.8484001159668" lon="2.25799918174744"><ele>47.7589</ele><time>2007-04-15T09:35:55Z</time></trkpt><trkpt lat="48.8485412597656" lon="2.25788855552673"><ele>47.7985</ele><time>2007-04-15T09:35:56Z</time></trkpt><trkpt lat="48.8486328125" lon="2.25779414176941"><ele>47.6278</ele><time>2007-04-15T09:35:57Z</time></trkpt><trkpt lat="48.8487243652344" lon="2.25772905349731"><ele>47.4505</ele><time>2007-04-15T09:35:58Z</time></trkpt><trkpt lat="48.8487396240234" lon="2.25772547721863"><ele>47.4426</ele><time>2007-04-15T09:35:59Z</time></trkpt><trkpt lat="48.8488311767578" lon="2.25773763656616"><ele>47.5396</ele><time>2007-04-15T09:36:00Z</time></trkpt><trkpt lat="48.8489379882812" lon="2.25773477554321"><ele>47.5782</ele><time>2007-04-15T09:36:01Z</time></trkpt><trkpt lat="48.8490333557129" lon="2.25772714614868"><ele>47.5774</ele><time>2007-04-15T09:36:02Z</time></trkpt><trkpt lat="48.8491554260254" lon="2.25773882865906"><ele>47.7137</ele><time>2007-04-15T09:36:03Z</time></trkpt><trkpt lat="48.8492622375488" lon="2.25776720046997"><ele>48.5016</ele><time>2007-04-15T09:36:04Z</time></trkpt><trkpt lat="48.8493576049805" lon="2.25783491134644"><ele>49.5099</ele><time>2007-04-15T09:36:05Z</time></trkpt><trkpt lat="48.8494491577148" lon="2.25787711143494"><ele>50.2889</ele><time>2007-04-15T09:36:06Z</time></trkpt><trkpt lat="48.8495254516602" lon="2.25790333747864"><ele>50.8621</ele><time>2007-04-15T09:36:07Z</time></trkpt><trkpt lat="48.8496475219727" lon="2.25797891616821"><ele>51.9155</ele><time>2007-04-15T09:36:08Z</time></trkpt><trkpt lat="48.8497314453125" lon="2.25802683830261"><ele>52.5742</ele><time>2007-04-15T09:36:09Z</time></trkpt><trkpt lat="48.8498191833496" lon="2.25808262825012"><ele>53.2507</ele><time>2007-04-15T09:36:10Z</time></trkpt><trkpt lat="48.8499069213867" lon="2.25811648368835"><ele>53.7971</ele><time>2007-04-15T09:36:11Z</time></trkpt><trkpt lat="48.8500022888184" lon="2.25817131996155"><ele>54.4206</ele><time>2007-04-15T09:36:12Z</time></trkpt><trkpt lat="48.8500595092773" lon="2.25821018218994"><ele>54.6492</ele><time>2007-04-15T09:36:13Z</time></trkpt><trkpt lat="48.850154876709" lon="2.25826287269592"><ele>54.9636</ele><time>2007-04-15T09:36:14Z</time></trkpt><trkpt lat="48.8502502441406" lon="2.25831365585327"><ele>55.2436</ele><time>2007-04-15T09:36:15Z</time></trkpt><trkpt lat="48.850341796875" lon="2.25838279724121"><ele>55.4695</ele><time>2007-04-15T09:36:16Z</time></trkpt><trkpt lat="48.8504333496094" lon="2.25845646858215"><ele>55.6678</ele><time>2007-04-15T09:36:17Z</time></trkpt><trkpt lat="48.8505516052246" lon="2.25852966308594"><ele>55.8975</ele><time>2007-04-15T09:36:18Z</time></trkpt><trkpt lat="48.8506927490234" lon="2.25863409042358"><ele>56.1922</ele><time>2007-04-15T09:36:19Z</time></trkpt><trkpt lat="48.850772857666" lon="2.25869846343994"><ele>56.3656</ele><time>2007-04-15T09:36:20Z</time></trkpt><trkpt lat="48.8508529663086" lon="2.25875997543335"><ele>56.4539</ele><time>2007-04-15T09:36:21Z</time></trkpt><trkpt lat="48.850959777832" lon="2.25881814956665"><ele>56.2397</ele><time>2007-04-15T09:36:22Z</time></trkpt><trkpt lat="48.8510551452637" lon="2.25885915756226"><ele>56.0702</ele><time>2007-04-15T09:36:23Z</time></trkpt><trkpt lat="48.8511390686035" lon="2.25890493392944"><ele>55.9733</ele><time>2007-04-15T09:36:24Z</time></trkpt><trkpt lat="48.8512229919434" lon="2.25895071029663"><ele>55.9097</ele><time>2007-04-15T09:36:25Z</time></trkpt><trkpt lat="48.8512992858887" lon="2.2590160369873"><ele>55.9569</ele><time>2007-04-15T09:36:26Z</time></trkpt><trkpt lat="48.8513145446777" lon="2.25902342796326"><ele>55.9529</ele><time>2007-04-15T09:36:27Z</time></trkpt><trkpt lat="48.8513870239258" lon="2.25907373428345"><ele>56.0018</ele><time>2007-04-15T09:36:28Z</time></trkpt><trkpt lat="48.8514022827148" lon="2.25908350944519"><ele>56.0131</ele><time>2007-04-15T09:36:29Z</time></trkpt><trkpt lat="48.8515548706055" lon="2.25919032096863"><ele>56.2477</ele><time>2007-04-15T09:36:30Z</time></trkpt><trkpt lat="48.8517036437988" lon="2.25929188728333"><ele>56.3482</ele><time>2007-04-15T09:36:31Z</time></trkpt><trkpt lat="48.851863861084" lon="2.25939893722534"><ele>55.827</ele><time>2007-04-15T09:36:32Z</time></trkpt><trkpt lat="48.8519897460938" lon="2.25944399833679"><ele>55.2631</ele><time>2007-04-15T09:36:33Z</time></trkpt><trkpt lat="48.8520889282227" lon="2.25950980186462"><ele>55.0241</ele><time>2007-04-15T09:36:34Z</time></trkpt><trkpt lat="48.8521766662598" lon="2.25959491729736"><ele>55.0126</ele><time>2007-04-15T09:36:35Z</time></trkpt><trkpt lat="48.8522796630859" lon="2.25967717170715"><ele>54.9381</ele><time>2007-04-15T09:36:36Z</time></trkpt><trkpt lat="48.8524322509766" lon="2.25974655151367"><ele>54.5498</ele><time>2007-04-15T09:36:37Z</time></trkpt><trkpt lat="48.8525238037109" lon="2.25980234146118"><ele>54.619</ele><time>2007-04-15T09:36:38Z</time></trkpt><trkpt lat="48.8526191711426" lon="2.25984477996826"><ele>55.0787</ele><time>2007-04-15T09:36:39Z</time></trkpt><trkpt lat="48.8527336120606" lon="2.25992918014526"><ele>55.8181</ele><time>2007-04-15T09:36:40Z</time></trkpt><trkpt lat="48.852840423584" lon="2.26001286506653"><ele>56.4296</ele><time>2007-04-15T09:36:41Z</time></trkpt><trkpt lat="48.8529167175293" lon="2.26005411148071"><ele>56.565</ele><time>2007-04-15T09:36:42Z</time></trkpt><trkpt lat="48.8530311584473" lon="2.26013398170471"><ele>56.7098</ele><time>2007-04-15T09:36:43Z</time></trkpt><trkpt lat="48.8531723022461" lon="2.26020526885986"><ele>56.7508</ele><time>2007-04-15T09:36:44Z</time></trkpt><trkpt lat="48.8532791137695" lon="2.26027154922485"><ele>56.6939</ele><time>2007-04-15T09:36:45Z</time></trkpt><trkpt lat="48.8533706665039" lon="2.26031875610352"><ele>56.4001</ele><time>2007-04-15T09:36:46Z</time></trkpt><trkpt lat="48.8535118103027" lon="2.26042008399963"><ele>55.5348</ele><time>2007-04-15T09:36:47Z</time></trkpt><trkpt lat="48.8535461425781" lon="2.26044273376465"><ele>55.3435</ele><time>2007-04-15T09:36:48Z</time></trkpt><trkpt lat="48.8536376953125" lon="2.26051092147827"><ele>54.8673</ele><time>2007-04-15T09:36:49Z</time></trkpt><trkpt lat="48.8537445068359" lon="2.26058912277222"><ele>54.379</ele><time>2007-04-15T09:36:50Z</time></trkpt><trkpt lat="48.853874206543" lon="2.26068615913391"><ele>53.8856</ele><time>2007-04-15T09:36:51Z</time></trkpt><trkpt lat="48.8539886474609" lon="2.26076102256775"><ele>53.5229</ele><time>2007-04-15T09:36:52Z</time></trkpt><trkpt lat="48.8541221618652" lon="2.26082563400269"><ele>53.1432</ele><time>2007-04-15T09:36:53Z</time></trkpt><trkpt lat="48.8542213439941" lon="2.26089358329773"><ele>53.2083</ele><time>2007-04-15T09:36:54Z</time></trkpt><trkpt lat="48.8543395996094" lon="2.26097273826599"><ele>53.617</ele><time>2007-04-15T09:36:55Z</time></trkpt><trkpt lat="48.8544273376465" lon="2.26103258132935"><ele>53.9395</ele><time>2007-04-15T09:36:56Z</time></trkpt><trkpt lat="48.8545379638672" lon="2.26109933853149"><ele>54.3525</ele><time>2007-04-15T09:36:57Z</time></trkpt><trkpt lat="48.8545761108398" lon="2.26112723350525"><ele>54.5086</ele><time>2007-04-15T09:36:58Z</time></trkpt><trkpt lat="48.854606628418" lon="2.26118421554565"><ele>54.6993</ele><time>2007-04-15T09:36:59Z</time></trkpt><trkpt lat="48.8547477722168" lon="2.26128220558166"><ele>55.3089</ele><time>2007-04-15T09:37:00Z</time></trkpt><trkpt lat="48.854850769043" lon="2.26132798194885"><ele>55.7227</ele><time>2007-04-15T09:37:01Z</time></trkpt><trkpt lat="48.8549728393555" lon="2.2613959312439"><ele>56.263</ele><time>2007-04-15T09:37:02Z</time></trkpt><trkpt lat="48.855110168457" lon="2.26147294044495"><ele>56.3014</ele><time>2007-04-15T09:37:03Z</time></trkpt><trkpt lat="48.855224609375" lon="2.26156377792358"><ele>56.2473</ele><time>2007-04-15T09:37:04Z</time></trkpt><trkpt lat="48.8552360534668" lon="2.26156663894653"><ele>56.2274</ele><time>2007-04-15T09:37:05Z</time></trkpt><trkpt lat="48.8553047180176" lon="2.2616069316864"><ele>56.1515</ele><time>2007-04-15T09:37:06Z</time></trkpt><trkpt lat="48.8553314208984" lon="2.26162147521973"><ele>56.1177</ele><time>2007-04-15T09:37:07Z</time></trkpt><trkpt lat="48.85546875" lon="2.26169872283936"><ele>55.8678</ele><time>2007-04-15T09:37:08Z</time></trkpt><trkpt lat="48.8555717468262" lon="2.2617654800415"><ele>55.6789</ele><time>2007-04-15T09:37:09Z</time></trkpt><trkpt lat="48.8556900024414" lon="2.26180243492126"><ele>55.5297</ele><time>2007-04-15T09:37:10Z</time></trkpt><trkpt lat="48.8557777404785" lon="2.26184892654419"><ele>55.4979</ele><time>2007-04-15T09:37:11Z</time></trkpt><trkpt lat="48.8558959960938" lon="2.26191401481628"><ele>55.2623</ele><time>2007-04-15T09:37:12Z</time></trkpt><trkpt lat="48.8559188842773" lon="2.26192474365234"><ele>55.1697</ele><time>2007-04-15T09:37:13Z</time></trkpt><trkpt lat="48.8560028076172" lon="2.26197552680969"><ele>54.8752</ele><time>2007-04-15T09:37:14Z</time></trkpt><trkpt lat="48.8561401367188" lon="2.26207637786865"><ele>54.5045</ele><time>2007-04-15T09:37:15Z</time></trkpt><trkpt lat="48.8562126159668" lon="2.26212096214294"><ele>54.3109</ele><time>2007-04-15T09:37:16Z</time></trkpt><trkpt lat="48.8562850952148" lon="2.26219320297241"><ele>54.2382</ele><time>2007-04-15T09:37:17Z</time></trkpt><trkpt lat="48.856388092041" lon="2.2622492313385"><ele>54.0004</ele><time>2007-04-15T09:37:18Z</time></trkpt><trkpt lat="48.8564758300781" lon="2.26230478286743"><ele>53.8573</ele><time>2007-04-15T09:37:19Z</time></trkpt><trkpt lat="48.8565673828125" lon="2.26236438751221"><ele>53.7453</ele><time>2007-04-15T09:37:20Z</time></trkpt><trkpt lat="48.8566589355469" lon="2.26240682601929"><ele>53.5827</ele><time>2007-04-15T09:37:21Z</time></trkpt><trkpt lat="48.8567504882812" lon="2.26245069503784"><ele>53.8937</ele><time>2007-04-15T09:37:22Z</time></trkpt><trkpt lat="48.8568725585938" lon="2.26252341270447"><ele>54.2613</ele><time>2007-04-15T09:37:23Z</time></trkpt><trkpt lat="48.8569030761719" lon="2.2625253200531"><ele>54.2968</ele><time>2007-04-15T09:37:24Z</time></trkpt><trkpt lat="48.8570098876953" lon="2.26255655288696"><ele>54.4238</ele><time>2007-04-15T09:37:25Z</time></trkpt><trkpt lat="48.8571891784668" lon="2.26260161399841"><ele>54.596</ele><time>2007-04-15T09:37:26Z</time></trkpt><trkpt lat="48.8573150634766" lon="2.26264715194702"><ele>54.6799</ele><time>2007-04-15T09:37:27Z</time></trkpt><trkpt lat="48.8574180603027" lon="2.26269102096558"><ele>54.7175</ele><time>2007-04-15T09:37:28Z</time></trkpt><trkpt lat="48.8575019836426" lon="2.26270866394043"><ele>54.7383</ele><time>2007-04-15T09:37:29Z</time></trkpt><trkpt lat="48.857593536377" lon="2.26275873184204"><ele>54.1903</ele><time>2007-04-15T09:37:30Z</time></trkpt><trkpt lat="48.8576927185059" lon="2.26279926300049"><ele>53.6686</ele><time>2007-04-15T09:37:31Z</time></trkpt><trkpt lat="48.8577880859375" lon="2.26282548904419"><ele>53.2103</ele><time>2007-04-15T09:37:32Z</time></trkpt><trkpt lat="48.8578872680664" lon="2.26275777816772"><ele>52.6211</ele><time>2007-04-15T09:37:33Z</time></trkpt><trkpt lat="48.8579254150391" lon="2.26262998580933"><ele>52.1792</ele><time>2007-04-15T09:37:34Z</time></trkpt><trkpt lat="48.8579292297363" lon="2.26259803771973"><ele>52.0949</ele><time>2007-04-15T09:37:35Z</time></trkpt><trkpt lat="48.8579292297363" lon="2.26257848739624"><ele>52.0579</ele><time>2007-04-15T09:37:36Z</time></trkpt><trkpt lat="48.8579330444336" lon="2.26256942749023"><ele>52.0152</ele><time>2007-04-15T09:37:37Z</time></trkpt><trkpt lat="48.857967376709" lon="2.26250600814819"><ele>51.6479</ele><time>2007-04-15T09:37:38Z</time></trkpt><trkpt lat="48.8580131530762" lon="2.2623610496521"><ele>51.3694</ele><time>2007-04-15T09:37:39Z</time></trkpt><trkpt lat="48.8580627441406" lon="2.26219534873962"><ele>51.0669</ele><time>2007-04-15T09:37:40Z</time></trkpt><trkpt lat="48.8581085205078" lon="2.2620165348053"><ele>50.7752</ele><time>2007-04-15T09:37:41Z</time></trkpt><trkpt lat="48.858154296875" lon="2.26184225082397"><ele>50.4586</ele><time>2007-04-15T09:37:42Z</time></trkpt><trkpt lat="48.8582077026367" lon="2.26167154312134"><ele>50.0544</ele><time>2007-04-15T09:37:43Z</time></trkpt><trkpt lat="48.8582496643066" lon="2.26143288612366"><ele>50.0949</ele><time>2007-04-15T09:37:44Z</time></trkpt><trkpt lat="48.8582801818848" lon="2.26129293441772"><ele>50.1718</ele><time>2007-04-15T09:37:45Z</time></trkpt><trkpt lat="48.8583068847656" lon="2.26119160652161"><ele>50.2538</ele><time>2007-04-15T09:37:46Z</time></trkpt><trkpt lat="48.8583221435547" lon="2.26099824905396"><ele>50.6336</ele><time>2007-04-15T09:37:47Z</time></trkpt><trkpt lat="48.858341217041" lon="2.26078581809998"><ele>51.0927</ele><time>2007-04-15T09:37:48Z</time></trkpt><trkpt lat="48.8583602905273" lon="2.26055312156677"><ele>51.4221</ele><time>2007-04-15T09:37:49Z</time></trkpt><trkpt lat="48.8583831787109" lon="2.26037406921387"><ele>51.6585</ele><time>2007-04-15T09:37:50Z</time></trkpt><trkpt lat="48.8583908081055" lon="2.26017212867737"><ele>51.8504</ele><time>2007-04-15T09:37:51Z</time></trkpt><trkpt lat="48.8583908081055" lon="2.26014447212219"><ele>51.8745</ele><time>2007-04-15T09:37:52Z</time></trkpt><trkpt lat="48.8583526611328" lon="2.26002407073975"><ele>51.9738</ele><time>2007-04-15T09:37:53Z</time></trkpt><trkpt lat="48.8583526611328" lon="2.25997853279114"><ele>51.9994</ele><time>2007-04-15T09:37:54Z</time></trkpt><trkpt lat="48.8583221435547" lon="2.25990462303162"><ele>51.9731</ele><time>2007-04-15T09:37:55Z</time></trkpt><trkpt lat="48.8583106994629" lon="2.259850025177"><ele>51.9457</ele><time>2007-04-15T09:37:56Z</time></trkpt><trkpt lat="48.8582954406738" lon="2.25985383987427"><ele>51.9091</ele><time>2007-04-15T09:37:57Z</time></trkpt><trkpt lat="48.8582916259766" lon="2.25984025001526"><ele>51.8999</ele><time>2007-04-15T09:37:58Z</time></trkpt><trkpt lat="48.8582801818848" lon="2.2598135471344"><ele>51.8724</ele><time>2007-04-15T09:37:59Z</time></trkpt><trkpt lat="48.8583068847656" lon="2.25980567932129"><ele>51.9365</ele><time>2007-04-15T09:38:00Z</time></trkpt><trkpt lat="48.8583106994629" lon="2.25981259346008"><ele>51.9457</ele><time>2007-04-15T09:38:01Z</time></trkpt><trkpt lat="48.8583221435547" lon="2.2598888874054"><ele>51.9731</ele><time>2007-04-15T09:38:02Z</time></trkpt><trkpt lat="48.8583145141602" lon="2.25984740257263"><ele>51.9548</ele><time>2007-04-15T09:38:03Z</time></trkpt><trkpt lat="48.8583221435547" lon="2.25984477996826"><ele>51.9731</ele><time>2007-04-15T09:38:04Z</time></trkpt><trkpt lat="48.8583793640137" lon="2.25982594490051"><ele>51.9885</ele><time>2007-04-15T09:38:05Z</time></trkpt><trkpt lat="48.8584022521973" lon="2.2597496509552"><ele>51.9752</ele><time>2007-04-15T09:38:06Z</time></trkpt><trkpt lat="48.8583946228027" lon="2.25954103469849"><ele>51.9595</ele><time>2007-04-15T09:38:07Z</time></trkpt><trkpt lat="48.8583793640137" lon="2.25934958457947"><ele>51.9569</ele><time>2007-04-15T09:38:08Z</time></trkpt><trkpt lat="48.8583297729492" lon="2.25921368598938"><ele>51.9915</ele><time>2007-04-15T09:38:09Z</time></trkpt><trkpt lat="48.8582305908203" lon="2.25901079177856"><ele>51.7047</ele><time>2007-04-15T09:38:10Z</time></trkpt><trkpt lat="48.8581428527832" lon="2.25887966156006"><ele>51.6708</ele><time>2007-04-15T09:38:11Z</time></trkpt><trkpt lat="48.8580551147461" lon="2.25877404212952"><ele>51.8049</ele><time>2007-04-15T09:38:12Z</time></trkpt><trkpt lat="48.8579292297363" lon="2.25867557525635"><ele>52.1555</ele><time>2007-04-15T09:38:13Z</time></trkpt><trkpt lat="48.8577995300293" lon="2.25856566429138"><ele>52.7695</ele><time>2007-04-15T09:38:14Z</time></trkpt><trkpt lat="48.8576812744141" lon="2.25846338272095"><ele>53.5533</ele><time>2007-04-15T09:38:15Z</time></trkpt><trkpt lat="48.857551574707" lon="2.25831007957458"><ele>54.7593</ele><time>2007-04-15T09:38:16Z</time></trkpt><trkpt lat="48.8574447631836" lon="2.25817823410034"><ele>54.9337</ele><time>2007-04-15T09:38:17Z</time></trkpt><trkpt lat="48.8573226928711" lon="2.2580680847168"><ele>54.7872</ele><time>2007-04-15T09:38:18Z</time></trkpt><trkpt lat="48.8572044372559" lon="2.25796818733215"><ele>54.6453</ele><time>2007-04-15T09:38:19Z</time></trkpt><trkpt lat="48.8571090698242" lon="2.25787448883057"><ele>54.5309</ele><time>2007-04-15T09:38:20Z</time></trkpt><trkpt lat="48.8569869995117" lon="2.2577965259552"><ele>54.3844</ele><time>2007-04-15T09:38:21Z</time></trkpt><trkpt lat="48.856876373291" lon="2.25776886940002"><ele>54.2516</ele><time>2007-04-15T09:38:22Z</time></trkpt><trkpt lat="48.8567657470703" lon="2.25775527954102"><ele>54.1189</ele><time>2007-04-15T09:38:23Z</time></trkpt><trkpt lat="48.8566398620606" lon="2.25773906707764"><ele>53.8758</ele><time>2007-04-15T09:38:24Z</time></trkpt><trkpt lat="48.856517791748" lon="2.25771641731262"><ele>53.3249</ele><time>2007-04-15T09:38:25Z</time></trkpt><trkpt lat="48.8564147949219" lon="2.25769925117493"><ele>52.8765</ele><time>2007-04-15T09:38:26Z</time></trkpt><trkpt lat="48.856315612793" lon="2.25767755508423"><ele>52.4669</ele><time>2007-04-15T09:38:27Z</time></trkpt><trkpt lat="48.8562164306641" lon="2.25766777992249"><ele>52.0528</ele><time>2007-04-15T09:38:28Z</time></trkpt><trkpt lat="48.8560829162598" lon="2.25765180587769"><ele>51.5157</ele><time>2007-04-15T09:38:29Z</time></trkpt><trkpt lat="48.8560409545898" lon="2.25764393806458"><ele>51.3584</ele><time>2007-04-15T09:38:30Z</time></trkpt><trkpt lat="48.8559532165527" lon="2.25757360458374"><ele>51.2047</ele><time>2007-04-15T09:38:31Z</time></trkpt><trkpt lat="48.8559112548828" lon="2.25755882263184"><ele>51.0886</ele><time>2007-04-15T09:38:32Z</time></trkpt><trkpt lat="48.8557929992676" lon="2.25749468803406"><ele>50.9768</ele><time>2007-04-15T09:38:33Z</time></trkpt><trkpt lat="48.8556900024414" lon="2.25743818283081"><ele>51.112</ele><time>2007-04-15T09:38:34Z</time></trkpt><trkpt lat="48.8555679321289" lon="2.2573516368866"><ele>51.337</ele><time>2007-04-15T09:38:35Z</time></trkpt><trkpt lat="48.855411529541" lon="2.25724244117737"><ele>51.5737</ele><time>2007-04-15T09:38:36Z</time></trkpt><trkpt lat="48.8553047180176" lon="2.25716638565063"><ele>51.7131</ele><time>2007-04-15T09:38:37Z</time></trkpt><trkpt lat="48.8552169799805" lon="2.25710034370422"><ele>51.824</ele><time>2007-04-15T09:38:38Z</time></trkpt><trkpt lat="48.8550872802734" lon="2.25701475143433"><ele>51.9126</ele><time>2007-04-15T09:38:39Z</time></trkpt><trkpt lat="48.8550567626953" lon="2.25698065757751"><ele>51.9802</ele><time>2007-04-15T09:38:40Z</time></trkpt><trkpt lat="48.8550415039062" lon="2.25696969032288"><ele>51.9906</ele><time>2007-04-15T09:38:41Z</time></trkpt><trkpt lat="48.8550109863281" lon="2.25695276260376"><ele>51.9919</ele><time>2007-04-15T09:38:42Z</time></trkpt><trkpt lat="48.8549919128418" lon="2.25693774223328"><ele>52.0727</ele><time>2007-04-15T09:38:43Z</time></trkpt><trkpt lat="48.8549842834473" lon="2.25691485404968"><ele>52.2008</ele><time>2007-04-15T09:38:44Z</time></trkpt><trkpt lat="48.8549728393555" lon="2.25691628456116"><ele>52.2643</ele><time>2007-04-15T09:38:45Z</time></trkpt><trkpt lat="48.8549156188965" lon="2.25692653656006"><ele>52.5708</ele><time>2007-04-15T09:38:46Z</time></trkpt><trkpt lat="48.8548126220703" lon="2.25692176818848"><ele>53.2059</ele><time>2007-04-15T09:38:47Z</time></trkpt><trkpt lat="48.8546714782715" lon="2.25690007209778"><ele>54.1309</ele><time>2007-04-15T09:38:48Z</time></trkpt><trkpt lat="48.8545379638672" lon="2.25688219070435"><ele>54.9963</ele><time>2007-04-15T09:38:49Z</time></trkpt><trkpt lat="48.8544120788574" lon="2.25682210922241"><ele>55.9679</ele><time>2007-04-15T09:38:50Z</time></trkpt><trkpt lat="48.8543281555176" lon="2.25666046142578"><ele>57.0433</ele><time>2007-04-15T09:38:51Z</time></trkpt><trkpt lat="48.8542785644531" lon="2.25646471977234"><ele>57.8278</ele><time>2007-04-15T09:38:52Z</time></trkpt><trkpt lat="48.8542747497559" lon="2.25625205039978"><ele>58.3924</ele><time>2007-04-15T09:38:53Z</time></trkpt><trkpt lat="48.8543395996094" lon="2.25602698326111"><ele>58.1502</ele><time>2007-04-15T09:38:54Z</time></trkpt><trkpt lat="48.8544387817383" lon="2.25588345527649"><ele>57.0386</ele><time>2007-04-15T09:38:55Z</time></trkpt><trkpt lat="48.8545608520508" lon="2.25577425956726"><ele>55.1446</ele><time>2007-04-15T09:38:56Z</time></trkpt><trkpt lat="48.8547019958496" lon="2.25570702552795"><ele>52.9339</ele><time>2007-04-15T09:38:57Z</time></trkpt><trkpt lat="48.8548431396484" lon="2.25569581985474"><ele>50.8977</ele><time>2007-04-15T09:38:58Z</time></trkpt><trkpt lat="48.8549728393555" lon="2.25569343566895"><ele>49.0499</ele><time>2007-04-15T09:38:59Z</time></trkpt><trkpt lat="48.8551063537598" lon="2.25566339492798"><ele>49.2303</ele><time>2007-04-15T09:39:00Z</time></trkpt><trkpt lat="48.8552169799805" lon="2.25561261177063"><ele>49.7721</ele><time>2007-04-15T09:39:01Z</time></trkpt><trkpt lat="48.8553161621094" lon="2.25548243522644"><ele>50.0548</ele><time>2007-04-15T09:39:02Z</time></trkpt><trkpt lat="48.8553237915039" lon="2.2554566860199"><ele>50.0388</ele><time>2007-04-15T09:39:03Z</time></trkpt><trkpt lat="48.8552589416504" lon="2.25529980659485"><ele>49.2732</ele><time>2007-04-15T09:39:04Z</time></trkpt><trkpt lat="48.8551483154297" lon="2.2551372051239"><ele>48.2192</ele><time>2007-04-15T09:39:05Z</time></trkpt><trkpt lat="48.8550682067871" lon="2.25501418113708"><ele>47.4433</ele><time>2007-04-15T09:39:06Z</time></trkpt><trkpt lat="48.8549919128418" lon="2.25490617752075"><ele>47.1002</ele><time>2007-04-15T09:39:07Z</time></trkpt><trkpt lat="48.8549499511719" lon="2.25482416152954"><ele>47.5846</ele><time>2007-04-15T09:39:08Z</time></trkpt><trkpt lat="48.8548393249512" lon="2.25466394424438"><ele>48.6544</ele><time>2007-04-15T09:39:09Z</time></trkpt><trkpt lat="48.8547325134277" lon="2.2545108795166"><ele>49.4004</ele><time>2007-04-15T09:39:10Z</time></trkpt><trkpt lat="48.8546829223633" lon="2.25442719459534"><ele>49.6162</ele><time>2007-04-15T09:39:11Z</time></trkpt><trkpt lat="48.854606628418" lon="2.25432586669922"><ele>49.9013</ele><time>2007-04-15T09:39:12Z</time></trkpt><trkpt lat="48.8545188903809" lon="2.25420188903809"><ele>50.0331</ele><time>2007-04-15T09:39:13Z</time></trkpt><trkpt lat="48.854434967041" lon="2.25408840179443"><ele>50.3838</ele><time>2007-04-15T09:39:14Z</time></trkpt><trkpt lat="48.854362487793" lon="2.25399804115295"><ele>50.7057</ele><time>2007-04-15T09:39:15Z</time></trkpt><trkpt lat="48.8542900085449" lon="2.25389385223389"><ele>50.8959</ele><time>2007-04-15T09:39:16Z</time></trkpt><trkpt lat="48.8542022705078" lon="2.25381112098694"><ele>51.0424</ele><time>2007-04-15T09:39:17Z</time></trkpt><trkpt lat="48.854076385498" lon="2.25369310379028"><ele>51.8533</ele><time>2007-04-15T09:39:18Z</time></trkpt><trkpt lat="48.8539848327637" lon="2.25363302230835"><ele>52.7443</ele><time>2007-04-15T09:39:19Z</time></trkpt><trkpt lat="48.8538589477539" lon="2.25358772277832"><ele>54.0777</ele><time>2007-04-15T09:39:20Z</time></trkpt><trkpt lat="48.8537292480469" lon="2.2536187171936"><ele>55.5744</ele><time>2007-04-15T09:39:21Z</time></trkpt><trkpt lat="48.8535995483398" lon="2.25363063812256"><ele>57.0334</ele><time>2007-04-15T09:39:22Z</time></trkpt><trkpt lat="48.8535118103027" lon="2.25365400314331"><ele>58.0231</ele><time>2007-04-15T09:39:23Z</time></trkpt><trkpt lat="48.8534393310547" lon="2.25367021560669"><ele>58.8309</ele><time>2007-04-15T09:39:24Z</time></trkpt><trkpt lat="48.8533210754394" lon="2.25371599197388"><ele>59.9932</ele><time>2007-04-15T09:39:25Z</time></trkpt><trkpt lat="48.8532180786133" lon="2.25377440452576"><ele>59.9268</ele><time>2007-04-15T09:39:26Z</time></trkpt><trkpt lat="48.8531265258789" lon="2.2538104057312"><ele>59.8579</ele><time>2007-04-15T09:39:27Z</time></trkpt><trkpt lat="48.8529586791992" lon="2.25385332107544"><ele>59.7195</ele><time>2007-04-15T09:39:28Z</time></trkpt><trkpt lat="48.8529396057129" lon="2.25384926795959"><ele>59.7075</ele><time>2007-04-15T09:39:29Z</time></trkpt><trkpt lat="48.8528633117676" lon="2.25368595123291"><ele>59.7613</ele><time>2007-04-15T09:39:30Z</time></trkpt><trkpt lat="48.8528747558594" lon="2.25361084938049"><ele>59.8167</ele><time>2007-04-15T09:39:31Z</time></trkpt><trkpt lat="48.8528861999512" lon="2.25353813171387"><ele>59.8681</ele><time>2007-04-15T09:39:32Z</time></trkpt><trkpt lat="48.8529243469238" lon="2.2534167766571"><ele>59.9509</ele><time>2007-04-15T09:39:33Z</time></trkpt><trkpt lat="48.852954864502" lon="2.25316381454468"><ele>59.205</ele><time>2007-04-15T09:39:34Z</time></trkpt><trkpt lat="48.8529891967773" lon="2.25295400619507"><ele>58.2585</ele><time>2007-04-15T09:39:35Z</time></trkpt><trkpt lat="48.8530158996582" lon="2.25276303291321"><ele>57.4255</ele><time>2007-04-15T09:39:36Z</time></trkpt><trkpt lat="48.8530654907227" lon="2.25259447097778"><ele>56.7701</ele><time>2007-04-15T09:39:37Z</time></trkpt><trkpt lat="48.8531227111816" lon="2.25240302085876"><ele>56.5815</ele><time>2007-04-15T09:39:38Z</time></trkpt><trkpt lat="48.8531532287598" lon="2.25223135948181"><ele>56.8204</ele><time>2007-04-15T09:39:39Z</time></trkpt><trkpt lat="48.8531761169434" lon="2.25205636024475"><ele>57.0546</ele><time>2007-04-15T09:39:40Z</time></trkpt><trkpt lat="48.8532295227051" lon="2.25189518928528"><ele>57.3862</ele><time>2007-04-15T09:39:41Z</time></trkpt><trkpt lat="48.8532524108887" lon="2.25172877311707"><ele>57.6414</ele><time>2007-04-15T09:39:42Z</time></trkpt><trkpt lat="48.8532943725586" lon="2.25151515007019"><ele>57.5046</ele><time>2007-04-15T09:39:43Z</time></trkpt><trkpt lat="48.853328704834" lon="2.25136351585388"><ele>57.2578</ele><time>2007-04-15T09:39:44Z</time></trkpt><trkpt lat="48.8533325195312" lon="2.25121665000916"><ele>56.9176</ele><time>2007-04-15T09:39:45Z</time></trkpt><trkpt lat="48.853343963623" lon="2.25103712081909"><ele>56.4605</ele><time>2007-04-15T09:39:46Z</time></trkpt><trkpt lat="48.8533363342285" lon="2.25083589553833"><ele>55.9989</ele><time>2007-04-15T09:39:47Z</time></trkpt><trkpt lat="48.8533096313477" lon="2.25064015388489"><ele>55.4795</ele><time>2007-04-15T09:39:48Z</time></trkpt><trkpt lat="48.8533020019531" lon="2.2504358291626"><ele>54.9708</ele><time>2007-04-15T09:39:49Z</time></trkpt><trkpt lat="48.8532943725586" lon="2.2502613067627"><ele>54.5336</ele><time>2007-04-15T09:39:50Z</time></trkpt><trkpt lat="48.8532791137695" lon="2.25008845329285"><ele>54.0822</ele><time>2007-04-15T09:39:51Z</time></trkpt><trkpt lat="48.8532485961914" lon="2.24992489814758"><ele>53.7966</ele><time>2007-04-15T09:39:52Z</time></trkpt><trkpt lat="48.8532180786133" lon="2.24976682662964"><ele>53.7234</ele><time>2007-04-15T09:39:53Z</time></trkpt><trkpt lat="48.8531951904297" lon="2.24962401390076"><ele>53.6685</ele><time>2007-04-15T09:39:54Z</time></trkpt><trkpt lat="48.8531723022461" lon="2.24943828582764"><ele>53.6135</ele><time>2007-04-15T09:39:55Z</time></trkpt><trkpt lat="48.853141784668" lon="2.24923777580261"><ele>53.5403</ele><time>2007-04-15T09:39:56Z</time></trkpt><trkpt lat="48.8531265258789" lon="2.24918031692505"><ele>53.5037</ele><time>2007-04-15T09:39:57Z</time></trkpt><trkpt lat="48.8530731201172" lon="2.24897885322571"><ele>53.6009</ele><time>2007-04-15T09:39:58Z</time></trkpt><trkpt lat="48.8530387878418" lon="2.24880075454712"><ele>53.7322</ele><time>2007-04-15T09:39:59Z</time></trkpt><trkpt lat="48.8530120849609" lon="2.24864220619202"><ele>53.8584</ele><time>2007-04-15T09:40:00Z</time></trkpt><trkpt lat="48.8529663085938" lon="2.24841642379761"><ele>54.0194</ele><time>2007-04-15T09:40:01Z</time></trkpt><trkpt lat="48.852912902832" lon="2.24825620651245"><ele>53.991</ele><time>2007-04-15T09:40:02Z</time></trkpt><trkpt lat="48.852897644043" lon="2.24815726280212"><ele>53.9543</ele><time>2007-04-15T09:40:03Z</time></trkpt><trkpt lat="48.8528900146484" lon="2.24811840057373"><ele>53.936</ele><time>2007-04-15T09:40:04Z</time></trkpt><trkpt lat="48.8528900146484" lon="2.24808430671692"><ele>53.936</ele><time>2007-04-15T09:40:05Z</time></trkpt><trkpt lat="48.8529777526856" lon="2.248046875"><ele>54.1466</ele><time>2007-04-15T09:40:06Z</time></trkpt><trkpt lat="48.8530693054199" lon="2.24815821647644"><ele>54.3663</ele><time>2007-04-15T09:40:07Z</time></trkpt><trkpt lat="48.8531188964844" lon="2.24823665618896"><ele>54.4854</ele><time>2007-04-15T09:40:08Z</time></trkpt><trkpt lat="48.8532028198242" lon="2.24840259552002"><ele>54.6037</ele><time>2007-04-15T09:40:09Z</time></trkpt><trkpt lat="48.8532905578613" lon="2.24855947494507"><ele>54.626</ele><time>2007-04-15T09:40:10Z</time></trkpt><trkpt lat="48.8533821105957" lon="2.24865245819092"><ele>54.6171</ele><time>2007-04-15T09:40:11Z</time></trkpt><trkpt lat="48.8534774780273" lon="2.24876284599304"><ele>54.4846</ele><time>2007-04-15T09:40:12Z</time></trkpt><trkpt lat="48.853588104248" lon="2.24892354011536"><ele>54.2918</ele><time>2007-04-15T09:40:13Z</time></trkpt><trkpt lat="48.8536148071289" lon="2.24904608726501"><ele>54.1447</ele><time>2007-04-15T09:40:14Z</time></trkpt><trkpt lat="48.853645324707" lon="2.24914693832397"><ele>54.0237</ele><time>2007-04-15T09:40:15Z</time></trkpt><trkpt lat="48.8536949157715" lon="2.24921894073486"><ele>53.9728</ele><time>2007-04-15T09:40:16Z</time></trkpt><trkpt lat="48.8538055419922" lon="2.24937295913696"><ele>53.8597</ele><time>2007-04-15T09:40:17Z</time></trkpt><trkpt lat="48.8538780212402" lon="2.249516248703"><ele>53.7258</ele><time>2007-04-15T09:40:18Z</time></trkpt><trkpt lat="48.8539352416992" lon="2.24965929985046"><ele>53.573</ele><time>2007-04-15T09:40:19Z</time></trkpt><trkpt lat="48.8540000915527" lon="2.24977707862854"><ele>53.4139</ele><time>2007-04-15T09:40:20Z</time></trkpt><trkpt lat="48.8540191650391" lon="2.24981093406677"><ele>53.3637</ele><time>2007-04-15T09:40:21Z</time></trkpt><trkpt lat="48.8541145324707" lon="2.24994850158691"><ele>53.1205</ele><time>2007-04-15T09:40:22Z</time></trkpt><trkpt lat="48.8541831970215" lon="2.25004243850708"><ele>53.0479</ele><time>2007-04-15T09:40:23Z</time></trkpt><trkpt lat="48.8542022705078" lon="2.25007057189941"><ele>53.0738</ele><time>2007-04-15T09:40:24Z</time></trkpt><trkpt lat="48.8542861938477" lon="2.25019645690918"><ele>53.1343</ele><time>2007-04-15T09:40:25Z</time></trkpt><trkpt lat="48.8543434143066" lon="2.25026726722717"><ele>53.1166</ele><time>2007-04-15T09:40:26Z</time></trkpt><trkpt lat="48.8544158935547" lon="2.25037908554077"><ele>53.0468</ele><time>2007-04-15T09:40:27Z</time></trkpt><trkpt lat="48.8544998168945" lon="2.25052356719971"><ele>52.8748</ele><time>2007-04-15T09:40:28Z</time></trkpt><trkpt lat="48.8545951843262" lon="2.2506251335144"><ele>52.5929</ele><time>2007-04-15T09:40:29Z</time></trkpt><trkpt lat="48.8546943664551" lon="2.2507381439209"><ele>52.2031</ele><time>2007-04-15T09:40:30Z</time></trkpt><trkpt lat="48.8547821044922" lon="2.25084972381592"><ele>51.8186</ele><time>2007-04-15T09:40:31Z</time></trkpt><trkpt lat="48.8548736572266" lon="2.25096368789673"><ele>51.744</ele><time>2007-04-15T09:40:32Z</time></trkpt><trkpt lat="48.8550224304199" lon="2.25112748146057"><ele>51.66</ele><time>2007-04-15T09:40:33Z</time></trkpt><trkpt lat="48.8551483154297" lon="2.25124359130859"><ele>51.6314</ele><time>2007-04-15T09:40:34Z</time></trkpt><trkpt lat="48.8552589416504" lon="2.25136923789978"><ele>51.5758</ele><time>2007-04-15T09:40:35Z</time></trkpt><trkpt lat="48.8553771972656" lon="2.25147175788879"><ele>51.386</ele><time>2007-04-15T09:40:36Z</time></trkpt><trkpt lat="48.8554916381836" lon="2.25157356262207"><ele>51.1385</ele><time>2007-04-15T09:40:37Z</time></trkpt><trkpt lat="48.8555564880371" lon="2.25167036056519"><ele>51.007</ele><time>2007-04-15T09:40:38Z</time></trkpt><trkpt lat="48.8556900024414" lon="2.25177597999573"><ele>50.8644</ele><time>2007-04-15T09:40:39Z</time></trkpt><trkpt lat="48.8558006286621" lon="2.25191116333008"><ele>50.9749</ele><time>2007-04-15T09:40:40Z</time></trkpt><trkpt lat="48.8559265136719" lon="2.25200629234314"><ele>51.2889</ele><time>2007-04-15T09:40:41Z</time></trkpt><trkpt lat="48.8559989929199" lon="2.25209951400757"><ele>51.6538</ele><time>2007-04-15T09:40:42Z</time></trkpt><trkpt lat="48.8560829162598" lon="2.25219655036926"><ele>52.0166</ele><time>2007-04-15T09:40:43Z</time></trkpt><trkpt lat="48.8561630249023" lon="2.25224828720093"><ele>52.2133</ele><time>2007-04-15T09:40:44Z</time></trkpt><trkpt lat="48.8563003540039" lon="2.25233101844788"><ele>52.5053</ele><time>2007-04-15T09:40:45Z</time></trkpt><trkpt lat="48.8564147949219" lon="2.25244545936584"><ele>52.8493</ele><time>2007-04-15T09:40:46Z</time></trkpt><trkpt lat="48.8565521240234" lon="2.25259208679199"><ele>52.5732</ele><time>2007-04-15T09:40:47Z</time></trkpt><trkpt lat="48.8566703796387" lon="2.2527174949646"><ele>51.9607</ele><time>2007-04-15T09:40:48Z</time></trkpt><trkpt lat="48.8567390441894" lon="2.25282168388367"><ele>51.59</ele><time>2007-04-15T09:40:49Z</time></trkpt><trkpt lat="48.8568115234375" lon="2.25292491912842"><ele>51.3149</ele><time>2007-04-15T09:40:50Z</time></trkpt><trkpt lat="48.8569412231445" lon="2.25307559967041"><ele>51.1474</ele><time>2007-04-15T09:40:51Z</time></trkpt><trkpt lat="48.8570365905762" lon="2.2532172203064"><ele>51.0856</ele><time>2007-04-15T09:40:52Z</time></trkpt><trkpt lat="48.8571166992188" lon="2.25332093238831"><ele>51.1875</ele><time>2007-04-15T09:40:53Z</time></trkpt><trkpt lat="48.8572158813477" lon="2.25348424911499"><ele>51.521</ele><time>2007-04-15T09:40:54Z</time></trkpt><trkpt lat="48.8572883605957" lon="2.25359892845154"><ele>51.6705</ele><time>2007-04-15T09:40:55Z</time></trkpt><trkpt lat="48.8573608398438" lon="2.25375890731812"><ele>51.6518</ele><time>2007-04-15T09:40:56Z</time></trkpt><trkpt lat="48.8574485778809" lon="2.2539222240448"><ele>51.5143</ele><time>2007-04-15T09:40:57Z</time></trkpt><trkpt lat="48.8574714660644" lon="2.25397610664368"><ele>51.426</ele><time>2007-04-15T09:40:58Z</time></trkpt><trkpt lat="48.8575439453125" lon="2.25414848327637"><ele>51.0941</ele><time>2007-04-15T09:40:59Z</time></trkpt><trkpt lat="48.8575973510742" lon="2.25433468818665"><ele>50.7371</ele><time>2007-04-15T09:41:00Z</time></trkpt><trkpt lat="48.8576469421387" lon="2.25448203086853"><ele>50.4862</ele><time>2007-04-15T09:41:01Z</time></trkpt><trkpt lat="48.8577270507812" lon="2.25461673736572"><ele>50.3394</ele><time>2007-04-15T09:41:02Z</time></trkpt><trkpt lat="48.8578071594238" lon="2.25477433204651"><ele>50.179</ele><time>2007-04-15T09:41:03Z</time></trkpt><trkpt lat="48.8578681945801" lon="2.25494146347046"><ele>49.9931</ele><time>2007-04-15T09:41:04Z</time></trkpt><trkpt lat="48.8579139709473" lon="2.25508189201355"><ele>49.9434</ele><time>2007-04-15T09:41:05Z</time></trkpt><trkpt lat="48.857982635498" lon="2.25528812408447"><ele>50.0676</ele><time>2007-04-15T09:41:06Z</time></trkpt><trkpt lat="48.8580474853516" lon="2.25550031661987"><ele>50.2965</ele><time>2007-04-15T09:41:07Z</time></trkpt><trkpt lat="48.8581008911133" lon="2.25564694404602"><ele>50.5688</ele><time>2007-04-15T09:41:08Z</time></trkpt><trkpt lat="48.8581619262695" lon="2.25578665733337"><ele>50.9501</ele><time>2007-04-15T09:41:09Z</time></trkpt><trkpt lat="48.8582534790039" lon="2.25592136383057"><ele>51.5006</ele><time>2007-04-15T09:41:10Z</time></trkpt><trkpt lat="48.8583106994629" lon="2.25605750083923"><ele>51.8496</ele><time>2007-04-15T09:41:11Z</time></trkpt><trkpt lat="48.8583602905273" lon="2.25628304481506"><ele>51.9528</ele><time>2007-04-15T09:41:12Z</time></trkpt><trkpt lat="48.8583984375" lon="2.25650072097778"><ele>51.9063</ele><time>2007-04-15T09:41:13Z</time></trkpt><trkpt lat="48.8584136962891" lon="2.25669598579407"><ele>52.0023</ele><time>2007-04-15T09:41:14Z</time></trkpt><trkpt lat="48.8584327697754" lon="2.25692868232727"><ele>52.7489</ele><time>2007-04-15T09:41:15Z</time></trkpt><trkpt lat="48.8584594726562" lon="2.2571291923523"><ele>53.3457</ele><time>2007-04-15T09:41:16Z</time></trkpt><trkpt lat="48.8584785461426" lon="2.25733828544617"><ele>53.9627</ele><time>2007-04-15T09:41:17Z</time></trkpt><trkpt lat="48.8585052490234" lon="2.25754356384277"><ele>54.2151</ele><time>2007-04-15T09:41:18Z</time></trkpt><trkpt lat="48.858528137207" lon="2.25770282745361"><ele>53.5527</ele><time>2007-04-15T09:41:19Z</time></trkpt><trkpt lat="48.8585472106934" lon="2.25782895088196"><ele>53.0563</ele><time>2007-04-15T09:41:20Z</time></trkpt><trkpt lat="48.8585548400879" lon="2.25789165496826"><ele>52.8223</ele><time>2007-04-15T09:41:21Z</time></trkpt><trkpt lat="48.8585739135742" lon="2.25807929039001"><ele>52.1561</ele><time>2007-04-15T09:41:22Z</time></trkpt><trkpt lat="48.8585968017578" lon="2.25824475288391"><ele>51.6069</ele><time>2007-04-15T09:41:23Z</time></trkpt><trkpt lat="48.8586196899414" lon="2.25840544700623"><ele>51.3707</ele><time>2007-04-15T09:41:24Z</time></trkpt><trkpt lat="48.8586502075195" lon="2.25858068466187"><ele>51.4513</ele><time>2007-04-15T09:41:25Z</time></trkpt><trkpt lat="48.8587188720703" lon="2.25877904891968"><ele>51.5026</ele><time>2007-04-15T09:41:26Z</time></trkpt><trkpt lat="48.8587913513184" lon="2.25893807411194"><ele>51.4776</ele><time>2007-04-15T09:41:27Z</time></trkpt><trkpt lat="48.8588600158691" lon="2.25905442237854"><ele>51.4035</ele><time>2007-04-15T09:41:28Z</time></trkpt><trkpt lat="48.8589515686035" lon="2.25917911529541"><ele>51.2692</ele><time>2007-04-15T09:41:29Z</time></trkpt><trkpt lat="48.859058380127" lon="2.2592887878418"><ele>51.2574</ele><time>2007-04-15T09:41:30Z</time></trkpt><trkpt lat="48.8591804504394" lon="2.25939083099365"><ele>51.2601</ele><time>2007-04-15T09:41:31Z</time></trkpt><trkpt lat="48.8593063354492" lon="2.25947141647339"><ele>51.2431</ele><time>2007-04-15T09:41:32Z</time></trkpt><trkpt lat="48.8594398498535" lon="2.25955414772034"><ele>51.1601</ele><time>2007-04-15T09:41:33Z</time></trkpt><trkpt lat="48.8595657348633" lon="2.25961565971374"><ele>51.0228</ele><time>2007-04-15T09:41:34Z</time></trkpt><trkpt lat="48.8596611022949" lon="2.25967121124268"><ele>50.887</ele><time>2007-04-15T09:41:35Z</time></trkpt><trkpt lat="48.859790802002" lon="2.25971150398254"><ele>50.6745</ele><time>2007-04-15T09:41:36Z</time></trkpt><trkpt lat="48.8599090576172" lon="2.25973653793335"><ele>50.4654</ele><time>2007-04-15T09:41:37Z</time></trkpt><trkpt lat="48.8600006103516" lon="2.25975227355957"><ele>50.2974</ele><time>2007-04-15T09:41:38Z</time></trkpt><trkpt lat="48.860034942627" lon="2.25973629951477"><ele>50.3186</ele><time>2007-04-15T09:41:39Z</time></trkpt><trkpt lat="48.8600425720215" lon="2.25974106788635"><ele>50.3142</ele><time>2007-04-15T09:41:40Z</time></trkpt><trkpt lat="48.8600578308106" lon="2.25975060462952"><ele>50.3064</ele><time>2007-04-15T09:41:41Z</time></trkpt><trkpt lat="48.8600997924805" lon="2.25977492332458"><ele>50.2928</ele><time>2007-04-15T09:41:42Z</time></trkpt><trkpt lat="48.8601150512695" lon="2.25977659225464"><ele>50.2951</ele><time>2007-04-15T09:41:43Z</time></trkpt><trkpt lat="48.8601226806641" lon="2.25978064537048"><ele>50.2942</ele><time>2007-04-15T09:41:44Z</time></trkpt><trkpt lat="48.8602333068848" lon="2.25986909866333"><ele>50.3051</ele><time>2007-04-15T09:41:45Z</time></trkpt><trkpt lat="48.8603210449219" lon="2.25991010665894"><ele>50.3685</ele><time>2007-04-15T09:41:46Z</time></trkpt><trkpt lat="48.8604125976562" lon="2.25995659828186"><ele>50.4698</ele><time>2007-04-15T09:41:47Z</time></trkpt><trkpt lat="48.8605194091797" lon="2.26000475883484"><ele>50.6233</ele><time>2007-04-15T09:41:48Z</time></trkpt><trkpt lat="48.8606376647949" lon="2.26007413864136"><ele>50.7652</ele><time>2007-04-15T09:41:49Z</time></trkpt><trkpt lat="48.8607635498047" lon="2.26014733314514"><ele>50.9163</ele><time>2007-04-15T09:41:50Z</time></trkpt><trkpt lat="48.8608512878418" lon="2.26019859313965"><ele>50.919</ele><time>2007-04-15T09:41:51Z</time></trkpt><trkpt lat="48.8609237670898" lon="2.26028871536255"><ele>50.6035</ele><time>2007-04-15T09:41:52Z</time></trkpt><trkpt lat="48.8610343933106" lon="2.26040887832642"><ele>50.1533</ele><time>2007-04-15T09:41:53Z</time></trkpt><trkpt lat="48.8611145019531" lon="2.26052212715149"><ele>49.8618</ele><time>2007-04-15T09:41:54Z</time></trkpt><trkpt lat="48.8612098693848" lon="2.26065587997437"><ele>49.5483</ele><time>2007-04-15T09:41:55Z</time></trkpt><trkpt lat="48.8613014221191" lon="2.26078343391418"><ele>49.2812</ele><time>2007-04-15T09:41:56Z</time></trkpt><trkpt lat="48.8614082336426" lon="2.26095199584961"><ele>48.8862</ele><time>2007-04-15T09:41:57Z</time></trkpt><trkpt lat="48.8614959716797" lon="2.26110482215881"><ele>48.5478</ele><time>2007-04-15T09:41:58Z</time></trkpt><trkpt lat="48.8615951538086" lon="2.26124668121338"><ele>48.2149</ele><time>2007-04-15T09:41:59Z</time></trkpt><trkpt lat="48.861701965332" lon="2.26137590408325"><ele>48.066</ele><time>2007-04-15T09:42:00Z</time></trkpt><trkpt lat="48.8618011474609" lon="2.26151466369629"><ele>48.4395</ele><time>2007-04-15T09:42:01Z</time></trkpt><trkpt lat="48.8619003295898" lon="2.26166915893555"><ele>49.1233</ele><time>2007-04-15T09:42:02Z</time></trkpt><trkpt lat="48.8619956970215" lon="2.26181411743164"><ele>49.7191</ele><time>2007-04-15T09:42:03Z</time></trkpt><trkpt lat="48.8621292114258" lon="2.2618682384491"><ele>50.4887</ele><time>2007-04-15T09:42:04Z</time></trkpt><trkpt lat="48.8622436523438" lon="2.26190853118896"><ele>51.1714</ele><time>2007-04-15T09:42:05Z</time></trkpt><trkpt lat="48.8623733520508" lon="2.26195859909058"><ele>51.9862</ele><time>2007-04-15T09:42:06Z</time></trkpt><trkpt lat="48.8625259399414" lon="2.26199293136597"><ele>52.6463</ele><time>2007-04-15T09:42:07Z</time></trkpt><trkpt lat="48.8626518249512" lon="2.26200318336487"><ele>52.0053</ele><time>2007-04-15T09:42:08Z</time></trkpt><trkpt lat="48.8628005981445" lon="2.26199579238892"><ele>51.2046</ele><time>2007-04-15T09:42:09Z</time></trkpt><trkpt lat="48.862907409668" lon="2.26198196411133"><ele>50.6162</ele><time>2007-04-15T09:42:10Z</time></trkpt><trkpt lat="48.8630599975586" lon="2.26196503639221"><ele>49.7875</ele><time>2007-04-15T09:42:11Z</time></trkpt><trkpt lat="48.8631896972656" lon="2.26193714141846"><ele>49.07</ele><time>2007-04-15T09:42:12Z</time></trkpt><trkpt lat="48.8633270263672" lon="2.26191830635071"><ele>48.3345</ele><time>2007-04-15T09:42:13Z</time></trkpt><trkpt lat="48.863468170166" lon="2.26191854476929"><ele>48.1894</ele><time>2007-04-15T09:42:14Z</time></trkpt><trkpt lat="48.8636436462402" lon="2.26192593574524"><ele>48.0546</ele><time>2007-04-15T09:42:15Z</time></trkpt><trkpt lat="48.8637809753418" lon="2.26197361946106"><ele>48.029</ele><time>2007-04-15T09:42:16Z</time></trkpt><trkpt lat="48.863899230957" lon="2.26204705238342"><ele>48.0874</ele><time>2007-04-15T09:42:17Z</time></trkpt><trkpt lat="48.8640174865723" lon="2.26213884353638"><ele>48.2108</ele><time>2007-04-15T09:42:18Z</time></trkpt><trkpt lat="48.8641471862793" lon="2.26225638389587"><ele>48.4222</ele><time>2007-04-15T09:42:19Z</time></trkpt><trkpt lat="48.8642616271973" lon="2.26238489151001"><ele>48.8182</ele><time>2007-04-15T09:42:20Z</time></trkpt><trkpt lat="48.8643913269043" lon="2.26250290870666"><ele>48.9921</ele><time>2007-04-15T09:42:21Z</time></trkpt><trkpt lat="48.8644943237305" lon="2.26262903213501"><ele>48.6294</ele><time>2007-04-15T09:42:22Z</time></trkpt><trkpt lat="48.8646125793457" lon="2.2627477645874"><ele>48.2463</ele><time>2007-04-15T09:42:23Z</time></trkpt><trkpt lat="48.8647193908691" lon="2.26281595230103"><ele>47.9902</ele><time>2007-04-15T09:42:24Z</time></trkpt><trkpt lat="48.864860534668" lon="2.26292395591736"><ele>47.5589</ele><time>2007-04-15T09:42:25Z</time></trkpt><trkpt lat="48.8649864196777" lon="2.26299667358398"><ele>47.2217</ele><time>2007-04-15T09:42:26Z</time></trkpt><trkpt lat="48.8651237487793" lon="2.26305961608887"><ele>46.5865</ele><time>2007-04-15T09:42:27Z</time></trkpt><trkpt lat="48.8652610778809" lon="2.26311445236206"><ele>45.864</ele><time>2007-04-15T09:42:28Z</time></trkpt><trkpt lat="48.8653984069824" lon="2.26318430900574"><ele>44.9661</ele><time>2007-04-15T09:42:29Z</time></trkpt><trkpt lat="48.8655586242676" lon="2.26324534416199"><ele>43.9185</ele><time>2007-04-15T09:42:30Z</time></trkpt><trkpt lat="48.8657035827637" lon="2.26332211494446"><ele>42.7087</ele><time>2007-04-15T09:42:31Z</time></trkpt><trkpt lat="48.8658218383789" lon="2.26341247558594"><ele>42.1475</ele><time>2007-04-15T09:42:32Z</time></trkpt><trkpt lat="48.8659248352051" lon="2.26352548599243"><ele>42.0363</ele><time>2007-04-15T09:42:33Z</time></trkpt><trkpt lat="48.8660430908203" lon="2.26367211341858"><ele>42.0054</ele><time>2007-04-15T09:42:34Z</time></trkpt><trkpt lat="48.8661346435547" lon="2.26381945610046"><ele>42.0711</ele><time>2007-04-15T09:42:35Z</time></trkpt><trkpt lat="48.866153717041" lon="2.26384520530701"><ele>42.0815</ele><time>2007-04-15T09:42:36Z</time></trkpt><trkpt lat="48.8662376403809" lon="2.26399779319763"><ele>42.2139</ele><time>2007-04-15T09:42:37Z</time></trkpt><trkpt lat="48.866325378418" lon="2.26417207717896"><ele>42.4405</ele><time>2007-04-15T09:42:38Z</time></trkpt><trkpt lat="48.8664131164551" lon="2.26432919502258"><ele>43.2964</ele><time>2007-04-15T09:42:39Z</time></trkpt><trkpt lat="48.8665084838867" lon="2.26448488235474"><ele>44.2635</ele><time>2007-04-15T09:42:40Z</time></trkpt><trkpt lat="48.8665924072266" lon="2.26464462280273"><ele>45.3771</ele><time>2007-04-15T09:42:41Z</time></trkpt><trkpt lat="48.86669921875" lon="2.26477551460266"><ele>46.4964</ele><time>2007-04-15T09:42:42Z</time></trkpt><trkpt lat="48.8668022155762" lon="2.2648983001709"><ele>47.5694</ele><time>2007-04-15T09:42:43Z</time></trkpt><trkpt lat="48.8669204711914" lon="2.26501202583313"><ele>48.2958</ele><time>2007-04-15T09:42:44Z</time></trkpt><trkpt lat="48.867015838623" lon="2.26509928703308"><ele>48.3192</ele><time>2007-04-15T09:42:45Z</time></trkpt><trkpt lat="48.867130279541" lon="2.26519370079041"><ele>48.2977</ele><time>2007-04-15T09:42:46Z</time></trkpt><trkpt lat="48.8672065734863" lon="2.26526021957397"><ele>48.2433</ele><time>2007-04-15T09:42:47Z</time></trkpt><trkpt lat="48.8672904968262" lon="2.26532292366028"><ele>48.1684</ele><time>2007-04-15T09:42:48Z</time></trkpt><trkpt lat="48.8673782348633" lon="2.26539206504822"><ele>48.0504</ele><time>2007-04-15T09:42:49Z</time></trkpt><trkpt lat="48.8674507141113" lon="2.26544499397278"><ele>47.936</ele><time>2007-04-15T09:42:50Z</time></trkpt><trkpt lat="48.8675537109375" lon="2.26554012298584"><ele>47.5294</ele><time>2007-04-15T09:42:51Z</time></trkpt><trkpt lat="48.8676681518555" lon="2.26562166213989"><ele>47.0019</ele><time>2007-04-15T09:42:52Z</time></trkpt><trkpt lat="48.8677864074707" lon="2.26569390296936"><ele>46.5322</ele><time>2007-04-15T09:42:53Z</time></trkpt><trkpt lat="48.8679428100586" lon="2.26573538780212"><ele>46.0474</ele><time>2007-04-15T09:42:54Z</time></trkpt><trkpt lat="48.8680992126465" lon="2.26577663421631"><ele>45.6001</ele><time>2007-04-15T09:42:55Z</time></trkpt><trkpt lat="48.8682403564453" lon="2.26584196090698"><ele>45.2622</ele><time>2007-04-15T09:42:56Z</time></trkpt><trkpt lat="48.8683776855469" lon="2.26596808433533"><ele>45.6226</ele><time>2007-04-15T09:42:57Z</time></trkpt><trkpt lat="48.8684577941894" lon="2.2660927772522"><ele>45.9762</ele><time>2007-04-15T09:42:58Z</time></trkpt><trkpt lat="48.8685455322266" lon="2.26624846458435"><ele>46.1056</ele><time>2007-04-15T09:42:59Z</time></trkpt><trkpt lat="48.8686332702637" lon="2.26641726493835"><ele>45.8929</ele><time>2007-04-15T09:43:00Z</time></trkpt><trkpt lat="48.8687210083008" lon="2.266606092453"><ele>45.2919</ele><time>2007-04-15T09:43:01Z</time></trkpt><trkpt lat="48.8687286376953" lon="2.26663684844971"><ele>45.2147</ele><time>2007-04-15T09:43:02Z</time></trkpt><trkpt lat="48.8687782287598" lon="2.26681303977966"><ele>44.9285</ele><time>2007-04-15T09:43:03Z</time></trkpt><trkpt lat="48.8688583374023" lon="2.26697826385498"><ele>44.5283</ele><time>2007-04-15T09:43:04Z</time></trkpt><trkpt lat="48.8689460754394" lon="2.26711845397949"><ele>44.1701</ele><time>2007-04-15T09:43:05Z</time></trkpt><trkpt lat="48.8690032958984" lon="2.26723194122314"><ele>44.0714</ele><time>2007-04-15T09:43:06Z</time></trkpt><trkpt lat="48.8690223693848" lon="2.26729106903076"><ele>44.1141</ele><time>2007-04-15T09:43:07Z</time></trkpt><trkpt lat="48.8691215515137" lon="2.26751828193665"><ele>44.2604</ele><time>2007-04-15T09:43:08Z</time></trkpt><trkpt lat="48.8692245483398" lon="2.26771306991577"><ele>44.4758</ele><time>2007-04-15T09:43:09Z</time></trkpt><trkpt lat="48.8692893981934" lon="2.26786708831787"><ele>44.7513</ele><time>2007-04-15T09:43:10Z</time></trkpt><trkpt lat="48.8693656921387" lon="2.26802778244019"><ele>44.9642</ele><time>2007-04-15T09:43:11Z</time></trkpt><trkpt lat="48.869457244873" lon="2.26817154884338"><ele>45.0497</ele><time>2007-04-15T09:43:12Z</time></trkpt><trkpt lat="48.8695335388184" lon="2.26827955245972"><ele>45.0473</ele><time>2007-04-15T09:43:13Z</time></trkpt><trkpt lat="48.8696212768555" lon="2.26843166351318"><ele>44.7802</ele><time>2007-04-15T09:43:14Z</time></trkpt><trkpt lat="48.8696556091309" lon="2.26850938796997"><ele>44.5786</ele><time>2007-04-15T09:43:15Z</time></trkpt><trkpt lat="48.8697662353516" lon="2.26865029335022"><ele>44.0137</ele><time>2007-04-15T09:43:16Z</time></trkpt><trkpt lat="48.8697853088379" lon="2.268709897995"><ele>43.8443</ele><time>2007-04-15T09:43:17Z</time></trkpt><trkpt lat="48.8698692321777" lon="2.26888394355774"><ele>43.1997</ele><time>2007-04-15T09:43:18Z</time></trkpt><trkpt lat="48.8699722290039" lon="2.26900434494019"><ele>42.5099</ele><time>2007-04-15T09:43:19Z</time></trkpt><trkpt lat="48.8700561523438" lon="2.2691502571106"><ele>42.441</ele><time>2007-04-15T09:43:20Z</time></trkpt><trkpt lat="48.8701362609863" lon="2.26927781105042"><ele>43.0926</ele><time>2007-04-15T09:43:21Z</time></trkpt><trkpt lat="48.8702201843262" lon="2.26939487457275"><ele>43.7868</ele><time>2007-04-15T09:43:22Z</time></trkpt><trkpt lat="48.8702926635742" lon="2.26952266693115"><ele>44.3843</ele><time>2007-04-15T09:43:23Z</time></trkpt><trkpt lat="48.8703384399414" lon="2.26964998245239"><ele>44.7812</ele><time>2007-04-15T09:43:24Z</time></trkpt><trkpt lat="48.8704032897949" lon="2.269775390625"><ele>45.2806</ele><time>2007-04-15T09:43:25Z</time></trkpt><trkpt lat="48.870418548584" lon="2.26983284950256"><ele>45.4115</ele><time>2007-04-15T09:43:26Z</time></trkpt><trkpt lat="48.8704719543457" lon="2.26994013786316"><ele>45.8006</ele><time>2007-04-15T09:43:27Z</time></trkpt><trkpt lat="48.8705215454102" lon="2.27000880241394"><ele>46.1319</ele><time>2007-04-15T09:43:28Z</time></trkpt><trkpt lat="48.8705787658691" lon="2.27013564109802"><ele>46.4454</ele><time>2007-04-15T09:43:29Z</time></trkpt><trkpt lat="48.8706474304199" lon="2.27026104927063"><ele>46.6774</ele><time>2007-04-15T09:43:30Z</time></trkpt><trkpt lat="48.8706588745117" lon="2.2703001499176"><ele>46.6853</ele><time>2007-04-15T09:43:31Z</time></trkpt><trkpt lat="48.8707084655762" lon="2.27044796943665"><ele>46.659</ele><time>2007-04-15T09:43:32Z</time></trkpt><trkpt lat="48.870777130127" lon="2.27058148384094"><ele>46.5496</ele><time>2007-04-15T09:43:33Z</time></trkpt><trkpt lat="48.8708305358887" lon="2.27073550224304"><ele>46.2358</ele><time>2007-04-15T09:43:34Z</time></trkpt><trkpt lat="48.8708801269531" lon="2.27090668678284"><ele>45.4435</ele><time>2007-04-15T09:43:35Z</time></trkpt><trkpt lat="48.870922088623" lon="2.27104091644287"><ele>44.8524</ele><time>2007-04-15T09:43:36Z</time></trkpt><trkpt lat="48.8709678649902" lon="2.27114677429199"><ele>44.4495</ele><time>2007-04-15T09:43:37Z</time></trkpt><trkpt lat="48.8710174560547" lon="2.27129793167114"><ele>44.1104</ele><time>2007-04-15T09:43:38Z</time></trkpt><trkpt lat="48.8710784912109" lon="2.27145099639893"><ele>43.9737</ele><time>2007-04-15T09:43:39Z</time></trkpt><trkpt lat="48.8711051940918" lon="2.27158784866333"><ele>43.9847</ele><time>2007-04-15T09:43:40Z</time></trkpt><trkpt lat="48.8711433410644" lon="2.27177119255066"><ele>44.3027</ele><time>2007-04-15T09:43:41Z</time></trkpt><trkpt lat="48.8711547851562" lon="2.27189087867737"><ele>44.5724</ele><time>2007-04-15T09:43:42Z</time></trkpt><trkpt lat="48.8711814880371" lon="2.2719874382019"><ele>44.8966</ele><time>2007-04-15T09:43:43Z</time></trkpt><trkpt lat="48.8711891174316" lon="2.27216172218323"><ele>45.2953</ele><time>2007-04-15T09:43:44Z</time></trkpt><trkpt lat="48.8711853027344" lon="2.27236866950989"><ele>45.6903</ele><time>2007-04-15T09:43:45Z</time></trkpt><trkpt lat="48.8712043762207" lon="2.27250695228577"><ele>46.1278</ele><time>2007-04-15T09:43:46Z</time></trkpt><trkpt lat="48.8712348937988" lon="2.27275681495666"><ele>46.7148</ele><time>2007-04-15T09:43:47Z</time></trkpt><trkpt lat="48.8712692260742" lon="2.27293586730957"><ele>47.1121</ele><time>2007-04-15T09:43:48Z</time></trkpt><trkpt lat="48.8713111877441" lon="2.27313733100891"><ele>47.4418</ele><time>2007-04-15T09:43:49Z</time></trkpt><trkpt lat="48.871337890625" lon="2.27329969406128"><ele>47.5906</ele><time>2007-04-15T09:43:50Z</time></trkpt><trkpt lat="48.8713760375977" lon="2.27347302436829"><ele>47.8266</ele><time>2007-04-15T09:43:51Z</time></trkpt><trkpt lat="48.8714065551758" lon="2.27364706993103"><ele>48.0404</ele><time>2007-04-15T09:43:52Z</time></trkpt><trkpt lat="48.8714408874512" lon="2.27381634712219"><ele>48.2002</ele><time>2007-04-15T09:43:53Z</time></trkpt><trkpt lat="48.871452331543" lon="2.2739884853363"><ele>48.3494</ele><time>2007-04-15T09:43:54Z</time></trkpt><trkpt lat="48.8714332580566" lon="2.27406001091003"><ele>48.4526</ele><time>2007-04-15T09:43:55Z</time></trkpt><trkpt lat="48.8714027404785" lon="2.27417206764221"><ele>48.6293</ele><time>2007-04-15T09:43:56Z</time></trkpt><trkpt lat="48.8713569641113" lon="2.27434539794922"><ele>48.5839</ele><time>2007-04-15T09:43:57Z</time></trkpt><trkpt lat="48.8713073730469" lon="2.27453136444092"><ele>48.4849</ele><time>2007-04-15T09:43:58Z</time></trkpt><trkpt lat="48.8712387084961" lon="2.27471280097961"><ele>48.354</ele><time>2007-04-15T09:43:59Z</time></trkpt><trkpt lat="48.8711967468262" lon="2.27488327026367"><ele>48.158</ele><time>2007-04-15T09:44:00Z</time></trkpt><trkpt lat="48.871166229248" lon="2.27507400512695"><ele>48.4269</ele><time>2007-04-15T09:44:01Z</time></trkpt><trkpt lat="48.8712043762207" lon="2.27530479431152"><ele>49.5405</ele><time>2007-04-15T09:44:02Z</time></trkpt><trkpt lat="48.8712272644043" lon="2.27536368370056"><ele>49.6823</ele><time>2007-04-15T09:44:03Z</time></trkpt><trkpt lat="48.8713073730469" lon="2.27552676200867"><ele>49.6466</ele><time>2007-04-15T09:44:04Z</time></trkpt><trkpt lat="48.871410369873" lon="2.27567887306213"><ele>48.8132</ele><time>2007-04-15T09:44:05Z</time></trkpt><trkpt lat="48.8715019226074" lon="2.27581000328064"><ele>47.582</ele><time>2007-04-15T09:44:06Z</time></trkpt><trkpt lat="48.8716011047363" lon="2.27596020698547"><ele>45.9184</ele><time>2007-04-15T09:44:07Z</time></trkpt><trkpt lat="48.8716812133789" lon="2.2761082649231"><ele>44.6874</ele><time>2007-04-15T09:44:08Z</time></trkpt><trkpt lat="48.8717155456543" lon="2.27635836601257"><ele>44.4808</ele><time>2007-04-15T09:44:09Z</time></trkpt><trkpt lat="48.8717460632324" lon="2.27650499343872"><ele>44.4244</ele><time>2007-04-15T09:44:10Z</time></trkpt><trkpt lat="48.8718032836914" lon="2.27679800987244"><ele>45.0138</ele><time>2007-04-15T09:44:11Z</time></trkpt><trkpt lat="48.8718414306641" lon="2.27697205543518"><ele>45.9769</ele><time>2007-04-15T09:44:12Z</time></trkpt><trkpt lat="48.8718681335449" lon="2.27716088294983"><ele>47.0584</ele><time>2007-04-15T09:44:13Z</time></trkpt><trkpt lat="48.8718948364258" lon="2.27742433547974"><ele>48.6314</ele><time>2007-04-15T09:44:14Z</time></trkpt><trkpt lat="48.8719177246094" lon="2.27765011787415"><ele>49.9606</ele><time>2007-04-15T09:44:15Z</time></trkpt><trkpt lat="48.8719444274902" lon="2.27783799171448"><ele>51.0185</ele><time>2007-04-15T09:44:16Z</time></trkpt><trkpt lat="48.8719711303711" lon="2.27802729606628"><ele>51.966</ele><time>2007-04-15T09:44:17Z</time></trkpt><trkpt lat="48.8719902038574" lon="2.27824354171753"><ele>52.8529</ele><time>2007-04-15T09:44:18Z</time></trkpt><trkpt lat="48.8720092773438" lon="2.27839040756226"><ele>53.0804</ele><time>2007-04-15T09:44:19Z</time></trkpt><trkpt lat="48.8720359802246" lon="2.27864193916321"><ele>52.4668</ele><time>2007-04-15T09:44:20Z</time></trkpt><trkpt lat="48.8720817565918" lon="2.27882862091064"><ele>52.0118</ele><time>2007-04-15T09:44:21Z</time></trkpt><trkpt lat="48.8720970153809" lon="2.27903437614441"><ele>51.4047</ele><time>2007-04-15T09:44:22Z</time></trkpt><trkpt lat="48.8721084594727" lon="2.27917003631592"><ele>51.0076</ele><time>2007-04-15T09:44:23Z</time></trkpt><trkpt lat="48.8721351623535" lon="2.279376745224"><ele>51.4415</ele><time>2007-04-15T09:44:24Z</time></trkpt><trkpt lat="48.8721733093262" lon="2.27958917617798"><ele>51.7951</ele><time>2007-04-15T09:44:25Z</time></trkpt><trkpt lat="48.8721923828125" lon="2.27969932556152"><ele>51.9438</ele><time>2007-04-15T09:44:26Z</time></trkpt><trkpt lat="48.8721923828125" lon="2.27971005439758"><ele>51.9628</ele><time>2007-04-15T09:44:27Z</time></trkpt><trkpt lat="48.8721961975098" lon="2.27977204322815"><ele>52.0593</ele><time>2007-04-15T09:44:28Z</time></trkpt><trkpt lat="48.872200012207" lon="2.27978539466858"><ele>52.0691</ele><time>2007-04-15T09:44:29Z</time></trkpt></trkseg></trk></gpx>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.emulator/src/main/resources/test.gpx b/kura/org.eclipse.kura.emulator/src/main/resources/test.gpx
new file mode 100644
index 0000000000000000000000000000000000000000..285bbfab2fba79c7aa216d6288c852da6e189327
--- /dev/null
+++ b/kura/org.eclipse.kura.emulator/src/main/resources/test.gpx
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="MotionX Live" version="1.1">
+  <trk>
+    <name>Track 002</name>
+    <desc>Mar 25, 2010 10:19 am</desc>
+    <trkseg>
+      <trkpt lat="39.757509" lon="-104.902044">
+        <ele>1602.000000</ele>
+        <time>2010-03-25T16:19:20Z</time>
+      </trkpt>
+      <trkpt lat="39.757484" lon="-104.902000">
+        <ele>1605.000000</ele>
+        <time>2010-03-25T16:19:22Z</time>
+      </trkpt>
+      <trkpt lat="39.757424" lon="-104.901952">
+        <ele>1606.000000</ele>
+        <time>2010-03-25T16:19:25Z</time>
+      </trkpt>
+      <trkpt lat="39.757336" lon="-104.901900">
+        <ele>1608.000000</ele>
+        <time>2010-03-25T16:19:27Z</time>
+      </trkpt>
+      <trkpt lat="39.757266" lon="-104.901870">
+        <ele>1608.000000</ele>
+        <time>2010-03-25T16:19:29Z</time>
+      </trkpt>
+      <trkpt lat="39.757215" lon="-104.901857">
+        <ele>1607.000000</ele>
+        <time>2010-03-25T16:19:31Z</time>
+      </trkpt>
+      <trkpt lat="39.757112" lon="-104.901898">
+        <ele>1607.000000</ele>
+        <time>2010-03-25T16:19:34Z</time>
+      </trkpt>
+      <trkpt lat="39.757058" lon="-104.902024">
+        <ele>1607.000000</ele>
+        <time>2010-03-25T16:19:37Z</time>
+      </trkpt>
+      <trkpt lat="39.757033" lon="-104.902128">
+        <ele>1608.000000</ele>
+        <time>2010-03-25T16:19:39Z</time>
+      </trkpt>
+      <trkpt lat="39.757035" lon="-104.902465">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:19:41Z</time>
+      </trkpt>
+      <trkpt lat="39.757070" lon="-104.902841">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:19:44Z</time>
+      </trkpt>
+      <trkpt lat="39.757109" lon="-104.903020">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:19:46Z</time>
+      </trkpt>
+      <trkpt lat="39.757125" lon="-104.903049">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:19:48Z</time>
+      </trkpt>
+      <trkpt lat="39.757136" lon="-104.903147">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:20:00Z</time>
+      </trkpt>
+      <trkpt lat="39.757182" lon="-104.903329">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:20:03Z</time>
+      </trkpt>
+      <trkpt lat="39.757324" lon="-104.903434">
+        <ele>1609.000000</ele>
+        <time>2010-03-25T16:20:06Z</time>
+      </trkpt>
+      <trkpt lat="39.757858" lon="-104.903452">
+        <ele>1610.000000</ele>
+        <time>2010-03-25T16:20:09Z</time>
+      </trkpt>
+      <trkpt lat="39.758390" lon="-104.903485">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:20:12Z</time>
+      </trkpt>
+      <trkpt lat="39.758770" lon="-104.903476">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:20:14Z</time>
+      </trkpt>
+      <trkpt lat="39.759124" lon="-104.903450">
+        <ele>1611.000000</ele>
+        <time>2010-03-25T16:20:16Z</time>
+      </trkpt>
+      <trkpt lat="39.759446" lon="-104.903386">
+        <ele>1612.000000</ele>
+        <time>2010-03-25T16:20:18Z</time>
+      </trkpt>
+      <trkpt lat="39.759743" lon="-104.903212">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:20Z</time>
+      </trkpt>
+      <trkpt lat="39.760028" lon="-104.903071">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:22Z</time>
+      </trkpt>
+      <trkpt lat="39.760313" lon="-104.902947">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:24Z</time>
+      </trkpt>
+      <trkpt lat="39.760608" lon="-104.902876">
+        <ele>1614.000000</ele>
+        <time>2010-03-25T16:20:26Z</time>
+      </trkpt>
+      <trkpt lat="39.760931" lon="-104.902853">
+        <ele>1613.000000</ele>
+        <time>2010-03-25T16:20:29Z</time>
+      </trkpt>
+    </trkseg>
+  </trk>
+</gpx>
+      
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.clock/.gitignore b/kura/org.eclipse.kura.linux.clock/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.clock/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.clock/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..5ec50bfc8fd76bb3b961bfc65d5f484f9b174835
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.clock
+Bundle-SymbolicName: org.eclipse.kura.linux.clock;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: org.apache.commons.net;version="3.1.0",
+ org.apache.commons.net.ntp;version="3.1.0",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.clock; version="[0.2, 0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+
diff --git a/kura/org.eclipse.kura.linux.clock/OSGI-INF/clock.xml b/kura/org.eclipse.kura.linux.clock/OSGI-INF/clock.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ddd98d184fa3df9016de72b4cd28d65a1e73da86
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/OSGI-INF/clock.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.clock.ClockService">
+   <implementation class="org.eclipse.kura.linux.clock.ClockServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.clock.ClockService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.clock.ClockService"/>
+   <reference name="EventAdmin" 
+              cardinality="1..1" 
+              policy="static"
+              bind="setEventAdmin"
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.clock/OSGI-INF/metatype/org.eclipse.kura.clock.ClockService.xml b/kura/org.eclipse.kura.linux.clock/OSGI-INF/metatype/org.eclipse.kura.clock.ClockService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b4cde9d4bec737f564fe34a0d4d96e7a5bf07843
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/OSGI-INF/metatype/org.eclipse.kura.clock.ClockService.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.clock.ClockService" 
+         name="ClockService" 
+         description="ClockService Configuration">
+        
+        <Icon resource="ClockService" size="32"/>
+        
+       	<AD id="enabled"
+            name="enabled"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="true"
+            description="Whether or not to enable the ClockService"/>
+            
+        <AD id="clock.set.hwclock"  
+            name="clock.set.hwclock"
+            type="Boolean"
+            cardinality="0" 
+            required="false"
+            default="true" 
+            description="Whether or not to sync the system hardware clock after the system time gets set"/>
+        
+        <AD id="clock.provider"  
+            name="clock.provider"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="java-ntp" 
+            description="Source for setting the system clock">
+           <Option label="java-ntp" value="java-ntp"/>
+           <Option label="ntpd"     value="ntpd"/>
+        </AD>
+
+        <AD id="clock.ntp.host"  
+            name="clock.ntp.host"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="0.pool.ntp.org" 
+            description="The hostname that provides the system time via NTP"/>
+
+        <AD id="clock.ntp.port"  
+            name="clock.ntp.port"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="123" 
+            description="The port number that provides the system time via NTP"/>
+
+        <AD id="clock.ntp.timeout"  
+            name="clock.ntp.timeout"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="10000" 
+            description="The NTP timeout in milliseconds"/>
+
+        <AD id="clock.ntp.max-retry"  
+            name="clock.ntp.max-retry"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="10" 
+            description="When sync fails the system retries every minute for max-retry times. After, the next retry will occur on next refresh-interval"/>
+
+        <AD id="clock.ntp.refresh-interval"  
+            name="clock.ntp.refresh-interval"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="3600" 
+            description="Whether or not to sync the clock and if so, the frequency in seconds.  If less than 0 - no update, if equal to zero - sync once at startup, if greater than zero - the frequency in seconds to perform a new clock sync"/>
+
+    </OCD>
+    <Designate pid="org.eclipse.kura.clock.ClockService">
+        <Object ocdref="org.eclipse.kura.clock.ClockService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.linux.clock/about.html b/kura/org.eclipse.kura.linux.clock/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.clock/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.clock/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.clock/build.properties b/kura/org.eclipse.kura.linux.clock/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b0ac25d351ddfcca22c8c615d06fc5374ce964da
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/build.properties
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.kura.core,\
+                     org.apache.commons.net,\
+                     org.apache.commons.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.linux.clock/pom.xml b/kura/org.eclipse.kura.linux.clock/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bbd4dc191c83605936690dfbece68c0f57fbc1f6
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.clock</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/AbstractNtpClockSyncProvider.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/AbstractNtpClockSyncProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c8f784b6123e8d692a955bef954f80dee0125ad
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/AbstractNtpClockSyncProvider.java
@@ -0,0 +1,181 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractNtpClockSyncProvider implements ClockSyncProvider
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(AbstractNtpClockSyncProvider.class);
+	
+	protected Map<String, Object> m_properties;
+	protected ClockSyncListener   m_listener;
+
+	protected String                      m_ntpHost;
+	protected int                         m_ntpPort;
+	protected int                         m_ntpTimeout;
+	protected int                         m_refreshInterval;
+	protected Date                        m_lastSync;
+	protected ScheduledExecutorService    m_scheduler;
+	protected int                         m_maxRetry;
+	protected int                         m_numRetry;
+	protected boolean					  m_isSynced;
+	protected int						  m_syncCount;	
+
+	
+	@Override
+	public void init(Map<String, Object> properties, ClockSyncListener listener) throws KuraException
+	{
+		m_properties = properties;
+		m_listener   = listener;
+		
+		readProperties();
+	}
+
+	@Override
+	public void start() throws KuraException 
+	{		
+		if (m_refreshInterval < 0) {			
+			// Never do any update. So Nothing to do.
+			s_logger.info("No clock update required");
+			if (m_scheduler != null) {
+				m_scheduler.shutdown();
+				m_scheduler = null;
+			}
+		}
+		else if (m_refreshInterval == 0) {
+			// Perform one clock update - but in a thread.
+			s_logger.info("Perform clock update just once");
+			if (m_scheduler != null) {
+				m_scheduler.shutdown();
+				m_scheduler = null;
+			}
+			m_scheduler = Executors.newSingleThreadScheduledExecutor();
+			
+			//call recursive retry method for setting the clock
+			scheduleOnce();	
+		}
+		else {
+			// Perform periodic clock updates.
+			s_logger.info("Perform periodic clock updates every {} sec", m_refreshInterval);
+			if (m_scheduler != null) {
+				m_scheduler.shutdown();
+				m_scheduler = null;
+			}
+			m_scheduler = Executors.newSingleThreadScheduledExecutor();
+			m_scheduler.scheduleAtFixedRate(new Runnable() {
+				public void run() {
+					Thread.currentThread().setName("AbstractNtpClockSyncProvider:schedule");
+					if(!m_isSynced){
+						m_syncCount=0;
+						try { 
+							s_logger.info("Try to sync clock ("+m_numRetry+")");
+							syncClock(); 
+							s_logger.info("Clock synced");
+							m_isSynced=true;
+							m_numRetry=0;
+						}
+						catch(KuraException e) {
+							m_numRetry++;
+							if(m_numRetry>=m_maxRetry) m_isSynced=true; // give up retry
+							s_logger.error("Error Synchronizing Clock", e);
+						}
+					}
+					else{
+						m_syncCount++;
+						if((m_syncCount*60)>=m_refreshInterval-1){
+							m_isSynced=false;
+							m_numRetry=0;
+						}
+					}
+				}
+			}, 0, 60, TimeUnit.SECONDS);
+		}		
+	}
+	
+	private void scheduleOnce() {
+		if(m_scheduler != null) {
+			m_scheduler.schedule(new Runnable() {
+				public void run() {
+					Thread.currentThread().setName("AbstractNtpClockSyncProvider:scheduleOnce");
+					try {
+						syncClock();
+					} catch(KuraException e) {
+						s_logger.error("Error Synchronizing Clock - retrying", e);
+						scheduleOnce();
+					}
+				}
+			}, 1, TimeUnit.SECONDS);
+		}
+	}
+
+
+	@Override
+	public void stop() throws KuraException {
+		if (m_scheduler != null) {
+			m_scheduler.shutdown();
+			m_scheduler = null;
+		}
+	}
+
+	@Override
+	public Date getLastSync() {
+		return m_lastSync;
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private/Protected Methods
+	//
+	// ----------------------------------------------------------------
+
+	private void readProperties() throws KuraException
+	{
+		m_ntpHost = (String) m_properties.get("clock.ntp.host");
+		if (m_ntpHost == null) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, "clock.ntp.host");
+		}
+		
+		m_ntpPort = 123;
+		if (m_properties.containsKey("clock.ntp.port")) {
+			m_ntpPort = (Integer) m_properties.get("clock.ntp.port");
+		}
+
+		m_ntpTimeout = 10000;
+		if (m_properties.containsKey("clock.ntp.timeout")) {
+			m_ntpTimeout = (Integer) m_properties.get("clock.ntp.timeout");
+		}
+
+		m_refreshInterval = 0;
+		if (m_properties.containsKey("clock.ntp.refresh-interval")) {
+			m_refreshInterval = (Integer) m_properties.get("clock.ntp.refresh-interval");
+		}		
+		
+		m_maxRetry = 0;
+		if (m_properties.containsKey("clock.ntp.max-retry")) {
+			m_maxRetry = (Integer) m_properties.get("clock.ntp.max-retry");
+		}
+	}
+	
+	
+	protected abstract void syncClock() throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockServiceImpl.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a053a481f6ac7cfa5b28b92cc9706a7d7184153
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockServiceImpl.java
@@ -0,0 +1,238 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.clock.ClockEvent;
+import org.eclipse.kura.clock.ClockService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.EventAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClockServiceImpl implements ConfigurableComponent, ClockService, ClockSyncListener
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(ClockServiceImpl.class);
+
+	@SuppressWarnings("unused")
+	private ComponentContext      m_ctx;
+	private EventAdmin            m_eventAdmin;
+	private Map<String,Object>    m_properties;
+	private ClockSyncProvider     m_provider;
+	private boolean 			  m_configEnabled;
+		
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = eventAdmin;
+	}
+
+	public void unsetEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = null;
+	}
+
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		// save the properties
+		m_properties = properties;
+		
+		s_logger.info("Activate. Current Time: {}", new Date());
+
+		// save the bundle context
+		m_ctx = componentContext;		
+		
+		try {		
+			if(m_properties.get("enabled") != null) {
+				m_configEnabled = (Boolean) m_properties.get("enabled");
+			} else {
+				m_configEnabled = false;
+			}
+			
+			if(m_configEnabled) {
+				// start the provider
+				startClockSyncProvider();
+			}
+		}
+		catch (Throwable t) {
+			s_logger.error("Error updating ClockService Configuration", t);
+		}
+	}
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("Deactivate...");
+		try {
+			stopClockSyncProvider();
+		}
+		catch (Throwable t) {
+			s_logger.error("Error deactivate ClockService", t);
+		}
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("Updated...");		
+		try {
+
+			// save the properties
+			m_properties = properties;
+			
+			if(m_properties.get("enabled") != null) {
+				m_configEnabled = (Boolean) m_properties.get("enabled");
+			} else {
+				m_configEnabled = false;
+				return;
+			}
+			
+			if(m_configEnabled) {
+				// start the provider
+				startClockSyncProvider();
+			}
+		}
+		catch (Throwable t) {
+			s_logger.error("Error updating ClockService Configuration", t);
+		}
+	}
+
+		
+	// ----------------------------------------------------------------
+	//
+	//   Master Client Management APIs
+	//
+	// ----------------------------------------------------------------
+	
+	@Override
+	public Date getLastSync() throws KuraException {
+		if (m_provider != null) {
+			return m_provider.getLastSync();
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Clock service not configured yet");
+		}
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+
+	private void startClockSyncProvider() throws KuraException
+	{
+		stopClockSyncProvider();
+		String provider = (String) m_properties.get("clock.provider");
+		if ("java-ntp".equals(provider)) {
+			m_provider = new JavaNtpClockSyncProvider();
+		}
+		else if ("ntpd".equals(provider)) {
+			m_provider = new NtpdClockSyncProvider();			
+		}
+		else if ("gps".equals(provider)) {
+			m_provider = new GpsClockSyncProvider();			
+		}
+		if (m_provider != null) {
+			m_provider.init(m_properties, this);
+			m_provider.start();
+		}
+	}
+
+	private void stopClockSyncProvider() throws KuraException 
+	{
+		if (m_provider != null) {
+			m_provider.stop();
+			m_provider = null;
+		}
+	}
+
+	/**
+	 * Called by the current ClockSyncProvider after each Clock synchronization
+	 */
+	public void onClockUpdate(long offset) {
+		
+		s_logger.info("Clock update. Offset: {}", offset);
+		
+		// set system clock if necessary
+		boolean bClockUpToDate = false;
+		if (offset != 0) {
+			long time = System.currentTimeMillis() + offset;
+			Process proc = null;
+			try {
+				proc = ProcessUtil.exec("date -s @"+time/1000);		//divide by 1000 to switch to seconds
+				proc.waitFor();
+				if (proc.exitValue() == 0) {
+					bClockUpToDate = true;
+					s_logger.info("System Clock Updated to {}", new Date());
+				}
+				else {
+					s_logger.error("Unexpected error while updating System Clock - it should've been {}", new Date());
+				}
+			} 
+			catch (Exception e) {
+				s_logger.error("Error updating System Clock", e);
+			}
+			finally {
+				ProcessUtil.destroy(proc);
+			}
+		}
+		else {
+			bClockUpToDate = true;
+		}
+		
+		// set hardware clock
+		boolean updateHwClock = false;
+		if (m_properties.containsKey("clock.set.hwclock")) {
+			updateHwClock = (Boolean) m_properties.get("clock.set.hwclock");
+		}
+		if (updateHwClock) {
+			Process proc = null;
+			try {
+				proc = ProcessUtil.exec("hwclock --utc --systohc");
+				proc.waitFor();
+				if (proc.exitValue() == 0) {
+					s_logger.info("Hardware Clock Updated");
+				}
+				else {
+					s_logger.error("Unexpected error while updating Hardware Clock");
+				}
+			} 
+			catch (Exception e) {
+				s_logger.error("Error updating Hardware Clock", e);
+			}
+			finally {
+				ProcessUtil.destroy(proc);
+			}
+		}
+		
+		// Raise the event
+		if (bClockUpToDate) {
+			m_eventAdmin.postEvent( new ClockEvent( new HashMap<String,Object>()));
+		}
+	}
+}
+
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockSyncListener.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockSyncListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0d4ab8ed44587ccf0662f6c7c64b78051648712
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockSyncListener.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+public interface ClockSyncListener 
+{
+	public void onClockUpdate(long offset);
+}
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockSyncProvider.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockSyncProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..503bc071e26ef293401e545d9f448c920d7f79d4
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/ClockSyncProvider.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.eclipse.kura.KuraException;
+
+public interface ClockSyncProvider 
+{
+	public void init(Map<String,Object> properties, ClockSyncListener listener) throws KuraException;
+
+	public void start() throws KuraException;
+
+	public void stop() throws KuraException;
+	
+	public Date getLastSync();
+
+}
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/GpsClockSyncProvider.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/GpsClockSyncProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c9be7cec819686eeafa1b6b1df795cd2a26ed8a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/GpsClockSyncProvider.java
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+import java.util.Date;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.position.PositionLockedEvent;
+import org.eclipse.kura.position.PositionService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GpsClockSyncProvider implements ClockSyncProvider, EventHandler {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(GpsClockSyncProvider.class);
+	
+	private PositionService		  m_positionService;
+	protected Map<String, Object> m_properties;
+	protected ClockSyncListener   m_listener;
+	protected int                 m_refreshInterval;
+	protected Date                m_lastSync;
+	protected boolean			  m_waitForLocked;
+	protected ScheduledExecutorService m_scheduler;
+
+	// ----------------------------------------------------------------
+	//
+	//   Wait for GPS locked event if single clock update
+	//
+	// ----------------------------------------------------------------	
+	
+	public void handleEvent(Event event) {
+		if(PositionLockedEvent.POSITION_LOCKED_EVENT_TOPIC.contains(event.getTopic())){
+			if((m_waitForLocked)&&(m_refreshInterval == 0)){
+				s_logger.info("Received Position Locked event");
+				try { synchClock(); }
+				catch(KuraException e) {
+					s_logger.error("Error Synchronizing Clock", e);
+				}
+			}
+		}
+	}
+
+	public GpsClockSyncProvider() {
+	}
+
+	@Override
+	public void init(Map<String, Object> properties, ClockSyncListener listener)
+			throws KuraException {
+		s_logger.debug("initiing the GPS clock sync provider");
+		m_properties = properties;
+		m_listener   = listener;
+		
+		m_waitForLocked=false;
+		m_refreshInterval = 0;
+		if (m_properties.containsKey("clock.ntp.refresh-interval")) {
+			m_refreshInterval = (Integer) m_properties.get("clock.ntp.refresh-interval");
+		}	
+		
+		try {
+			// looking for a valid PositionService from SCR
+			BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+			ServiceReference<PositionService> scrServiceRef = bundleContext.getServiceReference(PositionService.class);
+			m_positionService = bundleContext.getService(scrServiceRef);
+	
+			// install event listener for GPS locked event
+			Dictionary props = new Hashtable<String, String>();
+			String[] topic = {PositionLockedEvent.POSITION_LOCKED_EVENT_TOPIC};
+			props.put(EventConstants.EVENT_TOPIC, topic);
+			bundleContext.registerService(EventHandler.class.getName(), this, props);
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Failed to initialize the GpsClockSyncProvider", e);
+		}
+		
+		s_logger.debug("done initiing the GPS clock sync provider");
+	}
+
+	@Override
+	public void start() throws KuraException {
+		
+		if (m_refreshInterval < 0) {			
+			// Never do any update. So Nothing to do.
+			s_logger.info("No clock update required");
+		}
+		else if (m_refreshInterval == 0) {
+			// Perform a single clock update.
+			s_logger.info("Perform single clock update.");
+			try { 
+				synchClock(); 
+			}
+			catch(KuraException e) {
+				s_logger.error("Error Synchronizing Clock", e);
+			}
+		}
+		else {
+			// Perform periodic clock updates.
+			s_logger.info("Perform periodic clock updates every {} sec", m_refreshInterval);
+			if (m_scheduler != null) {
+				m_scheduler.shutdown();
+				m_scheduler = null;
+			}
+			m_scheduler = Executors.newSingleThreadScheduledExecutor();
+			m_scheduler.scheduleAtFixedRate(new Runnable() {
+				public void run() {
+					Thread.currentThread().setName("GpsClockSyncProvider");
+					try { synchClock(); }
+					catch(KuraException e) {
+						s_logger.error("Error Synchronizing Clock", e);
+					}
+				}
+			}, 0, m_refreshInterval, TimeUnit.SECONDS);
+		}		
+	}
+
+	@Override
+	public void stop() throws KuraException {
+		if (m_scheduler != null) {
+			m_scheduler.shutdown();
+			m_scheduler = null;
+		}
+		m_positionService=null;
+	}
+
+	@Override
+	public Date getLastSync() {
+		return m_lastSync;
+	}
+
+	// ----------------------------------------------------------------
+	//
+	//   The actual time sync method
+	//   The GPS can give time but not date 
+	//
+	// ----------------------------------------------------------------	
+	
+	protected void synchClock() throws KuraException
+	{
+		Process procDate = null;
+		Process procTime = null;
+		try {			
+			if(m_positionService!=null){
+				if(m_positionService.isLocked()){
+					String gpsTime = m_positionService.getNmeaTime();
+					String gpsDate = m_positionService.getNmeaDate();
+					// Execute a native Linux command to perform the set time and date.
+					if(!gpsDate.isEmpty()){
+						String YY = gpsDate.substring(4, 6);
+						String MM = gpsDate.substring(2, 4);
+						String DD = gpsDate.substring(0, 2);
+						String commandDate ="date +%Y%m%d -s \"20"+YY+MM+DD+"\"";
+						procDate = ProcessUtil.exec(commandDate);
+						procDate.waitFor();
+						if (procDate.exitValue() == 0) {
+							s_logger.info("System Clock Synchronized with GPS, date = {} ",gpsDate);
+							m_lastSync = new Date();
+							if(!gpsTime.isEmpty()){
+								String hh = gpsTime.substring(0, 2);
+								String mm = gpsTime.substring(2, 4);
+								String ss = gpsTime.substring(4, 6);
+								String commandTime ="date +%T -u -s \""+hh+":"+mm+":"+ss+"\""; // time is in UTC => -u
+								procTime = ProcessUtil.exec(commandTime);
+								procTime.waitFor();
+								if (procTime.exitValue() == 0) {
+									s_logger.info("System Clock Synchronized with GPS, time = {}",gpsTime);
+									m_lastSync = new Date();
+						            m_waitForLocked=false;
+								}
+								else {
+									s_logger.error("Unexpected error while Synchronizing System Clock with GPS");
+									m_waitForLocked=true;
+								}
+							}
+				            m_waitForLocked=false;
+				            // Call update method with 0 offset to ensure the clock event gets fired and the HW clock
+							// is updated if desired.
+							m_listener.onClockUpdate(0);
+						}
+						else {
+							s_logger.error("Unexpected error while Synchronizing System Clock with GPS");
+							m_waitForLocked=true;
+						}
+					}
+				}
+				else
+					m_waitForLocked=true;
+			}
+		} 
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(procDate);
+			ProcessUtil.destroy(procTime);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/JavaNtpClockSyncProvider.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/JavaNtpClockSyncProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..475333637b71e53c08b6ab84fb868d07b34c3241
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/JavaNtpClockSyncProvider.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+import java.net.InetAddress;
+import java.util.Date;
+
+import org.apache.commons.net.ntp.NTPUDPClient;
+import org.apache.commons.net.ntp.TimeInfo;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JavaNtpClockSyncProvider extends AbstractNtpClockSyncProvider
+{
+	@SuppressWarnings("unused")
+	private static final Logger s_logger = LoggerFactory.getLogger(JavaNtpClockSyncProvider.class);
+	
+	
+	// ----------------------------------------------------------------
+	//
+	//   Concrete Methods
+	//
+	// ----------------------------------------------------------------	
+	
+	protected void syncClock() throws KuraException
+	{
+		// connect and get the delta
+		NTPUDPClient ntpClient = new NTPUDPClient();
+        ntpClient.setDefaultTimeout(m_ntpTimeout);
+        try {
+            ntpClient.open();
+            InetAddress ntpHostAddr = InetAddress.getByName(m_ntpHost);
+            TimeInfo info = ntpClient.getTime(ntpHostAddr, m_ntpPort);
+            
+            m_lastSync = new Date();
+            info.computeDetails();
+            
+            m_listener.onClockUpdate(info.getOffset());
+        } 
+        catch (Exception e) {
+        	throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+        }
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/NtpdClockSyncProvider.java b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/NtpdClockSyncProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..53934c595c5d2cef8e40e67ef1510d538afde727
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.clock/src/main/java/org/eclipse/kura/linux/clock/NtpdClockSyncProvider.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.clock;
+
+import java.util.Date;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NtpdClockSyncProvider extends AbstractNtpClockSyncProvider
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(NtpdClockSyncProvider.class);
+
+	// ----------------------------------------------------------------
+	//
+	//   Concrete Methods
+	//
+	// ----------------------------------------------------------------	
+	
+	protected void syncClock() throws KuraException
+	{
+		Process proc = null;
+		try {			
+			// Execute a native Linux command to perform the NTP time sync.
+			int ntpTimeout = m_ntpTimeout / 1000;
+			proc = ProcessUtil.exec("ntpdate -t "+ntpTimeout+" "+m_ntpHost);
+			proc.waitFor();
+			if (proc.exitValue() == 0) {
+				s_logger.info("System Clock Synchronized with "+m_ntpHost);
+				m_lastSync = new Date();
+				
+				// Call update method with 0 offset to ensure the clock event gets fired and the HW clock
+				// is updated if desired.
+				m_listener.onClockUpdate(0);
+			}
+			else {
+				s_logger.error("Unexpected error while Synchronizing System Clock with "+m_ntpHost);
+			}
+		} 
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.command/.gitignore b/kura/org.eclipse.kura.linux.command/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.command/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.command/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..875f87d7977b87447ce5fac40d8b1864124491fc
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.command
+Bundle-SymbolicName: org.eclipse.kura.linux.command;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.command; version="[0.2,0.3)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.slf4j;version="1.6.4"
+
diff --git a/kura/org.eclipse.kura.linux.command/OSGI-INF/command.xml b/kura/org.eclipse.kura.linux.command/OSGI-INF/command.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a4c1bb8bba7b0f8c8aee02b7bc560b5bf720eafd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/OSGI-INF/command.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.command.CommandService">
+   <implementation class="org.eclipse.kura.linux.command.CommandServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.command.CommandService"/>
+   </service>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.command/about.html b/kura/org.eclipse.kura.linux.command/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.command/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.command/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.command/build.properties b/kura/org.eclipse.kura.linux.command/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e79ec009d2f478daafe3a0948a5778192d098b09
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/build.properties
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.kura.core
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.linux.command/pom.xml b/kura/org.eclipse.kura.linux.command/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f57b3429830582a94d8b15bc72ec86bbaae775e5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.command</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.command/src/main/java/org/eclipse/kura/linux/command/CommandServiceImpl.java b/kura/org.eclipse.kura.linux.command/src/main/java/org/eclipse/kura/linux/command/CommandServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..67fd9146fc2be1e08f0285f74a8423726a2bb635
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/src/main/java/org/eclipse/kura/linux/command/CommandServiceImpl.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.command;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.command.CommandService;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CommandServiceImpl implements CommandService {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(CommandServiceImpl.class);
+	
+	private static final String SCRIPT_FILE = System.getProperty("java.io.tmpdir") + File.separator + "runCmd.sh";
+	
+	private File	m_scriptFile;
+
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	protected void activate() {
+		s_logger.debug("Activating...");
+	}
+	
+	protected void deactivate() {
+		s_logger.debug("Deactivating...");
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+	@Override
+	public String execute(String cmd) throws KuraException {
+		if (cmd == null) {
+			s_logger.debug("null command");
+			return "null command";
+		}
+	
+		// Delete script file if it exists
+		m_scriptFile = new File(SCRIPT_FILE);
+		if (m_scriptFile.exists()) {
+			try {
+				m_scriptFile.delete();
+			} catch (SecurityException se) {
+				s_logger.error("File " + m_scriptFile + " cannot be deleted");
+			}
+		}
+		
+		// Create script file and set appropriate permissions
+		createScript(cmd);
+		setPermissions();
+		
+		// Run script
+		String output = runScript();
+		
+		return output;
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+	private void createScript(String cmd) throws KuraException {
+		try {
+			cmd = "#!/bin/sh\n\n" + 
+					"cd " + System.getProperty("java.io.tmpdir") + "\n" +
+					cmd;
+			
+			FileOutputStream fos = new FileOutputStream(m_scriptFile);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(cmd);
+			pw.write("\n");
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch (IOException e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	private void setPermissions() throws KuraException {
+		Process procChmod = null;
+		Process procDos = null;
+		
+		try {
+			procChmod = ProcessUtil.exec("chmod 700 " + m_scriptFile.toString());
+			procChmod.waitFor();
+			
+			procDos = ProcessUtil.exec("dos2unix " + m_scriptFile.toString());
+			procDos.waitFor();
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		} finally {
+			ProcessUtil.destroy(procChmod);
+			ProcessUtil.destroy(procDos);
+		}
+		
+	}
+	
+	private String runScript() throws KuraException{
+		Process procUserScript = null;
+		InputStream is = null;
+		InputStream es = null;
+		StreamGobbler isg = null;
+		StreamGobbler esg = null;
+		
+		try {
+			procUserScript = ProcessUtil.exec("sh " + m_scriptFile.toString());
+			
+			is = procUserScript.getInputStream();
+			es = procUserScript.getErrorStream();
+			
+			isg = new StreamGobbler(is, "stdout");
+			esg = new StreamGobbler(es, "stderr");
+			isg.start();
+			esg.start();
+			
+			procUserScript.waitFor();
+			isg.join(1000);
+			esg.join(1000);
+			
+			if (procUserScript.exitValue() == 0) {
+				return isg.getStreamAsString();
+			}
+			else {
+				return esg.getStreamAsString();
+			}
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		} finally {
+			ProcessUtil.destroy(procUserScript);
+		}
+	}
+	
+}
diff --git a/kura/org.eclipse.kura.linux.command/src/main/java/org/eclipse/kura/linux/command/StreamGobbler.java b/kura/org.eclipse.kura.linux.command/src/main/java/org/eclipse/kura/linux/command/StreamGobbler.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed3de8462571c5f16a0b3e472d5fddb8ff970b5d
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.command/src/main/java/org/eclipse/kura/linux/command/StreamGobbler.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.command;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class StreamGobbler extends Thread {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(StreamGobbler.class);
+	
+	private static final int BUF_LEN = 1024;
+	private static final int MAX_BYTES = 100 * BUF_LEN;
+	
+	private InputStream 	m_is;
+	private String			m_streamType;
+	private StringBuilder	m_sb;
+	
+	public StreamGobbler(InputStream is, String streamType) {
+		m_is = is;
+		m_streamType = streamType;
+		m_sb = new StringBuilder();
+	}
+	
+	public String getStreamAsString() {
+		return m_sb.toString();
+	}
+	
+	public void run() {
+		InputStreamReader isr = new InputStreamReader(m_is);
+		BufferedReader br = new BufferedReader(isr);
+		
+		try {
+			int count = 0;
+			char[] cbuf = new char[BUF_LEN];
+			int read = -1;
+			
+			while ((read = br.read(cbuf)) != -1) {
+				if (count < MAX_BYTES) {
+					count += read;
+					m_sb.append(cbuf, 0, read);
+				}
+			}
+		} catch (IOException ioe) {
+			s_logger.error(ioe.getMessage());
+		} finally {
+			try {
+				br.close();
+				m_is.close();
+			} catch (IOException ioe) {
+				s_logger.error(ioe.getMessage());
+			}
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net.test/.gitignore b/kura/org.eclipse.kura.linux.net.test/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.net.test/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.net.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..8f5f4073c44e21e0a16c38fb80c19cf7ed4075e3
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.net.test
+Bundle-SymbolicName: org.eclipse.kura.linux.net.test;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.core.net.util; version="[0.2,1.0)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.dhcp; version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.iptables; version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.util; version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.wifi; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,1.0)",
+ org.eclipse.kura.net.dhcp; version="[0.2,1.0)",
+ org.eclipse.kura.net.wifi; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.osgi.framework;version="1.4.0",
+ org.osgi.service.component;version="1.0.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+Service-Component: OSGI-INF/*.xml
+Fragment-Host: org.eclipse.kura.linux.net
+Unit-Test: true
+Bundle-ClassPath: .
+Require-Bundle: org.eclipse.kura.test;bundle-version="0.2.0",
+ org.junit;bundle-version="4.10.0"
diff --git a/kura/org.eclipse.kura.linux.net.test/OSGI-INF/DhcpServerTest.xml b/kura/org.eclipse.kura.linux.net.test/OSGI-INF/DhcpServerTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de1c98da4957f59ac94c4e6494742c508d7ae8bd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/OSGI-INF/DhcpServerTest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.kura.linux.test.net.DhcpServerTest">
+   <implementation class="org.eclipse.kura.linux.test.net.DhcpServerTest"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.net.test/OSGI-INF/IPTablesTest.xml b/kura/org.eclipse.kura.linux.net.test/OSGI-INF/IPTablesTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6cbfbfe4c0d79cacac7dc7de93f6a7af26313bfd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/OSGI-INF/IPTablesTest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.kura.linux.test.net.IPTablesTest">
+   <implementation class="org.eclipse.kura.linux.test.net.IPTablesTest"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.net.test/OSGI-INF/nettest.xml b/kura/org.eclipse.kura.linux.net.test/OSGI-INF/nettest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ae6b8e8b429a0869a12482a5d937d285a0a55f61
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/OSGI-INF/nettest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.kura.linux.test.net.NetworkTest">
+   <implementation class="org.eclipse.kura.linux.test.net.NetworkTest"/>
+   <reference bind="setNetworkService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkService" name="NetworkService" policy="static"/>
+   <reference bind="setSystemService" cardinality="1..1" interface="org.eclipse.kura.system.SystemService" name="SystemService" policy="static"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.net.test/about.html b/kura/org.eclipse.kura.linux.net.test/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net.test/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.net.test/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net.test/build.properties b/kura/org.eclipse.kura.linux.net.test/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7dc194183a61361d69f16d11b7b683aba93030fb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/build.properties
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/,\
+           src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = slf4j.api,\
+                     org.eclipse.kura.api,\
+                     org.eclipse.equinox.io,\
+                     org.junit,\
+                     org.eclipse.kura.test,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.core,\
+                     org.eclipse.kura.linux.net
+src.includes = about.html,\
+               about_files/
+
diff --git a/kura/org.eclipse.kura.linux.net.test/pom.xml b/kura/org.eclipse.kura.linux.net.test/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1258fefcb8dd609858e9f41f62f7c10c00642668
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.net.test</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/DhcpServerTest.java b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/DhcpServerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6de83f72e628788638cfd1620e2451a7e4180aa
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/DhcpServerTest.java
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.test.net;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.linux.net.dhcp.DhcpServerFactory;
+import org.eclipse.kura.linux.net.dhcp.DhcpServerImpl;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.dhcp.DhcpServerConfigIP4;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DhcpServerTest extends TestCase {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(DhcpServerTest.class);
+	
+	private static CountDownLatch dependencyLatch = new CountDownLatch(0);	// initialize with number of dependencies
+	
+	private static DhcpServerImpl s_dhcpServer;
+
+	private static final String TMPDIR = "/tmp/" + DhcpServerTest.class.getName();
+	private static String oldConfigBackup = TMPDIR + "/dhcpd.conf.backup";
+	
+	private static final String s_testInterface = "eth0";
+
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@BeforeClass
+	public void setUp() {
+		try {
+			s_dhcpServer = DhcpServerFactory.getInstance(s_testInterface, true, true);
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		
+		File tmpDir = new File(TMPDIR);
+		tmpDir.mkdirs();
+		 
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+			System.exit(1);
+		}
+		
+		// Backup current dhcpd config
+		try {
+			s_logger.info("Backing up current dhcpd config to " + oldConfigBackup);
+						
+			// Read current config from file
+			File oldConfig = new File(s_dhcpServer.getConfigFilename());
+			StringBuffer data = new StringBuffer();
+
+			if(oldConfig.exists()) {
+				FileReader fr = new FileReader(oldConfig);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+
+			// Write current config to file
+			FileOutputStream fos = new FileOutputStream(oldConfigBackup);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();		
+		} catch (Exception e) {
+			fail("Error backing up current dhcpd config");
+			System.exit(1);
+		}
+	}
+		
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testDisable() {
+		s_logger.info("Test disable dhcp server");
+
+		try {
+			s_dhcpServer.disable();
+			assertFalse("dhcp server is disabled", s_dhcpServer.isRunning());
+		} catch (Exception e) {
+			fail("testDisable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testEnable() {
+		s_logger.info("Test enable dhcp server");
+		
+		try {
+			// Setup note: Assumes the existence of the test interface, and that it can be brought up with an ip address
+			LinuxNetworkUtil.disableInterface(s_testInterface);
+			LinuxNetworkUtil.enableInterface(s_testInterface);
+
+			String ip = LinuxNetworkUtil.getCurrentIpAddress(s_testInterface);
+			assertNotNull(ip);
+			
+			String[] ip_parts = ip.split("\\.");
+			String subnet = ip_parts[0] + "." + ip_parts[1] + "." + ip_parts[2] + ".0";
+			String rangeFrom = ip_parts[0] + "." + ip_parts[1] + "." + ip_parts[2] + ".200";
+			String rangeTo = ip_parts[0] + "." + ip_parts[1] + "." + ip_parts[2] + ".255";
+			
+			DhcpServerConfigIP4 dhcpServerConfig4 = new DhcpServerConfigIP4(s_testInterface, true, (IP4Address) IPAddress.parseHostAddress(subnet), null, 
+																				(IP4Address) IPAddress.parseHostAddress("255.255.255.0"), 
+																				3600, 10000, (short) 24, (IP4Address) IPAddress.parseHostAddress(rangeFrom), 
+																				(IP4Address) IPAddress.parseHostAddress(rangeTo), true, null);
+			s_dhcpServer.setConfig(dhcpServerConfig4);
+			
+			s_dhcpServer.enable();
+			assertTrue("dhcp server is enabled", s_dhcpServer.isRunning());			
+		} catch (Exception e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testSettings() {
+		s_logger.info("Test get/set dhcp settings");
+
+		try {
+			boolean enabled = true;
+			boolean passDns = true;
+			int defaultLeaseTime = 13579;
+			int maximumLeaseTime = 97531;
+			IP4Address routerAddress = (IP4Address) IP4Address.parseHostAddress("192.168.2.1");
+			IP4Address rangeFrom = (IP4Address) IP4Address.parseHostAddress("192.168.2.33");
+			IP4Address rangeTo = (IP4Address) IP4Address.parseHostAddress("192.168.2.44");
+			IP4Address subnetMask = (IP4Address) IP4Address.parseHostAddress("255.255.255.0");
+			IP4Address subnet = (IP4Address) IPAddress.parseHostAddress(NetworkUtil.calculateNetwork(routerAddress.getHostAddress(), subnetMask.getHostAddress()));
+			short prefix = NetworkUtil.getNetmaskShortForm(subnetMask.getHostAddress());
+			List<IP4Address> dnsServers = new ArrayList<IP4Address>();
+			dnsServers.add((IP4Address)IPAddress.parseHostAddress("8.8.8.8"));
+	
+			DhcpServerConfigIP4 dhcpServerConfig4 = new DhcpServerConfigIP4(s_testInterface, enabled, subnet, routerAddress, subnetMask, defaultLeaseTime, maximumLeaseTime, prefix, rangeFrom, rangeTo, passDns, dnsServers);
+
+			// This assumes an existing subnet config from the previous test
+			s_dhcpServer.setConfig(dhcpServerConfig4);
+			s_dhcpServer.enable();
+			assertEquals(dhcpServerConfig4, s_dhcpServer.getDhcpServerConfig(enabled, passDns));
+			
+		} catch (Exception e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@AfterClass()
+	public void tearDown() {
+		
+		if (s_dhcpServer != null) {
+			try {
+				s_dhcpServer.disable();
+			} catch (Exception e) {
+				// continue anyway
+			}
+		}
+		
+		// Restore old dhcpd config
+		try {
+			s_logger.info("Restoring dhcpd config from " + oldConfigBackup);
+			
+			// Read current config from file
+			File backupFile = new File(oldConfigBackup);
+			StringBuffer data = new StringBuffer();
+			
+			if(backupFile.exists()) {
+				FileReader fr = new FileReader(backupFile);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+			
+			// Write backup config to file
+			FileOutputStream fos = new FileOutputStream(s_dhcpServer.getConfigFilename());
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch (Exception e) {
+			fail("Error restoring dhcpd config");
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/HostapdTest.java b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/HostapdTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f1a2492a86d964d7c8d481c497625118338f1ea
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/HostapdTest.java
@@ -0,0 +1,210 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.test.net;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.linux.net.wifi.Hostapd;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class HostapdTest extends TestCase {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(HostapdTest.class);
+	
+	private static CountDownLatch dependencyLatch = new CountDownLatch(0);	// initialize with number of dependencies
+	
+	private static Hostapd s_hostapd;
+
+	private static final String TMPDIR = "/tmp/" + HostapdTest.class.getName();
+	private static String oldConfigBackup = TMPDIR + "/hostapd.conf.backup";
+	
+	private static final String m_iface = "wlan0";
+	private static final String m_ssid = "HostapdTest";
+	private static final int m_channel = 10;
+	private static final String m_password = "123HostapdTestPassword";
+
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@BeforeClass
+	public void setUp() {
+		File tmpDir = new File(TMPDIR);
+		tmpDir.mkdirs();
+		
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+			System.exit(1);
+		}
+				
+		
+		// Backup current hostapd config
+		try {
+			s_logger.info("Backing up current hostapd config to " + oldConfigBackup);
+						
+			// Read current config from file
+			File oldConfig = new File(Hostapd.getConfigFilename());
+			StringBuffer data = new StringBuffer();
+
+			if(oldConfig.exists()) {
+				FileReader fr = new FileReader(oldConfig);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+
+			// Write current config to file
+			FileOutputStream fos = new FileOutputStream(oldConfigBackup);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch (Exception e) {
+			fail("Error backing up current hostapd config");
+			System.exit(1);
+		}
+		
+		// Initialize
+		try {
+			s_hostapd = Hostapd.getHostapd(m_iface, null, m_ssid,
+					WifiRadioMode.RADIO_MODE_80211g, m_channel,
+					WifiSecurity.SECURITY_WPA, m_password);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+		
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testDisable() {
+		s_logger.info("Test disable hostapd");
+
+		try {
+			s_hostapd.disable();
+			assertFalse("hostapd is disabled", s_hostapd.isEnabled());
+		} catch (Exception e) {
+			fail("testDisable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testEnable() {
+		s_logger.info("Test enable hostapd");
+		
+		try {
+			s_hostapd.enable();
+			assertTrue("hostapd is enabled", s_hostapd.isEnabled());
+			
+			String config = this.getConfig();
+			assertTrue("config specifies interface", config.contains("interface=" + m_iface));
+			assertTrue("config specifies ssid", config.contains("ssid=" + m_ssid));
+			assertTrue("config specifies channel", config.contains("channel=" + m_channel));
+			assertTrue("config specifies password", config.contains(m_password));
+			
+			s_logger.info("Disabling hostapd");
+			s_hostapd.disable();
+			assertFalse("hostapd is disabled", s_hostapd.isEnabled());
+		} catch (Exception e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+	
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@AfterClass()
+	public void tearDown() {
+		
+		if (s_hostapd != null) {
+			try {
+				s_hostapd.disable();
+			} catch (Exception e) {
+				// continue anyway
+			}
+		}
+		
+		// Restore old hostapd config
+		try {
+			s_logger.info("Restoring hostapd config from " + oldConfigBackup);
+			
+			// Read current config from file
+			File backupFile = new File(oldConfigBackup);
+			StringBuffer data = new StringBuffer();
+			
+			if(backupFile.exists()) {
+				FileReader fr = new FileReader(backupFile);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+			
+			// Write backup config to file
+			FileOutputStream fos = new FileOutputStream(Hostapd.getConfigFilename());
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch (Exception e) {
+			fail("Error restoring hostapd config");
+		}
+	}
+	
+	private String getConfig() {
+		// Read current config from file
+		File configFile = new File(Hostapd.getConfigFilename());
+		StringBuffer data = new StringBuffer();
+		
+		try {
+			if(configFile.exists()) {
+				FileReader fr = new FileReader(configFile);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return data.toString();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/IPTablesTest.java b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/IPTablesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..839777a288efcc8527ebdb460bbe77d51ffc6918
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/IPTablesTest.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.test.net;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.iptables.LinuxFirewall;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class IPTablesTest extends TestCase {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(IPTablesTest.class);
+	
+	private static CountDownLatch dependencyLatch = new CountDownLatch(0);	// initialize with number of dependencies
+	
+	private static LinuxFirewall s_firewall;
+
+	private static final String TMPDIR = "/tmp/" + IPTablesTest.class.getName();
+	private static String oldConfig = TMPDIR + "/iptables_" + new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
+
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@BeforeClass
+	public void setUp() {
+		s_firewall = LinuxFirewall.getInstance();
+		
+		File tmpDir = new File(TMPDIR);
+		tmpDir.mkdirs();
+		 
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+			System.exit(1);
+		}
+		
+		// Backup current iptables config
+		try {
+			s_logger.info("Backing up current iptables config to " + oldConfig);
+			
+			// Write current config to file
+			FileOutputStream fos = new FileOutputStream(oldConfig);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(getCurrentIptablesConfig());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();		
+		} catch (Exception e) {
+			fail("Error backing up current iptables config");
+			System.exit(1);
+		}
+	}
+		
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testDisable() {
+		s_logger.info("Test disable firewall");
+
+		try {
+			s_firewall.disable();
+			
+			String config = getCurrentIptablesConfig();
+			assertFalse("testDisable: config does not append to any tables", config.contains("-A"));
+		} catch (KuraException e) {
+			fail("testDisable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testEnable() {
+		s_logger.info("Test enable firewall");
+		
+		try {
+			s_firewall.enable();
+			
+			String config = getCurrentIptablesConfig();			
+			assertTrue("testEnable: config appends some rules", config.contains("-A"));			
+		} catch (KuraException e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testLocalRule() {
+		s_logger.info("Test local rule");
+		
+		int testPort = 12345;
+		
+		try {
+			s_firewall.addLocalRule(testPort, "tcp", null, null, null, null, null, null);
+			s_firewall.enable();
+			
+			String config = getCurrentIptablesConfig();			
+			assertTrue("testEnable: config appends some rules", config.contains("-A"));
+			assertTrue("testEnable: config has a rule that uses the test port - " + testPort, config.contains(Integer.toString(testPort)));
+		} catch (KuraException e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testNatRule() {
+		s_logger.info("Test NAT rule");
+		
+		String testIface = "test123";
+		
+		try {
+			s_firewall.addNatRule(testIface, testIface, false);
+			s_firewall.enable();
+			
+			String config = getCurrentIptablesConfig();
+			assertTrue("testEnable: config appends some rules", config.contains("-A"));
+			assertTrue("testEnable: config has a rule that uses the test values", config.contains(testIface));			
+		} catch (KuraException e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testPortForwardRule() {
+		s_logger.info("Test port forward rule");
+		
+		String testIface = "test321";
+		String testAddress = "12.34.56.78";
+		int testPort1 = 12345;
+		int testPort2 = 65432;
+		
+		try {
+			s_firewall.addPortForwardRule(testIface, testAddress, "tcp", testPort1, testPort2, null, null, null, null);
+			s_firewall.enable();
+			
+			String config = getCurrentIptablesConfig();
+			assertTrue("testEnable: config appends some rules", config.contains("-A"));
+
+			// Look for a rule containing all of the test values
+			boolean pass = false;
+			String[] lines = config.split("\n");
+			for(String line : lines) {
+				if(line.contains(testIface) && line.contains(testAddress) && line.contains(Integer.toString(testPort1)) && line.contains(Integer.toString(testPort2))) {
+					pass = true;
+					break;
+				}
+			}
+			
+			assertTrue("testEnable: config has a port forward rule that uses the test values", pass);			
+		} catch (KuraException e) {
+			fail("testEnable failed: " + e);
+		}
+	}
+
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@AfterClass()
+	public void tearDown() {
+		// Restore old iptables config
+		Process proc = null;
+		try {
+			s_logger.info("Restoring iptables config from " + oldConfig);
+			
+			// Read current config from file
+			FileReader fr = new FileReader(new File(oldConfig));
+			
+			int in;
+			StringBuffer data = new StringBuffer();
+			while( (in = fr.read()) != -1) {
+				data.append((char)in);
+			}
+			fr.close();
+			
+			// Restore old config
+			proc = ProcessUtil.exec("iptables-restore");			
+			OutputStreamWriter osr = new OutputStreamWriter(proc.getOutputStream());
+			BufferedWriter bw = new BufferedWriter(osr);			
+			bw.write(data.toString());
+			bw.flush();
+			bw.close();
+						
+			proc.waitFor();
+		} catch (Exception e) {
+			fail("Error restoring iptables config");
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	
+	private String getCurrentIptablesConfig() throws KuraException {
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec("iptables-save");
+			
+			InputStreamReader isr = new InputStreamReader(proc.getInputStream());
+			BufferedReader br = new BufferedReader(isr);
+			
+			StringBuffer configBuffer = new StringBuffer();
+			String line = null;
+			while ( (line = br.readLine()) != null) {
+				configBuffer.append(line).append("\n");
+			}
+			br.close();
+			
+			proc.waitFor();
+			
+			return configBuffer.toString();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+
+
+}
diff --git a/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/NetworkTest.java b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/NetworkTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe19de4c557b138690b72103dc518e9dfe44ab97
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/NetworkTest.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.test.net;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.NetworkState;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.eclipse.kura.usb.UsbDevice;
+import org.eclipse.kura.usb.UsbDeviceAddedEvent;
+import org.eclipse.kura.usb.UsbDeviceRemovedEvent;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+public class NetworkTest extends TestCase implements EventHandler {
+
+	private static CountDownLatch dependencyLatch = new CountDownLatch(3);	// initialize with number of dependencies
+	private static NetworkService s_networkService;
+	private static SystemService s_systemService;
+	private static EventAdmin s_eventAdmin;
+	
+	//private static final String PLATFORM_UNKNOWN = "unknown";
+	
+	/**
+	 * This is the profile that runs on cloudbees.  Most tests are skipped
+	 */
+	//private static final String PLATFORM_EMULATED = "emulated";
+	
+	/**
+	 * This is for an Ubuntu laptop with Network Manager.  The hardware profile assumes:
+	 * LAN1 - onboard ethernet controller intiially disabled
+	 * WIFI1 - onboard Wifi device initially acting as the WAN interface via DHCP
+	 * LAN2 - USB/Ethernet controller initially disabled
+	 * WIFI2 - USB/Wifi devices initially disabled
+	 * * Ethernet cable connects LAN1 to LAN2
+	 */
+	//private static String platform;
+	
+	@BeforeClass
+	public void setUp() {
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+		}
+		
+		FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+		
+		// install event listener for network events
+		Dictionary<String, String[]> eventProps = new Hashtable<String, String[]>();
+        String[] topic = {UsbDeviceAddedEvent.USB_EVENT_DEVICE_ADDED_TOPIC,UsbDeviceRemovedEvent.USB_EVENT_DEVICE_REMOVED_TOPIC};
+        eventProps.put(EventConstants.EVENT_TOPIC, topic);
+        BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+        bundleContext.registerService(EventHandler.class.getName(), this, eventProps);
+	}
+	
+	public void setNetworkService(NetworkService networkService) {
+		NetworkTest.s_networkService = networkService;
+		dependencyLatch.countDown();
+	}
+	
+	public void setSystemService(SystemService systemService) {
+		NetworkTest.s_systemService = systemService;
+		dependencyLatch.countDown();
+	}
+	
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		NetworkTest.s_eventAdmin = eventAdmin;
+		dependencyLatch.countDown();
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(NetworkTest.s_networkService);
+	}
+	
+	@Override
+	public void handleEvent(Event event) {
+		System.err.println("NetworkTest - GOT an EVENT: " + event.getTopic() + " " + event.toString());
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/RoutingAgentTest.java b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/RoutingAgentTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd7bcfee83f930801ad8188818f22bc01086adba
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/RoutingAgentTest.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.test.net;
+
+import junit.framework.TestCase;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RoutingAgentTest extends TestCase {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(RoutingAgentTest.class);
+
+	/*
+	private static IRoutingAgent s_routingAgentService = null;
+
+	
+	public void setRoutingAgent(IRoutingAgent ras) {
+		s_routingAgentService = ras;
+	}
+	
+	public void unsetRoutingAgent(IRoutingAgent ras) {
+		s_routingAgentService = null;
+	}*/
+
+	/*
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testServiceExists() {
+		assertNotNull(s_routingAgentService);
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void addEthernetWifiInterface() {
+		String iface = "eth0";
+		
+		s_logger.info("Adding EthernetWifi interface");
+		//s_routingAgentService.addInterface(new NetworkInterfaceStatus(iface, iface, 0, false, false, true, false, false, null, null, null));
+		
+		assertTrue("Has interface " + iface, s_routingAgentService.hasInterface(iface));
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void addCellularInterface() {
+		String iface = "eth1";
+		
+		s_logger.info("Adding interfaces");
+		//s_routingAgentService.addInterface(new NetworkInterfaceStatus(iface, true, true, false, true, true, null, null, null));
+		
+		assertTrue("Has interface " + iface, s_routingAgentService.hasInterface(iface));
+	}	
+	*/
+}
diff --git a/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/WpaSupplicantTest.java b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/WpaSupplicantTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8682f12da73696e0996baad4e2a21cb847b226a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net.test/src/main/java/org/eclipse/kura/linux/test/net/WpaSupplicantTest.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.test.net;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.linux.net.wifi.WpaSupplicant;
+import org.eclipse.kura.net.wifi.WifiCiphers;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class WpaSupplicantTest extends TestCase {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(WpaSupplicantTest.class);
+	
+	private static CountDownLatch dependencyLatch = new CountDownLatch(0);	// initialize with number of dependencies
+	
+	private static WpaSupplicant s_wpaSupplicant;
+
+	private static final String TMPDIR = "/tmp/" + WpaSupplicantTest.class.getName();
+	private static String oldConfigBackup = TMPDIR + "/wpasupplicant.conf.backup";
+	
+	private static final String m_iface = "wlan0";
+	//private static final String m_driver = WifiOptions.WIFI_MANAGED_DRIVER_WEXT;
+//	private static final String m_driver = WifiOptions.WIFI_MANAGED_DRIVER_NL80211;
+	private static final String m_ssid = "WpaSupplicantTest";
+	private static final String m_password = "123WpaSupplicantTestPassword";
+
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@BeforeClass
+	public void setUp() {
+		File tmpDir = new File(TMPDIR);
+		tmpDir.mkdirs();
+		
+		// Wait for OSGi dependencies
+		try {
+			dependencyLatch.await(5, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			fail("OSGi dependencies unfulfilled");
+			System.exit(1);
+		}
+		
+				
+		
+		// Backup current wpa_supplicant config
+		try {
+			s_logger.info("Backing up current wpa_supplicant config to " + oldConfigBackup);
+						
+			// Read current config from file
+			File oldConfig = new File(WpaSupplicant.getConfigFilename());
+			StringBuffer data = new StringBuffer();
+
+			if(oldConfig.exists()) {
+				FileReader fr = new FileReader(oldConfig);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+
+			// Write current config to file
+			FileOutputStream fos = new FileOutputStream(oldConfigBackup);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch (Exception e) {
+			fail("Error backing up current wpa_supplicant config");
+			System.exit(1);
+		}
+		
+		// Initialize
+		try {
+			s_wpaSupplicant = WpaSupplicant.getWpaSupplicant(m_iface,
+					WifiMode.INFRA, null, m_ssid, WifiSecurity.SECURITY_WPA,
+					WifiCiphers.CCMP_TKIP, WifiCiphers.CCMP_TKIP, null, 
+					m_password, null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testDisable() {
+		s_logger.info("Test disable wpa_supplicant");
+
+		try {
+			s_wpaSupplicant.disable();
+			assertFalse("wpa_supplicant is disabled", s_wpaSupplicant.isEnabled());
+		} catch (Exception e) {
+			fail("testDisable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testConstructor1() {
+		s_logger.info("Test wpa_supplicant - Infra WPA");
+		
+		try {
+			s_wpaSupplicant = WpaSupplicant.getWpaSupplicant(m_iface,
+					WifiMode.INFRA, null, m_ssid, WifiSecurity.SECURITY_WPA,
+					WifiCiphers.CCMP_TKIP, WifiCiphers.CCMP_TKIP, null, 
+					m_password, null);
+			assertNotNull(s_wpaSupplicant);
+			
+			s_wpaSupplicant.saveConfig();
+			s_logger.debug("config:\n" + getConfig());
+			
+			s_wpaSupplicant.enable();
+			assertTrue("wpa_supplicant is enabled", s_wpaSupplicant.isEnabled());
+			
+			String config = this.getConfig();
+			assertTrue("config specifies ssid", config.contains("ssid=\"" + m_ssid + "\""));
+			assertTrue("config specifies password", config.contains(m_password));
+			
+			s_logger.info("Disabling wpa_supplicant");
+			Thread.sleep(1000);
+			s_wpaSupplicant.disable();
+			assertFalse("wpa_supplicant is disabled", s_wpaSupplicant.isEnabled());
+		} catch (Exception e) {
+			e.printStackTrace();
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testConstructor2() {
+		s_logger.info("Test wpa_supplicant - Infra WEP");
+		
+		try {
+			String password = "1234567890";
+			String ssid = "TestSSID#2";
+			s_wpaSupplicant = WpaSupplicant.getWpaSupplicant(m_iface, WifiMode.INFRA,
+					null, ssid, WifiSecurity.SECURITY_WEP, null, null,
+					null, password, null);
+			assertNotNull(s_wpaSupplicant);
+			
+			s_wpaSupplicant.saveConfig();
+			s_logger.debug("config:\n" + getConfig());
+			
+			s_wpaSupplicant.enable();
+			assertTrue("wpa_supplicant is enabled",
+					s_wpaSupplicant.isEnabled());
+
+			String config = this.getConfig();
+			assertTrue("config specifies ssid",
+					config.contains("ssid=\"" + ssid + "\""));
+			assertTrue("config specifies password",
+					config.contains(password));
+
+			s_logger.info("Disabling wpa_supplicant");
+			s_wpaSupplicant.disable();
+			assertFalse("wpa_supplicant is disabled",
+					s_wpaSupplicant.isEnabled());
+		} catch (Exception e) {
+			e.printStackTrace();
+			fail("testEnable failed: " + e);
+		}
+	}
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@Test
+	public void testConstructor3() {
+		s_logger.info("Test wpa_supplicant - Adhoc none");
+		
+		try {
+			String password = "1234567890Password1234567890";
+			String ssid = "Another SSID";
+			
+			s_wpaSupplicant = WpaSupplicant.getWpaSupplicant(m_iface,
+					WifiMode.ADHOC, null, ssid, WifiSecurity.SECURITY_NONE,
+					null, null, WpaSupplicant.ALL_CHANNELS, password, null);
+			assertNotNull(s_wpaSupplicant);
+			
+			s_wpaSupplicant.saveConfig();
+			s_logger.debug("config:\n" + getConfig());
+			
+			s_wpaSupplicant.enable();
+			assertTrue("wpa_supplicant is enabled", s_wpaSupplicant.isEnabled());
+			
+			String config = this.getConfig();
+			assertTrue("config specifies ssid", config.contains("ssid=\"" + ssid + "\""));
+			
+			s_logger.info("Disabling wpa_supplicant");
+			s_wpaSupplicant.disable();
+			
+			Thread.sleep(1000);
+			assertFalse("wpa_supplicant is disabled", s_wpaSupplicant.isEnabled());
+		} catch (Exception e) {
+			e.printStackTrace();
+			fail("testEnable failed: " + e);
+		}
+	}
+	
+
+	@TestTarget(targetPlatforms={TestTarget.PLATFORM_ALL})
+	@AfterClass()
+	public void tearDown() {
+		
+		if (s_wpaSupplicant != null) {
+			try {
+				s_wpaSupplicant.disable();
+			} catch (Exception e) {
+				// continue anyway
+			}
+		}
+		
+		// Restore old wpa_supplicant config
+		try {
+			s_logger.info("Restoring wpa_supplicant config from " + oldConfigBackup);
+			
+			// Read current config from file
+			File backupFile = new File(oldConfigBackup);
+			StringBuffer data = new StringBuffer();
+			
+			if(backupFile.exists()) {
+				FileReader fr = new FileReader(backupFile);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+			
+			// Write backup config to file
+			FileOutputStream fos = new FileOutputStream(WpaSupplicant.getConfigFilename());
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();	
+		} catch (Exception e) {
+			fail("Error restoring wpa_supplicant config");
+		}
+	}
+	
+	private String getConfig() {
+		// Read current config from file
+		File configFile = new File(WpaSupplicant.getConfigFilename());
+		StringBuffer data = new StringBuffer();
+		
+		try {
+			if(configFile.exists()) {
+				FileReader fr = new FileReader(configFile);
+				
+				int in;
+				while( (in = fr.read()) != -1) {
+					data.append((char)in);
+				}
+				fr.close();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return data.toString();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net/.gitignore b/kura/org.eclipse.kura.linux.net/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.net/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.net/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..a51e784fbec781d3cedc6aa4ad5a7da16d163fe4
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.net
+Bundle-SymbolicName: org.eclipse.kura.linux.net;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.microedition.io,
+ org.apache.commons.io;version="2.4.0",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.comm,
+ org.eclipse.kura.core.linux.util; version="[0.2,1.0)",
+ org.eclipse.kura.core.net; version="[0.2,1.0)",
+ org.eclipse.kura.core.net.modem; version="[0.2,1.0)",
+ org.eclipse.kura.core.net.util; version="[0.2,1.0)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,0.3)",
+ org.eclipse.kura.net.dhcp; version="[0.2,1.0)",
+ org.eclipse.kura.net.dns; version="[0.2,1.0)",
+ org.eclipse.kura.net.modem; version="[0.2,1.0)",
+ org.eclipse.kura.net.route; version="[0.2,1.0)",
+ org.eclipse.kura.net.wifi; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.osgi.util.tracker;version="[1.5.0,2.0.0)",
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.linux.net; version="0.2.0",org.eclips
+ e.kura.linux.net.dhcp; version="0.2.0",org.eclipse.kura.linux.net.dns
+ ; version="0.2.0",org.eclipse.kura.linux.net.iptables; version="0.2.0
+ ",org.eclipse.kura.linux.net.modem; version="0.2.0",org.eclipse.kura.
+ linux.net.ppp; version="0.2.0",org.eclipse.kura.linux.net.route; vers
+ ion="0.2.0",org.eclipse.kura.linux.net.util; version="0.2.0",org.ecli
+ pse.kura.linux.net.wifi; version="0.2.0"
+
diff --git a/kura/org.eclipse.kura.linux.net/OSGI-INF/network.xml b/kura/org.eclipse.kura.linux.net/OSGI-INF/network.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f0ed657fb1535cc42d2284a0d9211ec1326d01dc
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/OSGI-INF/network.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" enabled="true" immediate="true" name="org.eclipse.kura.net.NetworkService">
+   <implementation class="org.eclipse.kura.linux.net.NetworkServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.NetworkService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.net.NetworkService"/>
+   <reference bind="setUsbService" cardinality="1..1" interface="org.eclipse.kura.usb.UsbService" name="UsbService" policy="static" unbind="unsetUsbService"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unsetEventAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.net/about.html b/kura/org.eclipse.kura.linux.net/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.net/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/build.properties b/kura/org.eclipse.kura.linux.net/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ad32db58aa60fdcca35dc32e48986b676b88d391
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/build.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/,\
+               src/main/resources/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.kura.core,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.equinox.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.linux.net/pom.xml b/kura/org.eclipse.kura.linux.net/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7ec3559a1e4cf590da81c6873586c6428666d5bd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.net</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/ConnectionInfoImpl.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/ConnectionInfoImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..5fdab2dd5d91c395231de8f5d79989dbf8bf07e5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/ConnectionInfoImpl.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.ConnectionInfo;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+
+public class ConnectionInfoImpl implements ConnectionInfo 
+{	
+	/**
+	 * The interface name associated with the connection information
+	 */
+	private String m_ifaceName = null;
+	
+	/**
+	 * The properties representing the connection information
+	 */
+	private Properties m_props = null;
+
+	/**
+	 * Creates a ConnectionInfo instance with the previously persisted connection properties if they existed
+	 * 
+	 * @param ifaceName			The interface name tied to the connection information
+	 * @throws KuraException
+	 */
+	public ConnectionInfoImpl(String ifaceName) throws KuraException {
+
+		m_ifaceName = ifaceName;
+		m_props = new Properties();
+
+		try {
+			File coninfoFile = new File(formConinfoFileName(ifaceName));
+			if (coninfoFile.exists()) {
+				m_props.load(new FileInputStream(coninfoFile));
+			}
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	@Override
+	public IP4Address getIpAddress() {
+		IP4Address ipAddress = null;
+		String sIpAddress = m_props.getProperty("IPADDR");
+		if (sIpAddress != null) {
+			try {
+				ipAddress = (IP4Address) IPAddress.parseHostAddress(sIpAddress);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		
+		return ipAddress;
+	}
+	
+	/**
+	 * Gets the gateway address associated with this interface
+	 * 
+	 * @return		A IP4Address representing the gateway if it is not null
+	 */
+	public IP4Address getGateway() {
+		
+		IP4Address gateway = null;
+		String sGateway = m_props.getProperty("GATEWAY");
+		if (sGateway != null) {
+			try {
+				gateway = (IP4Address) IPAddress.parseHostAddress(sGateway);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		
+		return gateway;
+	}
+	
+	/**
+	 * Gets the DNS addresses associated with this interface
+	 * 
+	 * @return		A List of IP4Address objects representing the DNS of this interface.  If there are none it returns an empty list.
+	 */
+	public List<IP4Address> getDnsServers() {
+
+		List<IP4Address> lDnsServers = new ArrayList<IP4Address>(2);
+
+		for (int i = 1; i <= 2; i++) {
+			String sDns = m_props.getProperty("DNS" + i);
+			if (sDns != null) {
+				try {
+					IP4Address dns = (IP4Address) IPAddress.parseHostAddress(sDns);
+					lDnsServers.add(dns);
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return lDnsServers;
+	}
+	
+	/**
+	 * Gets the interface name associated with this connection information
+	 * 
+	 * @return		The interface name associated with this connection information
+	 */
+	public String getIfaceName() {
+		return m_ifaceName;
+	}
+
+	private String formConinfoFileName (String ifaceName) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("/tmp/.kura/coninfo-");
+		sb.append(ifaceName);
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/NetworkServiceImpl.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/NetworkServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ec6562a0d996b56836868df7bf27abc7c928b76
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/NetworkServiceImpl.java
@@ -0,0 +1,967 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.EthernetInterfaceImpl;
+import org.eclipse.kura.core.net.LoopbackInterfaceImpl;
+import org.eclipse.kura.core.net.NetInterfaceAddressImpl;
+import org.eclipse.kura.core.net.WifiAccessPointImpl;
+import org.eclipse.kura.core.net.WifiInterfaceAddressImpl;
+import org.eclipse.kura.core.net.WifiInterfaceImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceAddressImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceImpl;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.linux.net.dns.LinuxDns;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.ConnectionInfo;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceState;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.NetworkState;
+import org.eclipse.kura.net.modem.ModemAddedEvent;
+import org.eclipse.kura.net.modem.ModemConnectionStatus;
+import org.eclipse.kura.net.modem.ModemConnectionType;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemInterface;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+import org.eclipse.kura.net.modem.ModemRemovedEvent;
+import org.eclipse.kura.net.modem.SerialModemDevice;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.usb.UsbBlockDevice;
+import org.eclipse.kura.usb.UsbDevice;
+import org.eclipse.kura.usb.UsbDeviceAddedEvent;
+import org.eclipse.kura.usb.UsbDeviceEvent;
+import org.eclipse.kura.usb.UsbDeviceRemovedEvent;
+import org.eclipse.kura.usb.UsbModemDevice;
+import org.eclipse.kura.usb.UsbNetDevice;
+import org.eclipse.kura.usb.UsbService;
+import org.eclipse.kura.usb.UsbTtyDevice;
+
+public class NetworkServiceImpl implements NetworkService, EventHandler {
+
+    public static final String PPP_PEERS_DIR = "/etc/ppp/peers/";
+
+    private static final Logger s_logger = LoggerFactory.getLogger(NetworkServiceImpl.class);
+	
+	private static final String UNCONFIGURED_MODEM_REGEX = "^\\d+-\\d+(\\.\\d+)?$";
+	
+    private static final String[] EVENT_TOPICS = new String[] {
+        UsbDeviceAddedEvent.USB_EVENT_DEVICE_ADDED_TOPIC,
+        UsbDeviceRemovedEvent.USB_EVENT_DEVICE_REMOVED_TOPIC
+    };
+	
+    private ComponentContext      m_ctx;
+    
+    private EventAdmin m_eventAdmin;
+    private UsbService m_usbService;
+    
+    private Map<String, UsbModemDevice> m_usbModems;
+    private SerialModemDevice m_serialModem;
+    
+    private List<String> m_addedModems;	
+    
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+    public void setEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = eventAdmin;
+    }
+
+    public void unsetEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = null;
+    }
+    
+	public void setUsbService(UsbService usbService) {
+		m_usbService = usbService;
+	}
+	
+	public void unsetUsbService(UsbService usbService) {
+		m_usbService = null;
+	}
+		
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(ComponentContext componentContext) {
+        // save the bundle context
+        m_ctx = componentContext;
+        
+        m_usbModems = new HashMap<String, UsbModemDevice>();
+        m_addedModems = new ArrayList<String>();
+        
+        Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+        d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+        m_ctx.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+        
+        // Add serial modem if any
+        SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+		if (serialModemInfo != null) {
+			m_serialModem = new SerialModemDevice(
+					serialModemInfo.getModemName(),
+					serialModemInfo.getManufacturerName(), serialModemInfo
+							.getDriver().getComm().getSerialPorts()); 
+		}
+        
+        // Add tty devices
+        List<UsbTtyDevice> ttyDevices = m_usbService.getUsbTtyDevices();
+        if(ttyDevices != null && !ttyDevices.isEmpty()) {
+            for(UsbTtyDevice device : ttyDevices) {
+                if(SupportedUsbModemsInfo.isSupported(device.getVendorId(), device.getProductId())) {
+                    UsbModemDevice usbModem = null;
+
+                    //found one - see if we have some info for it
+                    if(m_usbModems.get(device.getUsbPort()) == null) {
+                        usbModem = new UsbModemDevice(device);
+                    } else {
+                        usbModem = m_usbModems.get(device.getUsbPort());
+                    }
+                    usbModem.addTtyDev(device.getDeviceNode());
+                    s_logger.debug("Adding tty resource: " + device.getDeviceNode() + " for " + device.getUsbPort());
+                    m_usbModems.put(device.getUsbPort(), usbModem);
+                }
+            }
+        }
+            
+        // Add block devices
+        List<UsbBlockDevice> blockDevices = m_usbService.getUsbBlockDevices();
+        if(blockDevices != null && !blockDevices.isEmpty()) {
+            for(UsbBlockDevice device : blockDevices) {
+                if(SupportedUsbModemsInfo.isSupported(device.getVendorId(), device.getProductId())) {
+                    UsbModemDevice usbModem = null;
+
+                    //found one - see if we have some info for it
+                    if(m_usbModems.get(device.getUsbPort()) == null) {
+                        usbModem = new UsbModemDevice(device);
+                    } else {
+                        usbModem = m_usbModems.get(device.getUsbPort());
+                    }
+                    usbModem.addBlockDev(device.getDeviceNode());
+                    s_logger.debug("Adding block resource: " + device.getDeviceNode() + " for " + device.getUsbPort());
+                    m_usbModems.put(device.getUsbPort(), usbModem);
+                }
+            }
+        }
+        
+        //At this point, we should have some modems - display them
+        Iterator<Entry<String, UsbModemDevice>> it = m_usbModems.entrySet().iterator();
+        while(it.hasNext()) {
+            final UsbModemDevice usbModem = it.next().getValue();
+            SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem(usbModem.getVendorId(), usbModem.getProductId());
+            
+            // Check for correct number of resources
+			if ((modemInfo != null)
+					&& (usbModem.getTtyDevs().size() == modemInfo.getNumTtyDevs())
+					&& (usbModem.getBlockDevs().size() == modemInfo.getNumBlockDevs())) {
+				
+            	s_logger.debug("Found modem during init: " + usbModem);            	
+            	s_logger.debug("posting ModemAddedEvent during init: " + usbModem);
+                m_eventAdmin.postEvent(new ModemAddedEvent(usbModem));
+                m_addedModems.add(usbModem.getUsbPort());
+            }
+        }
+        
+        if (m_serialModem != null) {
+        	s_logger.debug("posting ModemAddedEvent during init: " + m_serialModem);
+            m_eventAdmin.postEvent(new ModemAddedEvent(m_serialModem));
+            m_addedModems.add(m_serialModem.getProductName());
+        }
+	}	
+	
+	protected void deactivate(ComponentContext componentContext) {
+	    m_usbModems = null;
+        m_ctx = null;
+	}
+	
+	@Override
+	public NetworkState getState() throws KuraException {
+		//FIXME - this method needs some work
+		
+		//see if we have global access by trying to ping - maybe there is a better way?
+		if(LinuxNetworkUtil.canPing("8.8.8.8", 1)) {
+			return NetworkState.CONNECTED_GLOBAL;
+		}
+		if(LinuxNetworkUtil.canPing("8.8.4.4", 1)) {
+			return NetworkState.CONNECTED_GLOBAL;
+		}
+		
+		//if we have a link we at least of network local access
+		List<NetInterface<? extends NetInterfaceAddress>> netInterfaces = getNetworkInterfaces();
+		for(NetInterface<? extends NetInterfaceAddress> netInterface : netInterfaces) {
+			if(netInterface.getType() == NetInterfaceType.ETHERNET) {
+				if(((EthernetInterfaceImpl<? extends NetInterfaceAddress>)netInterface).isLinkUp()) {
+					return NetworkState.CONNECTED_SITE;
+				}
+			}
+		}
+		
+		//TODO - should be know if we are CONNECTED_SITE for wifi?
+		
+		LoopbackInterfaceImpl<? extends NetInterfaceAddress> netInterface = (LoopbackInterfaceImpl<? extends NetInterfaceAddress>) getNetworkInterface("lo");
+		if(netInterface.isUp()) {
+			return NetworkState.CONNECTED_LOCAL;
+		}
+		
+		//not sure what we're doing...
+		return NetworkState.UNKNOWN;
+	}
+	
+	@Override
+	public NetInterfaceState getState(String interfaceName) throws KuraException {
+		NetInterface<? extends NetInterfaceAddress> netInterface = getNetworkInterface(interfaceName);
+		if(netInterface == null) {
+			s_logger.error("There is no status available for network interface " + interfaceName);
+			return NetInterfaceState.UNKNOWN;
+		} else {
+			return netInterface.getState();
+		}
+	}
+
+	@Override
+	public List<String> getAllNetworkInterfaceNames() throws KuraException {
+	    ArrayList<String> interfaceNames = new ArrayList<String>();
+	    List<String> allInterfaceNames = LinuxNetworkUtil.getAllInterfaceNames();
+	    if(allInterfaceNames != null) {
+	        interfaceNames.addAll(allInterfaceNames);
+	    }
+	    
+        // include non-connected ppp interfaces and usb port numbers for non-configured modems
+	    Iterator<String> it = m_addedModems.iterator();
+	    while(it.hasNext()) {
+	        String modemId = it.next();
+	        UsbModemDevice usbModem = m_usbModems.get(modemId);
+	        String pppPort = null;
+	        if (usbModem != null) {
+		        pppPort = getModemPppPort(usbModem);
+	        } else {
+	        	// for Serial modem
+		    	if (m_serialModem != null) {
+		    		pppPort = getModemPppPort(m_serialModem);
+		    	}
+	        }
+	        
+	        if(pppPort != null) {
+                if(!interfaceNames.contains(pppPort)) {
+                    interfaceNames.add(pppPort);
+                }
+            } else {
+                // add the usb port as an interface if there isn't already a ppp interface associated with this port
+                interfaceNames.add(modemId);
+            }
+	    }
+	    
+		return interfaceNames; 
+	}
+
+	@Override
+	public List<NetInterface<? extends NetInterfaceAddress>> getNetworkInterfaces() throws KuraException {
+				
+		s_logger.trace("getNetworkInterfaces()");
+		List<NetInterface<? extends NetInterfaceAddress>> netInterfaces = new ArrayList<NetInterface<? extends NetInterfaceAddress>>();
+		
+		List<String> interfaceNames = getAllNetworkInterfaceNames();
+		for(String interfaceName : interfaceNames) {
+			NetInterface<? extends NetInterfaceAddress> netInterface = getNetworkInterface(interfaceName);
+			if(netInterface != null) {
+				netInterfaces.add(netInterface);
+			}
+		}
+		
+		// Return an entry for non-connected modems (those w/o a ppp interface)
+		Iterator<String> it = m_addedModems.iterator();
+		while(it.hasNext()) {
+		    String modemId = it.next();
+		    UsbModemDevice usbModem = m_usbModems.get(modemId);
+		    if (usbModem != null) {
+			    // only add if there is not already a ppp interface for this modem
+			    boolean addModem = true;
+			    for(NetInterface<?> netInterface : netInterfaces) {
+			        UsbDevice usbDevice = netInterface.getUsbDevice();
+			        if(usbDevice != null) {
+			            if(usbDevice.getUsbPort().equals(usbModem.getUsbPort())) {
+			                addModem = false;
+			                break;
+			            }
+			        }
+			    }
+			    if(addModem) {
+			        netInterfaces.add(getModemInterface(usbModem.getUsbPort(), false, usbModem));
+			    }
+		    } else {
+		    	// for Serial modem
+		    	if (m_serialModem != null) {
+		    		
+				    // only add if there is not already a ppp interface for this modem
+				    boolean addModem = true;
+				    for(NetInterface<?> netInterface : netInterfaces) {
+				        UsbDevice usbDevice = netInterface.getUsbDevice();
+				        if(usbDevice != null) {
+				            if(usbDevice.getUsbPort().equals(m_serialModem.getProductName())) {
+				                addModem = false;
+				                break;
+				            }
+				        }
+				    }
+				    if(addModem) {
+				    	netInterfaces.add(getModemInterface(m_serialModem.getProductName(), false, m_serialModem));
+				    }
+		    	}
+		    }
+		}
+		
+		return netInterfaces;
+	}
+
+	@Override
+	public List<WifiAccessPoint> getAllWifiAccessPoints() throws KuraException {
+		List<String> interfaceNames = getAllNetworkInterfaceNames();
+		if(interfaceNames != null && interfaceNames.size() > 0) {
+			List<WifiAccessPoint> accessPoints = new ArrayList<WifiAccessPoint>();
+			for(String interfaceName : interfaceNames) {
+				if(LinuxNetworkUtil.getType(interfaceName) == NetInterfaceType.WIFI) {
+					accessPoints.addAll(getWifiAccessPoints(interfaceName));
+				}
+			}
+			return accessPoints;
+		}
+		return null;
+	}
+
+	@Override
+	public List<WifiAccessPoint> getWifiAccessPoints(String wifiInterfaceName) throws KuraException {
+		return LinuxNetworkUtil.getAvailableAccessPoints(wifiInterfaceName, 3);
+	}
+
+	@Override
+	public List<NetInterface<? extends NetInterfaceAddress>> getActiveNetworkInterfaces() throws KuraException {
+		List<NetInterface<? extends NetInterfaceAddress>> interfaces = getNetworkInterfaces();
+		
+		if(interfaces != null) {
+			for(int i=0; i<interfaces.size(); i++) {
+				NetInterface<? extends NetInterfaceAddress> iface = interfaces.get(i);
+				if(!LinuxNetworkUtil.isUp(iface.getName())) {
+					s_logger.debug("removing interface " + iface.getName() + " because it is not up");
+					interfaces.remove(i);
+					i--;
+				}
+			}
+		}
+		
+		return interfaces;
+	}
+	
+	public NetInterface<? extends NetInterfaceAddress> getNetworkInterface(String interfaceName) throws KuraException {
+		NetInterfaceType type = LinuxNetworkUtil.getType(interfaceName);
+		
+		boolean isUp = LinuxNetworkUtil.isUp(interfaceName);
+		if(type == NetInterfaceType.UNKNOWN) {
+			 if (interfaceName.matches(UNCONFIGURED_MODEM_REGEX)) {
+         		// If the interface name is in a form such as "1-3.4", assume it is a modem
+         		type = NetInterfaceType.MODEM;
+         	} else if ((m_serialModem != null) && interfaceName.equals(m_serialModem.getProductName())) {
+         		type = NetInterfaceType.MODEM;
+         	}
+		}
+ 		
+		if(type == NetInterfaceType.ETHERNET) {
+			EthernetInterfaceImpl<NetInterfaceAddress> netInterface = new EthernetInterfaceImpl<NetInterfaceAddress>(interfaceName);
+			
+			netInterface.setDriver(getDriver());
+			netInterface.setDriverVersion(getDriverVersion());
+			netInterface.setFirmwareVersion(getFirmwareVersion());
+			netInterface.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+			netInterface.setLinkUp(LinuxNetworkUtil.isLinkUp(type, interfaceName));
+			netInterface.setLoopback(false);
+			netInterface.setMTU(LinuxNetworkUtil.getCurrentMtu(interfaceName));
+			netInterface.setNetInterfaceAddresses(getNetInterfaceAddresses(interfaceName, type, isUp));
+			netInterface.setPointToPoint(false);
+			netInterface.setState(getState(interfaceName, isUp));
+			netInterface.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+			netInterface.setUp(isUp);
+			netInterface.setUsbDevice(getUsbDevice(interfaceName));
+			netInterface.setVirtual(isVirtual());
+			
+			return netInterface;
+		} else if(type == NetInterfaceType.LOOPBACK) {	
+			LoopbackInterfaceImpl<NetInterfaceAddress> netInterface = new LoopbackInterfaceImpl<NetInterfaceAddress>(interfaceName);
+			
+			netInterface.setDriver(getDriver());
+			netInterface.setDriverVersion(getDriverVersion());
+			netInterface.setFirmwareVersion(getFirmwareVersion());
+			netInterface.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+			netInterface.setLoopback(true);
+			netInterface.setMTU(LinuxNetworkUtil.getCurrentMtu(interfaceName));
+			netInterface.setNetInterfaceAddresses(getNetInterfaceAddresses(interfaceName, type, isUp));
+			netInterface.setPointToPoint(false);
+			netInterface.setState(getState(interfaceName, isUp));
+			netInterface.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+			netInterface.setUp(isUp);
+			netInterface.setUsbDevice(getUsbDevice(interfaceName));
+			netInterface.setVirtual(isVirtual());
+
+			return netInterface;
+		} else if(type == NetInterfaceType.WIFI) {
+			WifiInterfaceImpl<WifiInterfaceAddress> wifiInterface = new WifiInterfaceImpl<WifiInterfaceAddress>(interfaceName);
+			
+			int mtu = -1;
+			try {
+			    mtu = LinuxNetworkUtil.getCurrentMtu(interfaceName);
+			} catch (Exception e) {
+			    s_logger.error("Could not get mtu for " + interfaceName, e);
+			}
+			
+			wifiInterface.setDriver(getDriver());
+			wifiInterface.setDriverVersion(getDriverVersion());
+			wifiInterface.setFirmwareVersion(getFirmwareVersion());
+			wifiInterface.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+			wifiInterface.setLoopback(false);
+			wifiInterface.setMTU(mtu);
+			wifiInterface.setNetInterfaceAddresses(getWifiInterfaceAddresses(interfaceName, isUp));
+			wifiInterface.setPointToPoint(false);
+			wifiInterface.setState(getState(interfaceName, isUp));
+			wifiInterface.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+			wifiInterface.setUp(isUp);
+			wifiInterface.setUsbDevice(getUsbDevice(interfaceName));
+			wifiInterface.setVirtual(isVirtual());
+			wifiInterface.setCapabilities(LinuxNetworkUtil.getWifiCapabilities(interfaceName));
+
+			return wifiInterface;
+        } else if(type == NetInterfaceType.MODEM) {
+            ModemDevice modemDevice = null;
+            if(interfaceName.startsWith("ppp")) {
+                // already connected - find the corresponding usb device
+                modemDevice = m_usbModems.get(getModemUsbPort(interfaceName));
+                if ((modemDevice == null)  &&  (m_serialModem != null)) {
+                	modemDevice = m_serialModem;
+                }
+            } else if (interfaceName.matches(UNCONFIGURED_MODEM_REGEX)){
+                // the interface name is in the form of a usb port i.e. "1-3.4"
+                modemDevice = m_usbModems.get(interfaceName);
+            } else if ((m_serialModem != null) && interfaceName.equals(m_serialModem.getProductName())) {
+            	modemDevice = m_serialModem; 
+            }
+            return (modemDevice != null) ? getModemInterface(interfaceName, isUp, modemDevice) : null;
+		} else {
+			if(interfaceName.startsWith("can")) {
+				s_logger.trace("Ignoring CAN interface: " + interfaceName);
+			} else if (interfaceName.startsWith("ppp")) {
+			    s_logger.debug("Ignoring unconfigured ppp interface: " + interfaceName);
+			} else {
+				s_logger.warn("Unsupported network type - not adding to network devices: " + interfaceName + " of type: " + type.toString());
+			}
+			return null;
+		}
+	}
+	
+    @Override
+    public void handleEvent(Event event) {
+        s_logger.debug("handleEvent - topic: " + event.getTopic());
+        String topic = event.getTopic();
+        if (topic.equals(UsbDeviceAddedEvent.USB_EVENT_DEVICE_ADDED_TOPIC)) {
+            //do we care?
+            SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem((String)event.getProperty(UsbDeviceEvent.USB_EVENT_VENDOR_ID_PROPERTY), (String)event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_ID_PROPERTY));
+            if(modemInfo != null) {
+                UsbModemDevice usbModem = null;
+
+                //found one - see if we have some info for it                   
+                if(m_usbModems.get(event.getProperty(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY)) == null) {
+                    usbModem = new UsbModemDevice((String) event.getProperty(UsbDeviceEvent.USB_EVENT_VENDOR_ID_PROPERTY),
+                            (String) event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_ID_PROPERTY),
+                            (String) event.getProperty(UsbDeviceEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY),
+                            (String) event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_NAME_PROPERTY),
+                            (String) event.getProperty(UsbDeviceEvent.USB_EVENT_BUS_NUMBER_PROPERTY),
+                            (String) event.getProperty(UsbDeviceEvent.USB_EVENT_DEVICE_PATH_PROPERTY));
+                } else {
+                    //just add the new resource
+                    usbModem = m_usbModems.get((String) event.getProperty(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY));
+                }
+                
+                String resource = (String) event.getProperty(UsbDeviceEvent.USB_EVENT_RESOURCE_PROPERTY);
+                s_logger.debug("Adding resource: " + resource + " for " + usbModem.getUsbPort());
+                if(resource.contains("tty")) {
+                    usbModem.addTtyDev(resource);
+                } else {
+                    usbModem.addBlockDev(resource);
+                }
+                m_usbModems.put((String) event.getProperty(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY), usbModem);
+
+                
+                //At this point, we should have some modems - display them
+                s_logger.debug("Modified modem (Added resource): " + m_usbModems.get(event.getProperty(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY)));
+                
+                // Check for correct number of resources
+				if ((usbModem != null)
+						&& (usbModem.getTtyDevs().size() == modemInfo.getNumTtyDevs())
+						&& (usbModem.getBlockDevs().size() == modemInfo.getNumBlockDevs())) {
+					
+					final UsbModemDevice fUsbModem = usbModem;
+					s_logger.debug("posting ModemAddedEvent -- USB_EVENT_DEVICE_ADDED_TOPIC: " + fUsbModem);
+	                m_eventAdmin.postEvent(new ModemAddedEvent(fUsbModem));
+	                m_addedModems.add(fUsbModem.getUsbPort());
+                }
+            }
+            
+            /*
+            System.out.println("ADDED Device: " + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_VENDOR_ID_PROPERTY) + ":" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_ID_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_NAME_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY));
+            */
+        } else if(topic.equals(UsbDeviceRemovedEvent.USB_EVENT_DEVICE_REMOVED_TOPIC)) {
+            //do we care?
+            SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem((String)event.getProperty(UsbDeviceEvent.USB_EVENT_VENDOR_ID_PROPERTY), (String)event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_ID_PROPERTY));
+            if(modemInfo != null) {
+                //found one - see if we have some info for it
+                if(m_usbModems.get(event.getProperty(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY)) == null) {
+                    //this shouldn't happen
+                    String newDeviceId = new StringBuffer().append(event.getProperty(UsbDeviceEvent.USB_EVENT_VENDOR_ID_PROPERTY)).append(":").append(event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_ID_PROPERTY)).toString();
+                    s_logger.error("Got a removal event for a modem we've lost track of: " + event.getProperty(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY) + " with ID: " + newDeviceId);
+                } else {
+                    //just remove the old resource
+                    UsbModemDevice usbModem = m_usbModems.get((String) event.getProperty(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY));
+                    String resource = (String) event.getProperty(UsbDeviceEvent.USB_EVENT_RESOURCE_PROPERTY);
+                    s_logger.debug("Removing resource: " + resource + " for " + usbModem.getUsbPort());
+                    if (resource != null) {
+	                    if(resource.contains("tty")) {
+	                        usbModem.removeTtyDev(resource);
+	                    } else {
+	                        usbModem.removeBlockDev(resource);
+	                    }
+	                    s_logger.debug("Modified modem (Removed resource): " + resource + " for: " + usbModem);
+                    }
+                    
+                    // Check expected number of resources for the modem
+                    if(m_addedModems.contains(usbModem.getUsbPort()) && 
+                            (usbModem.getTtyDevs().size() < modemInfo.getNumTtyDevs() || usbModem.getBlockDevs().size() < modemInfo.getNumTtyDevs())) {
+                        s_logger.debug("Removing modem: " + usbModem);
+                        m_addedModems.remove(usbModem.getUsbPort());
+                        
+                        Map<String, String> properties = new HashMap<String, String>();
+                        properties.put(UsbDeviceEvent.USB_EVENT_BUS_NUMBER_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_BUS_NUMBER_PROPERTY));
+                        properties.put(UsbDeviceEvent.USB_EVENT_DEVICE_PATH_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_DEVICE_PATH_PROPERTY));
+                        properties.put(UsbDeviceEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY));
+                        properties.put(UsbDeviceEvent.USB_EVENT_PRODUCT_ID_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_ID_PROPERTY));
+                        properties.put(UsbDeviceEvent.USB_EVENT_PRODUCT_NAME_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_PRODUCT_NAME_PROPERTY));
+                        properties.put(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY));
+                        properties.put(UsbDeviceEvent.USB_EVENT_VENDOR_ID_PROPERTY, (String) event.getProperty(UsbDeviceEvent.USB_EVENT_VENDOR_ID_PROPERTY));
+                        m_eventAdmin.postEvent(new ModemRemovedEvent(properties));
+                    }
+                }
+            }
+            
+            
+            /*
+            System.out.println("REMOVED Device: " + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_VENDOR_ID_PROPERTY) + ":" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_ID_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_NAME_PROPERTY));
+            System.out.println("\t" + event.getProperty(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY));
+            */
+        } else {
+            s_logger.error("Unexpected event topic: " + topic);
+        }
+    }
+	
+	private String getDriver() {
+		//FIXME - hard coded
+		return "unknown";
+	}
+	
+	private String getDriverVersion() {
+		//FIXME - hard coded
+		return "unknown";
+	}
+	
+	private String getFirmwareVersion() {
+		//FIXME - hard coded
+		return "unknown";
+	}
+	
+	private ModemInterface<ModemInterfaceAddress> getModemInterface(String interfaceName, boolean isUp, ModemDevice modemDevice) throws KuraException {
+
+		ModemInterfaceImpl<ModemInterfaceAddress> modemInterface = new ModemInterfaceImpl<ModemInterfaceAddress>(interfaceName);
+        
+        SupportedUsbModemInfo supportedUsbModem = null;
+        SupportedSerialModemInfo supportedSerialModem = null;		
+        
+        if (modemDevice instanceof UsbModemDevice) {
+        	UsbModemDevice usbDevice = (UsbModemDevice)modemDevice;
+        	supportedUsbModem = SupportedUsbModemsInfo.getModem(usbDevice.getVendorId(), usbDevice.getProductId()); 
+        } else if (modemDevice instanceof SerialModemDevice) {
+        	supportedSerialModem = SupportedSerialModemsInfo.getModem();
+        }
+         
+        
+        int pppNum = 0;
+        if(interfaceName.startsWith("ppp")) {
+            pppNum = Integer.parseInt(interfaceName.substring(3));
+        }
+        
+        modemInterface.setDriver(getDriver());
+        modemInterface.setDriverVersion(getDriverVersion());
+        modemInterface.setFirmwareVersion(getFirmwareVersion());
+        modemInterface.setLoopback(false);
+        modemInterface.setNetInterfaceAddresses(getModemInterfaceAddresses(interfaceName, isUp));
+        modemInterface.setPointToPoint(true);
+        modemInterface.setState(getState(interfaceName, isUp));
+        modemInterface.setUp(isUp);
+        if (isUp) {
+	        try {
+	            int mtu = LinuxNetworkUtil.getCurrentMtu(interfaceName);
+	            modemInterface.setMTU(mtu);
+	        } catch (KuraException e) {
+	            s_logger.warn("Could not get MTU for " + interfaceName);
+	        }
+	        try {
+	            boolean multicast = LinuxNetworkUtil.isSupportsMulticast(interfaceName);
+	            modemInterface.setSupportsMulticast(multicast);
+	        } catch (KuraException e) {
+	            s_logger.warn("Could not get multicast for " + interfaceName);
+	        }
+	        
+	        try {
+	        	byte [] macAddressBytes = LinuxNetworkUtil.getMacAddressBytes(interfaceName);
+	        	modemInterface.setHardwareAddress(macAddressBytes);
+	        } catch (KuraException e) {
+	        	s_logger.warn("Could not get MAC Address for " + interfaceName);
+	        }
+        }
+        
+        modemInterface.setModemDevice(modemDevice);
+        if (modemDevice instanceof UsbModemDevice) {
+        	modemInterface.setTechnologyTypes(supportedUsbModem.getTechnologyTypes());
+        	modemInterface.setUsbDevice((UsbModemDevice)modemDevice);
+        } else if (modemDevice instanceof SerialModemDevice) {
+        	modemInterface.setTechnologyTypes(supportedSerialModem.getTechnologyTypes());
+        }
+        modemInterface.setVirtual(isVirtual());
+                
+        modemInterface.setManufacturer(modemDevice.getManufacturerName());
+        modemInterface.setModel(modemDevice.getProductName());
+        modemInterface.setModemIdentifier(modemDevice.getProductName());
+        modemInterface.setPppNum(pppNum);
+        modemInterface.setSerialNumber("");
+
+        return modemInterface;
+
+    }
+	
+	private List<NetInterfaceAddress> getNetInterfaceAddresses(String interfaceName, NetInterfaceType type, boolean isUp) throws KuraException {
+		if(isUp) {
+			ConnectionInfo conInfo = new ConnectionInfoImpl(interfaceName);
+			
+			List<NetInterfaceAddress> netInterfaceAddresses = new ArrayList<NetInterfaceAddress>();
+			NetInterfaceAddressImpl netInterfaceAddress = new NetInterfaceAddressImpl();
+			netInterfaceAddresses.add(netInterfaceAddress);
+			
+			try {
+				String currentNetmask = LinuxNetworkUtil.getCurrentNetmask(interfaceName);
+                if (currentNetmask != null) {
+					netInterfaceAddress.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+					netInterfaceAddress.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+					netInterfaceAddress.setNetmask(IPAddress.parseHostAddress(currentNetmask));
+					netInterfaceAddress.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(currentNetmask));
+					netInterfaceAddress.setGateway(conInfo.getGateway());
+					if(type == NetInterfaceType.MODEM) {
+						if(isUp) {
+							netInterfaceAddress.setDnsServers(LinuxDns.getInstance().getPppDnServers());
+						}
+					} else {
+						netInterfaceAddress.setDnsServers(conInfo.getDnsServers());
+					}
+                } else {
+                	return null;
+                }
+			} catch(UnknownHostException e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+	            
+			return netInterfaceAddresses;
+		} else {
+			return null;
+		}
+	}
+	
+	private List<WifiInterfaceAddress> getWifiInterfaceAddresses(String interfaceName, boolean isUp) throws KuraException {
+		if(isUp) {
+			ConnectionInfo conInfo = new ConnectionInfoImpl(interfaceName);
+			
+			List<WifiInterfaceAddress> wifiInterfaceAddresses = new ArrayList<WifiInterfaceAddress>();
+			WifiInterfaceAddressImpl wifiInterfaceAddress = new WifiInterfaceAddressImpl();
+			wifiInterfaceAddresses.add(wifiInterfaceAddress);
+			
+			try {
+				String currentNetmask = LinuxNetworkUtil.getCurrentNetmask(interfaceName);
+                if (currentNetmask != null) {
+					wifiInterfaceAddress.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+					wifiInterfaceAddress.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+					wifiInterfaceAddress.setNetmask(IPAddress.parseHostAddress(currentNetmask));
+					wifiInterfaceAddress.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(currentNetmask));
+					wifiInterfaceAddress.setGateway(conInfo.getGateway());
+					wifiInterfaceAddress.setDnsServers(conInfo.getDnsServers());
+					
+					WifiMode wifiMode = LinuxNetworkUtil.getWifiMode(interfaceName);
+					wifiInterfaceAddress.setBitrate(LinuxNetworkUtil.getWifiBitrate(interfaceName));
+					wifiInterfaceAddress.setMode(wifiMode);
+					
+					//TODO - should this only be the AP we are connected to in client mode?
+					if(wifiMode == WifiMode.INFRA) {
+						String currentSSID = LinuxNetworkUtil.getSSID(interfaceName);
+
+						if(currentSSID != null) {
+							s_logger.debug("Adding access point SSID: " + currentSSID);
+
+							WifiAccessPointImpl wifiAccessPoint = new WifiAccessPointImpl(currentSSID);
+
+							// FIXME: fill in other info
+							wifiAccessPoint.setMode(WifiMode.INFRA);
+							List<Long> bitrate = new ArrayList<Long>();
+							bitrate.add(54000000L);
+							wifiAccessPoint.setBitrate(bitrate);
+							wifiAccessPoint.setFrequency(12345);
+							wifiAccessPoint.setHardwareAddress("20AA4B8A6442".getBytes());
+							wifiAccessPoint.setRsnSecurity(EnumSet.allOf(WifiSecurity.class));
+							wifiAccessPoint.setStrength(1234);
+							wifiAccessPoint.setWpaSecurity(EnumSet.allOf(WifiSecurity.class));
+
+							wifiInterfaceAddress.setWifiAccessPoint(wifiAccessPoint);
+						}
+					}
+                } else {
+                	return null;
+                }
+			} catch(UnknownHostException e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+
+			return wifiInterfaceAddresses;
+		} else {
+			return null;
+		}
+	}
+	
+    private List<ModemInterfaceAddress> getModemInterfaceAddresses(String interfaceName, boolean isUp) throws KuraException {
+        if(isUp) {
+            ConnectionInfo conInfo = new ConnectionInfoImpl(interfaceName);
+            
+            List<ModemInterfaceAddress> modemInterfaceAddresses = new ArrayList<ModemInterfaceAddress>();
+            ModemInterfaceAddressImpl modemInterfaceAddress = new ModemInterfaceAddressImpl();
+            modemInterfaceAddresses.add(modemInterfaceAddress);
+            
+            try {
+                String currentNetmask = LinuxNetworkUtil.getCurrentNetmask(interfaceName);
+                if (currentNetmask != null) {
+                    modemInterfaceAddress.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+                    modemInterfaceAddress.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+                    modemInterfaceAddress.setNetmask(IPAddress.parseHostAddress(currentNetmask));
+                    modemInterfaceAddress.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(currentNetmask));
+                    modemInterfaceAddress.setGateway(conInfo.getGateway());
+                    modemInterfaceAddress.setDnsServers(conInfo.getDnsServers());
+                    modemInterfaceAddress.setConnectionType(ModemConnectionType.PPP);   // FIXME - hardcoded
+                    ModemConnectionStatus connectionStatus = isUp? ModemConnectionStatus.CONNECTED : ModemConnectionStatus.DISCONNECTED;
+                    modemInterfaceAddress.setConnectionStatus(connectionStatus);
+                    // TODO - other attributes
+                } else {
+                    return null;
+                }
+            } catch(UnknownHostException e) {
+                throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+            }
+                
+            return modemInterfaceAddresses;
+        } else {
+            return null;
+        }
+    }
+
+	
+	private NetInterfaceState getState(String interfaceName, boolean isUp) {
+		/** The device is in an unknown state. */
+		//UNKNOWN(0),
+		/** The device is recognized but not managed by NetworkManager. */
+		//UNMANAGED(10),
+		/** The device cannot be used (carrier off, rfkill, etc). */
+		//UNAVAILABLE(20),
+		/** The device is not connected. */
+		//DISCONNECTED(30),
+		/** The device is preparing to connect. */ 
+		//PREPARE(40),
+		/** The device is being configured. */
+		//CONFIG(50),
+		/** The device is awaiting secrets necessary to continue connection. */
+		//NEED_AUTH(60),
+		/** The IP settings of the device are being requested and configured. */
+		//IP_CONFIG(70),
+		/** The device's IP connectivity ability is being determined. */
+		//IP_CHECK(80),
+		/** The device is waiting for secondary connections to be activated. */
+		//SECONDARIES(90),
+		/** The device is active. */
+		//ACTIVATED(100),
+		/** The device's network connection is being torn down. */
+		//DEACTIVATING(110),
+		/** The device is in a failure state following an attempt to activate it. */
+		//FAILED(120);
+		
+		//FIXME - expand to support other States
+		if(isUp) {
+			return NetInterfaceState.ACTIVATED;
+		} else {
+			return NetInterfaceState.DISCONNECTED;
+		}
+	}
+	
+	private UsbNetDevice getUsbDevice(String interfaceName) {
+		List<UsbNetDevice> usbNetDevices = m_usbService.getUsbNetDevices();
+		if(usbNetDevices != null && usbNetDevices.size() > 0) {
+			for(UsbNetDevice usbNetDevice : usbNetDevices) {
+				if(usbNetDevice.getInterfaceName().equals(interfaceName)) {
+					return usbNetDevice;
+				}
+			}
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Given an interface name (e.g. 'ppp0'), look up the associated usb port
+	 * using the ppp peers config files
+	 */
+	@Override
+	public String getModemUsbPort(String interfaceName) {
+	    if(interfaceName != null) {
+    	    File peersDir = new File(PPP_PEERS_DIR);
+    	    if(peersDir.isDirectory()) {
+    	        File[] peerFiles = peersDir.listFiles();
+    	        for(int i=0; i<peerFiles.length; i++) {
+    	            File peerFile = peerFiles[i];
+    	            if(peerFile.getName().equals(interfaceName)) {
+    	                // should be a symlink...find the file it links to
+    	                try {
+                            String peerFilename = peerFile.getCanonicalFile().getName();
+                            String[] filenameParts = peerFilename.split("_");
+                            return filenameParts[filenameParts.length - 1];
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+    	            }
+                }
+            }	    
+    	    
+    	    // Return the interface name if it looks like a usb port
+            if(interfaceName.matches(UNCONFIGURED_MODEM_REGEX)) {
+                return interfaceName;
+            }
+	    }
+	    
+	    return null;
+	}
+	
+	/**
+	 * Given a usb port address, look up the associated ppp interface name
+	 * @throws KuraException 
+	 */
+	@Override
+	public String getModemPppPort(ModemDevice modemDevice) throws KuraException {
+	    
+		String deviceName = null;
+		String modemId = null;
+		
+		if (modemDevice instanceof UsbModemDevice) {
+			UsbModemDevice usbModem = (UsbModemDevice)modemDevice;
+			SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem(usbModem.getVendorId(), usbModem.getProductId());
+			 deviceName = modemInfo.getDeviceName();
+			 modemId = usbModem.getUsbPort();
+		} else if (modemDevice instanceof SerialModemDevice) {
+			SerialModemDevice serialModem = (SerialModemDevice) modemDevice;
+			deviceName = serialModem.getProductName();
+			modemId = serialModem.getProductName();
+		}
+		
+        // find a matching config file in the ppp peers directory
+        File peersDir = new File(PPP_PEERS_DIR);
+        if(peersDir.isDirectory()) {
+            File[] peerFiles = peersDir.listFiles();
+            for(int i=0; i<peerFiles.length; i++) {
+                File peerFile = peerFiles[i];
+                String peerFilename = peerFile.getName();
+                if(peerFilename.startsWith(deviceName) && peerFilename.endsWith(/*usbPort*/ modemId)) {                    
+                    // find a 'pppX' symlink to this peer file
+                    for(int j=0; j<peerFiles.length; j++) {
+                        File pppFile = peerFiles[j];
+                        
+                        if(peerFilename.equals(pppFile.getName())) {
+                            continue;
+                        }
+                        
+                        try {
+                            if(pppFile.getName().matches("ppp\\d+") &&
+                                    peerFile.getCanonicalPath().equals(pppFile.getCanonicalPath())) {
+                                
+                                return pppFile.getName();
+                            }
+                        } catch (IOException e) {
+                            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+                        }
+                    }
+                    
+                    break;
+                }
+            }
+        }    
+        return null;
+	}
+	
+	private boolean isVirtual() {
+		//FIXME - assuming only one to one relationship for network interfaces today
+		return false;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerFactory.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..54cf41c045fe91364d61cd118394c6bd9418f93e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerFactory.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.dhcp;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.kura.KuraException;
+
+public class DhcpServerFactory {
+
+	private static Map<String, DhcpServerImpl> dhcpServers;
+	
+	private DhcpServerFactory() {
+	}
+
+	public static DhcpServerImpl getInstance(String interfaceName, boolean enabled, boolean passDns) throws KuraException {
+		if(dhcpServers == null) {
+			dhcpServers = new Hashtable<String, DhcpServerImpl>();
+		}
+		
+		DhcpServerImpl dhcpServer = dhcpServers.get(interfaceName);
+		if(dhcpServer == null) {
+			dhcpServer = new DhcpServerImpl(interfaceName, enabled, passDns);
+			dhcpServers.put(interfaceName, dhcpServer);
+		}
+		
+		return dhcpServer;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerImpl.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..95b794b728dd880306ce8cb28d84863691439c21
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerImpl.java
@@ -0,0 +1,344 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.dhcp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.dhcp.DhcpServer;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.eclipse.kura.net.dhcp.DhcpServerConfigIP4;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DhcpServerImpl implements DhcpServer {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(DhcpServerImpl.class);
+	
+//	public static final String CONFIGURATION_NAME = "org.eclipse.kura.linux.net.dhcp";
+//	private static final String TMP_FILE_DIR = "/tmp/.kura/org.eclipse.kura.linux.net.dhcp/";
+	private static final String FILE_DIR = "/etc/";
+	private static final String PID_FILE_DIR = "/var/run/";
+	
+	private String m_interfaceName;
+	private DhcpServerConfig4 m_dhcpServerConfig4;
+	
+	private String m_configFileName;
+	private String m_pidFileName;
+	private String persistentConfigFileName;
+	private String persistentPidFilename;
+
+	DhcpServerImpl(String interfaceName, boolean enabled, boolean passDns) throws KuraException {
+		m_interfaceName = interfaceName;
+
+		StringBuffer sb = new StringBuffer();
+		sb.append("dhcpd-")
+		.append(interfaceName)
+		.append(".conf");
+		m_configFileName = sb.toString();
+		
+		sb = new StringBuffer();
+		sb.append("dhcpd-")
+		.append(interfaceName)
+		.append(".pid");
+		m_pidFileName = sb.toString();
+		
+		persistentConfigFileName = FILE_DIR + m_configFileName;
+		persistentPidFilename = PID_FILE_DIR + m_pidFileName;
+		
+		readConfig(enabled, passDns);
+	}
+	
+	private void readConfig(boolean enabled, boolean passDns) throws KuraException {
+		//TODO
+		File configFile = new File(persistentConfigFileName);
+		if(configFile.exists()) {
+			
+			s_logger.debug("initing DHCP Server configuration for " + m_interfaceName);
+			//parse the file
+			/*
+			# dhcpd.conf - DHCPD configuration file
+
+			subnet 192.168.2.0 netmask 255.255.255.0 {
+			    interface eth1;
+			    default-lease-time 7200;
+			    max-lease-time 7200;
+			    option domain-name-servers 192.168.2.1;
+			    option routers 192.168.2.1;
+			    pool {
+			        range 192.168.2.100 192.168.2.110;
+			    }
+			}*/
+			
+			try {
+				IP4Address subnet = null;
+				IP4Address netmask = null;
+				IP4Address router = null;
+				String interfaceName = null;
+				int defaultLeaseTime = -1;
+				int maxLeaseTime = -1;
+				IP4Address rangeStart = null;
+				IP4Address rangeEnd = null;
+				ArrayList<IP4Address> dnsList = new ArrayList<IP4Address>();
+				
+				BufferedReader br = new BufferedReader(new FileReader(configFile));
+				
+				String line = null;
+				while((line = br.readLine()) != null) {
+					//TODO - really simple for now
+					StringTokenizer st = new StringTokenizer(line);
+					while(st.hasMoreTokens()) {
+						String token = st.nextToken();
+						if(token.equals("#")) {
+							break;
+						} else if(token.equals("subnet")) {
+							subnet = (IP4Address) IPAddress.parseHostAddress(st.nextToken());
+							if(!st.nextToken().equals("netmask")) {
+								br.close();
+								br = null;
+								throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "invalid dhcp config file: " + persistentConfigFileName);
+							}
+							netmask = (IP4Address) IPAddress.parseHostAddress(st.nextToken());
+						} else if(token.equals("interface")) {
+							interfaceName = st.nextToken();
+							interfaceName = interfaceName.substring(0, interfaceName.indexOf(';'));
+						} else if(token.equals("default-lease-time")) {
+							String leaseTime = st.nextToken();
+							defaultLeaseTime = Integer.parseInt(leaseTime.substring(0, leaseTime.indexOf(';')));
+						} else if(token.equals("max-lease-time")) {
+							String leaseTime = st.nextToken();
+							maxLeaseTime = Integer.parseInt(leaseTime.substring(0, leaseTime.indexOf(';')));
+						} else if(token.equals("range")) {
+							rangeStart = (IP4Address) IPAddress.parseHostAddress(st.nextToken());
+							String rangeEndString = st.nextToken();
+							rangeEndString = rangeEndString.substring(0, rangeEndString.indexOf(';'));
+							rangeEnd = (IP4Address) IPAddress.parseHostAddress(rangeEndString);
+						} else if(token.equals("option")) {
+							String option = st.nextToken();
+							if(option.equals("routers")) {
+								String routerString = st.nextToken();
+								routerString = routerString.substring(0, routerString.indexOf(';'));
+								router = (IP4Address) IPAddress.parseHostAddress(routerString);
+							} else if(option.equals("domain-name-servers")) {
+								String dnsString = st.nextToken();
+								dnsString = dnsString.substring(0, dnsString.indexOf(';'));
+								dnsList.add((IP4Address) IPAddress.parseHostAddress(dnsString));
+							}
+						}
+					}
+				}
+				
+                boolean running = this.isRunning();
+                
+                /*
+                LinuxNamed linuxNamed = LinuxNamed.getInstance();
+                DnsServerConfigIP4 dnsServerConfig = linuxNamed.getDnsServerConfig();
+                List<IP4Address> forwarders = dnsServerConfig.getForwarders();
+                List<NetworkPair<IP4Address>> allowedNetworks = dnsServerConfig.getAllowedNetworks();
+                boolean passDns = (forwarders != null && forwarders.size() > 0
+                        && allowedNetworks != null && allowedNetworks.size() > 0);
+				*/
+                
+				//FIXME - prefix still hardcoded
+				s_logger.debug("instantiating DHCP server configuration during init with " + 
+						"\n\t\tinterfaceName: " + interfaceName +
+						"\n\t\trunning: " + running +
+						"\n\t\tsubnet: " + subnet.getHostAddress() +
+						"\n\t\trouter: " + router.getHostAddress() +
+						"\n\t\tnetmask: " + netmask.getHostAddress() +
+						"\n\t\tdefaultLeaseTime: " + defaultLeaseTime +
+						"\n\t\tmaxLeaseTime: " + maxLeaseTime +
+						"\n\t\trangeStart: " + rangeStart.getHostAddress() +
+						"\n\t\trangeEnd: " + rangeEnd.getHostAddress() +
+						"\n\t\tpassDns: " + passDns +
+						"\n\t\tdnsList: " + dnsList.toString());
+				
+				m_dhcpServerConfig4 = new DhcpServerConfigIP4(interfaceName, enabled, subnet, router, netmask, defaultLeaseTime, maxLeaseTime,
+						(short) 24, rangeStart, rangeEnd, passDns, dnsList);
+				
+				br.close();
+				br = null;
+			} catch (FileNotFoundException e) {
+				throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+			} catch (IOException e) {
+				throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+			}	
+		} else {
+			s_logger.debug("There is no current DHCP server configuration for " + m_interfaceName);
+		}
+	}
+	
+	public boolean isRunning() throws KuraException {
+		try {
+			// Check if dhcpd is running
+			int pid = LinuxProcessUtil.getPid(formDhcpdCommand());
+			return (pid > -1);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}	
+	
+	public boolean enable() throws KuraException {
+	    s_logger.debug("enable()");
+		// write to config file;
+		try {
+			writeConfig();
+		} catch (Exception e1) {
+			s_logger.error("Error writing configuration to filesystem");
+			e1.printStackTrace();
+			return false;
+		}
+		
+		try {
+			// Check if dhcpd is running
+			if(this.isRunning()) {
+				// If so, disable it
+				s_logger.error("DHCP server is already running, bringing it down...");
+				disable();
+			}
+			// Start dhcpd
+			if (LinuxProcessUtil.startBackground(formDhcpdCommand(), false) == 0) {
+				s_logger.debug("DHCP server started.");
+				s_logger.trace(m_dhcpServerConfig4.toString());
+				return true;
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return false;
+	}
+
+	public boolean disable() throws KuraException {
+        s_logger.debug("disable()");
+
+        // write to config file;
+        try {
+        	if(m_dhcpServerConfig4 != null) {
+        		writeConfig();
+        	}
+        } catch (Exception e1) {
+            s_logger.error("Error writing configuration to filesystem");
+            e1.printStackTrace();
+            return false;
+        }
+
+		try {
+			// Check if dhcpd is running
+			int pid = LinuxProcessUtil.getPid(formDhcpdCommand());
+			if(pid > -1) {
+				// If so, kill it.
+				if (LinuxProcessUtil.stop(pid)) {
+					removePidFile();
+				} else {
+					s_logger.debug("Failed to stop process...try to kill");
+	                if(LinuxProcessUtil.kill(pid)) {
+	                	removePidFile();
+	                } else {
+	                	throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "error killing process, pid=" + pid);
+	                }	
+				}
+			} else {
+				s_logger.debug("tried to kill DHCP server for interface but it is not running");
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return true;
+	}
+
+	public boolean isConfigured() {
+		return (m_dhcpServerConfig4 != null);
+	}
+	
+	public void setConfig(DhcpServerConfigIP4 dhcpServerConfig4) throws KuraException {
+	    s_logger.debug("setConfig()");
+
+		try {
+		    m_dhcpServerConfig4 = dhcpServerConfig4;
+			if(m_dhcpServerConfig4 == null) {
+				s_logger.warn("Set DHCP configuration to null");
+			}
+			
+			if(dhcpServerConfig4.isEnabled()) {
+			    this.enable();
+			} else {
+                writeConfig();
+			    this.disable();
+			}
+		} catch (Exception e) {
+			s_logger.error("Error setting subnet config for " + m_interfaceName);
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public DhcpServerConfig4 getDhcpServerConfig(boolean enabled, boolean passDns) {
+        try {
+            this.readConfig(enabled, passDns);
+        } catch (Exception e) {
+            s_logger.error("Error reading config", e);
+        }
+		return m_dhcpServerConfig4;
+	}
+
+	public String getConfigFilename() {
+		return persistentConfigFileName;
+	}
+	
+	private void writeConfig() throws KuraException {
+		try {
+			s_logger.trace("writing to " + FILE_DIR + m_configFileName + " with: " + m_dhcpServerConfig4.toString());
+			FileOutputStream fos = new FileOutputStream(FILE_DIR + m_configFileName);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(m_dhcpServerConfig4.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch(Exception e) {
+			e.printStackTrace();
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration files for dhcp servers: " + e.getMessage());
+		}		
+	}
+	
+	private void removePidFile() {
+		
+		File pidFile = new File(persistentPidFilename);
+		if (pidFile.exists()) {
+			pidFile.delete();
+		}
+	}
+	
+	private String formDhcpdCommand() {
+		StringBuffer sb = new StringBuffer();
+		sb.append("dhcpd -cf ").append(persistentConfigFileName)
+				.append(" -pf ").append(persistentPidFilename);
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerManager.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..cbddb76cd11ac7741f813efd478ebb62381c725a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dhcp/DhcpServerManager.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.dhcp;
+
+import java.io.File;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DhcpServerManager {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(DhcpServerManager.class);
+	
+	private static final String FILE_DIR = "/etc/";
+	private static final String PID_FILE_DIR = "/var/run/";
+	
+	
+	public static boolean isRunning(String interfaceName) throws KuraException {
+		try {
+			// Check if dhcpd is running
+			int pid = LinuxProcessUtil.getPid(DhcpServerManager.formDhcpdCommand(interfaceName));
+			return (pid > -1);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}	
+	
+	public static boolean enable(String interfaceName) throws KuraException {
+		try {
+			// Check if dhcpd is running
+			if(DhcpServerManager.isRunning(interfaceName)) {
+				// If so, disable it
+				s_logger.error("DHCP server is already running for " + interfaceName + ", bringing it down...");
+				DhcpServerManager.disable(interfaceName);
+			}
+			// Start dhcpd
+			File configFile = new File(DhcpServerManager.getConfigFilename(interfaceName));
+			if(configFile.exists()) {
+    			if (LinuxProcessUtil.startBackground(DhcpServerManager.formDhcpdCommand(interfaceName), false) == 0) {
+    				s_logger.debug("DHCP server started.");
+    				return true;
+    			}
+			} else {
+			    s_logger.debug("Can't start DHCP server, config file does not exist: " + configFile.getAbsolutePath());
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return false;
+	}
+
+	public static boolean disable(String interfaceName) throws KuraException {
+        s_logger.debug("Disable DHCP server for " + interfaceName);
+
+		try {
+			// Check if dhcpd is running
+			int pid = LinuxProcessUtil.getPid(DhcpServerManager.formDhcpdCommand(interfaceName));
+			if(pid > -1) {
+				// If so, kill it.
+				if (LinuxProcessUtil.stop(pid)) {
+				    DhcpServerManager.removePidFile(interfaceName);
+				} else {
+					s_logger.debug("Failed to stop process...try to kill");
+	                if(LinuxProcessUtil.kill(pid)) {
+	                    DhcpServerManager.removePidFile(interfaceName);
+	                } else {
+	                	throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "error killing process, pid=" + pid);
+	                }	
+				}
+			} else {
+				s_logger.debug("tried to kill DHCP server for interface but it is not running");
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return true;
+	}
+
+	public static String getConfigFilename(String interfaceName) {
+	    StringBuffer sb = new StringBuffer(FILE_DIR);
+	    sb.append("dhcpd-").append(interfaceName).append(".conf");
+
+		return sb.toString();
+	}
+	
+	private static void removePidFile(String interfaceName) {
+		File pidFile = new File(DhcpServerManager.getPidFilename(interfaceName));
+		if (pidFile.exists()) {
+			pidFile.delete();
+		}
+	}
+
+    private static String getPidFilename(String interfaceName) {
+        StringBuffer sb = new StringBuffer(PID_FILE_DIR);
+        sb.append("dhcpd-").append(interfaceName).append(".pid");
+
+        return sb.toString();
+    }
+	
+	private static String formDhcpdCommand(String interfaceName) {
+		StringBuffer sb = new StringBuffer("dhcpd");
+		sb.append(" -cf ").append(DhcpServerManager.getConfigFilename(interfaceName));
+		sb.append(" -pf ").append(DhcpServerManager.getPidFilename(interfaceName));
+		
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dns/LinuxDns.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dns/LinuxDns.java
new file mode 100644
index 0000000000000000000000000000000000000000..04ff76af77014a057cf4ff2c052102e1acd0c53c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dns/LinuxDns.java
@@ -0,0 +1,605 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.dns;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class LinuxDns {
+
+	private static Logger s_logger = LoggerFactory.getLogger(LinuxDns.class);
+	
+	private static final String DNS_FILE_NAME = "/etc/resolv.conf";
+	//private static final String PPP_DNS_FILE_NAME = "/etc/ppp/resolv.conf";
+	private static final String [] PPP_DNS_FILES = {"/var/run/ppp/resolv.conf", "/etc/ppp/resolv.conf"};
+	private static final String BACKUP_DNS_FILE_NAME = "/etc/resolv.conf.save";
+	
+	private static Object s_lock;
+	private static LinuxDns s_linuxDns = null;
+	
+	private LinuxDns() {
+		s_lock = new Object();
+	}
+	
+	public static synchronized LinuxDns getInstance() {
+		if(s_linuxDns == null) {
+			s_linuxDns = new LinuxDns();
+		}
+		
+		return s_linuxDns;
+	}
+
+	
+	public Set<IPAddress> getDnServers() {
+		synchronized(s_lock) {
+			BufferedReader br = null;
+			Set<IPAddress> servers = new HashSet<IPAddress>();
+			
+			try {
+				File f = new File(DNS_FILE_NAME);
+				if(!f.exists()) {
+					f.createNewFile();
+				}
+				
+				br = new BufferedReader(new FileReader(new File(DNS_FILE_NAME)));
+				
+				String line = null;
+				while((line = br.readLine()) != null) {
+					line = line.trim();
+					if(line.indexOf("nameserver") == 0) {
+						StringTokenizer st = new StringTokenizer(line);
+						st.nextToken();
+						servers.add(IPAddress.parseHostAddress(st.nextToken()));
+					}
+				}
+				
+				if(br != null) {
+					br.close();
+					br = null;
+				}
+				
+				if(servers.size() > 0) {
+					return servers;
+				} else {
+					s_logger.debug("No DNS servers found");
+					return null;
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+				return null;
+			}
+		}
+	}
+	
+	public void setDnServers(Set<IPAddress> servers) {
+		if(servers == null) {
+			if(getDnServers() != null) {
+				writeDnsFile(new HashSet<IPAddress>());
+			}
+		} else if(!servers.equals(getDnServers())) {
+			writeDnsFile(servers);
+		}
+	}
+	
+	public List<IPAddress> getPppDnServers() throws KuraException {
+		synchronized(s_lock) {
+			BufferedReader br = null;
+			ArrayList<IPAddress> serversList = new ArrayList<IPAddress>();
+			try {
+				String pppDnsFileName = getPppDnsFileName();
+				 if (pppDnsFileName != null) {
+					File pppDnsFile = new File(pppDnsFileName);
+					br = new BufferedReader(new FileReader(pppDnsFile));
+					String line;
+					while((line = br.readLine()) != null) {
+						line = line.trim();
+						if(line.indexOf("nameserver") == 0) {
+							StringTokenizer st = new StringTokenizer(line);
+							st.nextToken();
+							serversList.add(IP4Address.parseHostAddress(st.nextToken()));
+						}
+					}					
+			    }
+			} catch (Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			} finally {
+				if(br != null) {
+					try {
+						br.close();
+					} catch (IOException e) {
+						throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+					}
+				}
+			}
+			return serversList;
+		}
+	}
+	
+	public List<IPAddress> getDhcpDnsServers(String interfaceName, String address) throws KuraException {
+		IPAddress ipAddress = null;
+		try {
+			ipAddress = IP4Address.parseHostAddress(address);
+		} catch (UnknownHostException e) {
+			s_logger.error("Error parsing ip address " + address, e);
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		return getDhcpDnsServers(interfaceName, ipAddress);
+	}
+	
+	public List<IPAddress> getDhcpDnsServers(String interfaceName, IPAddress address) throws KuraException {
+		BufferedReader br = null;
+		ArrayList<IPAddress> servers = null;
+		
+		if(interfaceName != null && !interfaceName.isEmpty() && address != null && address.getAddress() != null) {
+			
+			StringBuilder sb = new StringBuilder();
+			sb.append("interface \"")
+			.append(interfaceName)
+			.append("\";");
+			String interfaceMatch = sb.toString();
+			
+			sb = new StringBuilder();
+			sb.append("fixed-address ")
+			.append(address.getHostAddress())
+			.append(";");
+			String fixedAddressMatch = sb.toString();
+			
+			File globalDhClientFile = new File("/var/lib/dhcp/dhclient.leases");
+			File interfaceDhClientFile = new File("/var/lib/dhcp/dhclient." + interfaceName + ".leases");
+			
+			if (interfaceDhClientFile.exists()) {
+				try {
+					br = new BufferedReader(new FileReader(interfaceDhClientFile));
+	    			
+					String line = null;
+					while((line = br.readLine()) != null) {
+						if(line.trim().equals("lease {")) {
+	    					//make sure it matches
+	    					if(!br.readLine().trim().equals(interfaceMatch)) {
+	    						continue;
+	    					}
+	    					if(!br.readLine().trim().equals(fixedAddressMatch)) {
+	    						continue;
+	    					}
+	    					while((line = br.readLine()) != null) {
+	    						if(line.indexOf("domain-name-servers") >= 0) {
+	    							StringTokenizer st = new StringTokenizer(line.substring(line.indexOf("domain-name-servers") + 19), ", ;");
+	    							if (servers == null) {
+	    								servers = new ArrayList<IPAddress>();
+	    							}
+	    							while(st.hasMoreTokens()) {
+	    								String nameServer = st.nextToken();
+	    								s_logger.debug("Found nameserver... " + nameServer); 
+	    								IPAddress ipa = IPAddress.parseHostAddress(nameServer);
+	    								if (!servers.contains(ipa)) {
+	    								servers.add(IPAddress.parseHostAddress(nameServer));
+	    								}
+	    							}
+	    							break;
+	    						} else if(line.indexOf("expire") >= 0) {
+	    							//no DNS for this entry
+	    							break;
+	    						}
+	    					}
+	    				}
+					}
+					
+	    			if(br != null) {
+	    				br.close();
+	    				br = null;
+	    			}
+				} catch (Exception e) {
+					throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+				}
+			} else if(globalDhClientFile.exists()) {
+				try {
+					br = new BufferedReader(new FileReader(globalDhClientFile));
+	    			
+					String line = null;
+					while((line = br.readLine()) != null) {
+						if(line.trim().equals("lease {")) {
+	    					//make sure it matches
+	    					if(!br.readLine().trim().equals(interfaceMatch)) {
+	    						continue;
+	    					}
+	    					if(!br.readLine().trim().equals(fixedAddressMatch)) {
+	    						continue;
+	    					}
+	    					while((line = br.readLine()) != null) {
+	    						if(line.indexOf("domain-name-servers") >= 0) {
+	    							StringTokenizer st = new StringTokenizer(line.substring(line.indexOf("domain-name-servers") + 19), ", ;");
+	    							servers = new ArrayList<IPAddress>();
+	    							while(st.hasMoreTokens()) {
+	    								String nameServer = st.nextToken();
+	    								s_logger.debug("Found nameserver... " + nameServer); 
+	    								servers.add(IPAddress.parseHostAddress(nameServer));
+	    							}
+	    							break;
+	    						} else if(line.indexOf("expire") >= 0) {
+	    							//no DNS for this entry
+	    							break;
+	    						}
+	    					}
+	    				}
+					}
+					
+	    			if(br != null) {
+	    				br.close();
+	    				br = null;
+	    			}
+				} catch (Exception e) {
+					throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				
+			} else {
+	    		sb = new StringBuilder();
+	    		sb.append("/var/lib/dhclient/dhclient-")
+	    		.append(interfaceName)
+	    		.append(".leases");
+	    
+	    		try {
+	    		    File dhclientFile = new File(sb.toString());
+	    		    if(!dhclientFile.exists()) {
+	    		        dhclientFile.createNewFile();
+	    		    }
+	    			br = new BufferedReader(new FileReader(dhclientFile));
+	    			
+	    			//boolean lookingForDns = false;
+	    			String line;
+	    			while((line = br.readLine()) != null) {
+	    				if(line.trim().equals("lease {")) {
+	    					//make sure it matches
+	    					if(!br.readLine().trim().equals(interfaceMatch)) {
+	    						continue;
+	    					}
+	    					if(!br.readLine().trim().equals(fixedAddressMatch)) {
+	    						continue;
+	    					}
+	    					while((line = br.readLine()) != null) {
+	    						if(line.indexOf("domain-name-servers") >= 0) {
+	    							StringTokenizer st = new StringTokenizer(line.substring(line.indexOf("domain-name-servers") + 19), ", ;");
+	    							servers = new ArrayList<IPAddress>();
+	    							while(st.hasMoreTokens()) {
+	    								String nameServer = st.nextToken();
+	    								s_logger.debug("Found nameserver... " + nameServer); 
+	    								servers.add(IPAddress.parseHostAddress(nameServer));
+	    							}
+	    							break;
+	    						} else if(line.indexOf("expire") >= 0) {
+	    							//no DNS for this entry
+	    							break;
+	    						}
+	    					}
+	    				}
+	    			}
+	    			
+	    			if(br != null) {
+	    				br.close();
+	    				br = null;
+	    			}
+	    		} catch (Exception e) {
+	    			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+	    		}    	
+			}
+		}
+		
+		return servers;
+	}
+
+	public void removeDnsServer(IPAddress serverIpAddress) {
+		synchronized(s_lock) {
+			try {
+				if(isPppDnsSet()) {
+					return;
+				}
+			} catch(Exception e) {
+				e.printStackTrace();
+			}
+			
+			Set<IPAddress> servers = getDnServers();
+			Set<IPAddress> newServers = new HashSet<IPAddress>();
+			
+			for(IPAddress server : servers) {
+				if(server.equals(serverIpAddress)) {
+					s_logger.info("removed the DNS server: " + serverIpAddress);
+				} else {
+					//keep it for the new Dns file
+					newServers.add(server);
+				}
+			}
+			
+			writeDnsFile(newServers);
+		}
+	}
+
+	public void addDnsServer(IPAddress serverIpAddress) {
+		synchronized(s_lock) {
+			try {
+				if(isPppDnsSet()) {
+					return;
+				}
+			} catch(Exception e) {
+				e.printStackTrace();
+			}
+			
+			Set<IPAddress> servers = getDnServers();
+			
+			if (servers == null) {
+				servers = new HashSet<IPAddress>();
+			}
+			servers.add(serverIpAddress);
+			
+			writeDnsFile(servers);
+		}
+	}
+
+	public void setPppDns() throws Exception {
+		synchronized(s_lock) {
+			String sPppDnsFileName = getPppDnsFileName();
+			if (sPppDnsFileName != null) {
+				if(!isPppDnsSet()) {
+					File file = new File(DNS_FILE_NAME);
+					if(file.exists()) {
+						Process proc = null;
+						try {
+							proc = ProcessUtil.exec("mv " + DNS_FILE_NAME + " " + BACKUP_DNS_FILE_NAME);
+							if(proc.waitFor() != 0) {
+								s_logger.error("failed to backup " + DNS_FILE_NAME);
+								throw new Exception("Failed to backup " + DNS_FILE_NAME);
+							} else {
+								s_logger.info("successfully backed up " + BACKUP_DNS_FILE_NAME);
+							}
+						}
+						finally {
+							ProcessUtil.destroy(proc);
+						}
+					}
+					
+					Process proc = null;
+					try {
+						proc = ProcessUtil.exec("ln -sf " + sPppDnsFileName + " " + DNS_FILE_NAME);
+						if(proc.waitFor() != 0) {
+							s_logger.error("failed to link " + DNS_FILE_NAME + " to " + sPppDnsFileName);
+							throw new Exception("Failed to backup " + DNS_FILE_NAME);
+						} else {
+							s_logger.info("set DNS to use ppp resolv.conf");
+						}
+					}
+					finally {
+						ProcessUtil.destroy(proc);
+					}
+				}
+			}
+		}
+	}
+
+	public void unsetPppDns() throws Exception {
+		synchronized(s_lock) {
+			if(isPppDnsSet()) {
+				String pppDnsFilename = getPppDnsFileName();
+				File file = new File(DNS_FILE_NAME);
+				if(file.exists()) {
+					Process proc = null;
+					try {
+						proc = ProcessUtil.exec("rm " + DNS_FILE_NAME);
+						if(proc.waitFor() != 0) {
+							s_logger.error("failed to delete " + DNS_FILE_NAME + " symlink that points to " + pppDnsFilename);
+							throw new Exception("failed to delete " + DNS_FILE_NAME + " symlink that points to " + pppDnsFilename);
+						} else {
+							s_logger.info("successfully removed symlink that points to " + pppDnsFilename);
+						}
+					}
+					finally {
+						ProcessUtil.destroy(proc);
+					}
+				}
+				
+				file = new File(BACKUP_DNS_FILE_NAME);
+				if(file.exists()) {
+					Process proc = null;
+					try {
+						proc = ProcessUtil.exec("mv " + BACKUP_DNS_FILE_NAME + " " + DNS_FILE_NAME);
+						if(proc.waitFor() != 0) {
+							s_logger.error("failed to restore " + BACKUP_DNS_FILE_NAME + " to " + DNS_FILE_NAME);
+							throw new Exception("failed to restore " + BACKUP_DNS_FILE_NAME + " to " + DNS_FILE_NAME);
+						} else {
+							s_logger.info("successfully restored " + DNS_FILE_NAME + " from " + BACKUP_DNS_FILE_NAME);
+						}
+					}
+					finally {
+						ProcessUtil.destroy(proc);
+					}						
+				} else {
+					Process proc = null;
+					try {
+						proc = ProcessUtil.exec("touch " + DNS_FILE_NAME);
+						if(proc.waitFor() != 0) {
+							s_logger.error("failed to create empty " + DNS_FILE_NAME);
+							throw new Exception("failed to create empty " + DNS_FILE_NAME);
+						} else {
+							s_logger.info("successfully created empty " + DNS_FILE_NAME);
+						}
+					}
+					finally {
+						ProcessUtil.destroy(proc);
+					}
+				}
+				
+				// remove actual PPP DNS file
+				File pppDnsFile = new File (pppDnsFilename);
+				if(pppDnsFile.exists()) {
+					pppDnsFile.delete();
+				}
+			}
+		}
+	}
+	
+	public boolean isPppDnsSet() throws Exception {
+		synchronized(s_lock) {
+			File file = new File(DNS_FILE_NAME);
+			if(isSymlink(file)) {
+				if(getRealPath(file).compareTo(getPppDnsFileName()) == 0) {
+					return true;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+		}
+	}
+	
+    private boolean isSymlink(File file) throws IOException {
+    	synchronized(s_lock) {
+	        if (file == null) {
+	        	throw new NullPointerException("File must not be null");
+	        }
+	
+	        File canon;
+	        if (file.getParent() == null) {
+	                canon = file;
+	        } else {
+	                File canonDir = file.getParentFile().getCanonicalFile();
+	                canon = new File(canonDir, file.getName());
+	        }
+	
+	        return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
+    	}
+    }
+
+    private String getRealPath(File file) throws IOException {
+    	synchronized(s_lock) {
+	        if (file == null) {
+	        	throw new NullPointerException("File must not be null");
+	        }
+	
+	        File canon;
+	        if (file.getParent() == null) {
+	                canon = file;
+	        } else {
+	                File canonDir = file.getParentFile().getCanonicalFile();
+	                canon = new File(canonDir, file.getName());
+	        }
+	        
+	        return canon.getCanonicalFile().toString();
+    	}
+    }
+    
+    private void writeDnsFile(Set<IPAddress> servers) {
+		s_logger.debug("Writing DNS servers to file");
+		synchronized(s_lock) {
+			try {
+				FileOutputStream fos = new FileOutputStream(DNS_FILE_NAME);
+				PrintWriter pw = new PrintWriter(fos);
+				
+				String[] existingFile = getModifiedFile();
+				for(int i=0; i<existingFile.length; i++) {
+					pw.write(existingFile[i] + "\n");
+				}
+				pw.write("\n");
+				
+				for(IPAddress server : servers) {
+					pw.write("nameserver " + server.getHostAddress() + "\n");
+				}
+				
+				if(pw != null) {
+					pw.flush();
+					fos.getFD().sync();
+					pw.close();
+					fos.close();
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+    private String[] getModifiedFile() {
+		synchronized(s_lock) {
+			BufferedReader br = null;
+			try {
+			    File dnsFile = new File(DNS_FILE_NAME);
+			    if(!dnsFile.exists()) {
+			        dnsFile.createNewFile();
+			    }
+			    
+				ArrayList<String> linesWithoutServers = new ArrayList<String>();
+				br = new BufferedReader(new FileReader(dnsFile));
+				
+				String line;
+				while((line = br.readLine()) != null) {
+					line = line.trim();
+					if(line.indexOf("nameserver") != 0) {
+						linesWithoutServers.add(line);
+					}
+				}
+				br.close();
+				
+				String[] lines = new String[linesWithoutServers.size()];
+				for(int i=0; i<linesWithoutServers.size(); i++) {
+					lines[i] = (String) linesWithoutServers.get(i);
+				}
+				return lines;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			
+			if(br != null) {
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			br = null;
+			
+			return null;
+		}
+	}
+    
+    private String getPppDnsFileName() {
+    	
+    	String pppDnsFileName = null;
+    	for (String name : PPP_DNS_FILES) {
+    		File file = new File (name);
+    		if (file.exists()) {
+    			pppDnsFileName = name;
+    			break;
+    		}
+    	}
+    	
+    	return pppDnsFileName;
+    }
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dns/LinuxNamed.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dns/LinuxNamed.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0351cdf24c9528795edd86002f0c20221e8d465
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/dns/LinuxNamed.java
@@ -0,0 +1,390 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.dns;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetworkPair;
+import org.eclipse.kura.net.dns.DnsServerConfigIP4;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LinuxNamed {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(LinuxNamed.class);
+
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private static LinuxNamed s_linuxNamed = null;
+	private static String s_persistentConfigFileName = null;
+	private static String s_procString = null;
+	
+	private DnsServerConfigIP4 m_dnsServerConfigIP4;
+	
+	private LinuxNamed() throws KuraException {
+		if(OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion()) ||
+				OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+			s_persistentConfigFileName = "/etc/bind/named.conf";
+			s_procString = "/usr/sbin/named";
+		} else {
+			s_persistentConfigFileName = "/etc/named.conf";
+			s_procString = "named -u named -t";
+		}
+		
+		//initialize the configuration
+		init();
+		
+		if(m_dnsServerConfigIP4 == null) {
+			Set<IP4Address> forwarders = new HashSet<IP4Address>();
+			HashSet<NetworkPair<IP4Address>> allowedNetworks = new HashSet<NetworkPair<IP4Address>>();
+			m_dnsServerConfigIP4 = new DnsServerConfigIP4(forwarders, allowedNetworks);
+		}
+	}
+	
+	public static synchronized LinuxNamed getInstance() throws KuraException {
+		if(s_linuxNamed == null) {
+			s_linuxNamed = new LinuxNamed();
+		}		
+		
+		return s_linuxNamed;
+	}
+	
+	private void init() throws KuraException {
+		//TODO
+		File configFile = new File(s_persistentConfigFileName);
+		if(configFile.exists()) {
+			
+			s_logger.debug("initing DNS Server configuration");
+			
+			try {
+				Set<IP4Address> forwarders = new HashSet<IP4Address>();
+				Set<NetworkPair<IP4Address>> allowedNetworks = new HashSet<NetworkPair<IP4Address>>();
+				
+				BufferedReader br = new BufferedReader(new FileReader(configFile));
+				boolean forwardingConfig = true;
+				
+				String line = null;
+				while((line = br.readLine()) != null) {
+					if(line.trim().equals("forward only;")) {
+						forwardingConfig = true;
+						break;
+					}
+				}
+				
+				br.close();
+				br = null;
+				
+				if(forwardingConfig) {
+					br = new BufferedReader(new FileReader(configFile));
+					while((line = br.readLine()) != null) {
+						//TODO - really simple for now
+						StringTokenizer st = new StringTokenizer(line);
+						while(st.hasMoreTokens()) {
+							String token = st.nextToken();
+							if(token.equals("forwarders")) {
+								//get the forwarders 'forwarders {192.168.1.1;192.168.2.1;};'
+								StringTokenizer st2 = new StringTokenizer(st.nextToken(), "{} ;");
+								while(st2.hasMoreTokens()) {
+									String forwarder = st2.nextToken();
+									if(forwarder != null && !forwarder.trim().equals("")) {
+										s_logger.debug("found forwarder: " + forwarder);
+										forwarders.add((IP4Address) IPAddress.parseHostAddress(forwarder));
+									}
+								}
+							} else if(token.equals("allow-query")) {
+								//get the networks 'allow-query {192.168.2.0/24;192.168.3.0/24};'
+								StringTokenizer st2 = new StringTokenizer(st.nextToken(), "{} ;");
+								while(st2.hasMoreTokens()) {
+									String allowedNetwork = st2.nextToken();
+									if(allowedNetwork != null && !allowedNetwork.trim().equals("")) {
+										String[] splitNetwork = allowedNetwork.split("/");
+										allowedNetworks.add(new NetworkPair<IP4Address>((IP4Address) IPAddress.parseHostAddress(splitNetwork[0]), Short.parseShort(splitNetwork[1])));
+									}
+								}
+							}
+						}
+					}
+					
+					br.close();
+					br = null;
+		
+					//set the configuration and return
+					m_dnsServerConfigIP4 = new DnsServerConfigIP4(forwarders, allowedNetworks);
+					return;
+				}
+			} catch (FileNotFoundException e) {
+				throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+			} catch (IOException e) {
+				throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+			}	
+		} else {
+			s_logger.debug("There is no current DNS server configuration that allows forwarding");
+		}
+	}
+	
+	public boolean isEnabled() throws KuraException {
+		try {
+			// Check if named is running
+			int pid = LinuxProcessUtil.getPid(s_procString);
+			return (pid > -1);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}	
+	
+	public boolean enable() throws KuraException {
+		//write config happened during 'set config' step
+		
+		try {
+			// Check if named is running
+			int pid = LinuxProcessUtil.getPid(s_procString);
+			if(pid > -1) {
+				// If so, disable it
+				s_logger.error("DNS server is already running, bringing it down...");
+				disable();
+			}
+			// Start named
+			int result = -1;
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				result = LinuxProcessUtil.start("/etc/init.d/bind start");
+			} 
+			else if (OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+				result = LinuxProcessUtil.start("/etc/init.d/bind9 start");
+			}
+			else {
+				result = LinuxProcessUtil.start("/etc/init.d/named start");
+			}
+			if(result == 0) {
+				s_logger.debug("DNS server started.");
+				s_logger.trace(m_dnsServerConfigIP4.toString());
+				return true;
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return false;
+	}
+
+	public boolean disable() throws KuraException {
+		try {
+			int result = -1;
+			// If so, stop it.
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				result = LinuxProcessUtil.start("/etc/init.d/bind stop");
+			} 
+			else if (OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+				result = LinuxProcessUtil.start("/etc/init.d/bind9 stop");
+			}
+			else {
+				result = LinuxProcessUtil.start("/etc/init.d/named stop");
+			}
+			
+			if(result == 0) {
+				s_logger.debug("DNS server stopped.");
+				s_logger.trace(m_dnsServerConfigIP4.toString());
+				return true;
+			} else {
+				s_logger.debug("tried to kill DNS server for interface but it is not running");
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return true;
+	}
+	
+	public boolean restart() throws KuraException {
+		try {
+			if(LinuxProcessUtil.start("/etc/init.d/named restart") == 0) {
+		        s_logger.debug("DNS server restarted.");
+		    } else {
+		    	throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "error restarting");
+		    }
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		return true;
+	}
+
+	public boolean isConfigured() {
+		if(m_dnsServerConfigIP4 != null && m_dnsServerConfigIP4.getForwarders() != null && m_dnsServerConfigIP4.getForwarders().size() > 0 &&
+				m_dnsServerConfigIP4.getAllowedNetworks() != null && m_dnsServerConfigIP4.getAllowedNetworks().size() > 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	public void setConfig(DnsServerConfigIP4 dnsServerConfigIP4) throws KuraException {
+		try {
+			
+			m_dnsServerConfigIP4 = dnsServerConfigIP4;
+			if(m_dnsServerConfigIP4 == null) {
+				s_logger.warn("Set DNS server configuration to null");
+			}
+			
+			writeConfig();
+		} catch (Exception e) {
+			s_logger.error("Error setting DNS server config");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public DnsServerConfigIP4 getDnsServerConfig() {
+		return m_dnsServerConfigIP4;
+	}
+
+	public String getConfigFilename() {
+		return s_persistentConfigFileName;
+	}
+	
+	private void writeConfig() throws KuraException {
+		try {
+			FileOutputStream fos = new FileOutputStream(s_persistentConfigFileName);
+			PrintWriter pw = new PrintWriter(fos);
+			
+			//build up the file
+			if(m_dnsServerConfigIP4 == null || m_dnsServerConfigIP4.getForwarders() == null || m_dnsServerConfigIP4.getAllowedNetworks() == null ||
+					m_dnsServerConfigIP4.getForwarders().size() == 0 || m_dnsServerConfigIP4.getAllowedNetworks().size() == 0) {
+				s_logger.debug("writing default named.conf to " + s_persistentConfigFileName + " with: " + m_dnsServerConfigIP4.toString());
+				pw.print(getDefaultNamedFile());
+			} else {
+				s_logger.debug("writing custom named.conf to " + s_persistentConfigFileName + " with: " + m_dnsServerConfigIP4.toString());
+				pw.print(getForwardingNamedFile());
+			}
+			
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch(Exception e) {
+			e.printStackTrace();
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration files for dns servers: " + e.getMessage());
+		}
+	}
+	
+	private String getForwardingNamedFile() {
+		StringBuilder sb = new StringBuilder()
+		.append("// Forwarding and Caching Name Server Configuration\n")
+		.append("options {\n")
+		.append("\tdirectory \"/var/named\";\n")
+		.append("\tversion \"not currently available\";\n")
+		
+		.append("\tforwarders {");
+		Set<IP4Address> forwarders = m_dnsServerConfigIP4.getForwarders();
+		for(IP4Address forwarder : forwarders) {
+			sb.append(forwarder.getHostAddress())
+			.append(";");
+		}
+		sb.append("};\n");
+		
+		sb.append("\tforward only;\n")
+		.append("\tallow-transfer{\"none\";};\n")
+		
+		.append("\tallow-query {");
+		Set<NetworkPair<IP4Address>> allowedNetworks = m_dnsServerConfigIP4.getAllowedNetworks();
+		for(NetworkPair<IP4Address> pair : allowedNetworks) {
+			sb.append(pair.getIpAddress().getHostAddress())
+			.append("/")
+			.append(pair.getPrefix())
+			.append(";");
+		}
+		sb.append("};\n");
+		sb.append("\tmax-cache-ttl 30;\n");
+		sb.append("\tmax-ncache-ttl 30;\n");
+		sb.append("};\n")
+		.append("logging{\n")
+		.append("\tchannel named_log {\n")
+		.append("\t\tfile \"/var/log/named.log\" versions 3;\n")
+		.append("\t\tseverity info;\n")
+		.append("\t\tprint-severity yes;\n")
+		.append("\t\tprint-time yes;\n")
+		.append("\t\tprint-category yes;\n")
+		.append("\t};\n")
+		.append("\tcategory default{\n")
+		.append("\t\tnamed_log;\n")
+		.append("\t};\n")
+		.append("};\n")
+		.append("zone \".\" IN {\n")
+		.append("\ttype hint;\n")
+		.append("\tfile \"named.ca\";\n")
+		.append("};\n")
+		.append("include \"/etc/named.rfc1912.zones\";\n");
+
+		return sb.toString();
+	}
+	
+	private static final String getDefaultNamedFile() {
+		StringBuilder sb = new StringBuilder()
+		.append("//\n")
+		.append("// named.conf\n")
+		.append("//\n")
+		.append("// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS\n")
+		.append("// server as a caching only nameserver (as a localhost DNS resolver only).\n")
+		.append("//\n")
+		.append("// See /usr/share/doc/bind*/sample/ for example named configuration files.\n")
+		.append("//\n")
+		.append("\n")
+		.append("options {\n")
+		.append("\tlisten-on port 53 { 127.0.0.1; };\n")
+		.append("\tlisten-on-v6 port 53 { ::1; };\n")
+		.append("\tdirectory	\"/var/named\";\n")
+		.append("\tdump-file	\"/var/named/data/cache_dump.db\";\n")
+		.append("\tstatistics-file \"/var/named/data/named_stats.txt\";\n")
+		.append("\tmemstatistics-file \"/var/named/data/named_mem_stats.txt\";\n")
+		.append("\tallow-query     { localhost; };\n")
+		.append("\trecursion yes;\n")
+		.append("\n")
+		.append("\tmax-cache-ttl 30;\n")
+		.append("\tmax-ncache-ttl 30;\n")
+		.append("\tdnssec-enable yes;\n")
+		.append("\tdnssec-validation yes;\n")
+		.append("\tdnssec-lookaside auto;\n")
+		.append("\n")
+		.append("\t/* Path to ISC DLV key */\n")
+		.append("\nbindkeys-file \"/etc/named.iscdlv.key\";\n")
+		.append("};\n")
+		.append("\n")
+		.append("logging {\n")
+		.append("\tchannel default_debug {\n")
+		.append("\t\tfile \"data/named.run\";\n")
+		.append("\t\tseverity dynamic;\n")
+		.append("\t};\n")
+		.append("};\n")
+		.append("\n")
+		.append("zone \".\" IN {\n")
+		.append("\ttype hint;\n")
+		.append("\tfile \"named.ca\";\n")
+		.append("};\n")
+		.append("\n")
+		.append("include \"/etc/named.rfc1912.zones\";\n");
+	
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/LinuxFirewall.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/LinuxFirewall.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a26759f1f4a58f93bb9484b1dcbf9f4011e501c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/LinuxFirewall.java
@@ -0,0 +1,1258 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.iptables;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetworkPair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation class for the ILinuxFirewallService
+ * 
+ * @author eurotech
+ */
+public class LinuxFirewall {
+	private static final Logger s_logger = LoggerFactory.getLogger(LinuxFirewall.class);
+	
+	private static final String[] HEADER = {"#!/bin/sh", "# IPTables Firewall script", ""};
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private static final String[] DEFAULT_POLICY = HEADER;
+	
+	private static final String[] CLEAR_ALL_CHAINS = {"",
+						"#Clear all Built-in Chains",
+						"iptables -F INPUT",
+						"iptables -F OUTPUT",
+						"iptables -F FORWARD",
+						"iptables -t nat -F",
+						""};
+
+	private static final String[] BLOCK_POLICY = {"",
+													"#Block all ports for input traffic",
+													"iptables -P INPUT DROP",
+													"#block Output Traffic",
+													"iptables -P OUTPUT ACCEPT",
+													"#block forward Traffic",
+													"iptables -P FORWARD DROP",
+													"",
+													"#Allow all traffic to the loop back interface",
+													"iptables -A INPUT -i lo -j ACCEPT",
+													"",
+													"#Allow Only incoming connection related to Outgoing connection",
+													"iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT",
+													""};
+
+	/*
+	private static final String UNBLOCK_POLICY = "\n" + "#unBlock all ports for input traffic\n" + "iptables -P INPUT ACCEPT\n" + "#Accept Output Traffic\n" + "iptables -P OUTPUT ACCEPT\n"
+						+ "#unblock forward Traffic\n" + "iptables -P FORWARD ACCEPT\n" + "\n"
+						+ "#Allow all traffic to loop back interface\n" + "iptables -A INPUT -i lo -j ACCEPT\n" + "\n"
+						+ "#Allow Only incoming connection related to Outgoing connection\n" + "iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\n" + "\n";
+	 */
+	
+	private static final String[] ALLOW_ICMP = {"#allow inbound ICMP requests",
+												"iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT",
+												"iptables -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT",
+												""};
+
+	private static final String[] DO_NOT_ALLOW_ICMP = {"#Do not allow inbound ICMP requests",
+														"iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j DROP",
+														"iptables -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j DROP",
+														""};
+
+	private static final String[] ALLOW_FORWARDING = {"#allow fowarding if any masquerade is defined",
+														"echo 1 > /proc/sys/net/ipv4/ip_forward"};
+
+	private static final String[] DO_NOT_ALLOW_FORWARDING = {"#do not allow fowarding unless masquerade is defined",
+																"echo 0 > /proc/sys/net/ipv4/ip_forward"};
+
+	private static final String[] FOOTER = {"#source a custom firewall script",
+											"source /etc/init.d/firewall_cust 2> /dev/null"};
+
+	private static LinuxFirewall s_linuxFirewall;
+
+	private static final String FIREWALL_SCRIPT_NAME = "/etc/init.d/firewall";
+	private static final String FIREWALL_TMP_SCRIPT_NAME = "/etc/init.d/firewall.tmp";
+
+	private LinkedHashSet<LocalRule> m_localRules;
+	private LinkedHashSet<PortForwardRule> m_portForwardRules;
+	private LinkedHashSet<NATRule> m_natRules;
+	private LinkedHashSet<NATRule> m_reverseNatRules;
+	private LinkedHashSet<String> m_customRules;
+	private boolean m_allowIcmp;
+	private boolean m_allowForwarding;
+
+	private LinuxFirewall() {
+		try {
+			try {
+				File oscfile = new File(FIREWALL_SCRIPT_NAME);
+				if (oscfile.exists() == false) {
+					FileOutputStream fos = new FileOutputStream(oscfile);
+					s_logger.debug(oscfile + " new file created");
+					PrintWriter pw = new PrintWriter(fos);
+					for(String line : DEFAULT_POLICY) {
+						pw.println(line);
+					}
+					pw.println();
+					pw.close();
+				} else {
+					s_logger.debug(oscfile + " file already exists");
+				}
+			} catch (IOException e) {
+				s_logger.error("cannot create or read file");// File did not exist and was created
+			}
+			
+			m_localRules = new LinkedHashSet<LocalRule>();
+			m_portForwardRules = new LinkedHashSet<PortForwardRule>();
+			m_natRules = new LinkedHashSet<NATRule>();
+			m_reverseNatRules = new LinkedHashSet<NATRule>();
+			m_customRules = new LinkedHashSet<String>();
+			m_allowIcmp = true;
+			m_allowForwarding = false;
+			
+			initialize();
+		} catch (Exception e) {
+			e.printStackTrace();
+			s_logger.error("failed to initialize LinuxFirewall");
+		}
+	}
+	
+	public static LinuxFirewall getInstance() {
+		if(s_linuxFirewall == null) {
+			s_linuxFirewall = new LinuxFirewall();
+		}
+		
+		return s_linuxFirewall;
+	}
+
+	public ArrayList<String> readFileLinebyLine(String sourceFile) {
+		ArrayList<String> destination = new ArrayList<String>();
+		try {
+			// Open the file that is the first command line parameter
+			FileInputStream fstream = new FileInputStream(sourceFile);
+
+			// Get the object of DataInputStream
+			DataInputStream in = new DataInputStream(fstream);
+			BufferedReader br = new BufferedReader(new InputStreamReader(in));
+			String strLine;
+			int i = 0;
+
+			// Read File Line By Line
+			while ((strLine = br.readLine()) != null) {
+				// Print the content on the console
+				destination.add(i, strLine);
+				i = i + 1;
+			}
+
+			// Close the input stream
+			in.close();
+		} catch(FileNotFoundException e) {// Catch exception if any
+			s_logger.error("the file: " + sourceFile + " does not exist");
+		} catch(IOException ioe) {
+			s_logger.error("IOException while trying to open: " + sourceFile);
+			ioe.printStackTrace();
+		}
+
+		s_logger.trace("size of destination is" + destination.size());
+		return destination;
+	}
+
+	public void createFile(String file1) throws KuraException {
+		File file = new File(file1);
+		if (file.exists() == true) {
+			s_logger.debug(file + " already exists in getdefaultroute method");
+
+		} else {
+			s_logger.debug(file + " does not exist in getdefaultroute method");
+			try {
+				file.createNewFile();
+			} catch (IOException e) {
+				s_logger.error(file + ", ERROR creating new file");
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			s_logger.debug("new File: " + file + " created");
+		}
+	}
+
+	private void initialize() throws KuraException {
+		
+		s_logger.debug("Parsing current firewall configuraion");
+		BufferedReader br = null;
+		
+		try {
+			br = new BufferedReader(new FileReader(FIREWALL_SCRIPT_NAME));
+			String line = null;
+			
+			lineloop:
+			while((line = br.readLine()) != null) {
+				//skip any predefined lines or comment lines
+				if(line.trim().equals("")) {
+					continue;
+				}
+				if(line.trim().startsWith("#")) {
+					continue;
+				}
+				for(String headerLine : HEADER) {
+					if(line.equals(headerLine)) {
+						continue lineloop;
+					}
+				}
+				for(String clearAllChains : CLEAR_ALL_CHAINS) {
+					if(line.equals(clearAllChains)) {
+						continue lineloop;
+					}
+				}
+				for(String blockPolicy : BLOCK_POLICY) {
+					if(line.equals(blockPolicy)) {
+						continue lineloop;
+					}
+				}
+				for(String allowIcmp : ALLOW_ICMP) {
+					if(line.equals(allowIcmp)) {
+						m_allowIcmp = true;
+						continue lineloop;
+					}
+				}
+				for(String doNotAllowIcmp : DO_NOT_ALLOW_ICMP) {
+					if(line.equals(doNotAllowIcmp)) {
+						m_allowIcmp = false;
+						continue lineloop;
+					}
+				}
+				for(String allowForwarding : ALLOW_FORWARDING) {
+					if(line.equals(allowForwarding)) {
+						m_allowForwarding = true;
+						continue lineloop;
+					}
+				}
+				for(String doNotAllowForwarding : DO_NOT_ALLOW_FORWARDING) {
+					if(line.equals(doNotAllowForwarding)) {
+						m_allowForwarding = false;
+						continue lineloop;
+					}
+				}
+				for(String footer : FOOTER) {
+					if(line.equals(footer)) {
+						continue lineloop;
+					}
+				}
+
+				if(line.startsWith("iptables -I INPUT -p")) {
+					s_logger.debug("Found local rule");
+					
+					//Local Rule
+					int dport = -1;
+					String sport = null;
+					String permittedMac = null;
+					String permittedNetwork = null;
+					String permittedInterfaceName = null;
+					String unpermittedInterfaceName = null;
+					int permittedNetworkMask = -1;
+					String protocol = null;
+					
+					StringTokenizer st = new StringTokenizer(line);
+					while(st.hasMoreTokens()) {
+						String token = st.nextToken();
+						if(token.equals("iptables")) {
+							st.nextToken();	//skip -I
+							st.nextToken(); //skip INPUT
+						} else if(token.equals("-p")) {
+							protocol = st.nextToken();
+						} else if(token.equals("--dport")) {
+							dport = Integer.parseInt(st.nextToken());
+						} else if(token.equals("--sport")) {
+							sport = st.nextToken();
+						} else if(token.equals("--mac-source")) {
+							permittedMac = st.nextToken();
+						} else if(token.equals("-m")) {
+							st.nextToken();	//skip mac
+						} else if(token.equals("-s")) {
+							String[] permitted = st.nextToken().split("/");							
+							permittedNetwork = permitted[0];
+							permittedNetworkMask = Integer.parseInt(permitted[1]);
+						} else if(token.equals("!")) {
+							st.nextToken(); //skip -i
+							unpermittedInterfaceName = st.nextToken();
+						} else if(token.equals("-i")) {
+							permittedInterfaceName = st.nextToken();
+						} else if(token.equals("-j")) {
+							//got to the end of the line...
+							break;
+						} else {
+							throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "Error parsing LocalRule: " + line);
+						}
+					}
+					
+					LocalRule localRule = new LocalRule(dport, protocol, new NetworkPair(IPAddress.parseHostAddress(permittedNetwork), (short) permittedNetworkMask), permittedInterfaceName, unpermittedInterfaceName, permittedMac, sport);
+					s_logger.debug("Adding local rule: " + localRule.toString());
+					m_localRules.add(localRule);
+				} else if(line.startsWith("iptables -t nat -A PREROUTING")) {
+					s_logger.debug("Found port forward rule");
+					
+					//Port Forward Rule
+					String interfaceName = null;
+					String protocol = null;
+					int inPort = -1;
+					int outPort = -1;
+					String sport = null;
+					String permittedMac = null;
+					String permittedNetwork = null;
+					int permittedNetworkMask = -1;
+					String address = null;
+					
+					StringTokenizer st = new StringTokenizer(line, "; \t\n\r\f");
+					while(st.hasMoreTokens()) {
+						String token = st.nextToken();
+						if(token.equals("iptables")) {
+							String tok1 = st.nextToken();	//skip -t
+							String tok2 = st.nextToken(); //skip nat
+							if (tok1.equals("-t") && tok2.equals("nat")) {
+								st.nextToken();	//skip -A
+								st.nextElement();	//skip PREROUTING
+							} else if (tok1.equals("-A") && tok2.equals("FORWARD")) {
+								// this is a forwarding rule, skip it
+								break;
+							} else {
+								throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "Error parsing LocalRule: " + line);
+							}
+						} else if(token.equals("-i")) {
+							interfaceName = st.nextToken();
+						} else if(token.equals("-p")) {
+							protocol = st.nextToken();
+						} else if(token.equals("--dport")) {
+							inPort = Integer.parseInt(st.nextToken());
+						} else if(token.equals("--sport")) {
+							sport = st.nextToken();
+						} else if(token.equals("--mac-source")) {
+							permittedMac = st.nextToken();
+						} else if(token.equals("-m")) {
+							st.nextToken();	//skip mac
+						} else if(token.equals("-j")) {
+							st.nextToken(); //skip DNAT
+						} else if(token.equals("--to")) {
+							String[] to = st.nextToken().split(":");							
+							address = to[0];
+							outPort = Integer.parseInt(to[1]);
+						} else if(token.equals("-s")) {
+							String[] permitted = st.nextToken().split("/");							
+							permittedNetwork = permitted[0];
+							permittedNetworkMask = Integer.parseInt(permitted[1]);
+						} else {
+							throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "Error parsing LocalRule: " + line);
+						}
+					}
+					
+					PortForwardRule portForwardRule = new PortForwardRule(interfaceName, address, protocol, inPort, outPort, permittedNetwork, permittedNetworkMask, permittedMac, sport);
+					s_logger.debug("Adding port forward rule: " + portForwardRule.toString());
+					m_portForwardRules.add(portForwardRule);
+				} else if(line.startsWith("iptables -t nat -A POSTROUTING")) {
+					s_logger.debug("Found NAT rule");
+					
+					//NAT Rule
+					String destinationInterface = null;
+					String sourceInterface = null;
+					boolean masquerade = false;
+					
+					String protocol = null;
+					String source = null;
+					String destination = null;
+					
+					//just do this one by one
+					StringTokenizer st = new StringTokenizer(line);
+					st.nextToken();		//skip iptables
+					String token = st.nextToken();		//get -t or -A (depending on whether or not masquerade is enabled)
+					if(token.equals("-t")) {
+						masquerade = true;
+						st.nextToken();		//skip nat
+						st.nextToken();		//skip -A
+						st.nextToken();		//skip POSTROUTING
+						String tok = st.nextToken();		//skip -o or -p
+						if (tok.equals("-p")) {
+							protocol = st.nextToken();
+							st.nextToken(); 	// skip -s
+							source = st.nextToken();
+							st.nextToken(); 	// skip -d
+							destination = st.nextToken();
+							st.nextToken(); 	// skip -o
+							destinationInterface = st.nextToken();
+						} else {
+							destinationInterface = st.nextToken();
+						}
+						st.nextToken();		//skip -j
+						st.nextToken();		//skip MASQUERADE
+						st.nextToken();		//skip iptables
+						st.nextToken();		//skip -A
+					}
+
+					//get the rest (or continue on if no MASQ)
+					st.nextToken();		//skip FORWARD
+					String tok = st.nextToken();		//skip -i or -p
+					if (tok.equals("-p")) {
+						st.nextToken(); // skip protocol
+						st.nextToken(); // skip -s
+						st.nextToken(); // skip source
+						st.nextToken(); // skip -d
+						st.nextToken(); // skip destination
+						st.nextToken(); // skip -i
+						st.nextToken(); // skip destination interface
+						st.nextToken();		//skip -o
+						sourceInterface = st.nextToken();
+					} else {
+						destinationInterface = st.nextToken();
+						st.nextToken();		//skip -o
+						sourceInterface = st.nextToken();
+					}
+					
+					if (protocol == null) {
+						// used to be s_logger.debug
+						s_logger.debug("Parsed NAT rule with" +
+								"   sourceInterface: " + sourceInterface +
+								"   destinationInterface: " + destinationInterface +
+								"   masquerade: " + masquerade );
+	
+						NATRule natRule = new NATRule(sourceInterface, destinationInterface, masquerade);
+						s_logger.debug("Adding NAT rule " + natRule.toString());
+						m_natRules.add(natRule);
+					} else {
+						s_logger.debug("Parsed Reverse NAT rule with" +
+								"   sourceInterface: " + sourceInterface +
+								"   destinationInterface: " + destinationInterface +
+								"   masquerade: " + masquerade + 
+								"	protocol: " + protocol + 
+								"	source network/host: " + source + 
+								"	destination network/host + destination");
+						NATRule natRule = new NATRule(sourceInterface, destinationInterface, protocol, source, destination, masquerade);
+						s_logger.warn("Adding Reverse NAT rule " + natRule.toString());
+						m_reverseNatRules.add(natRule);
+					}
+				} else {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "invalid line in /etc/init.d/firewall: " + line);
+				}
+			}			
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} finally {
+			//close
+			if(br != null) {
+				try {
+					br.close();
+				} catch (IOException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				br = null;
+			}
+		}
+	}
+
+	private boolean writeFile() throws KuraException {
+		s_logger.trace("writing to file:  " + FIREWALL_TMP_SCRIPT_NAME);
+		try {
+			PrintWriter pw = new PrintWriter(new FileOutputStream(FIREWALL_TMP_SCRIPT_NAME));
+			for(String line : HEADER) {
+				pw.println(line);
+			}
+			for(String line : CLEAR_ALL_CHAINS) {
+				pw.println(line);
+			}
+			for(String line : BLOCK_POLICY) {
+				pw.println(line);
+			}
+			
+			if(m_allowIcmp) {
+				for(String line : ALLOW_ICMP) {
+					pw.println(line);
+				}
+			} else {
+				for(String line : DO_NOT_ALLOW_ICMP) {
+					pw.println(line);
+				}
+			}
+			
+			pw.println("#custom local service rules");
+			Iterator<LocalRule> itLocalRules = m_localRules.iterator();
+			while(itLocalRules.hasNext()) {
+			    pw.println(itLocalRules.next());
+			}
+			pw.println();
+			pw.println("#custom port forward service rules");
+			Iterator<PortForwardRule> itPortForwardRules = m_portForwardRules.iterator();
+			while(itPortForwardRules.hasNext()) {
+			    pw.println(itPortForwardRules.next());
+			}
+			pw.println();
+			pw.println("#custom nat service rules");
+			Iterator<NATRule> itNATRules = m_natRules.iterator();
+			while(itNATRules.hasNext()) {
+			    pw.println(itNATRules.next());
+			}
+			pw.println();
+			pw.println("#custom reverse nat service rules");
+			Iterator<NATRule> itReverseNATRules = m_reverseNatRules.iterator();
+			while(itReverseNATRules.hasNext()) {
+			    pw.println(itReverseNATRules.next());
+			}
+			pw.println();
+			pw.println("#custom rules");
+			Iterator<String> itCustomRules = m_customRules.iterator();
+			while(itCustomRules.hasNext()) {
+			    pw.println(itCustomRules.next());
+			}
+			pw.println();
+			if(m_allowForwarding) {
+				for(String line : ALLOW_FORWARDING) {
+					pw.println(line);
+				}
+			} else {
+				for(String line : DO_NOT_ALLOW_FORWARDING) {
+					pw.println(line);
+				}
+			}
+
+			pw.println();
+			for(String line : FOOTER) {
+				pw.println(line);
+			}
+			pw.close();
+			
+			Process proc = null; 
+			try {
+				proc = ProcessUtil.exec("chmod 755 " + FIREWALL_TMP_SCRIPT_NAME);
+				proc.waitFor();
+			}
+			finally {
+				ProcessUtil.destroy(proc);
+			}
+			
+			//move the file if we made it this far
+			File tmpFirewallFile = new File(FIREWALL_TMP_SCRIPT_NAME);
+			File firewallFile = new File(FIREWALL_SCRIPT_NAME);
+			if(!FileUtils.contentEquals(tmpFirewallFile, firewallFile)) {
+				if(tmpFirewallFile.renameTo(firewallFile)) {
+					s_logger.trace("Successfully wrote firewall file");
+					return true;
+				} else {
+					s_logger.error("Failed to write firewall file");
+					throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for firewall");
+				}
+			} else {
+				s_logger.info("Not rewriting firewall file because it is the same");
+				return false;
+			}
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}	
+
+	public void addCustomRule(String rule) throws KuraException {
+		try {			
+			s_logger.info("adding custom local rule to  firewall configuration");
+			m_customRules.add(rule);
+			this.update();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void addLocalRule(int port, String protocol, String permittedNetwork, String permittedNetworkPrefix, String permittedInterfaceName, String unpermittedInterfaceName, String permittedMAC, String sourcePortRange) throws KuraException {
+		try {
+			LocalRule newLocalRule = null;
+			if(permittedNetwork != null && permittedNetworkPrefix != null) {
+				s_logger.debug("permittedNetwork: " + permittedNetwork);
+				s_logger.debug("permittedNetworkPrefix: " + permittedNetworkPrefix);
+				
+				newLocalRule = new LocalRule(port, protocol, new NetworkPair(IPAddress.parseHostAddress(permittedNetwork), Short.parseShort(permittedNetworkPrefix)), permittedInterfaceName, unpermittedInterfaceName, permittedMAC, sourcePortRange);
+			} else {
+				newLocalRule = new LocalRule(port, protocol, new NetworkPair(IPAddress.parseHostAddress("0.0.0.0"), (short)0), permittedInterfaceName, permittedInterfaceName, permittedMAC, sourcePortRange);
+			}
+			
+			//make sure it is not already present
+			for(LocalRule localRule : m_localRules) {
+				if(newLocalRule.equals(localRule)) {
+					s_logger.warn("Not adding local rule that is already present: " + localRule);
+					return;
+				}
+			}
+			
+			s_logger.info("adding local rule to firewall configuration: " + newLocalRule.toString());
+			m_localRules.add(newLocalRule);
+			this.update();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void addPortForwardRule(String iface, String address, String protocol, int inPort, int outPort, String permittedNetwork, String permittedNetworkPrefix, String permittedMAC, String sourcePortRange)
+						throws KuraException {
+		try {
+			PortForwardRule newPortForwardRule = null;
+			if(permittedNetworkPrefix != null) {
+				newPortForwardRule = new PortForwardRule(iface, address, protocol, inPort, outPort, permittedNetwork, Short.parseShort(permittedNetworkPrefix), permittedMAC, sourcePortRange);
+			} else {
+				newPortForwardRule = new PortForwardRule(iface, address, protocol, inPort, outPort, permittedNetwork, -1, permittedMAC, sourcePortRange);	
+			}
+			
+			//make sure it is not already present
+			for(PortForwardRule portForwardRule : m_portForwardRules) {
+				if(newPortForwardRule.equals(portForwardRule)) {
+					s_logger.warn("Not adding port forward rule that is already present: " + portForwardRule);
+					return;
+				}
+			}
+			
+			s_logger.info("adding port forward rule to firewall configuration: " + newPortForwardRule.toString());
+			m_portForwardRules.add(newPortForwardRule);	
+			this.update();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void addNatRule(String sourceInterface, String destinationInterface, boolean masquerade) throws KuraException {
+		
+		try {
+		    if(sourceInterface == null || sourceInterface.isEmpty()) {
+		        s_logger.warn("Can't add NAT rule - source interface not specified");
+		        return;
+		    } else if(destinationInterface == null || destinationInterface.isEmpty()) {
+                s_logger.warn("Can't add NAT rule - destination interface not specified");
+                return;
+		    }
+		    
+			NATRule newNatRule = new NATRule(sourceInterface, destinationInterface, masquerade);
+			
+			//make sure it is not already present
+			for(NATRule natRule : m_natRules) {
+				if(newNatRule.equals(natRule)) {
+					s_logger.warn("Not adding nat rule that is already present: " + natRule);
+					return;
+				}
+			}
+			
+			s_logger.info("adding NAT rule to firewall configuration: " + newNatRule.toString());
+			this.m_natRules.add(newNatRule);
+			this.m_allowForwarding = true;
+			this.update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	/**
+	 * Adds Reverse Nat Rule
+	 * 
+	 * @param sourceInterface
+	 * @param destinationInterface
+	 * @param protocol
+	 * @param source
+	 * @param destination
+	 * @param masquerade
+	 * @throws EsfException
+	 */
+	public void addNatRule(String sourceInterface, String destinationInterface,
+			String protocol, String source, String destination,
+			boolean masquerade) throws KuraException {
+		
+		try {
+			if(sourceInterface == null || sourceInterface.isEmpty()) {
+		        s_logger.warn("Can't add Reverse NAT rule - source interface not specified");
+		        return;
+		    } else if(destinationInterface == null || destinationInterface.isEmpty()) {
+	            s_logger.warn("Can't add Reverse NAT rule - destination interface not specified");
+	            return;
+		    }
+			
+			NATRule newReverseNatRule = new NATRule(sourceInterface,
+					destinationInterface, protocol, source, destination,
+					masquerade);
+			// TODO need to add comparison
+			s_logger.info("adding Reverse NAT rule to firewall configuration: " + newReverseNatRule.toString());
+			m_reverseNatRules.add(newReverseNatRule);
+			m_allowForwarding = true;
+			this.update();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public Set<LocalRule> getLocalRules() throws KuraException {
+		try {
+			return m_localRules;
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public Set<PortForwardRule> getPortForwardRules() throws KuraException {
+		try {
+			return m_portForwardRules;
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public Set<NATRule> getNatRules() throws KuraException {
+		try {
+			return m_natRules;
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public Set<NATRule> getReverseNatRules() throws KuraException {
+		try {
+			return m_reverseNatRules;
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void deleteLocalRule(LocalRule rule) throws KuraException {
+		try {
+			m_localRules.remove(rule);
+			this.update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void deletePortForwardRule(PortForwardRule rule) throws KuraException {
+		try {
+			m_portForwardRules.remove(rule);
+			this.update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void deleteNatRule(NATRule rule) throws KuraException {
+		try {
+			this.m_natRules.remove(rule);
+			if (((m_natRules != null) && (m_natRules.size() < 1))
+					&& ((m_reverseNatRules != null) && (m_reverseNatRules.size() < 1))) {
+				m_allowForwarding = false;
+			}
+			update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void deleteAllLocalRules() throws KuraException {
+		try {
+			this.m_localRules.clear();
+			this.update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void deleteAllPortForwardRules() throws KuraException {
+		try {
+			m_portForwardRules.clear();
+			this.update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void replaceAllNatRules(LinkedHashSet<NATRule> newNatRules) throws KuraException {
+		try {
+			this.m_natRules = newNatRules;
+			if (((m_natRules != null) && (m_natRules.size() > 0))
+					|| ((m_reverseNatRules != null) && (m_reverseNatRules.size() > 0))) {
+				m_allowForwarding = true;
+			} else {
+				m_allowForwarding = false;
+			}
+			this.update();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void deleteAllNatRules() throws KuraException {
+		try {
+			this.m_natRules.clear();
+			if ((m_reverseNatRules != null) && (m_reverseNatRules.size() < 1)) {
+				m_allowForwarding = false;
+			}
+			this.update();
+		}
+		catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void deleteAllReverseNatRules(String inIface) throws KuraException {
+		try {
+			List<NATRule> rulesToRemove = null;
+			Iterator<NATRule> it = m_reverseNatRules.iterator();
+			while (it.hasNext()) {
+				NATRule rule = it.next();
+				if (inIface.equals(rule.getSourceInterface())) {
+					if (rulesToRemove == null) {
+						rulesToRemove = new ArrayList<NATRule>();
+					}
+					rulesToRemove.add(rule);
+				}
+			}
+			if ((rulesToRemove != null) && (rulesToRemove.size() > 0)) {
+				for (NATRule ruleToRemove : rulesToRemove) {
+					m_reverseNatRules.remove(ruleToRemove);
+				}
+			}
+			
+			if (((m_natRules != null) && (m_natRules.size() < 1))
+					&& ((m_reverseNatRules != null) && (m_reverseNatRules.size() < 1))) {
+				m_allowForwarding = false;
+			}
+			this.update();
+		} catch (KuraException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void blockAllPorts() throws KuraException {
+		deleteAllLocalRules();
+		deleteAllPortForwardRules();
+		deleteAllNatRules();
+		this.update();
+	}
+
+	public void unblockAllPorts() throws KuraException {
+		deleteAllLocalRules();
+		deleteAllPortForwardRules();
+		deleteAllNatRules();
+		this.update();
+	}
+
+	/**
+	 * This method is call when the EventListener receives a new configuration event.  The Configuration
+	 * Object is then requested from the Configuration Manager Service, and the updateConfiguration 
+	 * method is called.
+	 */
+	/*public void handleEvent(Event arg0) {
+		// Get the new configuration object form the Configuration Manager Service
+		Object configurationObject = configManager.getConfiguration(CONFIGURATION_NAME);
+		// Make sure it is a Java Properties object and then update the configuration parameters
+		if(configurationObject instanceof java.util.Properties) {
+			s_logger.info("New configuration received");
+			if(processNewConfig((Properties)configurationObject)) {
+				configManager.storeConfiguration(CONFIGURATION_NAME);
+			
+			}
+		} else {
+			s_logger.error("Invalid Configuration Object of type:  " + configurationObject.getClass().toString());
+		}
+	}*/
+	
+	
+//	public Object receiveConfig(Object config) throws KuraConfigurationException {
+//		try {
+//		// Get the new configuration object form the Configuration Manager Service
+//		Object configurationObject = config;
+//		// Make sure it is a Java Properties object and then update the configuration parameters
+//		if(configurationObject instanceof java.util.Properties) {
+//			s_logger.info("New configuration received");
+//			if(processNewConfig((Properties)configurationObject)) {
+//				s_logger.info("New configuration successfully submitted");
+//				
+//			}
+//		} else {
+//			s_logger.error("Invalid Configuration Object of type:  " + configurationObject.getClass().toString());
+//		}
+//		}catch (Exception e){
+//			throw new KuraConfigurationException(LABEL + "error while trying to submit configuration for firewall");
+//		}
+//		//we don't want the config manager to archive this - since we already did in the filesystem.
+//		return null;
+//	}
+//	
+//	private boolean processNewConfig(Properties props) {
+//		ArrayList natRules = new ArrayList();
+//		ArrayList localRules = new ArrayList();
+//		ArrayList portForwardRules = new ArrayList();
+//		
+//		NewRule newRule = null;
+//		String ruleString, param;
+//		Enumeration keys = props.keys();
+//		Properties configs = new Properties();
+//		
+//		
+//		try {
+//			while(keys.hasMoreElements()) {
+//				String key = (String)keys.nextElement();
+//				ruleString = key.substring(0, key.lastIndexOf('_'));
+//				param = key.substring(key.lastIndexOf('_')+1);
+//				
+//				newRule = getRule(ruleString);
+//				s_logger.trace("New Rule");
+//				s_logger.trace(" type = " + newRule.type); 
+//				s_logger.trace(" index = " + newRule.index);
+//				s_logger.trace(" param = " + param);
+//				s_logger.trace(" value = " + (String)props.getProperty(key));
+//				
+//				// Check if the new rule is a NATRule
+//				if(newRule.type.compareTo("NATRule")==0) {
+//					s_logger.trace("NATRule found");
+//					// Check if it is already contained in the natRules ArrayList
+//					for(int i=0; i<natRules.size(); i++) {
+//						NewRule tmpRule = (NewRule)natRules.get(i);
+//						if(tmpRule.index == newRule.index) {
+//							s_logger.trace("NATRule index recognized");
+//							newRule.natRule = tmpRule.natRule;
+//						}
+//					}
+//					// If not, create the NATRule and add it
+//					if(newRule.natRule == null) {
+//						s_logger.trace("NATRule index not recognized, creating new");
+//						newRule.natRule = new NATRule();
+//						natRules.add(newRule);
+//					}
+//					// Get the parameter and add it
+//					if(param.compareTo("natSourceNetwork")==0) {
+//						newRule.natRule.setNatSourceNetwork((String)props.get(key));
+//					} else if(param.compareTo("sourceInterface")==0) {
+//						newRule.natRule.setSourceInterface((String)props.get(key));
+//					}  else if(param.compareTo("destinationInterface")==0) {
+//						newRule.natRule.setDestinationInterface((String)props.get(key));
+//					} else if(param.compareTo("masquerade")==0) {
+//						newRule.natRule.setMasquerade(Boolean.valueOf((String)props.get(key)).booleanValue());
+//					} else {
+//						s_logger.error("New configuration contains malformatted parameter type:  " + param + ", rejecting configuration");
+//						return false;
+//					}
+//					
+//				// Check if the new rule is a LocalRule
+//				} else if(newRule.type.compareTo("LocalRule")==0) {
+//					s_logger.trace("LocalRule found");
+//					// Check if it is already contained in the localRules ArrayList
+//					for(int i=0; i<localRules.size(); i++) {
+//						NewRule tmpRule = (NewRule)localRules.get(i);
+//						if(tmpRule.index == newRule.index) {
+//							s_logger.trace("LocalRule index recognized");
+//							newRule.localRule = tmpRule.localRule;
+//						}
+//					}
+//					// If not, create the LocalRule and add it
+//					if(newRule.localRule == null) {
+//						s_logger.trace("LocalRule index not recognized, creating new");
+//						newRule.localRule = new LocalRule();
+//						localRules.add(newRule);
+//					}
+//					// Get the parameter and add it
+//					if(param.compareTo("port")==0) {
+//						try {
+//							int port = Integer.parseInt((String)props.get(key));
+//							newRule.localRule.setPort(port);
+//						} catch(NumberFormatException nfe) {
+//							newRule.localRule.setPortRange((String)props.get(key));
+//						}
+//					} else if(param.compareTo("protocol")==0) {
+//						newRule.localRule.setProtocol((String)props.get(key));
+//					} else if(param.compareTo("permittedNetwork")==0) {
+//						newRule.localRule.setPermittedNetwork((String)props.get(key));
+//					}  else if(param.compareTo("permittedMAC")==0) {
+//						newRule.localRule.setPermittedMAC((String)props.get(key));
+//					} else if(param.compareTo("sourcePortRange")==0) {
+//						newRule.localRule.setSourcePortRange((String)props.get(key));
+//					} else {
+//						s_logger.error("New configuration contains malformatted parameter type:  " + param + ", rejecting configuration");
+//						return false;
+//					}
+//				// Check if the new rule is a PortForwardRule
+//				} else if(newRule.type.compareTo("PortForwardRule")==0) {
+//					s_logger.trace("PortForwardRule found");
+//					// Check if it is already contained in the portForwardRules ArrayList
+//					for(int i=0; i<portForwardRules.size(); i++) {
+//						NewRule tmpRule = (NewRule)portForwardRules.get(i);
+//						if(tmpRule.index == newRule.index) {
+//							s_logger.trace("PortForwardRule index recognized");
+//							newRule.portForwardRule = tmpRule.portForwardRule;
+//						}
+//					}
+//					// If not, create the PortForwardRule and add it
+//					if(newRule.portForwardRule == null) {
+//						s_logger.trace("PortForwardRule index not recognized, creating new");
+//						newRule.portForwardRule = new PortForwardRule();
+//						portForwardRules.add(newRule);
+//					}
+//					// Get the parameter and add it
+//					if(param.compareTo("address")==0) {
+//						newRule.portForwardRule.setAddress((String)props.get(key));
+//					} else if(param.compareTo("iface")==0) {
+//						newRule.portForwardRule.setIface((String)props.get(key));
+//					} else if(param.compareTo("outPort")==0) {
+//						newRule.portForwardRule.setOutPort(Integer.parseInt((String)props.get(key)));
+//					} else if(param.compareTo("inPort")==0) {
+//						newRule.portForwardRule.setInPort(Integer.parseInt((String)props.get(key)));
+//					} else if(param.compareTo("protocol")==0) {
+//						newRule.portForwardRule.setProtocol((String)props.get(key));
+//					} else if(param.compareTo("permittedNetwork")==0) {
+//						newRule.portForwardRule.setPermittedNetwork((String)props.get(key));
+//					} else if(param.compareTo("permittedNetworkMask")==0) {
+//						newRule.portForwardRule.setPermittedNetworkMask(networkUtilityService.getNetmaskIntForm((String)props.get(key)));
+//					}  else if(param.compareTo("permittedMAC")==0) {
+//						newRule.portForwardRule.setPermittedMAC((String)props.get(key));
+//					} else if(param.compareTo("sourcePortRange")==0) {
+//						newRule.portForwardRule.setSourcePortRange((String)props.get(key));
+//					} else {
+//						s_logger.error("New configuration contains malformatted parameter type:  " + param + ", rejecting configuration");
+//						return false;
+//					}
+//				} else {
+//					s_logger.error("New configuration contains malformatted rule type:  " + newRule.type + ", rejecting configuration");
+//					return false;
+//				}
+//			}
+//		
+//			// Now that the new rule ArrayLists are all populated, check to make sure all required parameters are present
+//			for(int i=0; i<natRules.size(); i++) {
+//				s_logger.trace("Checking " + natRules.size() + " NATRules for completion");
+//				if(!((NewRule)natRules.get(i)).natRule.isComplete()) {
+//					s_logger.error("New configuration NATRule: " + ((NewRule)natRules.get(i)).toString()+ " does not contain all required parameters, rejecting configuration");
+//					return false;
+//				}
+//			}
+//			for(int i=0; i<localRules.size(); i++) {
+//				s_logger.trace("Checking " + localRules.size() + " LocalRules for completion");
+//				if(!((NewRule)localRules.get(i)).localRule.isComplete()) {
+//					s_logger.error("New configuration LocalRule: " + ((NewRule)localRules.get(i)).toString()+ " does not contain all required parameters, rejecting configuration");
+//					return false;
+//				}
+//			}
+//			for(int i=0; i<portForwardRules.size(); i++) {
+//				s_logger.trace("Checking " + portForwardRules.size() + " PortForwardRules for completion");
+//				if(!((NewRule)portForwardRules.get(i)).portForwardRule.isComplete()) {
+//					s_logger.error("New configuration PortForwardRule: " + ((NewRule)portForwardRules.get(i)).toString()+ " does not contain all required parameters, rejecting configuration");
+//					return false;
+//				}
+//			}
+//			
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//			return false;
+//		}
+//
+//		// Delete all the current rules.
+//		try {
+//			deleteAllNatRules();
+//			deleteAllLocalRules();
+//			deleteAllPortForwardRules();
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//			return false;
+//		}
+//		
+//		// Add all new rules
+//		for(int i=0; i<natRules.size(); i++) {
+//			NATRule tmpNatRule = ((NewRule)natRules.get(i)).natRule;
+//			try {
+//				addNatRule(tmpNatRule.getNatSourceNetwork(), 
+//						tmpNatRule.getDestinationInterface(), 
+//						tmpNatRule.getDestinationInterface(), 
+//						tmpNatRule.getMasquerade());
+//			} catch (Exception e) {
+//				e.printStackTrace();
+//			}
+//		}
+//		for(int i=0; i<localRules.size(); i++) {
+//			s_logger.trace("Adding " + localRules.size() + " LocalRules");
+//			LocalRule tmpLocalRule = ((NewRule)localRules.get(i)).localRule;
+//			s_logger.trace("LocalRule: " + tmpLocalRule.toString());
+//			try {
+//				if(tmpLocalRule.getPort() != 0) {
+//					addLocalRule(tmpLocalRule.getPort(),
+//							tmpLocalRule.getProtocol(), 
+//							tmpLocalRule.getPermittedNetwork(), 
+//							tmpLocalRule.getPermittedNetworkMask(), 
+//							tmpLocalRule.getPermittedMAC(), 
+//							tmpLocalRule.getSourcePortRange());
+//				} else {
+//					addLocalRule(tmpLocalRule.getPortRange(),
+//							tmpLocalRule.getProtocol(), 
+//							tmpLocalRule.getPermittedNetwork(), 
+//							tmpLocalRule.getPermittedNetworkMask(), 
+//							tmpLocalRule.getPermittedMAC(), 
+//							tmpLocalRule.getSourcePortRange());
+//				}
+//			} catch (Exception e) {
+//				e.printStackTrace();
+//			}
+//		}
+//		for(int i=0; i<portForwardRules.size(); i++) {
+//			PortForwardRule tmpPortForwardRule = ((NewRule)portForwardRules.get(i)).portForwardRule;
+//			try {
+//				addPortForwardRule(tmpPortForwardRule.getIface(), 
+//						tmpPortForwardRule.getAddress(), 
+//						tmpPortForwardRule.getProtocol(), 
+//						tmpPortForwardRule.getInPort(), 
+//						tmpPortForwardRule.getOutPort(), 
+//						tmpPortForwardRule.getPermittedNetwork(),
+//						tmpPortForwardRule.getPermittedNetworkMask(),
+//						tmpPortForwardRule.getPermittedMAC(), 
+//						tmpPortForwardRule.getSourcePortRange());
+//			} catch (Exception e) {
+//				e.printStackTrace();
+//			}
+//		}
+//		
+//		try {
+//			writeFile();
+//			writeFile();
+//			
+//		} catch (Exception e) {
+//			s_logger.error("Error writing new  configuration to file");
+//			e.printStackTrace();
+//		}
+//		
+//		return true;
+//		
+//	}
+
+	private void runScript() throws KuraException {
+		Process proc = null;
+		try {
+			File file = new File(FIREWALL_SCRIPT_NAME);
+			if(!file.exists()) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Firewall configuration file: " + FIREWALL_SCRIPT_NAME + " does not exist.");
+			}
+			s_logger.info("Running the firewall script");			
+			proc = ProcessUtil.exec("sh " + FIREWALL_SCRIPT_NAME);
+			proc.waitFor();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	/*
+	 * Saves the current iptables config into /etc/sysconfig/iptables
+	 */
+	private void iptablesSave() throws KuraException {
+		Process proc = null;
+		try {
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				proc = ProcessUtil.exec("iptables-save > /opt/eurotech/firewall_rules.fw");
+				proc.waitFor();
+			} else {
+				proc= ProcessUtil.exec("service iptables save");
+				proc.waitFor();
+			}
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	public void enable() throws KuraException {
+		this.update();
+		this.iptablesSave();
+	}
+	
+	public void disable() throws KuraException {
+		this.iptablesSave();
+
+		s_logger.trace("writing to file:  " + FIREWALL_TMP_SCRIPT_NAME);
+		try {
+			PrintWriter pw = new PrintWriter(new FileOutputStream(FIREWALL_TMP_SCRIPT_NAME));
+			for(String line : HEADER) {
+				pw.println(line);
+			}
+			for(String line : CLEAR_ALL_CHAINS) {
+				pw.println(line);
+			}
+			pw.flush();
+			pw.close();
+			
+			//move the file if we made it this far
+			File tmpFirewallFile = new File(FIREWALL_TMP_SCRIPT_NAME);
+			File firewallFile = new File(FIREWALL_SCRIPT_NAME);
+			if(!FileUtils.contentEquals(tmpFirewallFile, firewallFile)) {
+				if(tmpFirewallFile.renameTo(firewallFile)){
+					s_logger.trace("Successfully wrote firewall file");
+					runScript();
+				}else{
+					s_logger.error("Failed to write firewall file");
+					throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for firewall");
+				}
+			} else {
+				s_logger.info("Not rewriting firewall file because it is the same");
+			}
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public void allowIcmp() {
+		m_allowIcmp = true;
+	}
+	
+	public void disableIcmp() {
+		m_allowIcmp = false;
+	}
+	
+	public void enableForwarding() {
+		m_allowForwarding = true;
+	}
+	
+	public void disableForwarding() {
+		m_allowForwarding = false;
+	}
+	
+	private void update() throws KuraException {
+	    if(writeFile()) {
+	    	runScript();
+	    }
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/LocalRule.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/LocalRule.java
new file mode 100644
index 0000000000000000000000000000000000000000..ab0fe56588c710993df752b54a091383dd4011e9
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/LocalRule.java
@@ -0,0 +1,444 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.iptables;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetworkPair;
+
+/* 
+ * Copyright (c) 2013 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Creates an iptables command for a Local Rule, allowing an incoming port connection.
+ * 
+ * CONFIGURATION
+ * 
+ * Configuration will be accepted in the form of key/value pairs.  The key/value pairs are
+ * strictly defined here:
+ * 
+ *   CONFIG_ENTRY     -> KEY + "=" + VALUE
+ *   KEY              -> TYPE + INDEX + "_" + PARAM
+ *   TYPE             -> "LocalRule"
+ *   INDEX            -> "0" | "1" | "2" | ... | "N"
+ *   PARAM (required) -> "port" | "protocol"
+ *   PARAM (optional) -> "permittedNetwork" | "permittedMAC" | "sourcePortRange"
+ *   VALUE	          -> (value of the specified parameter)
+ * 
+ *   EXAMPLE:
+ *   
+ *   LocalRule0_port=1234
+ *   LocalRule0_protocol=tcp
+ *   LocalRule0_permittedNetwork=192.168.1.1
+ *   LocalRule0_permittedMAC=AA:BB:CC:DD:EE:FF
+ *   LocalRule0_sourcePortRange=3333:4444
+ */
+public class LocalRule {
+	
+	//required vars
+	private int port;
+	private String portRange;
+	private String protocol;
+	
+	//optional vars
+	private String permittedNetworkString;
+	private String permittedInterfaceName;
+	private String unpermittedInterfaceName;
+	private String permittedMAC;
+	private String sourcePortRange;
+	
+	/**
+	 * Constructor of <code>LocalRule</code> object.
+	 * 
+	 * @param port	destination local IP port number to allow
+	 * @param protocol	protocol of port (tcp, udp)
+	 * @param sourcePortRange	range of source ports allowed on IP connection (sourcePort1:sourcePort2) 
+	 * @param permittedNetwork	source network or ip address from which connection is allowed (such as 192.168.1.0/24)
+	 * @param permittedInterfaceName  only allow open port for this interface
+	 * @param unpermittedInterfaceName  allow open port for all interfaces except this one
+	 * @param permittedMAC	MAC address from which connection is allowed (such as AA:BB:CC:DD:EE:FF)
+	 */
+	public LocalRule(int port, String protocol, NetworkPair<IP4Address> permittedNetwork, String permittedInterfaceName, String unpermittedInterfaceName, String permittedMAC, String sourcePortRange) {
+		this.port = port;
+		this.portRange = null;
+		this.protocol = protocol;
+		this.sourcePortRange = sourcePortRange;
+		
+		if(permittedNetwork != null) {
+			permittedNetworkString = permittedNetwork.getIpAddress().getHostAddress() + "/" + permittedNetwork.getPrefix();
+		} else {
+			permittedNetworkString = "0.0.0.0/0";
+		}
+		
+		this.permittedInterfaceName = permittedInterfaceName;
+		this.unpermittedInterfaceName = unpermittedInterfaceName;
+		this.permittedMAC = permittedMAC;
+	}
+	
+	/**
+	 * Constructor of <code>LocalRule</code> object.
+	 * 
+	 * @param portRange	destination local IP port range to allow of the form X:Y where X<Y and both are valid ports
+	 * @param protocol	protocol of port (tcp, udp)
+	 * @param sourcePortRange	range of source ports allowed on IP connection (sourcePort1:sourcePort2) 
+	 * @param permittedNetwork	source network or ip address from which connection is allowed (such as 192.168.1.0/24)
+	 * @param permittedInterfaceName  only allow open port for this interface
+	 * @param unpermittedInterfaceName  allow open port for all interfaces except this one
+	 * @param permittedMAC	MAC address from which connection is allowed (such as AA:BB:CC:DD:EE:FF)
+	 */
+	public LocalRule(String portRange, String protocol, NetworkPair<IP4Address> permittedNetwork, String permittedInterfaceName, String unpermittedInterfaceName, String permittedMAC, String sourcePortRange) {
+		this.port = -1;
+		this.portRange = portRange;
+		this.protocol = protocol;
+		this.sourcePortRange = sourcePortRange;	
+
+		if(permittedNetwork != null) {
+			permittedNetworkString = permittedNetwork.getIpAddress().getHostAddress() + "/" + permittedNetwork.getPrefix();
+		} else {
+			permittedNetworkString = "0.0.0.0/0";
+		}
+
+		this.permittedInterfaceName = permittedInterfaceName;
+		this.unpermittedInterfaceName = unpermittedInterfaceName;
+		this.permittedMAC = permittedMAC;
+	}
+	
+	/**
+	 * Constructor of <code>LocalRule</code> object.
+	 */
+	public LocalRule() {
+		port = -1;
+		portRange = null;
+		protocol = null;
+		permittedNetworkString = null;
+		permittedInterfaceName = null;
+		unpermittedInterfaceName = null;
+		permittedMAC = null;
+		sourcePortRange = null;
+	}
+	
+	/**
+	 * Returns true if the required <code>LocalRule</code> parameters have all been set.  Returns false otherwise.
+	 * 
+	 * @return		A boolean representing whether all parameters have been set.
+	 */
+	public boolean isComplete() {
+		if(protocol != null && port != -1) {
+			return true; 
+		} else if(protocol != null && portRange != null) {
+			if(isPortRangeValid(portRange)) {
+				return true;
+			} else {
+				return false;
+			}
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * Setter for the protocol.
+	 * 
+	 * @param protocol	A String representing the protocol.
+	 */
+	public void setProtocol(String protocol) {
+		this.protocol = protocol;
+	}
+	
+	/**
+	 * Setter for the permittedNetwork.
+	 * 
+	 * @param permittedNetwork	A String representing the permittedNetwork.
+	 */
+	public void setPermittedNetwork(NetworkPair<IP4Address> permittedNetwork) {
+		if(permittedNetwork != null) {
+			permittedNetworkString = permittedNetwork.getIpAddress().getHostAddress() + "/" + permittedNetwork.getPrefix();
+		} else {
+			permittedNetworkString = "0.0.0.0/0";
+		}
+	}
+	
+	/**
+	 * Setter for the permittedInterfaceName.
+	 * 
+	 * @param permittedInterfaceName	A String representing the only interface allowed on this open port
+	 */
+	public void setPermittedInterfaceName(String permittedInterfaceName) {
+		this.permittedInterfaceName = permittedInterfaceName;
+	}
+	
+	/**
+	 * Setter for the unpermittedInterfaceName.
+	 * 
+	 * @param unpermittedInterfaceName	A String representing the only interface not allowed on this open port
+	 */
+	public void setUnpermittedInterfaceName(String unpermittedInterfaceName) {
+		this.unpermittedInterfaceName = unpermittedInterfaceName;
+	}
+	
+	/**
+	 * Setter for the permittedMAC.
+	 * 
+	 * @param permittedMAC	A String representing the permittedMAC.
+	 */
+	public void setPermittedMAC(String permittedMAC) {
+		this.permittedMAC = permittedMAC;
+	}
+	
+	/**
+	 * Setter for the sourcePortRange.
+	 * 
+	 * @param sourcePortRange	A String representing the sourcePortRange.
+	 */
+	public void setSourcePortRange(String sourcePortRange) {
+		this.sourcePortRange = sourcePortRange;
+	}
+	
+	/**
+	 * Setter for the port.
+	 * 
+	 * @param port	An int representing the port.
+	 */
+	public void setPort(int port) {
+		this.port = port;
+		this.portRange = null;
+	}
+	
+	/**
+	 * Setter for the portRange
+	 * 
+	 * @param portRange	A string representing the port range of the form X:Y where X < Y and both are valid ports
+	 */
+	public void setPortRange(String portRange) {
+		this.port = -1;
+		this.portRange = portRange;
+	}
+	
+	/**
+	 * Getter for the sourcePortRange.
+	 * 
+	 * @return the sourcePortRange
+	 */
+	public String getSourcePortRange() {
+		return this.sourcePortRange;
+	}
+	
+	/**
+	 * Getter for the permittedInterfaceName.
+	 * 
+	 * @param permittedInterfaceName	A String representing the only interface allowed on this open port
+	 */
+	public String getPermittedInterfaceName() {
+		return permittedInterfaceName;
+	}
+	
+	/**
+	 * Getter for the unpermittedInterfaceName.
+	 * 
+	 * @param unpermittedInterfaceName	A String representing the only interface not allowed on this open port
+	 */
+	public String getUnpermittedInterfaceName() {
+		return unpermittedInterfaceName;
+	}
+
+	/**
+	 * Getter for port
+	 * 
+	 * @return the port
+	 */
+	public int getPort() {
+		return port;
+	}
+	
+	/**
+	 * Getter for portRange
+	 * 
+	 * @return the portRange
+	 */
+	public String getPortRange() {
+		return portRange;
+	}
+
+	/**
+	 * Getter for protocol
+	 * 
+	 * @return the protocol
+	 */
+	public String getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * Getter for permittedNetwork
+	 * 
+	 * @return the permittedNetwork
+	 */
+	public NetworkPair<IP4Address> getPermittedNetwork() throws KuraException {
+		try {
+			if(permittedNetworkString != null) {
+				String[] split = permittedNetworkString.split("/");
+				return new NetworkPair(IPAddress.parseHostAddress(split[0]), Short.parseShort(split[1]));
+			} else {
+				return new NetworkPair(IPAddress.parseHostAddress("0.0.0.0"), (short)0);
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	/**
+	 * Getter for permittedMAC
+	 * 
+	 * @return the permittedMAC
+	 */
+	public String getPermittedMAC() {
+		return permittedMAC;
+	}
+
+	/**
+	 * Converts the <code>LocalRule</code> to a <code>String</code>.  
+	 * Returns one of the following iptables strings depending on the <code>LocalRule</code> format:
+	 * <code>
+	 * <p>  iptables -I INPUT -p {protocol} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} --sport {sourcePort1:sourcePort2} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} -m mac --mac-source {permittedMAC} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} -m mac --mac-source {permittedMAC} --sport {sourcePort1:sourcePort2} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} -s {permittedNetwork} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} -s {permittedNetwork} --sport {sourcePort1:sourcePort2} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} -s {permittedNetwork} -m mac --mac-source {permittedMAC} --dport {port} -j ACCEPT
+	 * <p>  iptables -I INPUT -p {protocol} -s {permittedNetwork} -m mac --mac-source {permittedMAC} --sport {sourcePort1:sourcePort2} --dport {port} -j ACCEPT
+	 * </code>
+	 */
+	public String toString() {
+		
+		String interfaceString = null;
+		if(permittedInterfaceName != null) {
+			interfaceString = new StringBuffer().append(" -i " ).append(permittedInterfaceName).toString();
+		} else if(unpermittedInterfaceName != null) {
+			interfaceString = new StringBuffer().append(" ! -i " ).append(unpermittedInterfaceName).toString();
+		}
+		
+		if(port != -1) {
+			if (this.permittedMAC == null && this.sourcePortRange == null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " --dport " + this.port + " -j ACCEPT");
+			} else if (this.permittedMAC == null && this.sourcePortRange != null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " --sport " + this.sourcePortRange + " --dport " + this.port + " -j ACCEPT");
+			} else if (this.permittedMAC != null && this.sourcePortRange == null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " -m mac --mac-source " + this.permittedMAC + " --dport " + this.port + " -j ACCEPT");
+			} else if (this.permittedMAC != null && this.sourcePortRange != null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " -m mac --mac-source " + this.permittedMAC + " --sport " + this.sourcePortRange + " --dport " + this.port + " -j ACCEPT");
+			} else {
+				return null;
+			}
+		} else {
+			if (this.permittedMAC == null && this.sourcePortRange == null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " --dport " + this.portRange + " -j ACCEPT");
+			} else if (this.permittedMAC == null && this.sourcePortRange != null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " --sport " + this.sourcePortRange + " --dport " + this.portRange + " -j ACCEPT");
+			} else if (this.permittedMAC != null && this.sourcePortRange == null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " -m mac --mac-source " + this.permittedMAC + " --dport " + this.portRange + " -j ACCEPT");
+			} else if (this.permittedMAC != null && this.sourcePortRange != null) {
+				return new String("iptables -I INPUT -p " + this.protocol + " -s " + permittedNetworkString + ((interfaceString != null) ? interfaceString : "") + " -m mac --mac-source " + this.permittedMAC + " --sport " + this.sourcePortRange + " --dport " + this.portRange + " -j ACCEPT");
+			} else {
+				return null;
+			}
+		}
+	}
+	
+	private boolean isPortRangeValid(String range) {
+		try {
+			String[] rangeParts = range.split(":");
+			if(rangeParts.length == 2) {
+				int portStart = Integer.parseInt(rangeParts[0]);
+				int portEnd = Integer.parseInt(rangeParts[1]);
+						
+				if(portStart > 0 && portStart < 65535 &&
+						portEnd > 0 && portEnd < 65535 &&
+						portStart < portEnd) {
+					return true;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+		} catch(Exception e) {
+			return false;
+		}
+	}
+	
+	@Override
+	public boolean equals(Object o) {
+	    if(!(o instanceof LocalRule)) {
+	        return false;
+	    }
+	    
+        LocalRule other = (LocalRule) o;
+        
+        if(port != other.getPort()) {
+            return false;
+        } else if (!compareObjects(this.portRange, other.portRange)) {
+            return false;
+        } else if (!compareObjects(this.protocol, other.protocol)) {
+            return false;
+        } else if (!compareObjects(this.permittedMAC, other.permittedMAC)) {
+            return false;
+        } else if (!compareObjects(this.sourcePortRange, other.sourcePortRange)) {
+            return false;
+        } else if (!compareObjects(this.permittedInterfaceName, other.permittedInterfaceName)) {
+            return false;
+        } else if (!compareObjects(this.unpermittedInterfaceName, other.unpermittedInterfaceName)) {
+            return false;
+        } else if (!compareObjects(this.permittedNetworkString, other.permittedNetworkString)) {
+            return false;
+        }
+	    
+	    return true;
+	}
+	
+    private boolean compareObjects(Object obj1, Object obj2) {
+        if(obj1 != null) {
+            return obj1.equals(obj2);
+        } else if(obj2 != null) {
+            return false;
+        }
+        
+        return true;
+    }
+    
+    @Override
+    public int hashCode() {
+        final int prime = 73;
+        int result = 1;
+        result = prime * result + port;
+        result = prime * result
+                + ((portRange == null) ? 0 : portRange.hashCode());
+        result = prime * result
+                + ((protocol == null) ? 0 : protocol.hashCode());
+        result = prime * result
+                + ((sourcePortRange == null) ? 0 : sourcePortRange.hashCode());
+        result = prime * result
+                + ((permittedInterfaceName == null) ? 0 : permittedInterfaceName.hashCode());
+        result = prime * result
+                + ((unpermittedInterfaceName == null) ? 0 : unpermittedInterfaceName.hashCode());
+        result = prime * result
+                + ((permittedMAC == null) ? 0 : permittedMAC.hashCode());
+        result = prime * result
+                + ((permittedNetworkString == null) ? 0 : permittedNetworkString.hashCode());
+        
+        return result;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/NATRule.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/NATRule.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec5368d3149d29c92344fb9dd8c621dd7fd84ce8
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/NATRule.java
@@ -0,0 +1,338 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.iptables;
+
+
+
+/* 
+ * Copyright (c) 2013 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Creates an iptables command for a NAT Rule.
+ * 
+ * CONFIGURATION
+ * 
+ * Configuration will be accepted in the form of key/value pairs.  The key/value pairs are
+ * strictly defined here:
+ * 
+ *   CONFIG_ENTRY     -> KEY + "=" + VALUE
+ *   KEY              -> TYPE + INDEX + "_" + PARAM
+ *   TYPE             -> "NATRule"
+ *   INDEX            -> "0" | "1" | "2" | ... | "N"
+ *   PARAM (required) -> "sourceInterface" | "destinationInterface"
+ *   PARAM (optional) -> "masquerade"
+ *   VALUE	          -> (value of the specified parameter)
+ * 
+ *   EXAMPLE:
+ *   
+ *   NATRule0_sourceInterface=eth0
+ *   NATRule0_destinationInterface=wlan0
+ *   NATRule0_masquerade=true
+ */
+public class NATRule {
+	
+	/*
+	masquerading/NAT
+ 		must define:
+			source network or ipaddress (i.e. xxx.xxx.xxx.xxx/mask or xxx.xxx.xxx.xxx)
+			source interface
+			destination interface
+
+	*/
+	
+    // private static final Logger s_logger = LoggerFactory.getLogger(NATRule.class);
+	private String m_sourceInterface;						//i.e. eth0
+	private String m_destinationInterface;				//i.e. ppp0
+	private String m_protocol;	// protocol (i.e. all, tcp, udp) 
+	private String m_source; // source network/host (i.e. 192.168.1.0/24 or 192.168.1.1/32)
+	private String m_destination; // destination network/host (i.e. 192.168.1.0/24 or 192.168.1.1/32)
+	private boolean m_masquerade;
+	
+	/**
+	 * Constructor of <code>NATRule</code> object.
+	 * 
+	 * @param sourceInterface	interface name of source network (such as eth0)
+	 * @param destinationInterface	interface name of destination network to be reached via NAT (such as ppp0)
+	 * @param masquerade add masquerade entry
+	 */
+	public NATRule(String sourceInterface, String destinationInterface, boolean masquerade) {
+		m_sourceInterface = sourceInterface;
+		m_destinationInterface = destinationInterface;
+		m_masquerade = masquerade;
+	}
+	
+	public NATRule(String sourceInterface, String destinationInterface, String protocol, String source, String destination, boolean masquerade) {
+		this(sourceInterface, destinationInterface, masquerade);
+		m_source = source;
+		m_destination = destination;
+		m_protocol = protocol;
+	}
+	
+	/**
+	 * Constructor of <code>NATRule</code> object.
+	 */
+	public NATRule() {
+		m_sourceInterface = null;
+		m_destinationInterface = null;
+	}
+	
+	/**
+	 * Returns true if the <code>NATRule</code> parameters have all been set.  Returns false otherwise.
+	 * 
+	 * @return		A boolean representing whether all parameters have been set.
+	 */
+	public boolean isComplete() {
+		if(m_sourceInterface != null && m_destinationInterface != null)
+			return true;
+		return false;
+	}
+	
+	
+	/**
+	 * Converts the <code>NATRule</code> to a <code>String</code>.  
+	 * Returns single iptables string based on the <code>NATRule</code>, which establishes the MASQUERADE and FORWARD rules:
+	 * <code>
+	 * <p>  iptables -t nat -A POSTROUTING -o {destinationInterface} -j MASQUERADE;
+	 * <p>  iptables -A FORWARD -i {sourceInterface} -o {destinationInterface} -j ACCEPT;
+	 * <p>  iptables -A FORWARD -i {destinationInterface} -o {sourceInterface} -j ACCEPT
+	 * </code>
+	 * 
+	 * @return		A String representation of the <code>NATRule</code>.
+	 */
+	public String toString() {
+		
+		/*EXAMPLE
+		iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
+		iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
+		iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
+		*/
+		
+        StringBuilder forward = new StringBuilder();
+        forward.append("iptables -A FORWARD");
+        if (m_protocol != null) {
+        	forward.append(" -p ");
+        	forward.append(m_protocol);
+        }
+        if (m_destination != null) {
+        	forward.append(" -s ");
+        	forward.append(m_destination);
+        }
+        if (m_source != null) {
+        	forward.append(" -d ");
+        	forward.append(m_source);
+        }
+        forward.append(" -i ");
+        forward.append(m_destinationInterface);
+        forward.append(" -o ");
+        forward.append(m_sourceInterface);
+        forward.append(" -m state --state RELATED,ESTABLISHED -j ACCEPT; ");
+        
+        forward.append("iptables -A FORWARD");
+        if (m_protocol != null) {
+        	forward.append(" -p ");
+        	forward.append(m_protocol);
+        }
+        if (m_source != null) {
+        	forward.append(" -s ");
+        	forward.append(m_source);
+        }
+        if (m_destination != null) {
+        	forward.append(" -d ");
+        	forward.append(m_destination);
+        }
+        forward.append(" -i ");
+        forward.append(m_sourceInterface);
+        forward.append(" -o ");
+        forward.append(m_destinationInterface);
+        forward.append(" -j ACCEPT");
+//      
+//      String forward = new String (
+//              "iptables -A FORWARD -i " + destinationInterface + " -o " + sourceInterface + " -m state --state RELATED,ESTABLISHED -j ACCEPT; " +
+//              "iptables -A FORWARD -i " + sourceInterface + " -o " + destinationInterface + " -j ACCEPT");
+        
+        if (m_masquerade) {
+            StringBuilder masquerade = new StringBuilder();
+            masquerade.append("iptables -t nat -A POSTROUTING");
+            if (m_protocol != null) {
+            	masquerade.append(" -p ");
+            	masquerade.append(m_protocol);
+            }
+            if (m_source != null) {
+            	masquerade.append(" -s ");
+            	masquerade.append(m_source);
+            } 
+            if (m_destination != null) {
+            	masquerade.append(" -d ");
+            	masquerade.append(m_destination);
+            }
+            masquerade.append(" -o ");
+            masquerade.append(m_destinationInterface);
+            masquerade.append(" -j MASQUERADE");
+            
+            masquerade.append("; ");
+            masquerade.append(forward);
+    
+            return masquerade.toString();
+//          String masquerade = new String ("iptables -t nat -A POSTROUTING -o " + destinationInterface + " -j MASQUERADE");
+//          return masquerade + "; " + forward;
+        } else {
+            return forward.toString();
+        }
+	}
+
+	
+	/**
+	 * Setter for the sourceInterface.
+	 * 
+	 * @param sourceInterface	A String representing the sourceInterface.
+	 */
+	public void setSourceInterface(String sourceInterface) {
+		m_sourceInterface = sourceInterface;
+	}
+	
+	/**
+	 * Setter for the destinationInterface.
+	 * 
+	 * @param destinationInterface	A String representing the destinationInterface.
+	 */
+	public void setDestinationInterface(String destinationInterface) {
+		m_destinationInterface = destinationInterface;
+	}
+	
+	/**
+	 * Setter for the masquerade.
+	 * 
+	 * @param masquerade	A boolean representing the masquerade.
+	 */
+	public void setMasquerade(boolean masquerade) {
+		m_masquerade = masquerade;
+	}
+	
+	public String getSource() {
+		return m_source;
+	}
+	
+	public String getDestination() {
+		return m_destination;
+	}
+	
+	public String getProtocol() {
+		return m_protocol;
+	}
+	
+	/**
+	 * Getter for the sourceInterface.
+	 * 
+	 * @return sourceInterface		A String representing the sourceInterface.
+	 */
+	public String getSourceInterface() {
+		return m_sourceInterface;
+	}
+	
+	/**
+	 * Getter for the destinationInterface.
+	 * 
+	 * @return destinationInterface		A String representing the destinationInterface.
+	 */
+	public String getDestinationInterface() {
+		return m_destinationInterface;
+	}
+	
+	/**
+	 * Getter for the masquerade.
+	 * 
+	 * @return masquerade		A boolean representing the masquerade.
+	 */
+	public boolean isMasquerade() {
+		return m_masquerade;
+	}
+	
+	@Override
+	public boolean equals(Object o) {
+	    if(!(o instanceof NATRule)) {
+	        return false;
+	    }
+	    
+	    NATRule other = (NATRule) o;
+
+	    if (!compareObjects(m_sourceInterface, other.m_sourceInterface)) {
+	        return false;
+	    } else if (!compareObjects(m_destinationInterface, other.m_destinationInterface)) {
+	        return false;
+	    } else if (m_masquerade != other.isMasquerade()) {
+	        return false;
+	    }
+	    
+	    if (m_protocol == null) {
+			if (other.m_protocol != null) {
+				return false;
+			}
+		} else if (!compareObjects(m_protocol, other.m_protocol)) {
+			return false;
+		}
+	    
+	    if (m_source == null) {
+			if (other.m_source != null) {
+				return false;
+			}
+		} else if (!compareObjects(m_source, other.m_source)) {
+			return false;
+		}
+	    
+	    if (m_destination == null) {
+			if (other.m_destination != null) {
+				return false;
+			}
+		} else if (!compareObjects(m_destination, other.m_destination)) {
+			return false;
+		}
+	    
+	    return true;
+	}
+	
+    private boolean compareObjects(Object obj1, Object obj2) {
+        if(obj1 != null) {
+            return obj1.equals(obj2);
+        } else if(obj2 != null) {
+            return false;
+        }
+        
+        return true;
+    }
+    
+    @Override
+    public int hashCode() {
+        final int prime = 71;
+        int result = 1;
+        
+        result = prime * result
+                + ((m_sourceInterface == null) ? 0 : m_sourceInterface.hashCode());
+ 
+        result = prime * result
+                + ((m_destinationInterface == null) ? 0 : m_destinationInterface.hashCode());
+ 
+        result = prime * result
+                + ((m_source == null) ? 0 : m_source.hashCode());
+        
+        result = prime * result
+        		+ ((m_destination == null) ? 0 : m_destination.hashCode());
+        
+        result = prime * result
+        		+ ((m_protocol == null) ? 0 : m_protocol.hashCode());
+       
+        result = prime * result + (m_masquerade ? 1277 : 1279);
+        
+        return result;
+    }
+}
+
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/PortForwardRule.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/PortForwardRule.java
new file mode 100644
index 0000000000000000000000000000000000000000..2e83c227cb3e1ff67a51b4c93ec2c5674b1ee269
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/iptables/PortForwardRule.java
@@ -0,0 +1,562 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.iptables;
+
+/* 
+ * Copyright (c) 2013 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Creates an iptables command for a Port Forward Rule, allowing an incoming port to be forwarded to destinationIP/port.
+ * 
+ * CONFIGURATION
+ * 
+ * Configuration will be accepted in the form of key/value pairs.  The key/value pairs are
+ * strictly defined here:
+ * 
+ *   CONFIG_ENTRY     -> KEY + "=" + VALUE
+ *   KEY              -> TYPE + INDEX + "_" + PARAM
+ *   TYPE             -> "LocalRule"
+ *   INDEX            -> "0" | "1" | "2" | ... | "N"
+ *   PARAM (required) -> "address" | "iface" | "protocol" | "inPort" | "outPort"
+ *   PARAM (optional) -> "permittedNetwork" | "permittedMAC" | "sourcePortRange"
+ *   VALUE	          -> (value of the specified parameter)
+ * 
+ *   EXAMPLE:
+ *   
+ *   PortForwardRule0_address=192.168.1.1
+ *   PortForwardRule0_iface=eth0
+ *   PortForwardRule0_protocol=tcp
+ *   PortForwardRule0_inPort=1234
+ *   PortForwardRule0_outPort=1234
+ *   PortForwardRule0_permittedNetwork=192.168.1.1
+ *   PortForwardRule0_permittedMAC=AA:BB:CC:DD:EE:FF
+ *   PortForwardRule0_sourcePortRange=3333:4444
+ */
+public class PortForwardRule {
+
+	/*
+	port forwarding to specific ip address on 'internal' network
+    must define:
+		inbound interface
+		protocol (i.e. tcp and/or udp)
+		inbound port
+		destination port (for mapping)
+    optional:
+		specific IPs to allow for this forwarded port
+		specific MAC addresses to allow for this forwarded port
+		specific source port range to allow for this connection
+	*/
+	
+	//required
+	private String m_iface;
+	private String m_address;
+	private String m_protocol;
+	private int m_inPort;
+	private int m_outPort;
+	
+	//optional
+	private String m_permittedNetwork;
+	private int m_permittedNetworkMask;
+	private String m_permittedMAC;
+	private String m_sourcePortRange;
+
+	/**
+	 * Constructor of <code>PortForwardRule</code> object.
+	 * 
+	 * @param iface	interface name on which inbound connection is allowed (such as ppp0) 
+	 * @param inPort	inbound port on which to listen for port forward
+	 * @param protocol	protocol of port connection (tcp, udp)
+	 * @param address	destination IP address to forward IP traffic
+	 * @param outPort	destination port to forward IP traffic
+	 * @param permittedNetwork	source network or ip address from which connection is allowed (such as 192.168.1.0)
+	 * @param permittedNetworkMask	source network mask from which connection is allowed (such as 255.255.255.0)
+	 * @param permittedMAC	MAC address from which connection is allowed (such as AA:BB:CC:DD:EE:FF)
+	 * @param sourcePortRange	range of source ports allowed on IP connection (sourcePort1:sourcePort2) 
+	 */
+	public PortForwardRule(String iface, String address, String protocol, int inPort, int outPort, String permittedNetwork, int permittedNetworkMask, String permittedMAC, String sourcePortRange) {
+		m_iface = iface;
+		m_inPort = inPort;
+		m_protocol = protocol;
+		m_address = address;
+		m_outPort = outPort;
+		
+		m_permittedNetwork = permittedNetwork;
+		m_permittedNetworkMask = permittedNetworkMask;
+		m_permittedMAC = permittedMAC;
+		m_sourcePortRange = sourcePortRange;
+	}
+	
+	/**
+	 * Constructor of <code>PortForwardRule</code> object.
+	 */
+	public PortForwardRule() {
+		m_iface = null;
+		m_inPort = 0;
+		m_protocol = null;
+		m_address = null;
+		m_outPort = 0;
+		
+		m_permittedNetworkMask = 0;
+		m_permittedNetwork = null;
+		m_permittedMAC = null;
+		m_sourcePortRange = null;
+	}
+	
+	/**
+	 * Returns true if the required <code>LocalRule</code> parameters have all been set.  Returns false otherwise.
+	 * 
+	 * @return		A boolean representing whether all parameters have been set.
+	 */
+	public boolean isComplete() {
+		if(m_protocol != null && m_iface != null && m_address != null && m_inPort != 0 && m_outPort != 0)
+			return true;
+		return false;
+	}
+	
+	/**
+	 * Converts the <code>PortForwardRule</code> to a <code>String</code>.  
+	 * Returns a PREROUTING/FORWARD pair of the following iptables strings depending on the <code>PortForwardRule</code> format:
+	 * <code>
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} --dport {inPort} -d {address} -j ACCEPT
+
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+	 * 
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} -m mac --mac-source {permittedMAC} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} -m mac --mac-source {m_permittedMAC} --dport {inPort} -d {address} -j ACCEPT
+	 *
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} -m mac --mac-source {permittedMAC} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} -m mac --mac-source {m_permittedMAC} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+	 *  
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} --dport {inPort} -d {address} -j ACCEPT
+	 *
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT 
+	 *
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {permittedMAC} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {m_permittedMAC} --dport {inPort} -d {address} -j ACCEPT
+	 *
+	 * <p>  iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {permittedMAC} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort}
+	 * <p>  iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {m_permittedMAC} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+	 * </code>
+	 * 
+	 * @return the String representation of <code>PortForwardRule</code>
+	 */
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		if(m_permittedNetwork == null && m_permittedMAC == null && m_sourcePortRange == null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol).append(" --dport ")
+					.append(m_inPort).append(" -j DNAT --to ")
+					.append(m_address).append(':').append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address)
+					.append(" -j ACCEPT");
+	
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork == null && m_permittedMAC == null && m_sourcePortRange != null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol).append(" --sport ")
+					.append(m_sourcePortRange).append(" --dport ")
+					.append(m_inPort).append(" -j DNAT --to ")
+					.append(m_address).append(':').append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" --sport ")
+					.append(m_sourcePortRange).append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address)
+					.append(" -j ACCEPT");
+	
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " --sport " + m_sourcePortRange + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork == null && m_permittedMAC != null && m_sourcePortRange == null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} -m mac --mac-source {m_permittedMAC} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} -m mac --mac-source {m_permittedMAC} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol)
+					.append(" -m mac --mac-source ").append(m_permittedMAC)
+					.append(" --dport ").append(m_inPort)
+					.append(" -j DNAT --to ").append(m_address).append(':')
+					.append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" -m mac --mac-source ")
+					.append(m_permittedMAC).append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address)
+					.append(" -j ACCEPT");
+	
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " -m mac --mac-source " + m_permittedMAC + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork == null && m_permittedMAC != null && m_sourcePortRange != null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} -m mac --mac-source {m_permittedMAC} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} -m mac --mac-source {m_permittedMAC} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol)
+					.append(" -m mac --mac-source ").append(m_permittedMAC)
+					.append(" --sport ").append(m_sourcePortRange)
+					.append(" --dport ").append(m_inPort)
+					.append(" -j DNAT --to ").append(m_address).append(':')
+					.append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" -m mac --mac-source ")
+					.append(m_permittedMAC).append(" --sport ")
+					.append(m_sourcePortRange).append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address)
+					.append(" -j ACCEPT");
+	
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " -m mac --mac-source " + m_permittedMAC + " --sport " + m_sourcePortRange + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork != null && m_permittedMAC == null && m_sourcePortRange == null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask).append(" --dport ")
+					.append(m_inPort).append(" -j DNAT --to ")
+					.append(m_address).append(':').append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask).append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address).append(" -j ACCEPT");
+			
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " -s " + m_permittedNetwork + "/" + m_permittedNetworkMask + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork != null && m_permittedMAC == null && m_sourcePortRange != null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask).append(" --sport ")
+					.append(m_sourcePortRange).append(" --dport ")
+					.append(m_inPort).append(" -j DNAT --to ")
+					.append(m_address).append(':').append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask).append(" --sport ")
+					.append(m_sourcePortRange).append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address)
+					.append(" -j ACCEPT");
+			
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " -s " + m_permittedNetwork + "/" + m_permittedNetworkMask + " --sport " + m_sourcePortRange + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork != null && m_permittedMAC != null && m_sourcePortRange == null) {
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {m_permittedMAC} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {m_permittedMAC} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask)
+					.append(" -m mac --mac-source ").append(m_permittedMAC)
+					.append(" --dport ").append(m_inPort)
+					.append(" -j DNAT --to ").append(m_address).append(':')
+					.append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask)
+					.append(" -m mac --mac-source ").append(m_permittedMAC)
+					.append(" --dport ")
+					.append(m_inPort).append(" -d ").append(m_address)
+					.append(" -j ACCEPT");
+			
+			return sb.toString();
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " -s " + m_permittedNetwork + "/" + m_permittedNetworkMask + " -m mac --mac-source " + m_permittedMAC + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else if(m_permittedNetwork != null && m_permittedMAC != null && m_sourcePortRange != null) {	
+			/** 
+			 * <code><p> iptables -t nat -A PREROUTING -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {m_permittedMAC} --sport {sourcePortRange} --dport {inPort} -j DNAT --to {address}:{outPort} <code> 
+			 * <code><p> iptables -A FORWARD -i {iface} -p {protocol} -s {permittedNetwork} -m mac --mac-source {m_permittedMAC} --sport {sourcePortRange} --dport {inPort} -d {address} -j ACCEPT
+			 */
+			sb.append("iptables -t nat -A PREROUTING -i ").append(m_iface)
+					.append(" -p ").append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask)
+					.append(" -m mac --mac-source ").append(m_permittedMAC)
+					.append(" --sport ").append(m_sourcePortRange)
+					.append(" --dport ").append(m_inPort)
+					.append(" -j DNAT --to ").append(m_address).append(':')
+					.append(m_outPort);
+			sb.append("; ");
+			sb.append("iptables -A FORWARD -i ").append(m_iface).append(" -p ")
+					.append(m_protocol).append(" -s ")
+					.append(m_permittedNetwork).append("/")
+					.append(m_permittedNetworkMask)
+					.append(" -m mac --mac-source ").append(m_permittedMAC)
+					.append(" --sport ").append(m_sourcePortRange)
+					.append(" --dport ").append(m_inPort).append(" -d ")
+					.append(m_address).append(" -j ACCEPT");
+			
+			return sb.toString();	
+			//return new String("iptables -t nat -A PREROUTING -i " + m_iface + " -p " + m_protocol + " -s " + m_permittedNetwork + "/" + m_permittedNetworkMask + " -m mac --mac-source " + m_permittedMAC + " --sport " + m_sourcePortRange + " --dport " + m_inPort + " -j DNAT --to " + m_address + ":" + m_outPort);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Getter for iface
+	 * 
+	 * @return the iface
+	 */
+	public String getIface() {
+		return m_iface;
+	}
+
+	/**
+	 * Setter for iface
+	 * 
+	 * @param iface the iface to set
+	 */
+	public void setIface(String iface) {
+		m_iface = iface;
+	}
+
+	/**
+	 * Getter for address
+	 * 
+	 * @return the address
+	 */
+	public String getAddress() {
+		return m_address;
+	}
+
+	/**
+	 * Setter for address
+	 * 
+	 * @param address the address to set
+	 */
+	public void setAddress(String address) {
+		m_address = address;
+	}
+
+	/**
+	 * Getter for protocol
+	 * 
+	 * @return the protocol
+	 */
+	public String getProtocol() {
+		return m_protocol;
+	}
+
+	/**
+	 * Setter for protocol
+	 * 
+	 * @param protocol the protocol to set
+	 */
+	public void setProtocol(String protocol) {
+		m_protocol = protocol;
+	}
+
+	/**
+	 * Getter for inPort
+	 * 
+	 * @return the inPort
+	 */
+	public int getInPort() {
+		return m_inPort;
+	}
+
+	/**
+	 * Setter for inPort
+	 * 
+	 * @param inPort the inPort to set
+	 */
+	public void setInPort(int inPort) {
+		m_inPort = inPort;
+	}
+
+	/**
+	 * Getter for outPort
+	 * 
+	 * @return the outPort
+	 */
+	public int getOutPort() {
+		return m_outPort;
+	}
+
+	/**
+	 * Setter for outPort
+	 * 
+	 * @param outPort the outPort to set
+	 */
+	public void setOutPort(int outPort) {
+		m_outPort = outPort;
+	}
+
+	/**
+	 * Getter for permittedNetwork
+	 * 
+	 * @return the permittedNetwork
+	 */
+	public String getPermittedNetwork() {
+		return m_permittedNetwork;
+	}
+
+	/**
+	 * Setter for permittedNetwork
+	 * 
+	 * @param permittedNetwork the permittedNetwork to set
+	 */
+	public void setPermittedNetwork(String permittedNetwork) {
+		m_permittedNetwork = permittedNetwork;
+	}
+	
+	/**
+	 * Getter for permittedNetworkMask
+	 * 
+	 * @return the permittedNetworkMask
+	 */
+	public int getPermittedNetworkMask() {
+		return m_permittedNetworkMask;
+	}
+
+	/**
+	 * Setter for permittedNetworkMask
+	 * 
+	 * @param permittedNetworkMask  of the permittedNetwork to set
+	 */
+	public void setPermittedNetworkMask(int permittedNetworkMask) {
+		m_permittedNetworkMask = permittedNetworkMask;
+	}
+
+	/**
+	 * Getter for permittedMAC
+	 * 
+	 * @return the permittedMAC
+	 */
+	public String getPermittedMAC() {
+		return m_permittedMAC;
+	}
+
+	/**
+	 * Setter for permittedMAC
+	 * 
+	 * @param permittedMAC the permittedMAC to set
+	 */
+	public void setPermittedMAC(String permittedMAC) {
+		m_permittedMAC = permittedMAC;
+	}
+
+	/**
+	 * Getter for sourcePortRange
+	 * 
+	 * @return the sourcePortRange
+	 */
+	public String getSourcePortRange() {
+		return m_sourcePortRange;
+	}
+
+	/**
+	 * Setter for sourcePortRange
+	 * 
+	 * @param sourcePortRange the sourcePortRange to set
+	 */
+	public void setSourcePortRange(String sourcePortRange) {
+		m_sourcePortRange = sourcePortRange;
+	}
+	
+    @Override
+    public boolean equals(Object o) {
+        if(!(o instanceof PortForwardRule)) {
+            return false;
+        }
+        
+        PortForwardRule other = (PortForwardRule) o;
+        
+        if (!compareObjects(m_iface, other.m_iface)) {
+            return false;
+        } else if (!compareObjects(m_address, other.m_address)) {
+            return false;
+        } else if (!compareObjects(m_protocol, other.m_protocol)) {
+            return false;
+        } else if (m_inPort != other.m_inPort) {
+            return false;
+        } else if (m_outPort != other.m_outPort) {
+            return false;
+        } else if (!compareObjects(m_permittedNetwork, other.m_permittedNetwork)) {
+            return false;
+        } else if (m_permittedNetworkMask != other.m_permittedNetworkMask) {
+            return false;
+        } else if (!compareObjects(m_permittedMAC, other.m_permittedMAC)) {
+            return false;
+        } else if (!compareObjects(m_sourcePortRange, other.m_sourcePortRange)) {
+            return false;
+        }
+        
+        return true;
+    }
+    
+    private boolean compareObjects(Object obj1, Object obj2) {
+        if(obj1 != null) {
+            return obj1.equals(obj2);
+        } else if(obj2 != null) {
+            return false;
+        }
+        
+        return true;
+    }	
+
+    @Override
+    public int hashCode() {
+        final int prime = 79;
+        int result = 1;
+        result = prime * result + m_inPort;
+        result = prime * result + m_outPort;
+        result = prime * result
+                + ((m_iface == null) ? 0 : m_iface.hashCode());
+        result = prime * result
+                + ((m_address == null) ? 0 : m_address.hashCode());
+        result = prime * result
+                + ((m_protocol == null) ? 0 : m_protocol.hashCode());
+        result = prime * result
+                + ((m_permittedNetwork == null) ? 0 : m_permittedNetwork.hashCode());
+        result = prime * result + m_permittedNetworkMask;
+        result = prime * result
+                + ((m_permittedMAC == null) ? 0 : m_permittedMAC.hashCode());
+        result = prime * result
+                + ((m_sourcePortRange == null) ? 0 : m_sourcePortRange.hashCode());
+        
+        return result;
+    }
+}
+
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/De910ModemDriver.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/De910ModemDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..947cafbeab416f25d60028242f05d9a388a2e7cd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/De910ModemDriver.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class De910ModemDriver extends OptionModemDriver {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(De910ModemDriver.class);
+	private static final String s_vendor = "1bc7";
+	private static final String s_product = "1010";
+	
+	public De910ModemDriver() {
+		super(s_vendor, s_product);
+	}
+	
+	public int install() throws Exception {	
+		s_logger.info("Installing {} driver for Telit DE910 modem", getName());
+		int status = super.install();
+		return status;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/Le910ModemDriver.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/Le910ModemDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..a51763dc68fad6279ee8c29c1d85789b9ded503f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/Le910ModemDriver.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Le910ModemDriver extends OptionModemDriver {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(Le910ModemDriver.class);
+	private static final String s_vendor = "1bc7";
+	private static final String s_product = "1201";
+	
+	public Le910ModemDriver() {
+		super(s_vendor, s_product);
+	}
+	
+	public int install() throws Exception {	
+		s_logger.info("Installing {} driver for Telit LE910 modem", getName());
+		int status = super.install();
+		return status;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/OptionModemDriver.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/OptionModemDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..073d6e62eb1ab31186cb47b93274bdf4e2973b80
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/OptionModemDriver.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OptionModemDriver extends UsbModemDriver {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(OptionModemDriver.class);
+
+	private String m_vendor;
+	private String m_product;
+	
+	public OptionModemDriver(String vendor, String product) {
+		super("option");
+		m_vendor = vendor;
+		m_product = product;
+	}
+	
+	public int install() throws Exception {	
+		int status = super.install();
+		if (status == 0) {
+			try {
+				Thread.sleep(1000);
+			} catch (Exception e) {
+				
+			}
+			
+			s_logger.info("submiting vendorId:productId information to option driver ...");
+			File newIdFile = new File("/sys/bus/usb-serial/drivers/option1/new_id");
+			if (newIdFile.exists()) {
+				StringBuffer sb = new StringBuffer();
+				sb.append(m_vendor);
+				sb.append(' ');
+				sb.append(m_product);
+				
+				FileOutputStream fos = new FileOutputStream(newIdFile);
+				PrintWriter pw = new PrintWriter(fos);
+				pw.write(sb.toString());
+				pw.flush();
+				pw.close();
+				fos.close();
+			}
+		}
+		return status;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SerialModemComm.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SerialModemComm.java
new file mode 100644
index 0000000000000000000000000000000000000000..42cc4f4ed80050dd75534ca8c9423c80fab0a785
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SerialModemComm.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public enum SerialModemComm {
+	
+	MiniGateway("/dev/ttyO5", "/dev/ttyO5", 115200, 8, 1, 0);
+	
+	private String m_atPort;
+	private String m_dataPort;
+	private int m_baudRate;
+	private int m_dataBits;
+	private int m_stopBits;
+	private int m_parity;
+	
+	private SerialModemComm (String atPort, String dataPort, int baudRate, int dataBits, int stopBits, int parity) {
+		m_atPort = atPort;
+		m_dataPort = dataPort;
+		m_baudRate = baudRate;
+		m_dataBits = dataBits;
+		m_stopBits = stopBits;
+		m_parity = parity;
+	}
+	
+	public String getAtPort() {
+		return m_atPort;
+	}
+	
+	public String getDataPort() {
+		return m_dataPort;
+	}
+	
+	public int getBaudRate() {
+		return m_baudRate;
+	}
+	
+	public int getDataBits() {
+		return m_dataBits;
+	}
+	
+	public int getStopBits() {
+		return m_stopBits;
+	}
+	
+	public int getParity() {
+		return m_parity;
+	}
+	
+	public List<String> getSerialPorts() {
+		List<String> ports = new ArrayList<String>();
+		ports.add(m_atPort);
+		return ports;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SerialModemDriver.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SerialModemDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..f059be0dac0f6603ddeaa3dedc5dd7b99e906bbb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SerialModemDriver.java
@@ -0,0 +1,287 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.core.linux.util.ProcessStats;
+
+public class SerialModemDriver {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(SerialModemDriver.class);
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private ConnectionFactory m_connectionFactory;
+	private SerialModemComm m_serialModemComm;
+	private String m_getModelAtCommand;
+	private String m_modemName;
+	private String m_modemModel;
+	
+	public SerialModemDriver (String modemName, SerialModemComm serialModemComm, String getModelAtCommand) {
+		
+		m_modemName = modemName;
+		m_serialModemComm = serialModemComm;
+		m_getModelAtCommand = getModelAtCommand;
+		BundleContext bundleContext = FrameworkUtil.getBundle(SerialModemDriver.class).getBundleContext();
+		
+		ServiceTracker<ConnectionFactory, ConnectionFactory> serviceTracker = new ServiceTracker<ConnectionFactory, ConnectionFactory>(bundleContext, ConnectionFactory.class, null);
+		serviceTracker.open(true);
+		m_connectionFactory = serviceTracker.getService();
+	}
+	
+	public int install() throws Exception {
+		
+		int status = -1;
+		boolean modemReachable = false;
+		
+		try {
+			modemReachable = isAtReachable(3, 1000);
+		} catch (KuraException kuraEx) {
+			s_logger.warn("Exception reaching serial modem ... " + kuraEx);
+			try {
+				unlockSerialPort();
+				sleep (2000);
+				modemReachable = isAtReachable(3, 1000);
+			} catch (Exception e) {
+				s_logger.error("Error unlocking the " + this.m_serialModemComm.getDataPort() + " device " + e);
+			}
+		}
+		
+		if (!modemReachable) {
+			s_logger.info("{} modem is not reachable, installing driver ...", m_modemName);
+			int retries = 3;
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				try {
+					toggleGpio65();
+					retries = 15;
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+			
+			modemReachable = isAtReachable(retries, 1000);
+		}
+				
+		if (modemReachable) {
+			status = 0;
+			s_logger.info("{} modem is reachable !!!", m_modemName);
+		} else {
+			s_logger.warn("{} modem is not reachable, failed to install modem driver", m_modemName);
+		}
+		
+		return status;
+	}
+	
+	public int remove() throws Exception {
+		
+		int status = -1;
+		boolean modemReachable = true;
+		
+		try {
+			modemReachable = isAtReachable(3, 1000);
+		} catch (KuraException e) {
+			s_logger.warn("Exception reaching serial modem ... " + e);
+		}
+		if (modemReachable) {
+			int retries = 3;
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				toggleGpio65();
+				sleep (2000);
+				retries = 15;
+			}
+			
+			modemReachable = isAtReachable(retries, 1000);
+		}
+		
+		if (!modemReachable) {
+			status = 0;
+			s_logger.info("{} modem is not reachable !!!", m_modemName);
+		} else {
+			s_logger.info("{} modem is still reachable, failed to remove modem driver", m_modemName);
+		}
+		return status;
+	}
+	
+	public String getModemName () {
+		return m_modemName;
+	}
+	
+	public String getModemModel () {
+		
+		return m_modemModel;
+	}
+	
+	public SerialModemComm getComm () {
+		return m_serialModemComm;
+	}
+	
+    private CommConnection openSerialPort (int tout) throws KuraException {
+    	
+    	CommConnection connection = null;
+		if(m_connectionFactory != null) {
+			String uri = new CommURI.Builder(m_serialModemComm.getAtPort())
+							.withBaudRate(m_serialModemComm.getBaudRate())
+							.withDataBits(m_serialModemComm.getDataBits())
+							.withStopBits(m_serialModemComm.getStopBits())
+							.withParity(m_serialModemComm.getParity())
+							.withTimeout(tout)
+							.build().toString();
+	
+			try {
+				connection = (CommConnection) m_connectionFactory.createConnection(uri, 1, false);
+			} catch (Exception e) {
+				s_logger.warn("Exception creating connection: " + e);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+		return connection;
+    }
+    
+    private void closeSerialPort (CommConnection connection) throws KuraException {
+		try {
+			connection.close();
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+    }
+    
+    private boolean isAtReachable(int numAttempts, int retryInMsec) throws KuraException {
+    	boolean status = false;
+    	CommConnection connection = openSerialPort(2000);
+ 
+    	do {
+    		numAttempts--;
+			try {
+				status = (connection.sendCommand("at\r\n".getBytes(), 500).length > 0);
+				if (status) {
+					byte [] reply = connection.sendCommand(m_getModelAtCommand.getBytes(), 1000, 100);
+					if (reply != null) {
+						m_modemModel = getResponseString(reply);
+						reply = null;
+					}
+				} else {
+					if (numAttempts > 0) {
+						sleep(retryInMsec);
+					}
+				}
+			} catch (Exception e) {
+				sleep(retryInMsec);
+			}			
+    	} while((status == false) && (numAttempts > 0));
+    	
+    	closeSerialPort(connection);
+    	return status;	
+    }
+    
+    // Parse the AT command response for the relevant info
+  	private String getResponseString(String resp) {
+  	    if(resp == null) {
+  	        return "";
+  	    }
+  	    
+  	    // remove the command and space at the beginning, and the 'OK' and spaces at the end
+  	    return resp.replaceFirst("^\\S*\\s*", "").replaceFirst("\\s*(OK)?\\s*$", "");
+  	}
+  	
+ 	private String getResponseString(byte[] resp) {
+ 		if (resp == null) {
+ 			return "";
+ 		}
+
+ 		return getResponseString(new String(resp));
+ 	}
+ 	
+ 	private void unlockSerialPort() throws Exception {
+ 		String dataPort = m_serialModemComm.getDataPort();
+ 		dataPort = dataPort.substring(dataPort.lastIndexOf("/")+1);
+ 		File fLockFile = new File ("/var/lock/LCK.." + dataPort);
+ 		if (fLockFile.exists()) {
+ 			s_logger.warn("lock exists for the {} device", dataPort);
+			BufferedReader br = new BufferedReader(new FileReader(fLockFile));
+			int lockedPid = Integer.parseInt(br.readLine().trim());
+			br.close();
+			
+			ProcessStats processStats = LinuxProcessUtil.startWithStats("pgrep pppd");
+	    	br = new BufferedReader(new InputStreamReader(processStats.getInputStream()));
+	    	String spid = null;
+	    	int pidToKill = -1;
+	    	while ((spid = br.readLine()) != null) {
+	    		int pid = Integer.parseInt(spid);
+	    		if (pid == lockedPid) {
+	    			pidToKill = pid;
+	    			break;
+	    		}
+	    	}
+	    	br.close();
+	    	if (pidToKill > 0) {
+	    		s_logger.info("killing pppd that locks the {} device", dataPort);
+	    		int stat = LinuxProcessUtil.start("kill " + pidToKill, true);
+	    		if (stat == 0) {
+	    			s_logger.info("deleting " + fLockFile.getName());
+	    			fLockFile.delete();
+	    		}
+	    	}
+ 		}
+ 	}
+ 	
+ 	private void toggleGpio65() throws Exception { 		
+ 		File fgpio65Folder = new File ("/sys/class/gpio/gpio65");
+		if (!fgpio65Folder.exists()) {
+			BufferedWriter bwGpioSelect = new BufferedWriter(new FileWriter("/sys/class/gpio/export"));
+			bwGpioSelect.write("65");
+			bwGpioSelect.flush();
+			bwGpioSelect.close();
+		}
+		
+		BufferedWriter bwGpio65Direction = new BufferedWriter(new FileWriter("/sys/class/gpio/gpio65/direction"));
+		bwGpio65Direction.write("out");
+		bwGpio65Direction.flush();
+		bwGpio65Direction.close();
+		
+		BufferedWriter fGpio65Value = new BufferedWriter(new FileWriter("/sys/class/gpio/gpio65/value"));
+		fGpio65Value.write("0");
+		fGpio65Value.flush();
+		fGpio65Value.write("1");
+		fGpio65Value.flush();
+		sleep(5000);
+		fGpio65Value.write("0");
+		fGpio65Value.flush();
+		fGpio65Value.close();
+ 	}
+	
+    private void sleep(long millis) {
+		try {
+			Thread.sleep(millis);
+		} catch (InterruptedException e) {
+			// ignore
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModemInfo.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModemInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..993187499e72e5b71249128623c64c2bb0bd73bb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModemInfo.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+public enum SupportedSerialModemInfo {
+
+	MiniGateway_Telit_HE910_NAD("HE910", new String[]{"HE910-NAD", "HE910-EUD"}, "Telit", KuraConstants.Mini_Gateway.getImageName(), 
+			KuraConstants.Mini_Gateway.getImageVersion(),  Arrays.asList(ModemTechnologyType.HSDPA), 
+			new SerialModemDriver("HE910", SerialModemComm.MiniGateway, "at+gmm\r\n"));
+	
+	private String m_modemName;
+	private String [] m_modemModels;
+	private String m_manufacturerName;
+	private String m_osImageName;
+	private String m_osImageVersion;
+	private List<ModemTechnologyType> m_technologyTypes;
+	private SerialModemDriver m_driver;
+	
+	private SupportedSerialModemInfo(String modemName, String [] modemModels, String manufacturerName, String osImageName,
+			String osImageVersion, List<ModemTechnologyType> technologyTypes,
+			SerialModemDriver driver) {
+
+		m_modemName = modemName;
+		m_modemModels = modemModels;
+		m_manufacturerName = manufacturerName;
+		m_osImageName = osImageName;
+		m_osImageVersion = osImageVersion;
+		m_technologyTypes = technologyTypes;
+		m_driver = driver;
+	}
+
+	public String getModemName() {
+		return m_modemName;
+	}
+	
+	public String [] getModemModels() {
+		return m_modemModels;
+	}
+	
+	public String getManufacturerName() {
+		return m_manufacturerName;
+	}
+	
+	public String getOsImageName() {
+		return m_osImageName;
+	}
+
+	public String getOsImageVersion() {
+		return m_osImageVersion;
+	}
+	
+	public List<ModemTechnologyType> getTechnologyTypes() {
+		return m_technologyTypes;
+	}	
+	
+	public SerialModemDriver getDriver() {
+		return m_driver;
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModems.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModems.java
new file mode 100644
index 0000000000000000000000000000000000000000..99200a6e337acc4fb0864895e0741bebf5bbf29f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModems.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+
+public class SupportedSerialModems {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(SupportedSerialModems.class);
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private static boolean modemReachable = false;
+	static {
+		breakout:
+		for (SupportedSerialModemInfo modem : SupportedSerialModemInfo.values()) {
+			if (modem == SupportedSerialModemInfo.MiniGateway_Telit_HE910_NAD) {
+				if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+					s_logger.info("Installing modem driver for {} ...", modem.getModemName());
+					try {
+						if (!SupportedUsbModems.isAttached(
+								SupportedUsbModemInfo.Telit_HE910_D.getVendorId(),
+								SupportedUsbModemInfo.Telit_HE910_D.getProductId())) {
+							if (modem.getDriver().install() == 0) {
+								for (String modemModel : modem.getModemModels()) {
+									if (modemModel.equals(modem.getDriver().getModemModel())) {
+										s_logger.info("Driver for the {} modem has been installed" , modemModel);
+										modemReachable = true;
+										break breakout;
+									}
+								}
+							}
+							s_logger.warn("Failed to installing modem driver for {}", modem.getModemName());
+						}
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+	}
+	
+	public static SupportedSerialModemInfo getModem(String imageName, String imageVersion) {
+		
+		SupportedSerialModemInfo supportedSerialModemInfo = null;
+		
+		for (SupportedSerialModemInfo modem : SupportedSerialModemInfo.values()) {
+			if (modem.getOsImageName().equals(imageName) && modem.getOsImageVersion().equals(imageVersion)) {
+				if (modemReachable) {
+					s_logger.debug("The {} modem is attached", modem.getModemName());
+					supportedSerialModemInfo = modem;
+				} else {
+					// do not return this modem if it isn't reachable
+					s_logger.debug("The {} modem is not attached", modem.getModemName());
+				}
+				break;
+			}
+		}
+		
+		return supportedSerialModemInfo;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModemsInfo.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModemsInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..abdd1b58aca5ac32297407759a34d2c05b0c8d62
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedSerialModemsInfo.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SupportedSerialModemsInfo {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(SupportedSerialModemsInfo.class);
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+
+	private static SupportedSerialModemInfo m_supportedSerialModemInfo = null;
+	
+	public static SupportedSerialModemInfo getModem() {
+
+		SupportedSerialModemInfo supportedSerialModemInfo = null;
+		if (m_supportedSerialModemInfo != null) {
+			supportedSerialModemInfo = m_supportedSerialModemInfo;
+		} else {
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				s_logger.debug("obtaining serial modem info for {}", KuraConstants.Mini_Gateway.getImageName());
+				supportedSerialModemInfo = SupportedSerialModems.getModem(KuraConstants.Mini_Gateway.getImageName(), KuraConstants.Mini_Gateway.getImageVersion());
+				m_supportedSerialModemInfo = supportedSerialModemInfo;
+			}
+		}
+		return supportedSerialModemInfo;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModemInfo.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModemInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce2a29ff4f65031763de5425b4dc1d93c09418ab
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModemInfo.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+public enum SupportedUsbModemInfo {
+
+			// device name,     vendor, product, ttyDevs, blockDevs, AT Port, Data Port, technology types, device driver
+    Telit_HE910_D   ("HE910-D",  "1bc7", "0021", 7, 0, 3, 0, Arrays.asList(ModemTechnologyType.HSDPA), Arrays.asList(new UsbModemDriver("cdc_acm"))),
+    Telit_DE910_DUAL("DE910-DUAL",  "1bc7", "1010", 4, 0, 2, 3, Arrays.asList(ModemTechnologyType.EVDO), Arrays.asList(new De910ModemDriver())),
+    Telit_LE910		("LE910", "1bc7", "1201", 7, 1, 4, 5, Arrays.asList(ModemTechnologyType.HSDPA), Arrays.asList(new Le910ModemDriver())),
+    Sierra_MC8775   ("MC8775", "1199", "6812", 3, 0, 2, 0, Arrays.asList(ModemTechnologyType.HSDPA), Arrays.asList(new UsbModemDriver("sierra"))),
+    Sierra_MC8790   ("MC8790", "1199", "683c", 7, 0, 3, 4, Arrays.asList(ModemTechnologyType.HSDPA), Arrays.asList(new UsbModemDriver("sierra"))),
+    Sierra_USB598   ("USB598", "1199", "0025", 4, 1, 0, 0, Arrays.asList(ModemTechnologyType.EVDO), Arrays.asList(new UsbModemDriver("sierra")));
+
+    private String m_deviceName;
+    private String m_vendorId;
+    private String m_productId;
+    private int m_numTtyDevs;
+    private int m_numBlockDevs;
+    
+    private int m_atPort;
+    private int m_dataPort;
+    
+    private List<ModemTechnologyType> m_technologyTypes;
+    private List<? extends UsbModemDriver> m_deviceDrivers;
+    
+    private SupportedUsbModemInfo(String deviceName, String vendorId, String productId, int numTtyDevs, int numBlockDevs,
+            int atPort, int dataPort, List<ModemTechnologyType> modemTechnology, List<? extends UsbModemDriver> drivers) {
+        m_deviceName = deviceName;
+        m_vendorId = vendorId;
+        m_productId = productId;
+        m_numTtyDevs = numTtyDevs;
+        m_numBlockDevs = numBlockDevs;
+        m_atPort = atPort;
+        m_dataPort = dataPort;
+        m_technologyTypes = modemTechnology;
+        m_deviceDrivers = drivers;
+    }
+    
+    public String getDeviceName() {
+        return m_deviceName;
+    }
+    
+    public List<? extends UsbModemDriver> getDeviceDrivers() {
+    	return m_deviceDrivers;
+    }
+    
+    public String getVendorId() {
+        return m_vendorId;
+    }
+    
+    public String getProductId() {
+        return m_productId;
+    }
+    
+    public int getNumTtyDevs() {
+        return m_numTtyDevs;
+    }
+    
+    public int getNumBlockDevs() {
+        return m_numBlockDevs;
+    }
+    
+    public int getAtPort() {
+    	return m_atPort;
+    }
+    
+    public int getDataPort() {
+    	return m_dataPort;
+    }
+    
+    public List<ModemTechnologyType> getTechnologyTypes() {
+        return m_technologyTypes;
+    }
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModems.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModems.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2471c4be6abe937dfa7a95078ba6e26e13e56fa
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModems.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.List;
+
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.core.linux.util.ProcessStats;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SupportedUsbModems {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(SupportedUsbModems.class);
+	
+	static {
+		for (SupportedUsbModemInfo modem : SupportedUsbModemInfo.values()) {
+			try {
+				if(isAttached(modem.getVendorId(), modem.getProductId())) {
+					// modprobe driver
+					s_logger.info("The " + modem.getVendorId() + ":" + modem.getProductId() + "USB modem device attached");
+					List<? extends UsbModemDriver> drivers = modem.getDeviceDrivers();
+					for (UsbModemDriver driver : drivers) {
+						driver.install();
+					}
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+    
+    public static SupportedUsbModemInfo getModem(String vendorId, String productId) {
+        if (vendorId == null || productId == null)
+            return null;
+        
+        for (SupportedUsbModemInfo modem : SupportedUsbModemInfo.values()) {
+            if (vendorId.equals(modem.getVendorId()) && productId.equals(modem.getProductId())) {
+                return modem;
+            }
+        }
+        
+        return null;
+    }
+    
+    public static boolean isSupported(String vendorId, String productId) {
+        return (SupportedUsbModems.getModem(vendorId, productId) != null);
+    }
+    
+    public static boolean isAttached (String vendor, String product) throws Exception {
+    	// lsusb -d 1bc7:1010
+    	boolean attached = false;
+    	ProcessStats processStats = LinuxProcessUtil.startWithStats(formLsusbCommand(vendor, product));
+    	BufferedReader br = new BufferedReader(new InputStreamReader(processStats.getInputStream()));
+    	String line = null;
+    	while ((line = br.readLine()) != null) {
+    		if (line.indexOf(vendor + ":" + product) > 0) {
+    			attached = true;
+    			break;
+    		}
+    	}
+    	ProcessUtil.destroy(processStats.getProcess());
+    	return attached;
+    }
+    
+	private static String formLsusbCommand(String vendor, String product) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("lsusb -d ").append(vendor).append(":").append(product);
+		return sb.toString();
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModemsInfo.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModemsInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..561b7f99e475355bebb9ce0ddf5b1625961005ee
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/SupportedUsbModemsInfo.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import org.eclipse.kura.usb.UsbDevice;
+
+public class SupportedUsbModemsInfo {
+ 
+    public static SupportedUsbModemInfo getModem(UsbDevice usbDevice) {
+        if(usbDevice == null) {
+            return null;
+        }
+        return getModem(usbDevice.getVendorId(), usbDevice.getProductId());
+    }
+    
+    public static SupportedUsbModemInfo getModem(String vendorId, String productId) {
+        if (vendorId == null || productId == null)
+            return null;
+        
+        for (SupportedUsbModemInfo modem : SupportedUsbModemInfo.values()) {
+            if (vendorId.equals(modem.getVendorId()) && productId.equals(modem.getProductId())) {
+                return modem;
+            }
+        }
+        
+        return null;
+    }
+    
+    public static boolean isSupported(String vendorId, String productId) {
+        return SupportedUsbModems.isSupported(vendorId, productId);
+    	//return (SupportedUsbModems.getModem(vendorId, productId) != null);
+    }
+}
+
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/UsbModemDriver.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/UsbModemDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d6e07dcc5cceba1039ee8c2559be44dc91e1bec
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/modem/UsbModemDriver.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.modem;
+
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UsbModemDriver {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(UsbModemDriver.class);
+	
+	private String m_name;
+	
+	public UsbModemDriver (String name) {
+		m_name = name;
+	}
+	
+	public int install() throws Exception {
+		s_logger.info("installing driver: " + m_name);
+		return LinuxProcessUtil.start("modprobe " + m_name, true);
+	}
+	
+	public int remove() throws Exception {
+		s_logger.info("removing driver: " + m_name);
+		return LinuxProcessUtil.start("rmmod " + m_name, true);
+	}
+
+	public String getName() {
+		return m_name;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/ppp/PppLinux.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/ppp/PppLinux.java
new file mode 100644
index 0000000000000000000000000000000000000000..d362de33b718cd4e82e59b6d42e614ada50500c5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/ppp/PppLinux.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.ppp;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.linux.util.ProcessStats;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * PPP support for Linux OS
+ * 
+ * @author ilya.binshtok
+ * 
+ */
+public class PppLinux {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(PppLinux.class);
+	private static Object s_lock = new Object();
+	private static final String PPP_DAEMON = "/usr/sbin/pppd";
+
+	public static void connect (String iface, String port) throws KuraException {
+		
+		String cmd = formConnectCommand(iface, port);
+		try {
+			int status = LinuxProcessUtil.start(cmd);
+			if (status != 0) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, (cmd + " command failed"));
+			}
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public static void disconnect(String iface, String port) throws KuraException {
+		
+		int pid = getPid(iface, port);
+		if(pid >= 0) {
+    		s_logger.info("killing " + iface + " pid=" + pid);
+    		if(!LinuxProcessUtil.stop(pid)) {
+                s_logger.debug("Failed to stop process...try to kill");
+                if(!LinuxProcessUtil.kill(pid)) {
+                    throw new KuraException(KuraErrorCode.INTERNAL_ERROR, ("error killing process, pid=" + pid));
+                }		    
+    		}
+		}
+	}
+	
+	public static boolean isPppProcessRunning(String iface, String port) throws KuraException {
+	    
+		return (getPid(iface, port) > 0)? true : false; 
+	}
+	
+	public static boolean isPppProcessRunning(String iface, String port, int tout) throws KuraException {
+		
+		if (tout <= 0L) {
+			return isPppProcessRunning(iface, port);
+		}
+		
+		boolean isPppRunning = false;
+		long timeout = tout * 1000;
+
+		long now = System.currentTimeMillis();
+		long startDelay = now;
+		long dif = now - startDelay;
+
+		while (dif < timeout) {
+
+			isPppRunning = isPppProcessRunning(iface, port);
+			if (isPppRunning) {
+				break;
+			}
+			s_logger.info("Waiting " + (timeout - dif) + " ms for pppd to launch");
+			try {
+				Thread.sleep(timeout - dif);
+			} catch (InterruptedException e) {
+				// ignore
+			}
+			
+			now = System.currentTimeMillis();
+			dif = now - startDelay;
+		}
+		
+		return isPppRunning;
+	}
+	
+	private static int getPid(String iface, String port) throws KuraException {
+
+		int pid = -1;
+		
+		synchronized (s_lock) {
+			String [] pgrepCmd = {"pgrep", "-f", ""};
+			pgrepCmd[2] = formConnectCommand(iface, port);
+			
+			try {
+				ProcessStats processStats = LinuxProcessUtil.startWithStats(pgrepCmd);
+		    	BufferedReader br = new BufferedReader(new InputStreamReader(processStats.getInputStream()));
+		    	String line = br.readLine();
+		    	if ((line != null) && (line.length() > 0)) {
+		    		pid = Integer.parseInt(line);
+		    	}
+		    	br.close();
+			} catch (Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+		return pid;
+	}
+	
+	private static String formConnectCommand(String peer, String port) {
+		
+		StringBuffer sb = new StringBuffer();
+		sb.append(PPP_DAEMON).append(' ').append(port).append(' ')
+				.append("call").append(' ').append(peer);
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteFile.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..c46c3100b54646c835d9c8687d8fe39d1ab625e7
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteFile.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.route;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Properties;
+
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IP6Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.route.RouteConfig;
+import org.eclipse.kura.net.route.RouteConfigIP4;
+import org.eclipse.kura.net.route.RouteConfigIP6;
+
+
+public class RouteFile {
+
+	private String osRouteConfigDirectory = "/etc/sysconfig/network-scripts/";
+	private String interfaceName;
+	private File file;
+	private ArrayList<RouteConfig> routes;
+	
+	
+	public RouteFile(String interfaceName) {
+		this.interfaceName = interfaceName;
+		routes = new ArrayList<RouteConfig>();
+		file = new File(osRouteConfigDirectory + "route-" + this.interfaceName);
+		if(file.exists()) {
+			readFile();
+		} else {
+			createFile();
+		}
+	}
+	
+	private void readFile() {
+		int i = 0;
+		RouteConfig newRoute = null;
+		FileInputStream in = null;
+		Properties routeProps = new Properties();
+		try {
+			in = new FileInputStream(file);
+			routeProps.load(in);
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		newRoute = findRoute(routeProps, i);
+		while(newRoute != null) {
+			routes.add(newRoute);
+			i++;
+			newRoute = findRoute(routeProps, i);
+		}
+	}
+	
+	private RouteConfig findRoute(Properties props, int index) {
+		RouteConfig route = null;
+		IPAddress dest = null;
+		IPAddress gw = null;
+		IPAddress mask = null;
+		if(!props.containsKey("ADDRESS" + index)) {
+			return null;
+		}
+		try {
+			dest = IPAddress.parseHostAddress((String)props.get("ADDRESS" + index));
+			gw = IPAddress.parseHostAddress((String)props.get("GATEWAY" + index));
+			mask = IPAddress.parseHostAddress((String)props.get("NETMASK" + index));
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+		if(dest != null && gw != null && mask != null) {
+			if(dest instanceof IP4Address) {
+				route = new RouteConfigIP4((IP4Address) dest, (IP4Address) gw, (IP4Address) mask, interfaceName, -1);
+			} else if(dest instanceof IP6Address) {
+				route = new RouteConfigIP6((IP6Address) dest, (IP6Address) gw, (IP6Address) mask, interfaceName, -1);
+			}
+		}
+		return route;
+	}
+	
+	public boolean addRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String ifaceName) {
+		RouteConfig route = null;
+		if(destination instanceof IP4Address) {
+			route = new RouteConfigIP4((IP4Address) destination, (IP4Address) gateway, (IP4Address) netmask, ifaceName, -1);
+		} else if(destination instanceof IP6Address) {
+			route = new RouteConfigIP6((IP6Address) destination, (IP6Address) gateway, (IP6Address) netmask, ifaceName, -1);
+		}
+		if(routeIndex(route) != -1) {
+			return false;
+		}
+		routes.add(route);
+		storeFile();
+		return true;
+	}
+	
+	public boolean removeRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface) {
+		RouteConfig route = null;
+		if(destination instanceof IP4Address) {
+			route = new RouteConfigIP4((IP4Address) destination, (IP4Address) gateway, (IP4Address) netmask, interfaceName, -1);
+		} else if(destination instanceof IP6Address) {
+			route = new RouteConfigIP6((IP6Address) destination, (IP6Address) gateway, (IP6Address) netmask, interfaceName, -1);
+		}
+		
+		int index = routeIndex(route);
+		if(index != -1) {
+			routes.remove(index);
+			storeFile();
+			return true;
+		}
+		return false;
+	}
+	
+	private void createFile() {
+		try {
+			file.createNewFile();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public RouteConfig [] getRoutes() {
+		if(routes.size()<1) {
+			return null;
+		}
+		RouteConfig [] result = new RouteConfig[routes.size()];
+		for(int i=0; i<routes.size(); i++) {
+			result[i] = (RouteConfig)routes.get(i);
+		}
+		return result;
+	}
+	
+	private void storeFile() {
+		FileOutputStream out;
+		Properties props = new Properties();
+		RouteConfig route = null;
+		for(int i=0; i<routes.size(); i++) {
+			route = (RouteConfig)routes.get(i);
+			props.put("ADDRESS"+i, route.getDestination().getHostAddress());
+			props.put("GATEWAY"+i, route.getGateway().getHostAddress());
+			props.put("NETMASK"+i, route.getNetmask().getHostAddress());
+		}
+		try {
+			out = new FileOutputStream(file);
+			props.store(out, "Persistent routes for interface:  " + interfaceName);
+			out.flush();
+			out.close();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+	}
+	
+	private int routeIndex(RouteConfig route) {
+		for(int i=0; i<routes.size(); i++) {
+			RouteConfig tmp = (RouteConfig)routes.get(i);
+			if(route.equals(tmp)) {
+				return i;
+			}
+		}
+		return -1;
+	}
+	
+	public void cleanFile() {
+		routes = new ArrayList<RouteConfig>();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteService.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..8681ca4e959b2cfd72872dc078b4327612eb140e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteService.java
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.route;
+
+/* 
+ * Copyright (c) 2013 Eurotech Inc. All rights reserved.
+ */
+
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.route.RouteConfig;
+
+/**
+ * The IRouteService is used to add, remove, and obtain information on entries in the system's route table
+ * 
+ * CONFIGURATION
+ * 
+ * Configuration will be accepted in the form of key/value pairs.  The key/value pairs are
+ * strictly defined here:
+ * 
+ *   CONFIG_ENTRY -> KEY + "=" + VALUE
+ *   KEY          -> PARAM + "_" + INDEX
+ *   INDEX        -> "1" | "2" | ... | "N"
+ *   PARAM        -> "destination" | "netmask" | "iface" | "gateway"
+ *   VALUE	      -> (value of the specified parameter)
+ * 
+ *   EXAMPLE:
+ *   
+ *   destination_1=192.168.2.0
+ *   gateway_1=192.168.1.56
+ *   netmask_1=255.255.255.0
+ *   iface_1=eth0
+ *   destination_2=10.11.0.0
+ *   gateway_2=10.11.10.1
+ *   netmask_2=255.255.0.0
+ *   iface_2=eth1
+ */
+
+public interface RouteService {
+
+	/**
+	 * Returns the default route for a specified interface.
+	 * 
+	 * @param interfaceName	A String object specifying the interface name.
+	 * @return				A Route object representing the default route or null if none exists.
+	 */
+	public RouteConfig getDefaultRoute(String interfaceName);
+
+	/**
+	 * Returns the default route's interface for the specified destination address, or null if no route exists.
+	 * 
+	 * @param destination	An IPAddress object representing the destination IP address.
+	 * @return				A String object specifying the interface name, null if no route exists.
+	 */
+	public String getDefaultInterface(IPAddress destination);
+	
+	/**
+	 * Adds a static route to the system's route table.
+	 * 
+	 * @param destination 	An IPAddress object representing the destination IP address.
+	 * @param gateway 		An IPAddress object representing the gateway IP address.
+	 * @param netmask		An IPAddress object representing the netmask.
+	 * @param iface			A String object specifying the interface name.
+	 * @param metric		An int representing the metric (priority) of the route.
+	 * @throws Exception 	for invalid supplied parameters, or failure to add.
+	 */
+	public void addStaticRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface, int metric) throws Exception;
+
+	/**
+	 * Adds a persistent static route to the system's route table.
+	 * 
+	 * @param destination 	An InetAddress object representing the destination IP address.
+	 * @param gateway 		An InetAddress object representing the gateway IP address.
+	 * @param netmask		An InetAddress object representing the netmask.
+	 * @param iface			A String object specifying the interface name.
+	 * @throws Exception 	for invalid supplied parameters, or failure to add.
+	 */
+	//public void addPersistentStaticRoute(InetAddress destination, InetAddress gateway, InetAddress netmask, String iface) throws Exception;
+
+	/**
+	 * Removes a static route in the system's route table.
+	 * 
+	 * @param destination 	An InetAddress object representing the destination IP address.
+	 * @param gateway 		An InetAddress object representing the gateway IP address.
+	 * @param netmask		An InetAddress object representing the netmask.
+	 * @param iface			A String object specifying the interface name.
+	 * @throws Exception 	for invalid supplied parameters, or failure to remove.
+	 */
+	public void removeStaticRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface) throws Exception;
+	
+	/**
+	 * Removes a persistent static route in the system's route table.
+	 * 
+	 * @param destination 	An InetAddress object representing the destination IP address.
+	 * @param gateway 		An InetAddress object representing the gateway IP address.
+	 * @param netmask		An InetAddress object representing the netmask.
+	 * @param iface			A String object specifying the interface name.
+	 * @throws Exception 	for invalid supplied parameters, or failure to remove.
+	 */
+	//public void removePersistentStaticRoute(InetAddress destination, InetAddress gateway, InetAddress netmask, String iface) throws Exception;
+
+	/**
+	 * Returns the routes contained in the system's route table.
+	 * 
+	 * @return				An array of Route objects representing the system's route table, null if no routes exist.
+	 */
+	public RouteConfig [] getRoutes();
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteServiceImpl.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..16392b80a78055032efe3e606abfb335edfd68b1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/route/RouteServiceImpl.java
@@ -0,0 +1,449 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.route;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IP6Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.route.RouteConfig;
+import org.eclipse.kura.net.route.RouteConfigIP4;
+import org.eclipse.kura.net.route.RouteConfigIP6;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+//public class RouteServiceImpl implements RouteService, IConfigurableComponentService {
+public class RouteServiceImpl implements RouteService {
+
+	private static Logger s_logger = LoggerFactory.getLogger(RouteServiceImpl.class);
+	
+	private static RouteServiceImpl s_routeService = null;
+	
+//	public static final String CONFIGURATION_NAME = "org.eclipse.kura.net.linux.route";
+	
+	private String m_osRouteConfigDirectory = null;	
+	
+	private RouteServiceImpl() {
+		m_osRouteConfigDirectory = "/etc/sysconfig/network-scripts/";
+	}
+
+	public static synchronized RouteService getInstance() {
+		if (s_routeService == null) {
+			s_routeService =  new RouteServiceImpl();
+		}
+		
+		return s_routeService;
+	}
+	
+	private void addPersistentStaticRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface) throws Exception {
+		addStaticRoute(destination, gateway, netmask, iface, 0);
+		RouteFile routeFile = new RouteFile(iface);
+		if(routeFile.addRoute(destination, gateway, netmask, iface)) {
+			s_logger.info("Route persistence added");
+		} else {
+			s_logger.error("Error adding route persistence");
+		}
+	}
+
+	public void addStaticRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface, int metric) throws Exception {
+		RouteConfig tmpRoute = null;		
+		StringBuffer command = new StringBuffer();
+		command.append("route add -net " + destination.getHostAddress() + " ");
+		if(netmask != null) {
+			command.append("netmask " + netmask.getHostAddress() + " ");
+		}
+		if (gateway != null) {
+			if ((gateway.getHostAddress().compareTo("0.0.0.0") != 0)
+					&& (gateway.getHostAddress().compareTo("127.0.0.1") != 0)) {
+				command.append("gw " + gateway.getHostAddress() + " ");
+			}
+		}
+		if(iface != null) {
+			command.append("dev " + iface + " ");
+		}
+		if(metric != 0 && metric != -1) {
+			command.append("metric " + metric);
+		}
+		
+		Process proc = null;
+		try {
+			s_logger.debug("Executing command:  " + command.toString());
+			proc = ProcessUtil.exec(command.toString());
+			proc.waitFor();
+			if(proc.exitValue() != 0) {
+				s_logger.error("Error adding static Route: " + command.toString());
+				throw new Exception("Error adding Static Route");
+			}
+		} catch (IOException e) {
+			s_logger.error("Error executing command:  route -n");
+			throw e;
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		if(destination instanceof IP4Address) {
+			tmpRoute = new RouteConfigIP4((IP4Address) destination, (IP4Address) gateway, (IP4Address) netmask, iface, -1);
+		} else if(destination instanceof IP6Address) {
+			tmpRoute = new RouteConfigIP6((IP6Address) destination, (IP6Address) gateway, (IP6Address) netmask, iface, -1);
+		}
+		s_logger.info("Static route added successfully");
+		s_logger.debug(tmpRoute.getDescription());
+	}
+
+	public RouteConfig getDefaultRoute(String iface) {
+		RouteConfig [] routes = getRoutes();
+		RouteConfig defaultRoute;
+		ArrayList<RouteConfig> defaultRoutes = new ArrayList<RouteConfig>();
+		
+		// Search through routes and construct a list of all default routes for the specified interface
+		for(int i=0;i<routes.length;i++) {
+			if(routes[i].getInterfaceName().compareTo(iface)==0 && routes[i].getDestination().getHostAddress().compareTo("0.0.0.0")==0) {
+				defaultRoutes.add(routes[i]);
+			}
+		}
+		
+		// If no default routes exist, return null
+		if(defaultRoutes.size() == 0) {
+			s_logger.info("No default routes exist for inteface: " + iface);
+			return null;
+		}
+		
+		// Set the default route to the first one in the list
+		defaultRoute = (RouteConfig) defaultRoutes.get(0);
+		
+		// Search for the default route with the lowest metric value
+		for(int i=1; i<defaultRoutes.size(); i++) {
+			if(defaultRoute.getMetric() > ((RouteConfig)defaultRoutes.get(i)).getMetric()) {
+				defaultRoute = (RouteConfig)defaultRoutes.get(i);
+			}
+		}
+		
+		s_logger.info("Default route found for interface: " + iface);
+		s_logger.debug("Default route:\n" + defaultRoute.getDescription());
+		return defaultRoute;
+	}
+
+	public RouteConfig[] getRoutes() {
+		String routeEntry = null;
+		ArrayList<RouteConfig> routeList = new ArrayList<RouteConfig>();
+		RouteConfig [] routes = null;
+		RouteConfig tmpRoute = null;
+		Process proc = null;		
+		try {
+			proc = ProcessUtil.exec("route -n");
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			br.readLine();
+			br.readLine();
+			while ((routeEntry = br.readLine()) != null) {
+				tmpRoute = entryToRoute(routeEntry);
+				if(tmpRoute != null) {
+					routeList.add(tmpRoute);
+				}
+			}
+		} 
+		catch (IOException e) {
+			s_logger.error("Error executing command:  route -n");
+			e.printStackTrace();
+			return null;
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+				
+		routes = new RouteConfig[routeList.size()];
+		for(int i=0; i<routes.length; i++) {
+			routes[i] = (RouteConfig)routeList.get(i);
+		}
+		
+		return routes;
+	}
+
+	private void removePersistentStaticRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface) throws Exception {
+		removeStaticRoute(destination, gateway, netmask, iface);
+		RouteFile routeFile = new RouteFile(iface);
+		if(routeFile.removeRoute(destination, gateway, netmask, iface)) {
+			s_logger.info("Route persistence removed");
+		} else {
+			s_logger.error("Error removing route persistence");
+		}
+	}
+
+	public void removeStaticRoute(IPAddress destination, IPAddress gateway, IPAddress netmask, String iface) throws Exception {
+		RouteConfig tmpRoute = null;		
+		StringBuffer command = new StringBuffer();
+		command.append("route del -net " + destination.getHostAddress() + " ");
+		if(netmask != null) {
+			command.append("netmask " + netmask.getHostAddress() + " ");
+		}
+		if(gateway != null) {
+			if (gateway.getHostAddress().compareTo("127.0.0.1") != 0) {
+				command.append("gw " + gateway.getHostAddress() + " ");
+			}
+		}
+		if(iface != null) {
+			command.append("dev " + iface + " ");
+		}
+		
+		Process proc = null;
+		try {
+			s_logger.debug("Executing command:  " + command.toString());
+			proc = ProcessUtil.exec(command.toString());
+			proc.waitFor();
+			if(proc.exitValue() != 0) {
+				s_logger.error("Error removing static Route");
+				throw new Exception("Error removing Static Route");
+			}
+		} catch (IOException e) {
+			s_logger.error("Error executing command:  route -n");
+			throw e;
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		if(destination instanceof IP4Address) {
+			tmpRoute = new RouteConfigIP4((IP4Address) destination, (IP4Address) gateway, (IP4Address) netmask, iface, -1);
+		} else if(destination instanceof IP6Address) {
+			tmpRoute = new RouteConfigIP6((IP6Address) destination, (IP6Address) gateway, (IP6Address) netmask, iface, -1);
+		}
+		s_logger.info("Static route removed successfully");
+		s_logger.debug(tmpRoute.getDescription());
+	}
+
+	private RouteConfig entryToRoute(String entry) {
+		RouteConfig route;
+		IPAddress destination;
+		IPAddress gateway;
+		IPAddress netmask;
+		int metric;
+		String iface;
+		String tmp;
+		
+		try {
+			route = null;
+			StringTokenizer tok = new StringTokenizer(entry, " ");
+			tmp = tok.nextToken();
+			destination = IPAddress.parseHostAddress(tmp);
+			gateway = IPAddress.parseHostAddress(tok.nextToken());
+			netmask = IPAddress.parseHostAddress(tok.nextToken());
+			tok.nextToken();
+			metric = Integer.parseInt(tok.nextToken());
+			tok.nextToken();
+			tok.nextToken();
+			iface = tok.nextToken();
+		} catch (Exception e) {
+			s_logger.error("Error parsing route table entry:  " + e.getMessage());
+			e.printStackTrace();
+			return null;
+		}
+		
+		if(destination instanceof IP4Address) {
+			route = new RouteConfigIP4((IP4Address) destination, (IP4Address) gateway, (IP4Address) netmask, iface, metric);
+		} else if(destination instanceof IP6Address) {
+			route = new RouteConfigIP6((IP6Address) destination, (IP6Address) gateway, (IP6Address) netmask, iface, metric);
+		}
+		s_logger.trace("Route successfully read from route table entry");
+		return route;
+	}
+
+	public String getDefaultInterface(IPAddress destination) {
+		ArrayList<RouteConfig> matches = new ArrayList<RouteConfig>();
+		RouteConfig [] routes = getRoutes();
+		for(int i=0; i<routes.length; i++) {
+			if(matchesRoute(destination, routes[i])) {
+				matches.add(routes[i]);
+			}
+		}
+		if(matches.size()>0) {
+			RouteConfig dRoute = (RouteConfig)matches.get(0);
+			for(int i=0; i<routes.length; i++) {
+				if(dRoute.getMetric()>routes[i].getMetric()) {
+					dRoute = routes[i];
+				}
+			}
+			s_logger.debug("Found defualt interface " + dRoute.getInterfaceName() + " for destination " + destination.getHostAddress());
+			return dRoute.getInterfaceName();
+		}
+		s_logger.debug("No default interface exists for destination " + destination.getHostAddress());
+		return null;
+	}
+	
+	private boolean matchesRoute(IPAddress destination, RouteConfig route) {
+		byte mask = (byte)0xFF;
+		byte [] dest = destination.getAddress();
+		byte [] routeMask = route.getNetmask().getAddress();
+		byte [] routeDest = route.getDestination().getAddress();
+		byte [] dest_masked = new byte[4];
+		for(int i=0; i<4; i++) {
+			if(routeMask[i] == mask) {
+				dest_masked[i] = dest[i];
+			} else {
+				dest_masked[i] = 0;
+			}
+		}
+		for(int i=0; i<4; i++) {
+			if(dest_masked[i] != routeDest[i]) {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/*
+	 * Container class for a new route from a configuration
+	 */
+	private class ConfigRoute {
+		public int index;
+		public IPAddress destination = null;
+		public IPAddress netmask = null;
+		public IPAddress gateway = null;
+		public String iface = null;
+		public ConfigRoute(int index) {
+			this.index = index;
+		}
+		public boolean isComplete() {
+			return destination != null && netmask != null && gateway != null && iface != null;
+		}
+		public String getDescription() {
+			return "dest: " + destination.getHostAddress() + " nm: " + netmask.getHostAddress() + " gw: " + gateway.getHostAddress() + " iface: " + iface; 
+		}
+	}
+	
+//	public Object receiveConfig(Object config) throws KuraConfigurationException {
+//		Properties props = (Properties)config;
+//		Enumeration keys = props.keys();
+//		ArrayList newRoutes = new ArrayList();
+//		String key = null;
+//		String param = null;
+//		int index = 0;
+//		ConfigRoute newRoute = null;
+//		s_logger.debug("New Configuration received with " + props.size() + " elements");
+//		
+//		// Validate the configuration parameters and create ConfigRoute objects to hold the new routes
+//		while(keys.hasMoreElements()) {
+//			key = (String)keys.nextElement();
+//			try {
+//				index = getKeyIndex(key);
+//			} catch (NumberFormatException e) {
+//				s_logger.error("Error parsing configuration parameter " + key);
+//				throw new KuraConfigurationException("Error parsing configuration parameter: " + key + ", " + e.getMessage());
+//			}
+//			param = getKeyParam(key);
+//			
+//			for(int i=0; i<newRoutes.size(); i++) {
+//				ConfigRoute tmpRoute = (ConfigRoute)newRoutes.get(i);
+//				if(tmpRoute.index == index) {
+//					s_logger.debug("New parameter found for route " + index);
+//					newRoute = tmpRoute;
+//				}
+//			}
+//			
+//			if(newRoute == null) {
+//				s_logger.debug("New parameter found for NEW route " + index);
+//				newRoute = new ConfigRoute(index);
+//				newRoutes.add(newRoute);
+//			}
+//				
+//			try {
+//				if(param.compareTo("destination")==0) {
+//					s_logger.debug("New Configuration - Route - destination: " + (String)props.get(key));
+//					newRoute.destination = InetAddress.getByName((String)props.get(key));
+//				} else if(param.compareTo("netmask")==0) {
+//					s_logger.debug("New Configuration - Route - netmask: " + (String)props.get(key));
+//					newRoute.netmask = InetAddress.getByName((String)props.get(key));
+//				} else if(param.compareTo("gateway")==0) {
+//					s_logger.debug("New Configuration - Route - gateway: " + (String)props.get(key));
+//					newRoute.gateway = InetAddress.getByName((String)props.get(key));
+//				} else if(param.compareTo("iface")==0) {
+//					s_logger.debug("New Configuration - Route - iface: " + (String)props.get(key));
+//					newRoute.iface = (String)props.get(key);
+//				} else {
+//					s_logger.error("Error parsing configuration, unknown parameter: " + key);
+//					throw new KuraConfigurationException("Unknown parameter: " + key);	
+//				}
+//			} catch (UnknownHostException e) {
+//				e.printStackTrace();
+//				s_logger.error("Error parsing configuration, unknown host: " + (String)props.get(key));
+//				throw new KuraConfigurationException("Unknown host: " + (String)props.get(key));
+//				
+//			}
+//			newRoute = null;
+//		}
+//		
+//		// Make sure all new route configurations are complete
+//		for(int i=0; i<newRoutes.size(); i++) {
+//			ConfigRoute cr = (ConfigRoute)newRoutes.get(i);
+//			if(!cr.isComplete()) {
+//				s_logger.error("Error parsing configuration, missing parameters for new route " + cr.index);
+//				throw new KuraConfigurationException("Missing parameters for new route " + cr.index);
+//			} else {
+//				s_logger.debug("New complete route configuration:  " + cr.getDescription());
+//			}
+//		}
+//		
+//		// Clear current OS persistent route files
+//		clearPersistenceFiles();
+//		
+//		// Create new routes
+//		RouteFile routeFile;
+//		for(int i=0; i<newRoutes.size(); i++) {
+//			ConfigRoute cr = (ConfigRoute)newRoutes.get(i);
+//			s_logger.debug("editing route file for interface:  " + cr.iface);
+//			routeFile = new RouteFile(cr.iface);
+//			s_logger.debug("adding route:  " + cr.getDescription());
+//			routeFile.addRoute(cr.destination, cr.gateway, cr.netmask, cr.iface);
+//		}
+//		
+//		return null;
+//	}
+
+	private int getKeyIndex(String key) throws NumberFormatException {
+		int index;
+		try {
+			String indexString = key.substring(key.indexOf("_")+1);
+			index = Integer.parseInt(indexString);
+		} catch (NumberFormatException e) {
+			e.printStackTrace();
+			throw e;
+		}
+		return index;
+	}
+	
+	private String getKeyParam(String key) {
+		return key.substring(0,key.indexOf("_"));
+	}
+	
+	private void clearPersistenceFiles() {
+		File dir = new File(m_osRouteConfigDirectory);
+		String [] files = dir.list();
+		for(int i=0; i<files.length; i++) {
+			if(files[i].startsWith("route-")) {
+				File fileToDelete = new File(m_osRouteConfigDirectory + files[i]);
+				fileToDelete.delete();
+			}
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/DebianNetworkInterface.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/DebianNetworkInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..32f6c8c1561e37b99fa5fb1143e29e10572c9ff7
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/DebianNetworkInterface.java
@@ -0,0 +1,254 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Properties;
+import java.util.Scanner;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DebianNetworkInterface extends GenericNetworkInterface {
+	private static final Logger s_logger = LoggerFactory.getLogger(DebianNetworkInterface.class);
+	
+	public static NetInterfaceConfig getCurrentConfiguration(
+			String interfaceName, NetInterfaceType type,
+			NetInterfaceStatus status, boolean dhcpServerEnabled,
+			boolean passDns)
+			throws KuraException {
+		NET_CONFIGURATION_DIRECTORY = "/etc/network/";
+		
+		try {
+		    NetInterfaceConfig netInterfaceConfig = null;
+		    
+			//build up the configuration
+			Properties kuraProps = new Properties();
+			
+			kuraFile = new File(NET_CONFIGURATION_DIRECTORY + "interfaces");
+			if(kuraFile.exists()) {
+				//found our match so load the properties
+				Scanner scanner = new Scanner (new FileInputStream(kuraFile));
+
+				s_logger.debug("getting args for " + interfaceName);
+				
+				//Debian specific routine to create Properties object
+	            kuraProps.setProperty("ONBOOT", "no");
+
+	            try {
+	                while (scanner.hasNextLine()) {
+	                    String line = scanner.nextLine().trim();
+	                    //ignore comments and blank lines
+	                    if (!line.isEmpty() && !line.startsWith("#")) {
+	                        String[] args = line.split("\\s+");
+	                        try {
+	                            //must be a line stating that interface starts on boot
+	                        	if (args[0].equals("auto") && args[1].equals(interfaceName)) {
+	                                kuraProps.setProperty("ONBOOT", "yes");
+	                            }
+	                        	//once the correct interface is found, read all configuration information
+	                            else if (args[0].equals("iface") && args[1].equals(interfaceName)) {
+	                                kuraProps.setProperty("BOOTPROTO", args[3]);
+	                                while (!(line = scanner.nextLine()).isEmpty()) {
+	                                    args = line.trim().split("\\s+");
+	                                    if (args[0].equals("mtu"))
+	                                        kuraProps.setProperty("mtu", args[1]);
+	                                    else if (args[0].equals( "address"))
+	                                        kuraProps.setProperty("IPADDR", args[1]);
+	                                    else if (args[0].equals( "netmask"))
+	                                        kuraProps.setProperty("NETMASK", args[1]);
+	                                    else if (args[0].equals( "gateway"))
+	                                        kuraProps.setProperty("GATEWAY", args[1]);
+	                                    else if(args[0].equals("dns-nameservers")) {
+	                                    	if (args.length == 2)
+	                                    		kuraProps.setProperty("DNS1", args[1]);
+	                                    	else if (args.length == 3) {
+	                                    		kuraProps.setProperty("DNS1", args[1]);
+	                                    		kuraProps.setProperty("DNS2", args[2]);
+	                                    	} else {
+	                                    		s_logger.warn("Possible malformed configuration file (dns) for " + interfaceName);
+						}
+	                                    }
+	                                }
+	                                //Debian makes assumptions about lo, handle those here
+	                                if (interfaceName.equals("lo") && kuraProps.getProperty("IPADDR") == null && kuraProps.getProperty("NETMASK") == null) {
+	                                	kuraProps.setProperty("IPADDR", "127.0.0.1");
+	                                	kuraProps.setProperty("NETMASK", "255.0.0.0");
+	                                }
+	                                break;
+	                            }
+	                        } catch (Exception e) {
+	                        	s_logger.warn("Possible malformed configuration file for " + interfaceName);
+					e.printStackTrace();
+	                        }
+	                    }
+	                }
+	                
+	                //if BOOTPROTO is null then interface was not found in the config file
+	                if (kuraProps.getProperty("BOOTPROTO") != null)
+	                	netInterfaceConfig = getCurrentConfig(interfaceName, type, status, dhcpServerEnabled, passDns, kuraProps);
+	            } finally {
+	                scanner.close();
+	            }
+            } else if(type == NetInterfaceType.MODEM) {
+                s_logger.debug("getting args for " + interfaceName);
+                kuraProps.setProperty("BOOTPROTO", "dhcp");
+                netInterfaceConfig = getCurrentConfig(interfaceName, type, status, dhcpServerEnabled, passDns, kuraProps);
+            }
+		
+			return netInterfaceConfig;
+		} catch (FileNotFoundException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public static void writeNewConfig(NetInterfaceConfig netInterfaceConfig) throws KuraException {
+		try {
+			StringBuffer sb = new StringBuffer();
+			String outputFileName = NET_CONFIGURATION_DIRECTORY + "interfaces";
+			kuraFile = new File(NET_CONFIGURATION_DIRECTORY + "interfaces");
+			String iName = netInterfaceConfig.getName();
+			
+			if(kuraFile.exists()) {
+				//found our match so load the properties
+				Scanner scanner = new Scanner (new FileInputStream(kuraFile));
+			
+				//need to loop through the existing file and replace only the desired interface
+				while (scanner.hasNextLine()) {
+					String noTrimLine = scanner.nextLine();
+					String line = noTrimLine.trim();
+					
+                    //ignore comments and blank lines
+                    if (!line.isEmpty() && !line.startsWith("#")) {
+                        String[] args = line.split("\\s+");
+                        try {
+                            //must be a line stating that interface starts on boot
+                        	if (args[1].equals(iName)) {
+                                
+								List<? extends NetInterfaceAddressConfig> netInterfaceConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+								s_logger.debug("There are " + netInterfaceConfigs.size() + " NetInterfaceConfigs in this configuration");
+								
+								for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceConfigs) {
+									List<NetConfig> netConfigs =  netInterfaceAddressConfig.getConfigs();
+					
+									if(netConfigs != null) {
+										for(NetConfig netConfig : netConfigs) {
+											if(netConfig instanceof NetConfigIP4) {
+												//ONBOOT
+												if(((NetConfigIP4) netConfig).isAutoConnect())
+													sb.append("auto " + iName + "\n" );
+												
+												//BOOTPROTO
+												sb.append("iface " + iName + " inet ");
+												if(((NetConfigIP4) netConfig).isDhcp()) {
+													s_logger.debug("new config is DHCP");
+													sb.append("dhcp\n");
+												} else {
+													s_logger.debug("new config is STATIC");
+													sb.append("static\n");
+												}
+					
+												if(!((NetConfigIP4) netConfig).isDhcp()) {
+													//IPADDR
+													sb.append("\taddress ")
+													.append(((NetConfigIP4) netConfig).getAddress().getHostAddress())
+													.append("\n");
+													
+													//NETMASK
+													sb.append("\tnetmask ")
+													.append(((NetConfigIP4) netConfig).getSubnetMask().getHostAddress())
+													.append("\n");
+													
+													//NETWORK
+													//TODO: Handle Debian NETWORK value
+					
+													//Gateway
+													if(((NetConfigIP4) netConfig).getGateway() != null) {
+														sb.append("\tgateway ")
+														.append(((NetConfigIP4) netConfig).getGateway().getHostAddress())
+														.append("\n");
+													}
+					
+													//DNS
+													List<? extends IPAddress> dnsAddresses = ((NetConfigIP4) netConfig).getDnsServers();
+													if (!dnsAddresses.isEmpty()) {
+														sb.append("\tdns-nameservers ");
+														for (int i = 0; i < dnsAddresses.size(); i++) {
+															sb.append(dnsAddresses.get(i).getHostAddress() + " ");
+														}
+														sb.append("\n");
+													}
+												} else {
+													// DEFROUTE
+						                            if(((NetConfigIP4) netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledLAN) {
+						                            	sb.append("post-up route del default dev ");
+						                            	sb.append(iName);
+						                            	sb.append("\n");
+						                            }
+												}
+											}
+										}
+									} else {
+										s_logger.debug("netConfigs is null");
+									}
+									
+									// WIFI
+									if(netInterfaceAddressConfig instanceof WifiInterfaceAddressConfig) {
+										s_logger.debug("new config is a WifiInterfaceAddressConfig");
+										sb.append("\n#Wireless configuration\n");
+										
+										//TODO: Handle Wireless
+									}
+								}
+								//remove old config lines from the scanner
+								while (!(line = scanner.nextLine()).isEmpty()) {
+								}
+								sb.append("\n");
+                        	}
+                        	else
+                        		sb.append(noTrimLine + "\n");
+                        } catch(Exception e) {
+                        	
+                        }
+                    }
+                    else
+                    	sb.append(noTrimLine + "\n");
+				}
+			}
+			
+			FileOutputStream fos = new FileOutputStream(outputFileName);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(sb.toString());
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/EthTool.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/EthTool.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba5cf4ca921d938b7f43195f38f679984fc41d9c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/EthTool.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Defines ethtool utility 
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class EthTool implements LinkTool {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(LinuxNetworkUtil.class);
+	
+	private static final String LINK_DETECTED = "Link detected:";
+	private static final String DUPLEX = "Duplex:";
+	private static final String SPEED = "Speed:";
+	
+	private String tool = null;
+	private String ifaceName = null; 
+	private boolean linkDetected = false;
+	private int speed = 0; // in b/s
+	private String duplex = null;
+
+	/**
+	 * ethtool constructor
+	 * 
+	 * @param ifaceName - interface name as {@link String}
+	 */
+	public EthTool (String tool, String ifaceName) {
+		this.tool = tool;
+		this.ifaceName = ifaceName;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#get()
+	 */
+	public boolean get () throws KuraException {
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec(tool + " " + this.ifaceName);			
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			int ind = -1;
+		    while((line = br.readLine()) != null) {
+		    	if ((ind = line.indexOf(LINK_DETECTED)) >= 0) {
+		    		s_logger.trace("Link detected from: " + line);
+		    		line = line.substring(ind + LINK_DETECTED.length()).trim();
+		    		this.linkDetected = (line.compareTo("yes") == 0)? true : false;
+		    	} else if ((ind = line.indexOf(DUPLEX)) >= 0) {
+		    		this.duplex = line.substring(ind + DUPLEX.length()).trim();
+		    	} else if ((ind = line.indexOf(SPEED)) >= 0) {
+		    		line = line.substring(ind + SPEED.length()).trim();
+		    		if (line.compareTo("10Mb/s") == 0) {
+		    			this.speed = 10000000;
+		    		} else if (line.compareTo("100Mb/s") == 0) {
+		    			this.speed = 100000000;
+		    		} else if (line.compareTo("1000Mb/s") == 0) {
+		    			this.speed = 1000000000;
+		    		}
+		    	}
+		    }
+		    
+		    return (proc.waitFor() == 0)? true : false;
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#getIfaceName()
+	 */
+	public String getIfaceName() {
+		return this.ifaceName;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#isLinkDetected()
+	 */
+	public boolean isLinkDetected() {
+		return this.linkDetected;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#getSpeed()
+	 */
+	public int getSpeed() {
+		return this.speed;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.util.net.service.ILinkTool#getDuplex()
+	 */
+	public String getDuplex() {
+		return this.duplex;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/GenericNetworkInterface.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/GenericNetworkInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..21b5d2a552a1378b87dcd4d2adf82039e50657d8
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/GenericNetworkInterface.java
@@ -0,0 +1,589 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.util;
+
+import java.io.File;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.EthernetInterfaceConfigImpl;
+import org.eclipse.kura.core.net.EthernetInterfaceImpl;
+import org.eclipse.kura.core.net.LoopbackInterfaceConfigImpl;
+import org.eclipse.kura.core.net.LoopbackInterfaceImpl;
+import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.WifiAccessPointImpl;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.linux.net.ConnectionInfoImpl;
+import org.eclipse.kura.linux.net.dhcp.DhcpServerFactory;
+import org.eclipse.kura.linux.net.dhcp.DhcpServerImpl;
+import org.eclipse.kura.linux.net.dns.LinuxDns;
+import org.eclipse.kura.linux.net.wifi.Hostapd;
+import org.eclipse.kura.linux.net.wifi.WpaSupplicant;
+import org.eclipse.kura.net.ConnectionInfo;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.eclipse.kura.net.modem.ModemInterfaceAddress;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddress;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.net.wifi.WifiInterface.Capability;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GenericNetworkInterface {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(GenericNetworkInterface.class);
+	protected static String NET_CONFIGURATION_DIRECTORY;
+	protected static File kuraFile;
+	
+	protected static NetInterfaceConfig getCurrentConfig(String interfaceName,
+			NetInterfaceType type, NetInterfaceStatus status,
+			boolean dhcpServerEnabled, boolean passDns, Properties kuraProps)
+			throws KuraException {
+		
+		try {
+			NetInterfaceConfig netInterfaceConfig = null;
+			boolean autoConnect = false;
+			int mtu = -1;
+			boolean dhcp = false;
+			IP4Address address = null;
+			String ipAddress = null;
+			String prefixString = null;
+			String netmask = null;
+			String broadcast = null;
+			String gateway = null;
+			boolean interfaceEnabled = false;
+			
+			if(kuraProps != null) {
+				String onBoot = kuraProps.getProperty("ONBOOT");
+				if("yes".equals(onBoot)) {
+					autoConnect = true;
+					
+					//we are enabled - just not sure if for LAN or WAN
+					if(status == NetInterfaceStatus.netIPv4StatusUnknown) {
+						interfaceEnabled = true;
+					}
+				} else {
+					autoConnect = false;
+				}
+	
+				//override MTU with what is in config if it is present
+				String stringMtu = kuraProps.getProperty("MTU");
+				if(stringMtu == null) {
+					try {
+						mtu = LinuxNetworkUtil.getCurrentMtu(interfaceName);
+					} catch(KuraException e) {
+						//just assume ???
+						if(interfaceName.equals("lo")) {
+							mtu = 16436;
+						} else {
+							mtu = 1500;
+						}
+					}
+				} else {
+					mtu = Short.parseShort(stringMtu);
+				}
+	
+				//get the bootproto
+				String bootproto = kuraProps.getProperty("BOOTPROTO");
+				if(bootproto == null) {
+					bootproto="static";
+				}
+				
+				//get the defroute
+				String defroute = kuraProps.getProperty("DEFROUTE");
+				if(defroute == null) {
+					defroute="no";
+				}
+				
+				if(interfaceEnabled) {
+					if(defroute.equals("yes")) {
+						status = NetInterfaceStatus.netIPv4StatusEnabledWAN;
+					} else {
+						status = NetInterfaceStatus.netIPv4StatusEnabledLAN;
+					}
+				}
+	
+				//check for dhcp or static configuration
+				try {
+					ipAddress = kuraProps.getProperty("IPADDR");
+					prefixString = kuraProps.getProperty("PREFIX");
+					netmask = kuraProps.getProperty("NETMASK");
+					broadcast = kuraProps.getProperty("BROADCAST");
+					try {
+						gateway = kuraProps.getProperty("GATEWAY");
+						s_logger.debug("got gateway for " + interfaceName + ": " + gateway);
+					} catch(Exception e) {
+						s_logger.warn("missing gateway stanza for " + interfaceName);
+					}
+	
+					if (bootproto.equals("dhcp")) {
+						s_logger.debug("currently set for DHCP");
+						dhcp = true;
+						ipAddress = null;
+						netmask = null;
+					} else {
+						s_logger.debug("currently set for static address");
+						dhcp = false;
+					}
+				} catch(Exception e) {
+					e.printStackTrace();
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "malformatted config file: " + NET_CONFIGURATION_DIRECTORY + "ifcfg-" + interfaceName);
+				}
+	
+				if(ipAddress != null && !ipAddress.isEmpty()) {
+					address = (IP4Address) IPAddress.parseHostAddress(ipAddress);
+				}
+				
+				//make sure at least prefix or netmask is present if static
+				if(!dhcp && prefixString == null && netmask == null) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "malformatted config file: " + NET_CONFIGURATION_DIRECTORY + "ifcfg-" + interfaceName + " must contain NETMASK and/or PREFIX");
+				}
+			}
+			
+			ConnectionInfo conInfo = new ConnectionInfoImpl(interfaceName);
+			LinuxDns dnsService = LinuxDns.getInstance();
+			
+			//note - we only add the fields we need/care about from a configuration standpoint
+			if(type == NetInterfaceType.LOOPBACK) {
+				s_logger.debug("Adding a Loopback interface");
+				netInterfaceConfig = new LoopbackInterfaceConfigImpl(interfaceName);
+
+				((LoopbackInterfaceImpl)netInterfaceConfig).setMTU(mtu);
+				((LoopbackInterfaceImpl)netInterfaceConfig).setAutoConnect(true);		//loopback autoConnect should always be true?
+				((LoopbackInterfaceImpl)netInterfaceConfig).setLoopback(true);
+
+				List<NetInterfaceAddressConfig> netInterfaceAddressConfigs = new ArrayList<NetInterfaceAddressConfig>();
+				List<NetInterfaceAddress> netInterfaceAddresses = new ArrayList<NetInterfaceAddress>();
+
+				NetInterfaceAddressConfigImpl netInterfaceAddressConfig = new NetInterfaceAddressConfigImpl();
+				netInterfaceAddressConfigs.add(netInterfaceAddressConfig);
+				netInterfaceAddresses.add(netInterfaceAddressConfig);
+				if(LinuxNetworkUtil.isUp(interfaceName)) {
+					netInterfaceAddressConfig.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+					netInterfaceAddressConfig.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+					netInterfaceAddressConfig.setNetmask(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentNetmask(interfaceName)));
+					netInterfaceAddressConfig.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(LinuxNetworkUtil.getCurrentNetmask(interfaceName)));
+                    netInterfaceAddressConfig.setGateway(conInfo.getGateway());
+					if(dhcp) {
+					    netInterfaceAddressConfig.setDnsServers(dnsService.getDhcpDnsServers(interfaceName, netInterfaceAddressConfig.getAddress())); 
+					} else {
+	                    netInterfaceAddressConfig.setDnsServers(conInfo.getDnsServers());
+					}
+				}
+				((LoopbackInterfaceConfigImpl)netInterfaceConfig).setNetInterfaceAddresses(netInterfaceAddressConfigs);
+				
+				List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+				netInterfaceAddressConfig.setNetConfigs(netConfigs);
+				
+				//FIXME - hardcoded
+				NetConfig netConfig = new NetConfigIP4(NetInterfaceStatus.netIPv4StatusEnabledLAN, true);
+				((NetConfigIP4)netConfig).setAddress(address);
+				((NetConfigIP4)netConfig).setDhcp(dhcp);
+				((NetConfigIP4)netConfig).setDnsServers(null);
+				((NetConfigIP4)netConfig).setDomains(null);
+				((NetConfigIP4)netConfig).setGateway(null);
+				((NetConfigIP4)netConfig).setNetworkPrefixLength((short) 8);
+				((NetConfigIP4)netConfig).setSubnetMask((IP4Address) IPAddress.parseHostAddress("255.0.0.0"));
+				((NetConfigIP4)netConfig).setWinsServers(null);
+				netConfigs.add(netConfig);
+				
+
+			} else if(type == NetInterfaceType.ETHERNET) {
+				s_logger.debug("Adding an Ethernet interface - " + interfaceName);
+				netInterfaceConfig = new EthernetInterfaceConfigImpl(interfaceName);
+				
+				((EthernetInterfaceImpl)netInterfaceConfig).setMTU(mtu);
+				((EthernetInterfaceImpl)netInterfaceConfig).setAutoConnect(autoConnect);
+				((EthernetInterfaceImpl)netInterfaceConfig).setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+				((EthernetInterfaceImpl)netInterfaceConfig).setLoopback(false);
+
+				List<NetInterfaceAddressConfig> netInterfaceAddressConfigs = new ArrayList<NetInterfaceAddressConfig>();
+				List<NetInterfaceAddress> netInterfaceAddresses = new ArrayList<NetInterfaceAddress>();
+
+				NetInterfaceAddressConfigImpl netInterfaceAddressConfig = new NetInterfaceAddressConfigImpl();
+				netInterfaceAddressConfigs.add(netInterfaceAddressConfig);
+				netInterfaceAddresses.add(netInterfaceAddressConfig);
+				if(LinuxNetworkUtil.isUp(interfaceName)) {
+					try {
+						netInterfaceAddressConfig.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+						netInterfaceAddressConfig.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+						netInterfaceAddressConfig.setNetmask(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentNetmask(interfaceName)));
+						netInterfaceAddressConfig.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(LinuxNetworkUtil.getCurrentNetmask(interfaceName)));
+						netInterfaceAddressConfig.setGateway(conInfo.getGateway());
+	                    if(dhcp) {
+	                        netInterfaceAddressConfig.setDnsServers(dnsService.getDhcpDnsServers(interfaceName, netInterfaceAddressConfig.getAddress()));
+	                    } else {
+	                        netInterfaceAddressConfig.setDnsServers(conInfo.getDnsServers());
+	                    }
+					} catch(KuraException e) {
+						s_logger.warn("The interface went down " + interfaceName + " not including current state in status because it is not up");
+						netInterfaceAddressConfig.setAddress(null);
+						netInterfaceAddressConfig.setBroadcast(null);
+						netInterfaceAddressConfig.setNetmask(null);
+						netInterfaceAddressConfig.setNetworkPrefixLength((short)-1);
+						netInterfaceAddressConfig.setGateway(null);
+						netInterfaceAddressConfig.setDnsServers(null);
+					}
+				}
+				((EthernetInterfaceConfigImpl)netInterfaceConfig).setNetInterfaceAddresses(netInterfaceAddressConfigs);
+
+				//add the config					
+				List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+				netInterfaceAddressConfig.setNetConfigs(netConfigs);
+				
+				NetConfigIP4 netConfig = new NetConfigIP4(NetInterfaceStatus.netIPv4StatusDisabled, autoConnect);
+				setNetConfigIP4(netConfig, status, autoConnect, dhcp, address, gateway, prefixString, netmask, kuraProps);
+				netConfigs.add(netConfig);
+				
+				if (dhcpServerEnabled) {
+					// add DHCP server configuration to the list
+					DhcpServerImpl dhcpServer = DhcpServerFactory.getInstance(interfaceName, dhcpServerEnabled, passDns);
+					DhcpServerConfig4 dhcpServerConfig = dhcpServer.getDhcpServerConfig(dhcpServerEnabled, passDns);
+					if(dhcpServerConfig != null) {
+						netConfigs.add(dhcpServerConfig);
+					}
+				}
+			} else if(type == NetInterfaceType.WIFI) {
+				s_logger.debug("Adding a Wireless interface - " + interfaceName);
+				WifiInterfaceConfigImpl wifiInterfaceConfig = new WifiInterfaceConfigImpl(interfaceName);
+				netInterfaceConfig = wifiInterfaceConfig;
+
+				wifiInterfaceConfig.setMTU(mtu);
+				wifiInterfaceConfig.setAutoConnect(autoConnect);
+				wifiInterfaceConfig.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+				wifiInterfaceConfig.setLoopback(false);
+
+				List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = new ArrayList<WifiInterfaceAddressConfig>();
+				List<WifiInterfaceAddress> wifiInterfaceAddresses = new ArrayList<WifiInterfaceAddress>();
+
+				WifiInterfaceAddressConfigImpl wifiInterfaceAddressConfig = new WifiInterfaceAddressConfigImpl();
+				wifiInterfaceAddressConfigs.add(wifiInterfaceAddressConfig);
+				wifiInterfaceAddresses.add(wifiInterfaceAddressConfig);
+				
+				String currentSSID = LinuxNetworkUtil.getSSID(interfaceName);
+				
+				if(LinuxNetworkUtil.isUp(interfaceName)) {
+					wifiInterfaceAddressConfig.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+					wifiInterfaceAddressConfig.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+
+					String currentNetmask = LinuxNetworkUtil.getCurrentNetmask(interfaceName);
+					if (currentNetmask != null) {
+						wifiInterfaceAddressConfig.setNetmask(IPAddress.parseHostAddress(currentNetmask));
+						wifiInterfaceAddressConfig.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(currentNetmask));
+					}
+
+					wifiInterfaceAddressConfig.setBitrate(LinuxNetworkUtil.getWifiBitrate(interfaceName));
+					wifiInterfaceAddressConfig.setGateway(conInfo.getGateway());
+                    if(dhcp) {
+                        wifiInterfaceAddressConfig.setDnsServers(dnsService.getDhcpDnsServers(interfaceName, wifiInterfaceAddressConfig.getAddress()));
+                    } else {
+                        wifiInterfaceAddressConfig.setDnsServers(conInfo.getDnsServers());
+                    }
+
+
+					WifiAccessPointImpl ap = null;
+					 
+					if(currentSSID != null) {
+						s_logger.debug("Adding access point SSID: " + currentSSID);
+
+						ap = new WifiAccessPointImpl(currentSSID);
+
+						// TODO: fill in other info
+						ap.setMode(WifiMode.INFRA);
+						List<Long> bitrate = new ArrayList<Long>();
+						bitrate.add(54000000L);
+						ap.setBitrate(bitrate);
+						ap.setFrequency(12345);
+						ap.setHardwareAddress("20AA4B8A6442".getBytes());
+						ap.setRsnSecurity(EnumSet.allOf(WifiSecurity.class));
+						ap.setStrength(1234);
+						ap.setWpaSecurity(EnumSet.allOf(WifiSecurity.class));
+					}
+					wifiInterfaceAddressConfig.setWifiAccessPoint(ap);						
+
+				}
+				
+				// mode
+				WifiMode wifiMode = WifiMode.UNKNOWN;
+
+				s_logger.debug("Get WifiMode...");
+				try {
+					// get from config file
+					String mode = (String) kuraProps.getProperty("MODE");
+					if (mode != null) {
+						s_logger.debug("Getting wifi mode from " + kuraFile.getAbsolutePath());
+						if (mode.equalsIgnoreCase("Managed")) {
+							wifiMode = WifiMode.INFRA;
+						} else if (mode.equalsIgnoreCase("Master")) {
+							wifiMode = WifiMode.MASTER;
+						} else if (mode.equalsIgnoreCase("Ad-Hoc")) {
+							wifiMode = WifiMode.ADHOC;
+						} else {
+							wifiMode =  WifiMode.valueOf(mode);
+						}
+					} else {
+						// get current setting using iwconfig
+						s_logger.debug("Getting wifi mode from iwconfig");
+						wifiMode = LinuxNetworkUtil.getWifiMode(interfaceName);
+					}
+				} catch (Exception e) {
+					// leave as unknown
+				}					
+
+				s_logger.debug("Current WifiMode: " + wifiMode);
+				wifiInterfaceAddressConfig.setMode(wifiMode);
+				
+				wifiInterfaceConfig.setNetInterfaceAddresses(wifiInterfaceAddressConfigs);
+				
+				// TODO: fix
+				wifiInterfaceConfig.setCapabilities(EnumSet.allOf(Capability.class));
+
+				// add the configs - one for client (managed) mode, one for access point (master) mode
+				List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+				wifiInterfaceAddressConfig.setNetConfigs(netConfigs);
+				
+				// get the NetConfig
+				NetConfigIP4 netConfig = new NetConfigIP4(NetInterfaceStatus.netIPv4StatusDisabled, autoConnect);
+				setNetConfigIP4(netConfig, status, autoConnect, dhcp, address, gateway, prefixString, netmask, kuraProps);
+				netConfigs.add(netConfig);
+				 
+				// get the wpa_supplicant configuration
+				WifiConfig wifiClientConfig = new WifiConfig();
+				setWifiClientConfig(interfaceName, wifiClientConfig, wifiMode);
+				
+				// get the hostapd configuration
+				WifiConfig wifiAPConfig = new WifiConfig();
+				setWifiAccessPointConfig(wifiAPConfig);
+				
+				// add WiFi configurations to the list
+				netConfigs.add(wifiClientConfig);
+				netConfigs.add(wifiAPConfig);
+				
+				if (dhcpServerEnabled) {
+					// add DHCP server configuration to the list
+					DhcpServerImpl dhcpServer = DhcpServerFactory.getInstance(interfaceName, dhcpServerEnabled, passDns);
+					DhcpServerConfig4 dhcpServerConfig = dhcpServer.getDhcpServerConfig(dhcpServerEnabled, passDns);
+					if(dhcpServerConfig != null) {
+						netConfigs.add(dhcpServerConfig);
+					}
+				}
+			} else if(type == NetInterfaceType.MODEM) {
+				s_logger.debug("Adding a Modem interface");
+				netInterfaceConfig = new ModemInterfaceConfigImpl(interfaceName);
+				
+				((ModemInterfaceConfigImpl)netInterfaceConfig).setMTU(mtu);
+				((ModemInterfaceConfigImpl)netInterfaceConfig).setAutoConnect(autoConnect);
+				((ModemInterfaceConfigImpl)netInterfaceConfig).setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+				((ModemInterfaceConfigImpl)netInterfaceConfig).setLoopback(false);
+				((ModemInterfaceConfigImpl)netInterfaceConfig).setPointToPoint(true);
+
+				List<ModemInterfaceAddressConfig> modemInterfaceAddressConfigs = new ArrayList<ModemInterfaceAddressConfig>();
+				List<ModemInterfaceAddress> netInterfaceAddresses = new ArrayList<ModemInterfaceAddress>();
+
+				ModemInterfaceAddressConfigImpl netInterfaceAddressConfig = new ModemInterfaceAddressConfigImpl();
+				modemInterfaceAddressConfigs.add(netInterfaceAddressConfig);
+				netInterfaceAddresses.add(netInterfaceAddressConfig);
+				if(LinuxNetworkUtil.isUp(interfaceName)) {
+					netInterfaceAddressConfig.setAddress(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentIpAddress(interfaceName)));
+					netInterfaceAddressConfig.setBroadcast(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentBroadcastAddress(interfaceName)));
+					netInterfaceAddressConfig.setNetmask(IPAddress.parseHostAddress(LinuxNetworkUtil.getCurrentNetmask(interfaceName)));
+					netInterfaceAddressConfig.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(LinuxNetworkUtil.getCurrentNetmask(interfaceName)));
+                    netInterfaceAddressConfig.setGateway(conInfo.getGateway());
+                    netInterfaceAddressConfig.setDnsServers(conInfo.getDnsServers());
+				}
+				((ModemInterfaceConfigImpl)netInterfaceConfig).setNetInterfaceAddresses(modemInterfaceAddressConfigs);
+
+				//add the config					
+				List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+				netInterfaceAddressConfig.setNetConfigs(netConfigs);
+				
+				NetConfigIP4 netConfig = new NetConfigIP4(NetInterfaceStatus.netIPv4StatusDisabled, autoConnect);
+				setNetConfigIP4(netConfig, status, autoConnect, dhcp, address, gateway, prefixString, netmask, kuraProps);
+				netConfigs.add(netConfig);
+			} else {
+				s_logger.warn("Unsupported Type: " + type);
+			}
+			
+			return netInterfaceConfig;
+			
+		} catch(UnknownHostException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	
+	
+	
+	/**
+	 * Populate a NetConfigIP4 object using the given values
+	 * 
+	 * @param netConfig
+	 * @param status
+	 * @param autoConnect
+	 * @param dhcp
+	 * @param address
+	 * @param gateway
+	 * @param prefixString
+	 * @param netmask
+	 * @param kuraProps
+	 * @throws UnknownHostException
+	 * @throws KuraException
+	 */
+	private static void setNetConfigIP4(NetConfigIP4 netConfig,
+			NetInterfaceStatus status,
+			boolean autoConnect,
+			boolean dhcp,
+			IP4Address address,
+			String gateway,
+			String prefixString,
+			String netmask,
+			Properties kuraProps) throws UnknownHostException, KuraException {
+
+		if(status != null) {
+			netConfig.setStatus(status);
+		} else {
+			//FIXME - make a best guess??
+			if(autoConnect) {
+				if(dhcp) {
+					netConfig.setStatus(NetInterfaceStatus.netIPv4StatusEnabledWAN);
+				} else {
+					if(gateway != null) {
+						netConfig.setStatus(NetInterfaceStatus.netIPv4StatusEnabledWAN);
+					} else {
+						netConfig.setStatus(NetInterfaceStatus.netIPv4StatusEnabledLAN);
+					}
+				}
+			} else {
+				netConfig = new NetConfigIP4(NetInterfaceStatus.netIPv4StatusDisabled, autoConnect);
+			}
+		}
+
+		netConfig.setDhcp(dhcp);
+		if(kuraProps != null) {
+			//get the DNS
+			List<IP4Address> dnsServers = new ArrayList<IP4Address>();
+			int count = 1;
+			while(true) {
+				String dns = null;
+				if((dns = kuraProps.getProperty("DNS" + count)) != null) {
+					dnsServers.add((IP4Address) IP4Address.parseHostAddress(dns));
+					count++;
+				} else {
+					break;
+				}
+			}
+            netConfig.setDnsServers(dnsServers);
+
+			if(!dhcp) {
+    			netConfig.setAddress(address);
+    			//TODO ((NetConfigIP4)netConfig).setDomains(domains);
+    			if(gateway != null && !gateway.isEmpty()) {
+    				netConfig.setGateway((IP4Address) IP4Address.parseHostAddress(gateway));
+    			}
+    			if(prefixString != null) {
+    				short prefix = Short.parseShort(prefixString);
+    				netConfig.setNetworkPrefixLength(prefix);
+    			}
+    			if(netmask != null) {
+    				netConfig.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(netmask));
+    			}
+    			//TODO netConfig.setWinsServers(winsServers);
+			}
+		}
+	}
+		
+	/**
+	 * Populate a WifiConfigIP4 object using the wpa_supplicant config
+	 * 
+	 * @param ifaceName - interface name as {@link String}
+	 * @param wifiConfig - WiFi configuration as {@link WifiConfig}
+	 * @param wifiMode - WiFi mode as {@link wifiMode}
+	 * @throws KuraException
+	 */
+	private static void setWifiClientConfig(String ifaceName,
+			WifiConfig wifiConfig, WifiMode wifiMode) throws KuraException {
+		
+		WpaSupplicant supplicant = WpaSupplicant.getWpaSupplicant(ifaceName);
+		if (supplicant != null) {
+	        wifiConfig.setMode(supplicant.getMode());
+			wifiConfig.setSSID(supplicant.getSSID());
+			wifiConfig.setSecurity(supplicant.getWifiSecurity());
+			wifiConfig.setPasskey(supplicant.getPassword());
+			wifiConfig.setPairwiseCiphers(supplicant.getPairwiseCiphers());
+			wifiConfig.setGroupCiphers(supplicant.getGroupCiphers());
+			wifiConfig.setChannels(supplicant.getChannels());
+			wifiConfig.setBgscan(supplicant.getBgscan());
+		}
+	}
+	
+	/**
+	 * Populate a WifiConfigIP4 object using the hostapd config
+	 * 
+	 * @param wifiConfig
+	 * @throws KuraException
+	 */
+	private static void setWifiAccessPointConfig(WifiConfig wifiConfig) throws KuraException {
+		
+		wifiConfig.setMode(WifiMode.MASTER);
+		
+		Hostapd hostapd = Hostapd.getHostapd();
+		if(hostapd != null) {
+			wifiConfig.setSSID(hostapd.getSSID());
+			//wifiConfig.setChannel((short)hostapd.getChannel());
+			int [] channels = new int[1];
+			channels[0] = hostapd.getChannel();
+			wifiConfig.setChannels(channels);
+			wifiConfig.setPasskey(hostapd.getPassword());
+			wifiConfig.setBroadcast(true);		// TODO: always true?  is this needed?
+
+			// security
+			wifiConfig.setSecurity(hostapd.getSecurity());
+			
+			// hw mode
+			WifiRadioMode radioMode = hostapd.getRadioMode();
+			if(radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				wifiConfig.setHardwareMode("b");
+			} else if(radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				wifiConfig.setHardwareMode("g");
+			} else if(radioMode == WifiRadioMode.RADIO_MODE_80211nHT20 ||
+					radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above ||
+					radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				
+				// TODO: specify these 'n' modes separately?
+				wifiConfig.setHardwareMode("n");
+			}
+			
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/IwLinkTool.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/IwLinkTool.java
new file mode 100644
index 0000000000000000000000000000000000000000..771e4ea499af380722164d507e433651a314ea91
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/IwLinkTool.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class IwLinkTool implements LinkTool {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(IwLinkTool.class);
+			
+    private String m_tool = null;
+    private String m_interfaceName = null; 
+    private boolean m_linkDetected = false;
+    private int m_speed = 0; // in b/s
+    private String m_duplex = null;
+
+    
+    /**
+     * constructor
+     * 
+     * @param ifaceName - interface name as {@link String}
+     */
+    public IwLinkTool (String tool, String ifaceName) {
+        this.m_tool = tool;
+        this.m_interfaceName = ifaceName;
+        
+        this.m_duplex = "half";
+    }
+
+    @Override
+    public boolean get() throws KuraException {
+        Process proc = null;
+        try {
+            proc = ProcessUtil.exec(m_tool + " " + this.m_interfaceName + " link");
+            BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+            String line = null;
+            while((line = br.readLine()) != null) {
+                line = line.trim();
+                
+                if(line.startsWith("Not connected")) {
+                    return true;
+                } else if (line.contains("signal:")) {
+                    // e.g.: signal: -55 dBm
+                    String parts[] = line.split("\\s");
+                    try{
+                        int signal = Integer.parseInt(parts[1]);
+                        if(signal > -100) {     // TODO: adjust this threshold?
+                            m_linkDetected = true;
+                        }
+                    } catch (NumberFormatException e) {
+                    	s_logger.debug("Could not parse '" + parts[1] + "' as int in line: " + line);
+                    	return false;
+                    }
+                } else if (line.contains("tx bitrate:")) {
+                    // e.g.: tx bitrate: 1.0 MBit/s
+                    String parts[] = line.split("\\s");
+                    try{
+                        double bitrate = Double.parseDouble(parts[2]);
+                        if(parts[3].equals("MBit/s")) {
+                            bitrate *= 1000000;
+                        }
+                        this.m_speed = (int) Math.round(bitrate);
+                    } catch (NumberFormatException e) {
+                    	s_logger.debug("Could not parse '" + parts[2] + "' as double in line: " + line);
+                    	return false;
+                    }                    
+                }
+            }
+            
+            int exitVal = proc.waitFor();
+            if(exitVal != 0) {
+            	s_logger.warn(m_tool + " returned with exit value " + exitVal);
+            	return false;
+            }
+            
+            return true;
+        } catch(IOException e) {
+            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+        } catch (InterruptedException e) {
+            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+        }
+        finally {
+            ProcessUtil.destroy(proc);
+        }
+    }
+
+    @Override
+    public String getIfaceName() {
+        return m_interfaceName;
+    }
+
+    @Override
+    public boolean isLinkDetected() {
+        return m_linkDetected;
+    }
+
+    @Override
+    public int getSpeed() {
+        return m_speed;
+    }
+
+    @Override
+    public String getDuplex() {
+        return m_duplex;
+    }
+
+    
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/KuraConstants.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/KuraConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..51a50ebfd4414fe7731086cef63bf9fefa4e1c83
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/KuraConstants.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.util;
+
+	
+public enum KuraConstants {
+	// image name, version
+	Mini_Gateway ("yocto", "1.2.1"),
+	Raspberry_Pi ("raspbian", "1.0.0");
+	
+	private String m_imageName;
+	private String m_imageVersion;
+	
+	private KuraConstants (String imageName, String imageVersion) {
+		m_imageName = imageName;
+		m_imageVersion = imageVersion;
+	}
+	
+	public String getImageName () {
+		return m_imageName;
+	}
+	
+	public String getImageVersion () {
+		return m_imageVersion;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/LinkTool.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/LinkTool.java
new file mode 100644
index 0000000000000000000000000000000000000000..c861cd32c30e7dc7a4bdb801462a8cb9a1106013
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/LinkTool.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.util;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * Defines link tool interface
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public interface LinkTool {
+	
+	/**
+	 * ethtool 'get' operation
+	 * 
+	 * @return operation status as {@link boolean}
+	 * @throws KuraException
+	 */
+	public boolean get () throws KuraException;
+	
+	/**
+	 * Reports interface name
+	 * 
+	 * @return interface name as {@link String}
+	 */
+	public String getIfaceName(); 
+	
+	/**
+	 * Reports link status
+	 * 
+	 * @return link status - true if link is detected, otherwise false {@link boolean}
+	 */
+	public boolean isLinkDetected();
+	
+	/**
+	 * Reports link speed in bits/s
+	 * 
+	 * @return link speed as {@link int}
+	 */
+	public int getSpeed();
+	
+	/**
+	 * Reports duplex (full or half)
+	 * 
+	 * @return duplex as {@link String}
+	 */
+	public String getDuplex();
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/LinuxNetworkUtil.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/LinuxNetworkUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..adbc03cb79653c40eada6de47e0cf1d68a48db87
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/LinuxNetworkUtil.java
@@ -0,0 +1,1267 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.net.WifiAccessPointImpl;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.NetworkServiceImpl;
+import org.eclipse.kura.linux.net.wifi.WifiOptions;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.net.wifi.WifiInterface.Capability;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LinuxNetworkUtil {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(LinuxNetworkUtil.class);
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+
+	public static List<String> getInterfaceNames() throws KuraException {
+		Process proc = null;
+		try {
+			List<String> ifaces = new ArrayList<String>();
+
+			//start the process
+			proc = ProcessUtil.exec("ifconfig");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf("Link encap:") > -1) {
+					StringTokenizer st = new StringTokenizer(line);
+					ifaces.add(st.nextToken());
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ifconfig --- exit value = " + proc.exitValue());
+				return null;
+			} else {
+				return ifaces;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+
+	public static List<String> getAllInterfaceNames() throws KuraException {
+		Process proc = null;
+		try {
+			List<String> ifaces = new ArrayList<String>();
+
+			//start the process
+			proc = ProcessUtil.exec("ifconfig -a");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf("Link encap:") > -1) {
+					StringTokenizer st = new StringTokenizer(line);
+					ifaces.add(st.nextToken());
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ifconfig -a --- exit value = " + proc.exitValue());
+				return null;
+			} else {
+				return ifaces;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+
+	public static boolean isUp(String interfaceName) throws KuraException {
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf(interfaceName) > -1 && line.indexOf("mon." + interfaceName) < 0) {
+					
+					//so the interface is listed - but must also have an IP and netmask to be 'up'
+					if(LinuxNetworkUtil.getCurrentIpAddress(interfaceName) == null) {
+						return false;
+					}
+					if(LinuxNetworkUtil.getCurrentNetmask(interfaceName) == null) {
+						return false;
+					}
+					
+					return true;
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ifconfig --- exit value = " + proc.exitValue());
+				return false;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return false;
+	}
+	
+	public static boolean isDhclientRunning(String interfaceName) throws KuraException {
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ps ax");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf(interfaceName) > -1 && line.indexOf("dhclient") > -1) {					
+					return true;
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ps ax --- exit value = " + proc.exitValue());
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unable to check in dhclient is running for " + interfaceName);
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return false;
+	}
+
+	public static String getCurrentIpAddress(String ifaceName) throws KuraException {
+		String ipAddress = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while ((line = br.readLine()) != null) {
+				if (line.indexOf(ifaceName) > -1) {
+					if ((line = br.readLine()) != null) {
+						int i = line.indexOf("inet addr:");
+						if (i > -1) {
+							ipAddress = line.substring(i + 10, line.indexOf(' ', i + 10));
+						}
+					}
+					break;
+				}
+			}
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("getCurrentIpAddress() :: error executing command --- ifconfig " + ifaceName + " --- exit value = " + proc.exitValue());
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		return ipAddress;
+	}
+
+	public static String getCurrentNetmask(String ifaceName) throws KuraException {
+		String netmask = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while ((line = br.readLine()) != null) {
+				if (line.indexOf(ifaceName) > -1) {
+					if ((line = br.readLine()) != null) {
+						int i = line.indexOf("Mask:");
+						if (i > -1) {
+							netmask = line.substring(i + 5);
+						}
+					}
+					break;
+				}
+			}
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("getCurrentNetmask() :: error executing command --- ifconfig " + ifaceName + " --- exit value = " + proc.exitValue());
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return netmask;
+	}
+	
+	public static int getCurrentMtu(String ifaceName) throws KuraException {
+		String stringMtu = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while ((line = br.readLine()) != null) {
+				if (line.indexOf("MTU:") > -1) {
+					stringMtu = line.substring(line.indexOf("MTU:") + 4, line.indexOf("Metric:") - 2);
+					break;
+				}
+			}
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("getCurrentMtu() :: error executing command --- ifconfig " + ifaceName + " --- exit value = " + proc.exitValue());
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		if(stringMtu != null) {
+			return Integer.parseInt(stringMtu);
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Interface is not up");
+		}
+	}
+
+	public static String getCurrentBroadcastAddress(String ifaceName) throws KuraException {
+		String broadcast = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while ((line = br.readLine()) != null) {
+				if (line.indexOf(ifaceName) > -1) {
+					if ((line = br.readLine()) != null) {
+						int i = line.indexOf("Bcast:");
+						if (i > -1) {
+							broadcast = line.substring(i + 6, line.indexOf(' ', i + 6));
+						}
+					}
+					break;
+				}
+			}
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("getCurrentBroadcastAddress() :: error executing command --- ifconfig " + ifaceName + " --- exit value = " + proc.exitValue());
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return broadcast;
+	}
+	
+	public static String getCurrentPtpAddress(String ifaceName) throws KuraException {
+		String ptp = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while ((line = br.readLine()) != null) {
+				if (line.indexOf(ifaceName) > -1) {
+					if ((line = br.readLine()) != null) {
+						int i = line.indexOf("P-t-P:");
+						if (i > -1) {
+							ptp = line.substring(i + 6, line.indexOf(' ', i + 6));
+						}
+					}
+					break;
+				}
+			}
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("getCurrentPtpAddress() :: error executing command --- ifconfig " + ifaceName + " --- exit value = " + proc.exitValue());
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return ptp;
+	}
+
+	public static boolean isLinkUp(String ifaceName) throws KuraException {
+		return isLinkUp(getType(ifaceName), ifaceName);
+	}
+	
+	public static boolean isLinkUp(NetInterfaceType ifaceType, String ifaceName) throws KuraException {
+		try {
+			if(ifaceType == NetInterfaceType.WIFI) {                
+				LinkTool linkTool = new IwLinkTool("iw", ifaceName);
+
+				if(linkTool.get()) {
+					return linkTool.isLinkDetected();
+				} else {
+					//throw new KuraException(Kura`ErrorCode.INTERNAL_ERROR, "link tool failed to detect the status of " + ifaceName);
+					s_logger.error("link tool failed to detect the status of " + ifaceName);
+					return false;
+				}
+			} else if(ifaceType == NetInterfaceType.ETHERNET) {
+				LinkTool linkTool = null;
+
+				String[] tools = new String[]{"/sbin/ethtool", "/usr/sbin/ethtool", "/sbin/mii-tool"};
+
+				for(int i=0; i<tools.length; i++) {
+					File tool = new File(tools[i]);
+					if(tool.exists()) {
+						if(tools[i].indexOf("ethtool") >= 0) {
+							linkTool = new EthTool (tools[i], ifaceName);
+							break;
+						} else {
+							linkTool = new MiiTool (ifaceName);
+							break;
+						}
+					}
+				}
+
+				if (linkTool != null) {
+					if(linkTool.get()) {
+						return linkTool.isLinkDetected();
+					} else {
+						throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "link tool failed to detect the ethernet status of " + ifaceName);
+					}
+				} else {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "ethtool or mii-tool must be included with the Linux distro");
+				}
+			} else {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported NetInterfaceType: " + ifaceType);
+			}
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public static boolean isAutoConnect(String interfaceName) throws KuraException {
+		try {
+			NetInterfaceType type = LinuxNetworkUtil.getType(interfaceName);
+			if(type != NetInterfaceType.ETHERNET && type != NetInterfaceType.WIFI && type != NetInterfaceType.LOOPBACK) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "method only supports interfaces of NetInterfaceType ETHERNET, WIFI, or LOOPBACK");
+			}
+			File interfaceFile = new File("/etc/sysconfig/network-scripts/ifcfg-" + interfaceName);
+			if(interfaceFile.exists()) {
+				BufferedReader br = new BufferedReader(new FileReader(interfaceFile));
+				if(br != null) {
+					String line = null;
+					while((line = br.readLine()) != null) {
+						if(line.contains("ONBOOT=yes")) {
+							br.close();
+							br = null;
+							return true;
+						}
+					}
+					if(br != null) {
+						br.close();
+						br = null;
+					}
+				}
+			}
+			
+			return false;
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	public static String getMacAddress(String ifaceName) throws KuraException {
+		String mac = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				int index = line.indexOf("HWaddr ");
+				if(index > -1) {
+					//found the iface in the list so return
+					mac = line.substring(index + 7, line.length()-2);
+				}
+			}
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		return mac;
+	}
+	
+	public static byte[] getMacAddressBytes(String interfaceName) throws KuraException {
+
+		String macAddress = LinuxNetworkUtil.getMacAddress(interfaceName);		
+
+		if(macAddress == null) {
+			return new byte[]{0, 0, 0, 0, 0, 0};
+		}
+
+		macAddress = macAddress.replaceAll(":","");
+
+		byte[] mac = new byte[6];
+        for(int i=0; i<6; i++) {
+        	mac[i] = (byte) ((Character.digit(macAddress.charAt(i*2), 16) << 4)
+        					+ Character.digit(macAddress.charAt(i*2+1), 16));
+        }
+        
+        return mac;
+	}
+	
+	public static boolean isSupportsMulticast(String interfaceName) throws KuraException {		
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf(interfaceName) > -1 && line.indexOf("mon." + interfaceName) < 0) {
+					//eat the next line
+					line = br.readLine();
+					line = br.readLine();
+					
+					if(line.contains("MULTICAST")) {
+						return true;
+					}
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ifconfig --- exit value = " + proc.exitValue());
+				return false;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return false;
+	}
+
+	public static boolean canPing(String ipAddress, int count) throws KuraException {
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec(new StringBuilder().append("ping -c ").append(count).append(" ").append(ipAddress).toString());
+			if(proc.waitFor() == 0) {
+				return true;
+			} else {
+				return false;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	public static NetInterfaceType getType(String ifaceName) throws KuraException {
+		NetInterfaceType ifaceType = NetInterfaceType.UNKNOWN;
+		String stringType = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				int index = line.indexOf("Link encap:");
+				if(index > -1) {
+					StringTokenizer st = new StringTokenizer(line);
+					st.nextToken(); //skip iface name
+					st.nextToken(); //skip Link
+					stringType = st.nextToken();
+					stringType = stringType.substring(6).toUpperCase();
+					if(stringType.equals("LOCAL")) {
+						stringType = "LOOPBACK";
+					} else if (stringType.equals("POINT-TO-POINT")) {
+						stringType = "MODEM";
+					}
+					break;
+				}
+			}
+			
+			Collection<String> wifiOptions = WifiOptions.getSupportedOptions(ifaceName);
+			if (wifiOptions.size() > 0) {
+				for (String op : wifiOptions) {
+					s_logger.trace("WiFi option supported on " + ifaceName + ": " + op);
+				}
+				stringType = "WIFI";
+			}
+			
+			File pppFile = new File(NetworkServiceImpl.PPP_PEERS_DIR + ifaceName);
+			if(pppFile.exists()) {
+			    stringType = "MODEM";
+			}
+			
+			if(ifaceName.matches("^ppp\\d+$")) {
+				stringType = "MODEM";
+			}
+			
+			//determine if wifi
+			/*
+			if("ETHERNET".equals(stringType)) {
+				proc = rt.exec("iw dev " + ifaceName + " info");
+				int status = proc.waitFor();
+				if (status != 0) {
+					proc = rt.exec("iwconfig " + ifaceName);				
+					br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+	
+					while((line = br.readLine()) != null) {
+						if(line.contains("IEEE 802.11")) {
+							stringType = "WIFI";
+							break;
+						}
+					}				
+				} else {
+					stringType = "WIFI";
+				}
+			}
+			*/
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		try {
+			ifaceType = NetInterfaceType.valueOf(stringType);
+		} catch (Exception e) {
+			// leave as unknown
+		}
+		
+		return ifaceType;
+	}
+	
+	public static Map<String,String> getEthernetDriver(String interfaceName) throws KuraException{
+		Process proc = null;
+		BufferedReader br = null;
+		
+		Map<String, String> driver = new HashMap<String, String>();
+		driver.put("name", "unknown");
+		driver.put("version", "unkown");
+		driver.put("firmware", "unknown");
+		
+		try {
+			//find the location of ethtool
+			proc = ProcessUtil.exec("which ethtool");
+			
+			//get the output
+			br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String ethTool = br.readLine();
+			if (ethTool != null && ethTool.length() > 0) {
+				ethTool = ethTool.replaceAll("\\s", "");
+			}
+			else {
+				s_logger.info("ethtool not found - setting driver to unknown");
+				return driver;
+			}
+			
+			//run ethtool
+			proc = ProcessUtil.exec(ethTool + " -i " + interfaceName);
+			
+			//get the output
+			br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			while ((line = br.readLine()) != null) {
+				if (line.startsWith("driver: ")) {
+					driver.put("name", line.substring(line.indexOf(": ") + 1));
+				}
+				else if (line.startsWith("version: ")) {
+					driver.put("version", line.substring(line.indexOf(": ") + 1));
+				}
+				else if (line.startsWith("firmware-version: ")) {
+					driver.put("firmware", line.substring(line.indexOf(": ") + 1));
+				}
+			}
+
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		return driver;
+	}
+	
+	public static EnumSet<Capability> getWifiCapabilities(String ifaceName) throws KuraException {
+		EnumSet<Capability> capabilities = EnumSet.noneOf(Capability.class);
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("iwlist " + ifaceName + " auth");
+	
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			while((line = br.readLine()) != null) {
+				// Remove all whitespace
+				String cleanLine = line.replaceAll("\\s", "");
+				
+				if ("WPA".equals(cleanLine)) {
+					capabilities.add(Capability.WPA);
+				} else if ("WPA2".equals(cleanLine)) {
+					capabilities.add(Capability.RSN);
+				} else if ("CIPHER-TKIP".equals(cleanLine)) {
+					capabilities.add(Capability.CIPHER_TKIP);
+				} else if ("CIPHER-CCMP".equals(cleanLine)) {
+					capabilities.add(Capability.CIPHER_CCMP);
+					
+				// TODO: WEP options don't always seem to be displayed?
+				} else if ("WEP-104".equals(cleanLine)) {
+					capabilities.add(Capability.CIPHER_WEP104);
+				} else if ("WEP-40".equals(cleanLine)) {
+					capabilities.add(Capability.CIPHER_WEP40);
+				}
+				
+			}
+	
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		return capabilities;
+	}
+	
+	public static WifiMode getWifiMode(String ifaceName) throws KuraException {
+		WifiMode mode = WifiMode.UNKNOWN;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("iwconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				int index = line.indexOf("Mode:");
+				if(index > -1) {
+					s_logger.debug("line: " + line);
+					StringTokenizer st = new StringTokenizer(line.substring(index));
+					String modeStr = st.nextToken().substring(5);
+					if("Managed".equals(modeStr)) {
+						mode = WifiMode.INFRA;
+					} else if ("Master".equals(modeStr)) {
+						mode = WifiMode.MASTER;
+					} else if ("Ad-Hoc".equals(modeStr)) {
+						mode = WifiMode.ADHOC;
+					}
+				}
+			}
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		return mode;
+	}
+	
+	public static long getWifiBitrate(String ifaceName) throws KuraException {
+		long bitRate = 0;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("iwconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				int index = line.indexOf("Bit Rate=");
+				if(index > -1) {
+					s_logger.debug("line: " + line);
+					StringTokenizer st = new StringTokenizer(line.substring(index));
+					st.nextToken();	// skip 'Bit'
+					Double rate = Double.parseDouble(st.nextToken().substring(5));
+					int mult = 1;
+					
+					String unit = st.nextToken();
+					if(unit.startsWith("kb")) {
+						mult = 1000;
+					} else if (unit.startsWith("Mb")) {
+						mult = 1000000;
+					} else if (unit.startsWith("Gb")) {
+						mult = 1000000000;
+					}
+					
+					bitRate = (long) (rate * mult);
+				}
+			}
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		return bitRate;
+	}
+	
+	public static String getSSID(String ifaceName) throws KuraException {
+		String ssid = null;
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("iwconfig " + ifaceName);
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				int index = line.indexOf("ESSID:");
+				if(index > -1) {
+					s_logger.debug("line: " + line);
+					String lineSub = line.substring(index);
+					StringTokenizer st = new StringTokenizer(lineSub);
+					String ssidStr = st.nextToken();
+					if(ssidStr.startsWith("\"") && ssidStr.endsWith("\"")) {
+						ssid = ssidStr.substring(lineSub.indexOf('"') + 1, lineSub.lastIndexOf('"')); // get value between quotes
+					}
+				}
+			}
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		return ssid;
+	}
+	
+	public static List<WifiAccessPoint> getAvailableAccessPoints(String interfaceName, int attempts) throws KuraException {
+		
+		if(LinuxNetworkUtil.getType(interfaceName) != NetInterfaceType.WIFI) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Can't scan for wifi Access Points with non-wifi interfaces");
+		}
+		
+		List<WifiAccessPoint> wifiAccessPoints = new ArrayList<WifiAccessPoint>();
+		
+		Process proc = null;
+		try {
+		    StringBuilder sb = new StringBuilder();
+		    
+			if(!isUp(interfaceName)) {
+			    // activate the interface
+			    sb.append("ip link set ")
+			    .append(interfaceName)
+			    .append(" up");
+			    proc = ProcessUtil.exec(sb.toString());
+			 
+			    // remove the previous ip address (needed on mgw)
+			    sb = new StringBuilder();
+			    sb.append("ip addr flush dev ")
+			    .append(interfaceName);
+			    proc = ProcessUtil.exec(sb.toString());			    
+			}
+			
+			//start the process
+			sb = new StringBuilder();
+			sb.append("iw dev ")
+			.append(interfaceName)
+			.append(" scan");
+
+			s_logger.info("getAvailableAccessPoints() :: executing: {}", sb.toString());
+			
+			int stat = -1;
+			while ((stat != 0) || (attempts > 0)) {
+				attempts--;
+				proc = ProcessUtil.exec(sb.toString());
+				try {
+					stat = proc.waitFor();
+					if (stat != 0) {
+						s_logger.error("getAvailableAccessPoints() :: failed to execute {} error code is {}", sb.toString(), stat);
+						s_logger.error("getAvailableAccessPoints() :: STDERR: " + LinuxProcessUtil.getInputStreamAsString(proc.getErrorStream()));
+						Thread.sleep(2000);
+					}	
+				} catch (InterruptedException e) {				
+					e.printStackTrace();
+				}
+			}
+			
+			if (stat != 0) {
+				return wifiAccessPoints; // return empty list
+			}
+			
+			s_logger.error("getAvailableAccessPoints() :: the {} command executed sucessfully, parsing output ...", sb.toString());
+			
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			
+			String ssid = null;
+			List<Long> bitrate = null;
+			long frequency = -1;
+			byte[] hardwareAddress = null;
+			WifiMode mode = null;
+			EnumSet<WifiSecurity> rsnSecurity = null;
+			int strength = -1;
+			EnumSet<WifiSecurity> wpaSecurity = null;
+			List<String> capabilities = null;
+			
+			while((line = br.readLine()) != null) {
+				if(line.contains("BSS ") && !line.contains("* OBSS")) {
+					//new AP
+					if(ssid != null) {
+						WifiAccessPointImpl wifiAccessPoint = new WifiAccessPointImpl(ssid);
+						wifiAccessPoint.setBitrate(bitrate);
+						wifiAccessPoint.setFrequency(frequency);
+						wifiAccessPoint.setHardwareAddress(hardwareAddress);
+						wifiAccessPoint.setMode(WifiMode.MASTER);				//FIME - is this right? - always MASTER - or maybe AD-HOC too?
+						wifiAccessPoint.setRsnSecurity(rsnSecurity);
+						wifiAccessPoint.setStrength(strength);
+						wifiAccessPoint.setWpaSecurity(wpaSecurity);
+						if ((capabilities != null) && (capabilities.size() > 0)) {
+							wifiAccessPoint.setCapabilities(capabilities);
+						}
+						wifiAccessPoints.add(wifiAccessPoint);
+					}
+					
+					//reset
+					ssid = null;
+					bitrate = null;
+					frequency = -1;
+					hardwareAddress = null;
+					mode = null;
+					rsnSecurity = null;
+					strength = -1;
+					wpaSecurity = null;
+					capabilities = null;
+					
+					//parse out the MAC
+					StringTokenizer st = new StringTokenizer(line, " ");
+					st.nextToken(); //eat BSS
+					String macAddressString = st.nextToken();
+					if(macAddressString != null) {
+						hardwareAddress = NetworkUtil.macToBytes(macAddressString);				
+					}
+				} else if(line.contains("freq: ")) {
+					StringTokenizer st = new StringTokenizer(line, " ");
+					st.nextToken();	//eat freq:
+					frequency = Long.parseLong(st.nextToken());
+				} else if(line.contains("SSID: ")) {
+					ssid = line.trim().substring(5).trim();
+				} else if(line.contains("RSN:")) {
+					rsnSecurity = EnumSet.noneOf(WifiSecurity.class);
+					boolean foundGroup = false;
+					boolean foundPairwise = false;
+					boolean foundAuthSuites = false;
+					while((line = br.readLine()) != null) {
+						if(line.contains("Group cipher:")) {
+							foundGroup = true;
+							if(line.contains("CCMP")) {
+								rsnSecurity.add(WifiSecurity.GROUP_CCMP);
+							}
+							if(line.contains("TKIP")) {
+								rsnSecurity.add(WifiSecurity.GROUP_TKIP);
+							}
+							if(line.contains("WEP104")) {
+								rsnSecurity.add(WifiSecurity.GROUP_WEP104);
+							}
+							if(line.contains("WEP40")) {
+								rsnSecurity.add(WifiSecurity.GROUP_WEP40);
+							}
+						} else if(line.contains("Pairwise ciphers:")) {
+							foundPairwise = true;
+							if(line.contains("CCMP")) {
+								rsnSecurity.add(WifiSecurity.PAIR_CCMP);
+							}
+							if(line.contains("TKIP")) {
+								rsnSecurity.add(WifiSecurity.PAIR_TKIP);
+							}
+							if(line.contains("WEP104")) {
+								rsnSecurity.add(WifiSecurity.PAIR_WEP104);
+							}
+							if(line.contains("WEP40")) {
+								rsnSecurity.add(WifiSecurity.PAIR_WEP40);
+							}
+						} else if(line.contains("Authentication suites:")) {
+							foundAuthSuites = true;
+							if(line.contains("802_1X")) {
+								rsnSecurity.add(WifiSecurity.KEY_MGMT_802_1X);
+							}
+							if(line.contains("PSK")) {
+								rsnSecurity.add(WifiSecurity.KEY_MGMT_PSK);
+							}
+						} else {
+							s_logger.debug("Ignoring line in RSN: " + line);
+						}
+						
+						if(foundGroup && foundPairwise && foundAuthSuites) {
+							break;
+						}
+					}
+				} else if(line.contains("WPA:")) {
+					wpaSecurity = EnumSet.noneOf(WifiSecurity.class);
+					boolean foundGroup = false;
+					boolean foundPairwise = false;
+					boolean foundAuthSuites = false;
+					while((line = br.readLine()) != null) {
+						if(line.contains("Group cipher:")) {
+							foundGroup = true;
+							if(line.contains("CCMP")) {
+								wpaSecurity.add(WifiSecurity.GROUP_CCMP);
+							}
+							if(line.contains("TKIP")) {
+								wpaSecurity.add(WifiSecurity.GROUP_TKIP);
+							}
+							if(line.contains("WEP104")) {
+								wpaSecurity.add(WifiSecurity.GROUP_WEP104);
+							}
+							if(line.contains("WEP40")) {
+								wpaSecurity.add(WifiSecurity.GROUP_WEP40);
+							}
+						} else if(line.contains("Pairwise ciphers:")) {
+							foundPairwise = true;
+							if(line.contains("CCMP")) {
+								wpaSecurity.add(WifiSecurity.PAIR_CCMP);
+							}
+							if(line.contains("TKIP")) {
+								wpaSecurity.add(WifiSecurity.PAIR_TKIP);
+							}
+							if(line.contains("WEP104")) {
+								wpaSecurity.add(WifiSecurity.PAIR_WEP104);
+							}
+							if(line.contains("WEP40")) {
+								wpaSecurity.add(WifiSecurity.PAIR_WEP40);
+							}
+						} else if(line.contains("Authentication suites:")) {
+							foundAuthSuites = true;
+							if(line.contains("802_1X")) {
+								wpaSecurity.add(WifiSecurity.KEY_MGMT_802_1X);
+							}
+							if(line.contains("PSK")) {
+								wpaSecurity.add(WifiSecurity.KEY_MGMT_PSK);
+							}
+						} else {
+							s_logger.debug("Ignoring line in WPA: " + line);
+						}
+						
+						if(foundGroup && foundPairwise && foundAuthSuites) {
+							break;
+						}
+					}
+				} else if(line.contains("Supported rates: ")) {
+					//Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
+					if(bitrate == null) {
+						bitrate = new ArrayList<Long>();
+					}
+					StringTokenizer st = new StringTokenizer(line, " *");
+					while(st.hasMoreTokens()) {
+						String token = st.nextToken();
+						if(!(token.contains("Supported") || token.contains("rates:"))) {
+							bitrate.add((long) (Float.parseFloat(token) * 1000000));
+						}
+					}
+				} else if(line.contains("Extended supported rates: ")) {
+					//Extended supported rates: 6.0 9.0 12.0 48.0 
+					if(bitrate == null) {
+						bitrate = new ArrayList<Long>();
+					}
+					StringTokenizer st = new StringTokenizer(line, " *");
+					while(st.hasMoreTokens()) {
+						String token = st.nextToken();
+						if(!(token.contains("Extended") || token.contains("supported") || token.contains("rates:"))) {
+							bitrate.add((long) (Float.parseFloat(token) * 1000000));
+						}
+					}
+				} else if(line.contains("signal:")) {
+					//signal: -56.00 dBm
+					StringTokenizer st = new StringTokenizer(line, " ");
+					st.nextToken(); //eat signal:
+					float dBm = Float.parseFloat(st.nextToken());
+					
+					if(dBm <= -100) {
+						strength = 0;
+					} else if(dBm >= -50) {
+						strength = 100;
+					} else {
+						strength = (int) (2 * (dBm + 100));
+					}
+				} else if (line.contains("capability:")) {
+					capabilities = new ArrayList<String>();
+					line = line.substring("capability:".length()).trim();
+					StringTokenizer st = new StringTokenizer(line, " ");
+					while (st.hasMoreTokens()) {
+						capabilities.add(st.nextToken());
+					}
+				}
+			}
+			
+			//store the last one
+			if(ssid != null) {
+				WifiAccessPointImpl wifiAccessPoint = new WifiAccessPointImpl(ssid);
+				wifiAccessPoint.setBitrate(bitrate);
+				wifiAccessPoint.setFrequency(frequency);
+				wifiAccessPoint.setHardwareAddress(hardwareAddress);
+				wifiAccessPoint.setMode(mode);
+				wifiAccessPoint.setRsnSecurity(rsnSecurity);
+				wifiAccessPoint.setStrength(strength);
+				wifiAccessPoint.setWpaSecurity(wpaSecurity);
+				if ((capabilities != null) && (capabilities.size() > 0)) {
+					wifiAccessPoint.setCapabilities(capabilities);
+				}
+				wifiAccessPoints.add(wifiAccessPoint);
+			}
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		return wifiAccessPoints;
+	}
+	
+	public static void disableInterface(String interfaceName) throws Exception {
+		if(interfaceName != null) {
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				LinuxProcessUtil.start("ifdown " + interfaceName + "\n");
+				LinuxProcessUtil.start("ifconfig " + interfaceName + " down\n");
+			} else {
+				if (isUp(interfaceName)) {
+					LinuxProcessUtil.start("ifdown " + interfaceName + "\n");		
+				}
+			}
+			
+			//always leave the Ethernet Controller powered
+			powerOnEthernetController(interfaceName);
+		}
+	}
+	
+	public static void enableInterface(String interfaceName) throws Exception {
+		if(interfaceName != null) {
+			if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+				LinuxProcessUtil.start("ifconfig " + interfaceName + " up\n");
+				LinuxProcessUtil.start("ifup " + interfaceName + "\n");
+			} else {
+				LinuxProcessUtil.start("ifup " + interfaceName + "\n");						
+			}
+		}
+	}
+	
+	public static void powerOnEthernetController(String interfaceName) throws KuraException {
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf(interfaceName) > -1 && line.indexOf("mon." + interfaceName) < 0) {
+					
+					//so the interface is listed - power is already on
+					if(LinuxNetworkUtil.getCurrentIpAddress(interfaceName) == null) {
+						return;
+					}
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ifconfig --- exit value = " + proc.exitValue());
+				return;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		
+		//power the controller since it is not on
+		try {
+			//start the process
+			StringBuilder sb = new StringBuilder().append("ifconfig ").append(interfaceName).append(" 0.0.0.0");
+			proc = ProcessUtil.exec(sb.toString());
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- " + sb.toString() + " --- exit value = " + proc.exitValue());
+				return;
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	public static boolean isEthernetControllerPowered(String interfaceName) throws KuraException {
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("ifconfig");
+
+			//get the output
+			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+
+			while((line = br.readLine()) != null) {
+				if(line.indexOf(interfaceName) > -1 && line.indexOf("mon." + interfaceName) < 0) {
+					
+					//so the interface is listed - power is already on
+					return true;
+				}
+			}
+
+			br.close();
+			br = null;
+
+			if (proc.waitFor() != 0) {
+				s_logger.error("error executing command --- ifconfig --- exit value = " + proc.exitValue());
+			}
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+		return false;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/MiiTool.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/MiiTool.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd5f372d8f7b3154ab012c4845bca7ec9f26f867
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/MiiTool.java
@@ -0,0 +1,138 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+
+/**
+ * Defines mii-tool utility
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class MiiTool implements LinkTool {
+	
+	private String ifaceName = null; 
+	private boolean linkDetected = false;
+	private int speed = 0; // in b/s
+	private String duplex = null;
+	
+	/**
+	 * MiiTool constructor
+	 * 
+	 * @param ifaceName - interface name as {@link String}
+	 */
+	public MiiTool (String ifaceName) {
+		this.ifaceName = ifaceName;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#get()
+	 */
+	public boolean get () throws KuraException {
+		Process proc = null;
+		try {
+			//start the process
+			proc = ProcessUtil.exec("mii-tool " + this.ifaceName);
+	
+			//get the output
+	        BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+	        String line = null;
+	        boolean linkDetected = false;
+	        int speed = 0;
+	        while ((line = br.readLine()) != null) {			
+	        	if(line.startsWith(this.ifaceName)) {
+	        		if(line.indexOf("link ok") > -1) {
+	        			linkDetected = true;
+	        			try {
+							String tmp = "";
+							if(line.indexOf("negotiated")>-1) {
+								tmp = line.substring(line.indexOf("negotiated") + 11);
+							} else {
+								tmp = line.substring(line.indexOf(",") + 2);
+							}
+							String speedTxt = tmp.substring(0, tmp.indexOf(","));
+							if(speedTxt.compareTo("10baseT-HD")==0) {
+								speed = 10000000;
+							} else if(speedTxt.compareTo("10baseT-FD")==0) {
+								speed = 10000000;
+							} else if(speedTxt.compareTo("100baseTx-HD")==0) {
+								speed = 100000000;
+							} else if(speedTxt.compareTo("100baseTx-FD")==0) {
+								speed = 100000000;
+							} else {
+								speed = -2;
+							}
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+	        		} 
+	        	} 
+	        }
+	        
+	        this.speed = speed;
+	        this.linkDetected = linkDetected;
+	        
+	        return (proc.waitFor() == 0)? true : false;
+		} catch(IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		} catch (InterruptedException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#getIfaceName()
+	 */
+	public String getIfaceName() {
+		return this.ifaceName;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#isLinkDetected()
+	 */
+	public boolean isLinkDetected() {
+		return this.linkDetected;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#getSpeed()
+	 */
+	public int getSpeed() {
+		return this.speed;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.util.net.service.ILinkTool#getDuplex()
+	 */
+	public String getDuplex() {
+		return this.duplex;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/RedHatNetworkInterface.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/RedHatNetworkInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..0faf34ebfca0c860478f9b1dc963e5fb1902694f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/util/RedHatNetworkInterface.java
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RedHatNetworkInterface extends GenericNetworkInterface {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(RedHatNetworkInterface.class);
+
+	public static NetInterfaceConfig getCurrentConfiguration(
+			String interfaceName, NetInterfaceType type,
+			NetInterfaceStatus status, boolean dhcpServerEnabled,
+			boolean passDns) throws KuraException {
+		NET_CONFIGURATION_DIRECTORY = "/etc/sysconfig/network-scripts/";
+
+        NetInterfaceConfig netInterfaceConfig = null;
+
+		try {
+			//build up the configuration
+			Properties kuraProps = new Properties();
+			
+			kuraFile = new File(NET_CONFIGURATION_DIRECTORY + "ifcfg-" + interfaceName);
+			if(type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI || type == NetInterfaceType.LOOPBACK) {
+				if(kuraFile.exists()) {
+					//found our match so load the properties
+					kuraProps.load(new FileInputStream(kuraFile));
+	
+					s_logger.debug("getting args for " + interfaceName);
+					
+					netInterfaceConfig = getCurrentConfig(interfaceName, type, status, dhcpServerEnabled, passDns, kuraProps);
+				} else {
+					netInterfaceConfig = getCurrentConfig(interfaceName, type, NetInterfaceStatus.netIPv4StatusDisabled, dhcpServerEnabled, passDns, null);
+				}
+			} else if(type == NetInterfaceType.MODEM) {
+			    s_logger.debug("getting args for " + interfaceName);
+			    kuraProps.setProperty("BOOTPROTO", "dhcp");
+			    kuraProps.setProperty("ONBOOT", "yes");
+			    netInterfaceConfig = getCurrentConfig(interfaceName, type, status, dhcpServerEnabled, passDns, kuraProps);
+			} else {
+				s_logger.error("Unsupported type: " + type.toString() + " for network interface: " + interfaceName);
+			}
+			
+		} catch (Exception e) {
+			s_logger.error("Error getting configuration for interface: " + interfaceName, e);
+		}
+
+        return netInterfaceConfig;
+	}
+	
+	public static void writeNewConfig(NetInterfaceConfig netInterfaceConfig) throws KuraException {
+		try {
+			String outputFileName = "/etc/sysconfig/network-scripts/ifcfg-" + netInterfaceConfig.getName();
+			
+			StringBuffer sb = new StringBuffer();
+			sb.append("# Networking Interface\n");
+			
+			//DEVICE
+			sb.append("DEVICE=")
+			.append(netInterfaceConfig.getName())
+			.append("\n");
+			
+			//NAME
+			sb.append("NAME=")
+			.append(netInterfaceConfig.getName())
+			.append("\n");
+			
+			//TYPE
+			sb.append("TYPE=")
+			.append(netInterfaceConfig.getType())
+			.append("\n");
+			
+			List<? extends NetInterfaceAddressConfig> netInterfaceConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+			s_logger.debug("There are " + netInterfaceConfigs.size() + " NetInterfaceConfigs in this configuration");
+			
+			boolean allowWrite = false;
+			for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceConfigs) {
+				List<NetConfig> netConfigs =  netInterfaceAddressConfig.getConfigs();
+
+				if(netConfigs != null) {
+					for(NetConfig netConfig : netConfigs) {
+						if(netConfig instanceof NetConfigIP4) {
+							//ONBOOT
+							sb.append("ONBOOT=");
+							if(((NetConfigIP4) netConfig).isAutoConnect()) {
+								sb.append("yes");
+							} else {
+								sb.append("no");
+							}
+							sb.append("\n");
+							
+							if(((NetConfigIP4) netConfig).isDhcp()) {
+							    //BOOTPROTO
+                                sb.append("BOOTPROTO=");
+                                s_logger.debug("new config is DHCP");
+                                sb.append("dhcp");
+                                sb.append("\n");
+							} else {
+							    //BOOTPROTO
+                                sb.append("BOOTPROTO=");
+                                s_logger.debug("new config is STATIC");
+                                sb.append("static");
+                                sb.append("\n");
+
+								//IPADDR
+								sb.append("IPADDR=")
+								.append(((NetConfigIP4) netConfig).getAddress().getHostAddress())
+								.append("\n");
+
+								//PREFIX
+								sb.append("PREFIX=")
+								.append(((NetConfigIP4) netConfig).getNetworkPrefixLength())
+								.append("\n");
+
+								//TODO - do we need to deal with Netmask and Broadcast here???
+								
+								//Gateway
+								if(((NetConfigIP4) netConfig).getGateway() != null) {
+									sb.append("GATEWAY=")
+									.append(((NetConfigIP4) netConfig).getGateway().getHostAddress())
+									.append("\n");
+								}
+							}
+							
+                            //DEFROUTE
+                            if(((NetConfigIP4) netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+                                sb.append("DEFROUTE=yes\n");
+                            } else {
+                                sb.append("DEFROUTE=no\n");
+                            }
+
+                            //DNS
+                            List<? extends IPAddress> dnsAddresses = ((NetConfigIP4) netConfig).getDnsServers();
+                            for(int i=0; i<dnsAddresses.size(); i++) {
+                            	IPAddress ipAddr = dnsAddresses.get(i);                            	
+								if (!(ipAddr.isLoopbackAddress()
+										|| ipAddr.isLinkLocalAddress() 
+										|| ipAddr.isMulticastAddress())) {
+									sb.append("DNS")
+											.append(i + 1)
+											.append("=")
+											.append(ipAddr.getHostAddress())
+											.append("\n");
+								}
+                            }
+
+							allowWrite = true;
+						}
+					}
+				} else {
+					s_logger.debug("netConfigs is null");
+				}
+				
+				// WIFI
+				if(netInterfaceAddressConfig instanceof WifiInterfaceAddressConfig) {
+					s_logger.debug("new config is a WifiInterfaceAddressConfig");
+					sb.append("\n#Wireless configuration\n");
+					
+					// MODE
+					String mode = null;
+					WifiMode wifiMode = ((WifiInterfaceAddressConfig)netInterfaceAddressConfig).getMode(); 
+					if (wifiMode == WifiMode.INFRA) {
+						mode = "Managed";
+					} else if (wifiMode == WifiMode.MASTER) {
+						mode = "Master";
+					} else if (wifiMode == WifiMode.ADHOC) {
+						mode = "Ad-Hoc";
+					} else {
+						mode = wifiMode.toString();
+					}
+					sb.append("MODE=").append(mode).append("\n");
+				}
+			}
+
+			if (allowWrite) {
+				FileOutputStream fos = new FileOutputStream(outputFileName);
+				PrintWriter pw = new PrintWriter(fos);
+				pw.write(sb.toString());
+				pw.flush();
+				fos.getFD().sync();
+				pw.close();
+				fos.close();
+			} else {
+				s_logger.warn("writeNewConfig :: operation is not allowed");
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/Hostapd.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/Hostapd.java
new file mode 100644
index 0000000000000000000000000000000000000000..a73e0d8facb93be0d1f9077791c1576670c264e7
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/Hostapd.java
@@ -0,0 +1,898 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.wifi;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Defines hostapd AP mode tool
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class Hostapd {
+
+	private static final String HEXES = "0123456789ABCDEF";
+	
+	private static Logger s_logger = LoggerFactory.getLogger(Hostapd.class);
+	
+	private static Hostapd m_hostapd = null;
+	
+	private boolean m_isConfigured = false;
+	private String m_configFilename = null;
+	
+	private String m_iface = null;
+	private String m_driver = null;
+	private String m_essid = null;
+	private WifiRadioMode m_radioMode = WifiRadioMode.RADIO_MODE_80211g;
+
+	private int m_channel = 0;
+	private WifiSecurity m_security = WifiSecurity.SECURITY_NONE;
+	private String m_passwd = null;
+	
+	private Hostapd() {
+		m_configFilename = formHostapdConfigFilename();
+	}
+	
+	public static Hostapd getHostapd() throws KuraException {
+		if(m_hostapd == null) {
+		    m_hostapd = parseHostapdConf(getConfigFilename());
+		}
+		return m_hostapd;
+	}
+	
+	/**
+	 * Hostapd constructor
+	 * 
+	 * @param iface - interface name as {@link String}
+	 * @param driver - driver as {@link String}
+	 * @param essid - SSID as {@link String}
+	 * @param hwMode - hardware mode as {@link}
+	 * @param channel - channel as {@link}
+	 * @param securityType - security type as {@link}
+	 * @param password - password as {@link}
+	 */
+	public static Hostapd getHostapd(String iface, String driver, String essid,
+			WifiRadioMode radioMode, int channel, WifiSecurity security, String password) {
+
+		try {
+            if (driver == null) {
+                driver = getDriver(iface);
+            }
+
+            if (m_hostapd == null) {
+				m_hostapd = new Hostapd(iface, driver, essid, radioMode, channel,
+						security, password);
+			} else {
+			    // update the current instance
+			    m_hostapd.setInterface(iface);
+			    m_hostapd.setDriver(driver);
+			    m_hostapd.setSSID(essid);
+			    m_hostapd.setRadioMode(radioMode);
+			    m_hostapd.setChannel(channel);
+			    m_hostapd.setSecurity(security);
+			    m_hostapd.setPassword(password);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return m_hostapd;
+	}
+
+	private Hostapd(String iface, String driver, String essid, WifiRadioMode radioMode,
+			int channel, WifiSecurity security, String passwd) throws KuraException {
+		
+		this.m_configFilename = formHostapdConfigFilename();
+		
+		this.m_iface = iface;
+		this.m_driver = driver;
+		this.m_essid = essid;
+		this.m_radioMode = radioMode;
+		this.m_channel = channel;
+		this.m_security = security;
+		this.m_passwd = passwd;
+		
+		String hostapdConfDirectory = formHostapdConfigDirectory();
+		
+		//make sure our directory exists
+		File fHostapdConfigDirectory = new File(hostapdConfDirectory);
+		if (!fHostapdConfigDirectory.exists()) {
+			if (!fHostapdConfigDirectory.mkdirs()) {
+				s_logger.error("failed to create the temporary storage directory in " + hostapdConfDirectory);
+			} else {
+				s_logger.debug("created temporary storage directory in " + hostapdConfDirectory);
+			}
+
+			if (!fHostapdConfigDirectory.isDirectory()) {
+				s_logger.error(hostapdConfDirectory + " is not a directory as it should be");
+			}
+		}
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals (Object obj) {
+		
+		if (!(obj instanceof WpaSupplicant)) {
+			return false;
+		}
+		
+		Hostapd hostapd = (Hostapd)obj;
+		
+		if (!this.m_iface.equals(hostapd.m_iface)) {
+			return false;
+		}
+		if (!this.m_essid.equals(hostapd.m_essid)) {
+			return false;
+		}
+		if (!this.m_driver.equals(hostapd.m_driver)) {
+			return false;
+		}
+		if (this.m_channel != hostapd.m_channel) {
+			return false;
+		}
+		if (!this.m_passwd.equals(hostapd.m_passwd)) {
+			return false;
+		}
+		if (this.m_radioMode != hostapd.m_radioMode) {
+			return false;
+		}
+		if (this.m_security != hostapd.m_security) {
+			return false;
+		}
+		
+		return true;
+	}
+	
+	/**
+	 * Get the interface name
+	 */
+	public String getInterface() {
+		return this.m_iface;
+	}
+	
+	/**
+	 * Set the interface name
+	 */
+	public void setInterface(String iface) {
+	    this.m_iface = iface;
+	}
+	
+	/**
+	 * Get the driver
+	 */
+	public String getDriver() {
+		return this.m_driver;
+	}
+	   
+    /**
+     * Set the driver
+     */
+    public void setDriver(String driver) {
+        this.m_driver = driver;
+    }
+
+	/**
+	 * Get the SSID
+	 */
+	public String getSSID() {
+		return this.m_essid;
+	}
+	   
+    /**
+     * Set the SSID
+     */
+    public void setSSID(String essid) {
+        this.m_essid = essid;
+    }	
+	
+	/**
+	 * Get the radio mode
+	 * 
+	 * @return WifiOptions
+	 */
+	public WifiRadioMode getRadioMode() {
+		return this.m_radioMode;
+	}
+	
+    /**
+     * Set the radio mode
+     */
+    public void setRadioMode(WifiRadioMode radioMode) {
+        this.m_radioMode = radioMode;
+    }
+	
+	/**
+	 * Get the channel 
+	 */
+	public int getChannel() {
+		return this.m_channel;
+	}
+	
+	/**
+	 * Set the channel
+	 */
+	public void setChannel(int channel) {
+	    this.m_channel = channel;
+	}
+	
+	/**
+	 * Get the security type
+	 * 
+	 * @return WifiOptions
+	 */
+	public WifiSecurity getSecurity() {
+		return this.m_security;
+	}
+	
+	/**
+	 * Set the security type
+	 */
+	public void setSecurity(WifiSecurity security) {
+	    this.m_security = security;
+	}
+	
+	/**
+	 * Get the password
+	 */
+	public String getPassword() {
+		return this.m_passwd;
+	}
+	
+	/**
+	 * Set the password
+	 */
+	public void setPassword(String password) {
+	    this.m_passwd = password;
+	}
+
+	/**
+	 * Save the current values to the config file
+	 */
+	public void saveConfig() throws KuraException {
+
+		try {
+			Hostapd hostapd = null;
+			try {
+				hostapd = getHostapd();
+			} catch (Exception e) {
+				e.printStackTrace();
+				this.generateHostapdConf();
+			}
+			
+			if ((hostapd == null) || (!this.equals(hostapd))) {
+				this.generateHostapdConf();
+			}
+			this.m_isConfigured = true;
+		} catch (Exception e) {
+			this.m_isConfigured = false;
+			s_logger.error("failed to configure hostapd");
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/**
+	 * Launches hostapd
+	 * 
+	 * @throws Exception
+	 */
+	public void enable() throws KuraException {
+		
+		this.saveConfig();
+		
+		if(this.m_isConfigured) {
+			Process proc = null;
+			try {
+				if(this.isEnabled()) {
+					this.disable();
+				}
+				
+				//start hostapd
+				String launchHostapdCommand = this.formHostapdCommand();
+				s_logger.debug("starting hostapd --> " + launchHostapdCommand);
+				proc = ProcessUtil.exec(launchHostapdCommand);
+				if(proc.waitFor() != 0) {
+					s_logger.error("failed to start hostapd for unknown reason");
+					throw KuraException.internalError("failed to start hostapd for unknown reason");
+				}
+				Thread.sleep(1000);
+			} catch(Exception e) {
+				throw KuraException.internalError(e);
+			}
+			finally {
+				ProcessUtil.destroy(proc);
+			}
+		} else {
+			s_logger.error("Hostapd failed to configure - so can not start");
+			throw KuraException.internalError("Hostapd failed to configure - so can not start");
+		}
+	}
+
+	/**
+	 * Stops hostapd
+	 * 
+	 * @throws Exception
+	 */
+	public void disable() throws KuraException {
+		killAll();
+	}
+	
+	/**
+	 * Stops all instances of hostapd
+	 * 
+	 * @throws Exception
+	 */
+	public static void killAll() throws KuraException {
+		Process proc = null;
+		try {
+			//kill hostapd
+			s_logger.debug("stopping hostapd");
+			proc = ProcessUtil.exec("killall hostapd");
+			proc.waitFor();
+			Thread.sleep(1000);
+		} catch(Exception e) {
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	/**
+	 * Reports if hostapd is running
+	 * 
+	 * @return {@link boolean}
+	 */
+	public boolean isEnabled() throws KuraException {
+		try {
+			// Check if hostapd is running
+			int pid = LinuxProcessUtil.getPid(this.formHostapdCommand());
+			return (pid > -1);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/**
+	 * Reports if there is an instance of hostapd running
+	 * 
+	 * @return {@link boolean}
+	 */
+	public static boolean hasInstanceRunning() throws KuraException {
+		try {
+			// Check if hostapd is running
+			int pid = LinuxProcessUtil.getPid("hostapd");
+			return (pid > -1);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/*
+	 * This method generates hostapd configuration file
+	 */
+	private void generateHostapdConf() throws Exception {
+		if(this.m_security == WifiSecurity.SECURITY_NONE) {
+			File outputFile = new File(this.m_configFilename);
+			InputStream is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_no_security");
+			
+			//relace the necessary components
+			String fileAsString = readInputStreamAsString(is);
+			if(this.m_iface != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_INTERFACE", this.m_iface);
+			} else {
+				throw KuraException.internalError("the interface name can not be null");
+			}
+			if(this.m_driver != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", this.m_driver);
+			} else {
+				throw KuraException.internalError("the driver name can not be null");
+			}
+			if(this.m_essid != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", this.m_essid);
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			if (m_radioMode == WifiRadioMode.RADIO_MODE_80211a) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "a");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "b");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT20) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[SHORT-GI-20]");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40+][SHORT-GI-20][SHORT-GI-40]");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40-][SHORT-GI-20][SHORT-GI-40]");
+			} else {
+				throw KuraException.internalError("invalid hardware mode");
+			}
+			
+			if(this.m_channel > 0 && this.m_channel < 14) {
+				fileAsString = fileAsString.replaceFirst("KURA_CHANNEL", Integer.toString(this.m_channel));
+			} else {
+				throw KuraException.internalError("the channel " + this.m_channel + " must be between 1 (inclusive) and 11 (inclusive) or 1 (inclusive) and 13 (inclusive) depending on your locale");
+			}
+
+			//everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			return;
+		} else if(this.m_security == WifiSecurity.SECURITY_WEP) {
+			File outputFile = new File(this.m_configFilename);
+			InputStream is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_wep");
+			
+			//relace the necessary components
+			String fileAsString = readInputStreamAsString(is);
+			if(this.m_iface != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_INTERFACE", this.m_iface);
+			} else {
+				throw KuraException.internalError("the interface name can not be null");
+			}
+			if(this.m_driver != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", this.m_driver);
+			} else {
+				throw KuraException.internalError("the driver name can not be null");
+			}
+			if(this.m_essid != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", this.m_essid);
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			if (m_radioMode == WifiRadioMode.RADIO_MODE_80211a) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "a");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "b");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT20) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[SHORT-GI-20]");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40+][SHORT-GI-20][SHORT-GI-40]");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40-][SHORT-GI-20][SHORT-GI-40]");
+			} else {
+				throw KuraException.internalError("invalid hardware mode");
+			}
+			
+			if(this.m_channel > 0 && this.m_channel < 14) {
+				fileAsString = fileAsString.replaceFirst("KURA_CHANNEL", Integer.toString(this.m_channel));
+			} else {
+				throw KuraException.internalError("the channel must be between 1 (inclusive) and 11 (inclusive) or 1 (inclusive) and 13 (inclusive) depending on your locale");
+			}
+			if(this.m_passwd != null) {
+				if(this.m_passwd.length() == 10) {
+					//check to make sure it is all hex
+					try {
+						Long.parseLong(this.m_passwd, 16);
+					} catch(Exception e) {
+						throw KuraException.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", m_passwd);
+				} else if(this.m_passwd.length() == 26) {
+					String part1 = this.m_passwd.substring(0, 13);
+					String part2 = this.m_passwd.substring(13);
+					
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+					} catch(Exception e) {
+						throw KuraException.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", this.m_passwd);
+				} else if(this.m_passwd.length() == 32) {
+					String part1 = this.m_passwd.substring(0, 10);
+					String part2 = this.m_passwd.substring(10, 20);
+					String part3 = this.m_passwd.substring(20);
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+						Long.parseLong(part3, 16);
+					} catch(Exception e) {
+						throw KuraException.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", this.m_passwd);
+				} else if ((this.m_passwd.length() == 5)
+						|| (this.m_passwd.length() == 13)
+						|| (this.m_passwd.length() == 16)) {
+					
+					// 5, 13, or 16 ASCII characters
+					this.m_passwd = this.toHex(this.m_passwd);
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", this.m_passwd);
+				} else {
+					throw KuraException.internalError("the WEP key (passwd) must be 10, 26, or 32 HEX characters in length");
+				}
+				
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+
+			//everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			return;
+		} else if ((this.m_security == WifiSecurity.SECURITY_WPA)
+				|| (this.m_security == WifiSecurity.SECURITY_WPA2)) {
+
+		    File outputFile = new File(this.m_configFilename);
+			
+			InputStream is = null;
+			if (this.m_security == WifiSecurity.SECURITY_WPA) {
+				is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_master_wpa_psk");
+			} else if (this.m_security == WifiSecurity.SECURITY_WPA2) {
+				is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_master_wpa2_psk");
+			}
+			
+			//replace the necessary components
+			String fileAsString = readInputStreamAsString(is);
+			if(this.m_iface != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_INTERFACE", this.m_iface);
+			} else {
+				throw KuraException.internalError("the interface name can not be null");
+			}
+			if(this.m_driver != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", this.m_driver);
+			} else {
+				throw KuraException.internalError("the driver name can not be null");
+			}
+			if(this.m_essid != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", this.m_essid);
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			if (m_radioMode == WifiRadioMode.RADIO_MODE_80211a) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "a");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "b");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT20) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[SHORT-GI-20]");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40+][SHORT-GI-20][SHORT-GI-40]");
+			} else if (m_radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40-][SHORT-GI-20][SHORT-GI-40]");
+			} else {
+				throw KuraException.internalError("invalid hardware mode");
+			}
+			
+			if((this.m_channel > 0) && (this.m_channel < 14)) {
+				fileAsString = fileAsString.replaceFirst("KURA_CHANNEL", Integer.toString(this.m_channel));
+			} else {
+				throw KuraException.internalError("the channel must be between 1 (inclusive) and 11 (inclusive) or 1 (inclusive) and 13 (inclusive) depending on your locale");
+			}
+			if(this.m_passwd != null && m_passwd.trim().length() > 0) {
+				if((this.m_passwd.length() < 8) || (this.m_passwd.length() > 63)) {
+					throw KuraException.internalError("the WPA passphrase (passwd) must be between 8 (inclusive) and 63 (inclusive) characters in length: " + m_passwd);
+				} else {
+					fileAsString = fileAsString.replaceFirst("KURA_PASSPHRASE", this.m_passwd.trim());
+				}
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+
+			//everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			return;
+		} else {
+			s_logger.error("unsupported security type: " + m_security +
+					" It must be WifiSecurity.SECURITY_NONE, WifiSecurity.SECURITY_WEP, WifiSecurity.SECURITY_WPA, or WifiSecurity.SECURITY_WPA2");
+			throw KuraException.internalError("unsupported security type: " + m_security);
+		}
+	}
+	
+	
+	/*
+	 * Return a Hostapd instance from a given config file
+	 */
+	private static Hostapd parseHostapdConf(String filename) throws KuraException {
+		try {
+			Hostapd hostapd = null;
+	
+			File configFile = new File(filename);
+			Properties hostapdProps = new Properties();
+			
+			s_logger.debug("parsing hostapd config file: " + configFile.getAbsolutePath());
+			if(configFile.exists()) {
+				hostapdProps.load(new FileInputStream(configFile));
+
+				// remove any quotes around the values
+				Enumeration<Object> keys = hostapdProps.keys();
+				while(keys.hasMoreElements()) {
+					String key = keys.nextElement().toString();
+					String val = hostapdProps.getProperty(key);
+					if(val.startsWith("\"") && val.endsWith("\"") && val.length() > 1) {
+						hostapdProps.setProperty(key, val.substring(1, val.length()-1));
+					}
+				}
+				
+				String iface = hostapdProps.getProperty("interface");
+				String driver = hostapdProps.getProperty("driver");
+				String essid = hostapdProps.getProperty("ssid");
+				int channel = Integer.parseInt(hostapdProps.getProperty("channel"));
+				
+				// Determine radio mode
+				WifiRadioMode wifiRadioMode = null;
+				String hwModeStr = hostapdProps.getProperty("hw_mode");
+				if("a".equals(hwModeStr)) {
+					wifiRadioMode = WifiRadioMode.RADIO_MODE_80211a;
+				} else if("b".equals(hwModeStr)) {
+					wifiRadioMode = WifiRadioMode.RADIO_MODE_80211b;
+				} else if("g".equals(hwModeStr)) {
+					wifiRadioMode = WifiRadioMode.RADIO_MODE_80211g;
+					if("1".equals(hostapdProps.getProperty("ieee80211n"))) {
+						wifiRadioMode = WifiRadioMode.RADIO_MODE_80211nHT20;
+						String ht_capab = hostapdProps.getProperty("ht_capab");
+						if(ht_capab != null) {
+							if(ht_capab.contains("HT40+")) {
+								wifiRadioMode = WifiRadioMode.RADIO_MODE_80211nHT40above;
+							} else if(ht_capab.contains("HT40-")) {
+								wifiRadioMode = WifiRadioMode.RADIO_MODE_80211nHT40below;
+							}
+						}
+					}
+				} else {
+					throw KuraException.internalError("malformatted config file, unexpected hw_mode: " + configFile.getAbsolutePath());
+				}
+				
+				// Determine security and pass
+				WifiSecurity security = WifiSecurity.SECURITY_NONE;
+				String passwd = "";			
+				
+				if(hostapdProps.containsKey("wpa")) {
+					if("1".equals(hostapdProps.getProperty("wpa"))) {
+						security = WifiSecurity.SECURITY_WPA;
+					} else if("2".equals(hostapdProps.getProperty("wpa"))) {
+						security = WifiSecurity.SECURITY_WPA2;
+					} else {
+						throw KuraException.internalError("malformatted config file: " + configFile.getAbsolutePath());
+					}
+					
+					if(hostapdProps.containsKey("wpa_passphrase")) {
+						passwd = hostapdProps.getProperty("wpa_passphrase");
+					} else if(hostapdProps.containsKey("wpa_psk")) {
+						passwd = hostapdProps.getProperty("wpa_psk");
+					} else {
+						throw KuraException.internalError("malformatted config file, no wpa passphrase: " + configFile.getAbsolutePath());
+					}
+				} else if(hostapdProps.containsKey("wep_key0")) {
+					security = WifiSecurity.SECURITY_WEP;
+					passwd = hostapdProps.getProperty("wep_key0");
+				}
+				
+				hostapd = new Hostapd(iface, driver, essid, wifiRadioMode, channel, security, passwd);
+			} else {
+				hostapd = new Hostapd();
+			}
+			
+			return hostapd;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/*
+	 * This method copies supplied String to a file
+	 */
+	private void copyFile(String data, File destination) throws KuraException {
+		try {
+			FileOutputStream fos = new FileOutputStream(destination);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data);
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+			
+			setPermissions(destination.toString());
+		} catch (IOException e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/*
+	 * This method sets permissions to hostapd configuration file 
+	 */
+	private void setPermissions(String fileName) throws KuraException {
+		Process procDos = null;
+		Process procChmod = null;
+		try {
+			procChmod = ProcessUtil.exec("chmod 600 " + fileName);
+			procChmod.waitFor();
+			
+			procDos = ProcessUtil.exec("dos2unix " + fileName);
+			procDos.waitFor();
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(procChmod);
+			ProcessUtil.destroy(procDos);			
+		}
+	}
+
+	/*
+	 * This method reads supplied input stream into a string
+	 */
+	private static String readInputStreamAsString(InputStream is) throws IOException {
+		BufferedInputStream bis = new BufferedInputStream(is);
+		ByteArrayOutputStream buf = new ByteArrayOutputStream();
+		int result = bis.read();
+		while(result != -1) {
+			byte b = (byte)result;
+			buf.write(b);
+			result = bis.read();
+		}
+		return buf.toString();
+	}
+	
+	/*
+	 * This method converts supplied string to hex
+	 */
+	private String toHex(String s) {
+		if (s == null) {
+			return null;
+		}
+		byte[] raw = s.getBytes();
+
+		StringBuffer hex = new StringBuffer(2 * raw.length);
+		for (int i = 0; i < raw.length; i++) {
+			hex.append(HEXES.charAt((raw[i] & 0xF0) >> 4)).append(HEXES.charAt((raw[i] & 0x0F)));
+		}
+		return hex.toString();
+	}
+	
+	/*
+	 * This method forms hostapd command
+	 */
+	private String formHostapdCommand () {
+		
+		StringBuffer sb = new StringBuffer();
+		sb.append("hostapd -B ");
+		sb.append(this.m_configFilename);
+		
+		return sb.toString();
+	}
+	
+	/*
+	 * This method forms hostapd configuration directory string
+	 */
+	private static String formHostapdConfigDirectory () {
+		
+		StringBuffer sb = new StringBuffer();
+//		sb.append("/tmp/.kura/");
+//		sb.append(Hostapd.class.getPackage().getName());
+		sb.append("/etc/");
+		
+		return sb.toString();
+	}
+	
+	/*
+	 * This method forms hostapd configuration filename
+	 */
+	private static String formHostapdConfigFilename () {
+		
+		StringBuffer sb = new StringBuffer ();
+		sb.append(Hostapd.formHostapdConfigDirectory());
+		sb.append("/hostapd.conf");
+		
+		return sb.toString();
+	}
+	
+	public static String getConfigFilename() {
+		return formHostapdConfigFilename();
+	}
+
+    public static String getDriver(String iface) throws KuraException {
+        String driver = null;
+        Collection<String> supportedWifiOptions = null;
+        try {
+            supportedWifiOptions = WifiOptions.getSupportedOptions(iface);
+        } catch (Exception e) {
+            throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+        }
+        
+        if ((supportedWifiOptions != null) && (supportedWifiOptions.size() > 0)) {
+            if (supportedWifiOptions.contains(WifiOptions.WIFI_MANAGED_DRIVER_NL80211)) {
+                driver = WifiOptions.WIFI_MANAGED_DRIVER_NL80211;
+            } else {
+                driver = "hostap";
+            }
+        } else {
+        	//make a guess
+        	driver = WifiOptions.WIFI_MANAGED_DRIVER_NL80211;
+        }
+        return driver;
+    }
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/HostapdManager.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/HostapdManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..93df8a54a77fe39f73dd6e510debb436318bfbbd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/HostapdManager.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.wifi;
+
+import java.io.File;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HostapdManager {
+    
+    private static Logger s_logger = LoggerFactory.getLogger(HostapdManager.class);
+    
+    private static final File CONFIG_FILE = new File("/etc/hostapd.conf");
+    private static final String HOSTAPD_EXEC = "hostapd";
+
+    public static void start() throws KuraException {
+        Process proc = null;
+        
+        if(!CONFIG_FILE.exists()) {
+            throw KuraException.internalError("Config file does not exist: " + CONFIG_FILE.getAbsolutePath());
+        }
+        
+        try {
+            if(HostapdManager.isRunning()) {
+                stop();
+            }
+            
+            //start hostapd
+            String launchHostapdCommand = generateCommand();
+            s_logger.debug("starting hostapd --> " + launchHostapdCommand);
+            proc = ProcessUtil.exec(launchHostapdCommand);
+            if(proc.waitFor() != 0) {
+                s_logger.error("failed to start hostapd for unknown reason");
+                throw KuraException.internalError("failed to start hostapd for unknown reason");
+            }
+            Thread.sleep(1000);
+        } catch(Exception e) {
+            throw KuraException.internalError(e);
+        }
+        finally {
+            ProcessUtil.destroy(proc);
+        }
+    }
+    
+    public static void stop() throws KuraException {
+        Process proc = null;
+        try {
+            //kill hostapd
+            s_logger.debug("stopping hostapd");
+            proc = ProcessUtil.exec("killall hostapd");
+            proc.waitFor();
+            Thread.sleep(1000);
+        } catch(Exception e) {
+            throw KuraException.internalError(e);
+        }
+        finally {
+            ProcessUtil.destroy(proc);
+        }
+    }
+
+    public static boolean isRunning() throws KuraException {
+        try {
+            // Check if hostapd is running
+            int pid = LinuxProcessUtil.getPid(generateCommand());
+            return (pid > -1);
+        } catch (Exception e) {
+            throw KuraException.internalError(e);
+        }
+    }
+    
+    private static String generateCommand() {
+        StringBuilder cmd = new StringBuilder(HOSTAPD_EXEC);
+        cmd.append(" -B ").append(CONFIG_FILE.getAbsolutePath());
+        
+        return cmd.toString();
+    }
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/NL80211.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/NL80211.java
new file mode 100644
index 0000000000000000000000000000000000000000..caffb09c6083ba69ea81926d14494d9def6fb199
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/NL80211.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.wifi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.kura.net.wifi.WifiHotspotInfo;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class NL80211 {
+	
+	private final static String LABEL = NL80211.class.getName() + ": ";
+	private static Logger s_logger = LoggerFactory.getLogger(NL80211.class);
+	
+	private static NL80211 s_nl80211;
+	
+	private String m_ifaceName;
+	
+	static {
+		try {
+			System.loadLibrary("nl80211");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private native boolean NL80211initialize(); 
+	private native void NL80211cleanup();
+	private native boolean NL80211setMode(String ifaceName, int mode);
+	private native boolean NL80211triggerScan(String ifaceName);
+	private native boolean NL80211triggerScanForSsid(String ifaceNa, String ssid);
+	private native String[] NL80211getScanResults(String ifaceName);
+	private native String NL80211getSSID(String bssid);
+	private native int NL80211getChannel(String bssid);
+	private native int NL80211getFrequency(String bssid);
+	private native int NL80211getSignal(String bssid);
+	private native int NL80211getSecurity(String bssid);
+	
+	private NL80211(String ifaceName) {
+		m_ifaceName = ifaceName;
+		initialize();
+	}
+	
+	public static NL80211 getInstance(String ifaceName) {
+		
+		if (s_nl80211 == null) {
+			s_nl80211 = new NL80211(ifaceName);
+		}
+		
+		return s_nl80211;
+	}
+	
+	public synchronized boolean initialize () {
+		return NL80211initialize();
+		
+	}
+	
+	public synchronized void release() {
+		NL80211cleanup();
+		s_nl80211 = null;
+	}
+	
+	public synchronized boolean setMode(WifiMode wifiMode) {
+		
+		boolean status = NL80211setMode(m_ifaceName, WifiMode.getCode(wifiMode));
+		return status;
+	}
+	
+	public synchronized boolean setMode(WifiMode wifiMode, int sleep) {
+		
+		boolean status = NL80211setMode(m_ifaceName, WifiMode.getCode(wifiMode));
+		if (sleep > 0) {
+			try {
+				Thread.sleep(sleep);
+			} catch (InterruptedException e) {
+			}
+		}
+		return status;
+	}
+	
+	public synchronized boolean triggerScan() {
+		
+		boolean scanStatus = NL80211triggerScan(m_ifaceName);
+		return scanStatus;
+	}
+	
+	public synchronized boolean triggerScan(String ssid) {
+		
+		boolean scanStatus = NL80211triggerScanForSsid(m_ifaceName, ssid);
+		return scanStatus;
+	}
+	
+	public synchronized Map<String, WifiHotspotInfo> getScanResults() {
+		
+		Map<String, WifiHotspotInfo> scanResults = null;
+		String[] BSSIDs = NL80211getScanResults(m_ifaceName);
+		if ((BSSIDs != null) && (BSSIDs.length > 0)) {
+			scanResults = new HashMap<String, WifiHotspotInfo>();
+			for (String bssid : BSSIDs) {
+				String ssid = NL80211getSSID(bssid);
+				int channel = NL80211getChannel(bssid);
+				int frequency = NL80211getFrequency(bssid);
+				int signal = NL80211getSignal(bssid);
+				int security = NL80211getSecurity(bssid);
+				WifiSecurity wifiSecurity = WifiSecurity.NONE;
+				switch (security) {
+					case 0:
+						wifiSecurity = WifiSecurity.NONE;
+						break;
+					case 1:
+						wifiSecurity = WifiSecurity.SECURITY_WEP;
+						break;
+					case 2:
+						wifiSecurity = WifiSecurity.SECURITY_WPA;
+						break;
+					case 4:
+						wifiSecurity = WifiSecurity.SECURITY_WPA2;
+						break;
+					case 6:
+						wifiSecurity = WifiSecurity.SECURITY_WPA_WPA2;
+						break;
+				}
+				
+				WifiHotspotInfo wifiHotspotInfo = new WifiHotspotInfo(ssid, bssid, signal, channel, frequency, wifiSecurity);
+				scanResults.put(bssid, wifiHotspotInfo);
+			}
+			
+		}
+		return scanResults;
+	}	
+	
+	public Map<String, WifiHotspotInfo> getScanResults(int noRetries, int delay) {
+	
+		Map<String, WifiHotspotInfo> scanResults = null;
+		while ((noRetries > 0) && ((scanResults == null) || (scanResults.isEmpty()))) {
+			try {
+				Thread.sleep(delay*1000);
+			} catch (InterruptedException e) {
+			}
+			
+			scanResults = getScanResults();	
+			noRetries--;
+		}
+		return scanResults;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WifiOptions.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WifiOptions.java
new file mode 100644
index 0000000000000000000000000000000000000000..34c6e77954cf2072707e9009beb59b728b9934d0
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WifiOptions.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.net.wifi;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+
+public class WifiOptions {
+	/**
+	 * Reports the class name representing this interface.
+	 */
+	public static final String SERVICE_NAME = WifiOptions.class.getName();
+
+	public static final String WIFI_MANAGED_DRIVER_WEXT = "wext";
+	public static final String WIFI_MANAGED_DRIVER_HOSTAP = "hostap";
+	public static final String WIFI_MANAGED_DRIVER_ATMEL = "atmel";
+	public static final String WIFI_MANAGED_DRIVER_WIRED = "wired";
+	public static final String WIFI_MANAGED_DRIVER_NL80211 = "nl80211";
+	
+	public static Collection<String> getSupportedOptions (String ifaceName) throws KuraException {
+		
+		Collection<String> options = new HashSet<String>();
+		Process procIw = null;
+		Process procIwConfig = null;
+		Process procWhich = null;
+		
+		try {
+			procWhich = ProcessUtil.exec("which iw");
+			BufferedReader br = new BufferedReader(new InputStreamReader(procWhich.getInputStream()));
+			String line = br.readLine();
+			if (line != null) {
+				procIw = ProcessUtil.exec("iw dev " + ifaceName + " info");
+				int status = procIw.waitFor();
+				if (status == 0) {
+					options.add(WIFI_MANAGED_DRIVER_NL80211);
+				}
+			}
+
+			procIwConfig = ProcessUtil.exec("iwconfig " + ifaceName);
+			br = new BufferedReader(new InputStreamReader(procIwConfig.getInputStream()));
+			line = null;
+			while ((line = br.readLine()) != null) {
+				if (line.contains("IEEE 802.11")) {
+					options.add(WIFI_MANAGED_DRIVER_WEXT);
+					break;
+				}
+			}
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(procIw);
+			ProcessUtil.destroy(procIwConfig);
+			ProcessUtil.destroy(procWhich);
+		}
+		
+		return options;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicant.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicant.java
new file mode 100644
index 0000000000000000000000000000000000000000..538d5f5f2568aad3844e7ae9b5246d4982bb3d17
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicant.java
@@ -0,0 +1,1306 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.wifi;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.route.RouteService;
+import org.eclipse.kura.linux.net.route.RouteServiceImpl;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.route.RouteConfig;
+import org.eclipse.kura.net.wifi.WifiBgscan;
+import org.eclipse.kura.net.wifi.WifiCiphers;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Defines WiFi wpa_supplicant tool
+ * 
+ * @author ilya.binshtok
+ * 
+ */
+public class WpaSupplicant {
+	
+	public static final int[] ALL_CHANNELS = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private static final int MODE_INFRA = 0;
+	private static final int MODE_IBSS = 1;
+	private static final int MODE_AP = 2;
+
+	private static final int CONN_NONE = 0;
+	private static final int CONN_L2 = 2;
+	private static final int CONN_L3 = 3;
+
+	private static final String HEXES = "0123456789ABCDEF";
+
+	private static Logger s_logger = LoggerFactory
+			.getLogger(WpaSupplicant.class);
+
+	private static WpaSupplicant m_wpaSupplicant = null;
+
+	private boolean m_isConfigured = false;
+	private String m_configFilename = null;
+
+	private WifiMode m_mode = WifiMode.INFRA;
+	private String m_iface = null;
+	private String m_driver = null;
+	private String m_essid = null;
+	private WifiSecurity m_security = WifiSecurity.SECURITY_NONE;
+	private WifiCiphers m_pairwiseCiphers = WifiCiphers.CCMP_TKIP;
+	private WifiCiphers m_groupCiphers = WifiCiphers.CCMP_TKIP;
+	private int[] m_scanChannels = ALL_CHANNELS;
+	private String m_passwd = null;
+	private WifiBgscan m_bgscan = null;
+
+	private ScheduledExecutorService m_worker = null;
+	private ScheduledFuture<?> m_handle = null;
+	private WpaSupplicantStatus m_status = null;
+	private int m_ifaceDisabledCnt = 0;
+	private int m_connState = CONN_NONE;
+	
+	private RouteService m_routeService = null;	
+
+	/**
+	 * Instantiates WpaSupplicant object
+	 * 
+	 * @param iface - interface name as {@link String}
+	 * @param mode - wifi mode (master, managed, ad-hoc) as {@link WifiMode}
+	 * @param driver - driver name as {@link String}
+	 * @param essid - service set ID (ESSID) as {@link String}
+	 * @param securityType - security type as {@link WifiSecurity}
+	 * @param pairwiseCiphers - allowed pairwise ciphers as {@link WifiCiphers}
+	 * @param groupCiphers - allowed group ciphers as {@link WifiCiphers}
+	 * @param scanChannels- scan channels as {@link int[]}
+	 * @param passwd - password as {@link String}
+	 * @param bgscan - background scan as {@link WifiBgscan}
+	 */
+	public static WpaSupplicant getWpaSupplicant(String iface, WifiMode mode,
+			String driver, String essid, WifiSecurity security,
+			WifiCiphers pairwiseCiphers, WifiCiphers groupCiphers,
+			int[] scanChannels, String passwd, WifiBgscan bgscan) {
+
+		try {
+		    if(m_wpaSupplicant == null) {
+    			m_wpaSupplicant = new WpaSupplicant(iface, mode, driver, essid,
+    					security, pairwiseCiphers,
+    					groupCiphers, scanChannels, passwd, bgscan);
+		    } else {
+		        // update the current instance
+		        m_wpaSupplicant.setInterface(iface);
+		        m_wpaSupplicant.setMode(mode);
+		        m_wpaSupplicant.setSSID(essid);
+		        m_wpaSupplicant.setWifiSecurity(security);
+		        m_wpaSupplicant.setPairwiseCiphers(pairwiseCiphers);
+		        m_wpaSupplicant.setGroupCiphers(groupCiphers);
+		        m_wpaSupplicant.setChannels(scanChannels);
+		        m_wpaSupplicant.setPassword(passwd);
+		        m_wpaSupplicant.setBgscan(bgscan);
+		        
+		        if(driver != null)
+	                m_wpaSupplicant.setDriver(driver);
+		    }
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return m_wpaSupplicant;
+	}
+
+	public static WpaSupplicant getWpaSupplicant(String ifaceName) throws KuraException {
+
+	    if (m_wpaSupplicant == null) {
+	        m_wpaSupplicant = parseWpaConfig(ifaceName);
+	    }
+	    
+		return m_wpaSupplicant;
+	}
+	
+	// Constructor
+    private WpaSupplicant(String iface, WifiMode mode, String driver,
+            String essid, WifiSecurity security,
+            WifiCiphers pairwiseCiphers, WifiCiphers groupCiphers,
+            int[] scanChannels, String passwd, WifiBgscan bgscan) throws KuraException {
+        
+        this.setup(iface, mode, driver, essid, security, passwd);
+        m_routeService = RouteServiceImpl.getInstance();
+        m_pairwiseCiphers = pairwiseCiphers;
+        m_groupCiphers = groupCiphers;
+        m_scanChannels = scanChannels;
+        m_bgscan = bgscan;
+    }
+
+    private static WpaSupplicant parseWpaConfig(String ifaceName)
+            throws KuraException {
+        Properties props = parseConfigFile();
+		
+		if (props == null) {
+			s_logger.warn("WPA in client mode is not configured");
+			return null;
+		}
+		
+		String ssid = props.getProperty("ssid");
+		if(ssid == null) {
+			s_logger.warn("WPA in client mode is not configured");
+			return null;
+		}
+		s_logger.debug("curent wpa_supplicant.conf: ssid=" + ssid);
+		
+		int [] channels = null;
+		
+		// wifi mode
+		int mode = (props.getProperty("mode") != null) ? Integer.parseInt(props.getProperty("mode")) : MODE_INFRA;
+		s_logger.debug("current wpa_supplicant.conf: mode=" + mode);
+		WifiMode wifiMode = null;
+		switch (mode) {
+		case MODE_INFRA:
+			wifiMode = WifiMode.INFRA;
+			String scan_freq = props.getProperty("scan_freq");
+			if (scan_freq != null && scan_freq.length() > 0) {
+				s_logger.debug("current wpa_supplicant.conf: scan_freq=" + scan_freq);
+				String [] saScanFreq = scan_freq.split(" ");
+				channels = new int [saScanFreq.length];
+				for (int i = 0; i < channels.length; i++) {
+					try {
+						channels[i] = frequencyMhz2Channel(Integer.parseInt(saScanFreq[i]));
+					} catch (NumberFormatException e) {
+						s_logger.warn("Invalid string in wpa_supplicant.conf for scan_freq: " + scan_freq);
+					}
+				}
+			} else {
+				channels = new int [11];
+				for (int i = 0; i < channels.length; i++) {
+					channels[i] = i+1;
+				}
+			}
+			break;
+		case MODE_IBSS:
+			channels = new int [1];
+			wifiMode = WifiMode.ADHOC;
+			String frequency = props.getProperty("frequency");
+			s_logger.debug("current wpa_supplicant.conf: frequency=" + frequency);
+			int freq = 2412;
+			if (frequency != null) { 
+				try {
+					freq = Integer.parseInt(frequency);
+					channels[0] = frequencyMhz2Channel(freq);
+				} catch (NumberFormatException e) {
+					freq = 2412;
+				}
+			}
+			break;
+		case MODE_AP:
+			throw KuraException
+					.internalError("wpa_supplicant failed to parse its configuration file: MODE_AP is invalid");
+		default:
+			throw KuraException
+				.internalError("wpa_supplicant failed to parse its configuration file: invalid mode: " + mode);
+		}
+		
+		String proto = props.getProperty("proto");
+		if (proto != null) {
+			s_logger.debug("current wpa_supplicant.conf: proto=" + proto);
+		}
+		
+		WifiCiphers pairwiseCiphers = null;
+		String pairwise = props.getProperty("pairwise");
+		if (pairwise != null) {
+			s_logger.debug("current wpa_supplicant.conf: pairwise=" + pairwise);
+			if(pairwise.contains(WifiCiphers.toString(WifiCiphers.CCMP_TKIP))) {
+				pairwiseCiphers = WifiCiphers.CCMP_TKIP;
+			} else if(pairwise.contains(WifiCiphers.toString(WifiCiphers.TKIP))) {
+				pairwiseCiphers = WifiCiphers.TKIP;
+			} else if(pairwise.contains(WifiCiphers.toString(WifiCiphers.CCMP))) {
+				pairwiseCiphers = WifiCiphers.CCMP;
+			} 
+		}
+		
+		WifiCiphers groupCiphers = null;
+		String group = props.getProperty("group");
+		if (group != null) {
+			s_logger.debug("current wpa_supplicant.conf: group=" + group);
+			if(group.contains(WifiCiphers.toString(WifiCiphers.CCMP_TKIP))) {
+				groupCiphers = WifiCiphers.CCMP_TKIP;
+			} else if(group.contains(WifiCiphers.toString(WifiCiphers.TKIP))) {
+				groupCiphers = WifiCiphers.TKIP;
+			} else if(group.contains(WifiCiphers.toString(WifiCiphers.CCMP))) {
+				groupCiphers = WifiCiphers.CCMP;
+			} 
+		}
+		
+		// security
+		WifiSecurity wifiSecurity = null;
+		String password = null;
+		String keyMgmt = props.getProperty("key_mgmt");
+		s_logger.debug("current wpa_supplicant.conf: key_mgmt=" + keyMgmt);
+		if (keyMgmt != null && keyMgmt.equalsIgnoreCase("WPA-PSK")) {
+			password = props.getProperty("psk");
+			if (proto != null) {
+				if(proto.trim().equals("WPA")) {
+					wifiSecurity = WifiSecurity.SECURITY_WPA;
+				} else if(proto.trim().equals("RSN")) {
+					wifiSecurity = WifiSecurity.SECURITY_WPA2;
+				} else if(proto.trim().equals("WPA RSN")) {
+					wifiSecurity = WifiSecurity.SECURITY_WPA_WPA2;
+				}
+			} else {
+				wifiSecurity = WifiSecurity.SECURITY_WPA_WPA2;
+			}
+		} else {
+			password = props.getProperty("wep_key0");
+			if (password != null) {
+				wifiSecurity = WifiSecurity.SECURITY_WEP;
+			} else {
+				wifiSecurity = WifiSecurity.SECURITY_NONE;
+			}
+			pairwiseCiphers = null;
+			groupCiphers = null;
+		}
+		
+		WifiBgscan bgscan = null;
+		String sBgscan = props.getProperty("bgscan");
+		if (sBgscan != null) {
+			s_logger.debug("current wpa_supplicant.conf: bgscan=" + sBgscan);
+			bgscan = new WifiBgscan(sBgscan);
+		}
+		
+		return getWpaSupplicant(ifaceName, wifiMode, null, ssid, wifiSecurity,
+				pairwiseCiphers, groupCiphers,
+				channels, password, bgscan);
+    }
+
+	/**
+	 * Setup and allocates resources
+	 * 
+	 * @param iface - interface name as {@link String}
+	 * @param mode - wifi mode (master, managed, ad-hoc) as {@link WifiMode}
+	 * @param driver - driver name as {@link String}
+	 * @param essid - service set ID (ESSID) as {@link String}
+	 * @param securityType - security type as {@link WifiSecurity}
+	 * @param passwd - password as {@link String}
+	 * @throws Exception
+	 */
+	private void setup(String iface, WifiMode mode, String driver,
+			String essid, WifiSecurity security, String passwd)
+			throws KuraException {
+
+		this.m_mode = mode;
+		this.m_worker = Executors.newSingleThreadScheduledExecutor();
+		this.m_configFilename = WpaSupplicant.formSupplicantConfigFilename();
+
+		if ((security != WifiSecurity.SECURITY_WEP)
+				&& (security != WifiSecurity.SECURITY_WPA)
+				&& (security != WifiSecurity.SECURITY_WPA2)
+				&& (security != WifiSecurity.SECURITY_WPA_WPA2)
+				&& (security != WifiSecurity.SECURITY_NONE)) {
+			throw KuraException
+					.internalError("the security type must be either WifiSecurity.SECURITY_NONE, WifiSecurity.SECURITY_WEP, WifiSecurity.SECURITY_WPA, or WifiSecurity.SECURITY_WPA2 if you are using WpaSupplicant");
+		}
+
+		if (driver == null) {
+			Collection<String> supportedDrivers = null;
+			Collection<String> supportedWifiOptions = null;
+			try {
+				supportedDrivers = this.getSupportedDrivers();
+				supportedWifiOptions = WifiOptions.getSupportedOptions(iface);
+				supportedDrivers.retainAll(supportedWifiOptions);
+			} catch (Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+
+			if ((supportedDrivers != null) && (supportedDrivers.size() > 0)) {
+				if (supportedDrivers
+						.contains(WifiOptions.WIFI_MANAGED_DRIVER_NL80211)) {
+					driver = WifiOptions.WIFI_MANAGED_DRIVER_NL80211;
+				} else if (supportedDrivers
+						.contains(WifiOptions.WIFI_MANAGED_DRIVER_WEXT)) {
+					driver = WifiOptions.WIFI_MANAGED_DRIVER_WEXT;
+				}
+			}
+		}
+
+		if ((driver.compareTo(WifiOptions.WIFI_MANAGED_DRIVER_WEXT) != 0)
+				&& (driver.compareTo(WifiOptions.WIFI_MANAGED_DRIVER_HOSTAP) != 0)
+				&& (driver.compareTo(WifiOptions.WIFI_MANAGED_DRIVER_ATMEL) != 0)
+				&& (driver.compareTo(WifiOptions.WIFI_MANAGED_DRIVER_WIRED) != 0)
+				&& (driver.compareTo(WifiOptions.WIFI_MANAGED_DRIVER_NL80211) != 0)) {
+			throw KuraException
+					.internalError("the driver must be one of the following:\n"
+							+ "\t\tIWifiDeviceService.WIFI_MANAGED_DRIVER_WEXT\n"
+							+ "\t\tIWifiDeviceService.WIFI_MANAGED_DRIVER_HOSTAP\n"
+							+ "\t\tIWifiDeviceService.WIFI_MANAGED_DRIVER_ATMEL\n"
+							+ "\t\tIWifiDeviceService.WIFI_MANAGED_DRIVER_WIRED\n"
+							+ "\t\tIWifiDeviceService.WIFI_MANAGED_DRIVER_NL80211\n");
+		}
+
+		// make sure our directory exists
+		String supplicantConfigDirectory = WpaSupplicant
+				.formSupplicantConfigDirectory();
+
+		File fWpaSupplicantConfigDirectory = new File(supplicantConfigDirectory);
+		if (!fWpaSupplicantConfigDirectory.exists()) {
+			if (!fWpaSupplicantConfigDirectory.mkdirs()) {
+				s_logger.error("failed to create directory for wpa_supplicant.conf "
+						+ supplicantConfigDirectory);
+			} else {
+				s_logger.debug("created directory for wpa_supplicant.conf - "
+						+ supplicantConfigDirectory);
+			}
+
+			if (!fWpaSupplicantConfigDirectory.isDirectory()) {
+				s_logger.error(supplicantConfigDirectory
+						+ " is not a directory as it should be.");
+			}
+		}
+
+		this.m_iface = iface;
+		this.m_driver = driver;
+		this.m_essid = essid;
+		this.m_security = security;
+		this.m_passwd = passwd;
+	}
+
+	/**
+	 * Launches wpa_supplicant
+	 * 
+	 * @throws Exception
+	 */
+	public synchronized void enable() throws KuraException {
+		
+		s_logger.debug("enable WPA Supplicant");
+		
+		//this.saveConfig();
+		
+		Process proc = null;
+		try {
+			if (this.isEnabled()) {
+				this.disable();
+			}
+			// start wpa_supplicant
+			String wpaSupplicantCommand = this.formSupplicantCommand();
+			s_logger.debug("starting wpa_supplicant -> " + wpaSupplicantCommand);
+			proc = ProcessUtil.exec(wpaSupplicantCommand);
+
+			int stat = proc.waitFor();
+			if (stat != 0) {
+				s_logger.error("failed to start wpa_supplicant error code is "
+						+ stat);
+				s_logger.debug("STDOUT: " + LinuxProcessUtil.getInputStreamAsString(proc.getInputStream()));
+				s_logger.debug("STDERR: " + LinuxProcessUtil.getInputStreamAsString(proc.getErrorStream()));
+				throw KuraException
+						.internalError("failed to start wpa_supplicant for unknown reason");
+			}
+			Thread.sleep(1000);
+			s_logger.debug("Starting WpaSupplicant monitor thread ...");
+			if (m_handle != null) {
+				m_handle.cancel(true);
+			}
+			this.m_handle = this.m_worker.scheduleAtFixedRate(
+					new Runnable() {
+						public void run() {
+							Thread.currentThread().setName("WpaSupplicant");
+							monitor();
+						}
+					}, 0, 2, TimeUnit.SECONDS);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+	}
+
+	/**
+	 * Stops wpa_supplicant
+	 * 
+	 * @throws Exception
+	 */
+	public synchronized void disable() throws KuraException {
+		s_logger.debug("disable WPA Supplicant");
+		killAll();
+	}
+
+	/**
+	 * Stops all instances of wpa_supplicant
+	 * 
+	 * @throws Exception
+	 */
+	public static void killAll() throws KuraException {
+		Process proc = null;
+		try {
+			// kill wpa_supplicant
+			s_logger.debug("stopping wpa_supplicant");
+			
+			if (m_wpaSupplicant != null) {
+				if ((m_wpaSupplicant.m_handle != null)
+						&& !m_wpaSupplicant.m_handle.isDone()) {
+					try {
+						Thread.sleep(200);
+					} catch (Exception e) {
+					}
+					m_wpaSupplicant.m_handle.cancel(true);
+					m_wpaSupplicant.m_handle = null;
+				}
+			}
+			
+			proc = ProcessUtil.exec("killall wpa_supplicant");
+			proc.waitFor();
+			Thread.sleep(1000);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+	}
+	
+	/**
+	 * Reports wpa_supplicant configuration file
+	 * 
+	 * @return full path to wpa_supplicant configuration file {@link String}
+	 */
+	public static String getConfigFilename () {
+		return formSupplicantConfigFilename();
+	}
+
+	/**
+	 * Reports if wpa_supplicant is running
+	 * 
+	 * @return {@link boolean}
+	 */
+	public boolean isEnabled() throws KuraException {
+		try {
+			// Check if wpa_supplicant is running
+			int pid = LinuxProcessUtil.getPid(this.formSupplicantCommand());
+			return (pid > -1);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+
+	/**
+	 * Reports if there is an instance of wpa_supplicant running
+	 * 
+	 * @return {@link boolean}
+	 */
+	public static boolean hasInstanceRunning() throws KuraException {
+		try {
+			// Check if wpa_supplicant is running
+			int pid = LinuxProcessUtil.getPid("wpa_supplicant");
+			return (pid > -1);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals (Object obj) {
+		
+		if (!(obj instanceof WpaSupplicant)) {
+			return false;
+		}
+		
+		WpaSupplicant supplicant = (WpaSupplicant)obj;
+		
+		s_logger.debug("comparing " + m_wpaSupplicant.hashCode() + " with " + supplicant.hashCode());
+			
+		if (!m_wpaSupplicant.m_iface.equals(supplicant.m_iface)) {
+			s_logger.debug("current supplicant doesn't match config file: ifaceName " + this.m_iface + ":" + supplicant.m_iface);
+			return false;
+		}
+		if (!m_wpaSupplicant.m_essid.equals(supplicant.m_essid)) {
+			s_logger.debug("current supplicant doesn't match config file: ssid");
+			return false;
+		}
+		if (!m_wpaSupplicant.m_driver.equals(supplicant.m_driver)) {
+			s_logger.debug("current supplicant doesn't match config file: driver");
+			return false;
+		}
+		if (m_wpaSupplicant.m_pairwiseCiphers != supplicant.m_pairwiseCiphers) {
+			s_logger.debug("current supplicant doesn't match config file: pairwiseCiphers");
+			return false;
+		}
+		if (m_wpaSupplicant.m_groupCiphers != supplicant.m_groupCiphers) {
+			s_logger.debug("current supplicant doesn't match config file: groupCiphers");
+			return false;
+		}
+		if (m_wpaSupplicant.m_mode != supplicant.m_mode) {
+			s_logger.debug("current supplicant doesn't match config file: mode");
+			return false;
+		}
+		if (m_wpaSupplicant.m_security != supplicant.m_security) {
+			s_logger.debug("current supplicant doesn't match config file: security");
+			return false;
+		}
+		if (!m_wpaSupplicant.m_passwd.equals(supplicant.m_passwd)) {
+			s_logger.debug("current supplicant doesn't match config file: password");
+			return false;
+		}
+		if (m_wpaSupplicant.m_scanChannels.length == supplicant.m_scanChannels.length) {
+			for (int i = 0; i < this.m_scanChannels.length; i++) {
+				if (this.m_scanChannels[i] != supplicant.m_scanChannels[i]) {
+					s_logger.debug("current supplicant doesn't match config file: channels");
+					return false;
+				}
+			}
+		} else {
+			s_logger.debug("current supplicant doesn't match config file: channels");
+			return false;
+		}
+		
+		if (((m_wpaSupplicant.m_bgscan != null) && (supplicant.m_bgscan == null)) || 
+		((m_wpaSupplicant.m_bgscan == null) && (supplicant.m_bgscan != null))) {
+			return false;
+		}
+		
+		if (((m_wpaSupplicant.m_bgscan != null) && (supplicant.m_bgscan != null))) {
+			if(!m_wpaSupplicant.m_bgscan.equals(supplicant.m_bgscan)) {
+				s_logger.debug("current supplicant doesn't match config file: bgscan");
+				return false;
+			}
+		}
+		
+		s_logger.debug("current supplicant matches config file");
+		return true;
+	}
+	
+	public String getInterface() {
+	    return m_iface;
+	}
+	
+	public void setInterface(String iface) {
+	    m_iface = iface;
+	}
+	
+	public String getDriver() {
+	    return m_driver;
+	}
+	
+	public void setDriver(String driver) {
+	    m_driver = driver;
+	}
+	
+	public WifiMode getMode() {
+	    return m_mode;
+	}
+	
+	public void setMode(WifiMode mode) {
+	    m_mode = mode;
+	}
+	
+	public String getSSID() {
+		return m_essid;
+	}
+	
+	public void setSSID(String ssid) {
+	    m_essid = ssid;
+	}
+	
+	public String getPassword() {
+		return m_passwd;
+	}
+	
+	public void setPassword(String password) {
+	    m_passwd = password;
+	}
+	
+	public WifiSecurity getWifiSecurity () {
+		return m_security;
+	}
+	
+	public void setWifiSecurity(WifiSecurity security) {
+	    m_security = security;
+	}
+
+	public WifiCiphers getPairwiseCiphers() {
+		return m_pairwiseCiphers;
+	}
+	
+	public void setPairwiseCiphers(WifiCiphers ciphers) {
+	    m_pairwiseCiphers = ciphers;
+	}
+	
+	public WifiCiphers getGroupCiphers() {
+		return m_groupCiphers;
+	}
+	
+	public void setGroupCiphers(WifiCiphers ciphers) {
+	    m_groupCiphers = ciphers; 
+	}
+	
+	public int [] getChannels() {
+		return m_scanChannels;
+	}
+	
+	public void setChannels(int[] channels) {
+	    m_scanChannels = channels;
+	}
+	
+	public WifiBgscan getBgscan () {
+		return m_bgscan;
+	}
+	
+	public void setBgscan(WifiBgscan bgscan) {
+	    m_bgscan = bgscan;
+	}
+
+	private void monitor() {
+
+		try {
+			m_status = new WpaSupplicantStatus(m_iface);
+			String state = m_status.getWpaState();
+			if (state == null) {
+				s_logger.warn("Failed to obtain 'state' info from wpa_supplicant");
+				return;
+			}
+			
+			if (m_mode == WifiMode.INFRA) {
+				if (state.compareTo("INTERFACE_DISABLED") == 0) {
+					if (m_ifaceDisabledCnt > 5) {
+						s_logger.debug("WPA Supplicant reports 'INTERFACE_DISABLED' state .. Restarting ..");
+						this.disable();
+						this.enable();
+						m_ifaceDisabledCnt = 0;
+						m_connState = CONN_NONE;
+					} else {
+						s_logger.debug("WPA Supplicant reports 'INTERFACE_DISABLED' state");
+						m_ifaceDisabledCnt++;
+					}
+
+					return;
+				}
+
+				m_ifaceDisabledCnt = 0;
+				if (state.compareTo("COMPLETED") == 0) {
+					if (m_connState < CONN_L2) {
+						m_connState = CONN_L2;
+						s_logger.info("WiFi (L2) is up");
+					}
+
+					if (m_status.getIpAddress() != null) {
+						if (m_connState < CONN_L3) {
+							s_logger.info("WiFi (L3) is up");
+							
+							if (m_routeService != null) {
+								RouteConfig[] routes = m_routeService.getRoutes();
+								boolean gwFound = false;
+								for (RouteConfig route : routes) {
+									if (route.getInterfaceName().equals(m_iface)
+											&& route.getDestination().equals("0.0.0.0")) {
+										gwFound = true;
+										break;
+									}
+								}
+								if (!gwFound) {
+									s_logger.info("Default gateway is not installed, bringing interface "
+											+ m_iface + " up");
+									LinuxProcessUtil.start("ifup " + m_iface + "\n");
+								}
+							}
+						}
+						m_connState = CONN_L3;
+					} else {
+						m_connState = CONN_L2;
+						s_logger.info("bringing interface " + m_iface + " up");
+						LinuxProcessUtil.start("ifup " + m_iface + "\n");
+					}
+				} else {
+					if (m_connState > CONN_NONE) {
+						s_logger.info("WiFi (L2) is down");
+					}
+					m_connState = CONN_NONE;
+				}
+			} else if (m_mode == WifiMode.ADHOC) {
+				if (state.compareTo("COMPLETED") == 0) {
+					if (LinuxNetworkUtil.getCurrentIpAddress(m_iface) == null) {
+						s_logger.info("bringing interface " + m_iface + " up");
+						LinuxProcessUtil.start("ifup " + m_iface + "\n");
+					}
+					return;
+				}
+				if (this.m_ifaceDisabledCnt > 30) {
+					this.m_ifaceDisabledCnt = 0;
+					this.disable();
+					Thread.sleep(1000);
+					this.enable();
+				} else {
+					this.m_ifaceDisabledCnt++;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/*
+	 * Save the current values to the config file
+	 */
+	public void saveConfig() throws KuraException {
+		
+		s_logger.debug("saveConfig()");
+		
+		try {
+			this.generateWpaSupplicantConf();
+			this.m_isConfigured = true;
+		} catch (Exception e) {
+			this.m_isConfigured = false;
+			s_logger.error("failed to configure wpa_supplicant");
+			e.printStackTrace();
+			throw KuraException.internalError(e);
+		}
+	}
+
+	/*
+	 * This method generates wpa_supplicant configuration file
+	 */
+	private void generateWpaSupplicantConf() throws Exception {
+
+		s_logger.debug("generateWpaSupplicantConf()");
+		
+		File outputFile = new File(this.m_configFilename);
+		InputStream is = null;
+		String fileAsString = null;
+
+		if (this.m_security == WifiSecurity.SECURITY_WEP) {
+			
+			if (m_mode == WifiMode.INFRA) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_wep");
+				fileAsString = readInputStreamAsString(is);
+			} else if (m_mode == WifiMode.ADHOC) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep");
+				fileAsString = readInputStreamAsString(is);
+				fileAsString = fileAsString
+						.replaceFirst("KURA_FREQUENCY", Integer.toString(this
+								.getChannelFrequencyMHz(this.m_scanChannels[0])));
+			} else {
+				throw KuraException
+						.internalError("Failed to generate wpa_supplicant.conf -- Invalid mode: "
+								+ this.m_mode);
+			}
+
+			// replace the necessary components
+			fileAsString = fileAsString.replaceFirst("KURA_MODE",
+					Integer.toString(this.getSupplicantMode()));
+
+			if (this.m_essid != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID",
+						this.m_essid);
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			if (this.m_passwd != null) {
+				if (this.m_passwd.length() == 10) {
+					// check to make sure it is all hex
+					try {
+						Long.parseLong(this.m_passwd, 16);
+					} catch (Exception e) {
+						throw KuraException
+								.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY",
+							this.m_passwd);
+				} else if (this.m_passwd.length() == 26) {
+					String part1 = this.m_passwd.substring(0, 13);
+					String part2 = this.m_passwd.substring(13);
+
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+					} catch (Exception e) {
+						throw KuraException
+								.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY",
+							m_passwd);
+				} else if (this.m_passwd.length() == 32) {
+					String part1 = this.m_passwd.substring(0, 10);
+					String part2 = this.m_passwd.substring(10, 20);
+					String part3 = this.m_passwd.substring(20);
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+						Long.parseLong(part3, 16);
+					} catch (Exception e) {
+						throw KuraException
+								.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY",
+							m_passwd);
+				} else if ((this.m_passwd.length() == 5)
+						|| (this.m_passwd.length() == 13)
+						|| (this.m_passwd.length() == 16)) {
+
+					// 5, 13, or 16 ASCII characters
+					this.m_passwd = this.toHex(this.m_passwd);
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY",
+							m_passwd);
+				} else {
+					throw KuraException
+							.internalError("the WEP key (passwd) must be 10, 26, or 32 HEX characters in length");
+				}
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+			
+			if (this.m_bgscan != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN",
+						this.m_bgscan.toString());
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", "");
+			}
+
+			if(m_scanChannels != null && m_scanChannels.length > 0) {
+				fileAsString = fileAsString.replaceFirst("KURA_SCANFREQ",
+						this.getScanFrequenciesMHz(this.m_scanChannels));
+			} else {
+				fileAsString = fileAsString.replaceFirst("scan_freq=KURA_SCANFREQ",
+						"");
+			}
+
+		} else if ((this.m_security == WifiSecurity.SECURITY_WPA)
+				|| (this.m_security == WifiSecurity.SECURITY_WPA2)) {
+
+			if (m_mode == WifiMode.INFRA) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_wpa");
+				fileAsString = readInputStreamAsString(is);
+			} else if (m_mode == WifiMode.ADHOC) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa");
+				fileAsString = readInputStreamAsString(is);
+				fileAsString = fileAsString
+						.replaceFirst("KURA_FREQUENCY", Integer.toString(this
+								.getChannelFrequencyMHz(this.m_scanChannels[0])));
+				fileAsString = fileAsString
+						.replaceFirst("KURA_PAIRWISE", "NONE");
+			} else {
+				throw KuraException
+						.internalError("Failed to generate wpa_supplicant.conf -- Invalid mode: "
+								+ this.m_mode);
+			}
+
+			// replace the necessary components
+			fileAsString = fileAsString.replaceFirst("KURA_MODE",
+					Integer.toString(this.getSupplicantMode()));
+
+			if (this.m_essid != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID",
+						this.m_essid);
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			if (this.m_passwd != null && m_passwd.trim().length() > 0) {
+				if ((this.m_passwd.length() < 8)
+						|| (this.m_passwd.length() > 63)) {
+					throw KuraException
+							.internalError("the WPA passphrase (passwd) must be between 8 (inclusive) and 63 (inclusive) characters in length: " + m_passwd);
+				} else {
+					fileAsString = fileAsString.replaceFirst("KURA_PASSPHRASE",
+							this.m_passwd.trim());
+				}
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+			
+			if(m_security == WifiSecurity.SECURITY_WPA) {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "WPA");
+			} else if(m_security == WifiSecurity.SECURITY_WPA2) {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "RSN");
+			} else if(m_security == WifiSecurity.SECURITY_WPA_WPA2) {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "WPA RSN");
+			}
+
+			if (this.m_pairwiseCiphers != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_PAIRWISE",
+						WifiCiphers.toString(this.m_pairwiseCiphers));
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_PAIRWISE",
+						"CCMP TKIP");
+			}
+
+			if (this.m_groupCiphers != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_GROUP",
+						WifiCiphers.toString(this.m_groupCiphers));
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_GROUP",
+						"CCMP TKIP");
+			}
+			
+			if (this.m_bgscan != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN",
+						this.m_bgscan.toString());
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", "");
+			}
+
+			if(m_scanChannels != null && m_scanChannels.length > 0) {
+				fileAsString = fileAsString.replaceFirst("KURA_SCANFREQ",
+						this.getScanFrequenciesMHz(this.m_scanChannels));
+			} else {
+				fileAsString = fileAsString.replaceFirst("scan_freq=KURA_SCANFREQ",
+						"");
+			}
+			
+		} else if (this.m_security == WifiSecurity.SECURITY_NONE) {
+
+			if (m_mode == WifiMode.INFRA) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_open");
+				fileAsString = readInputStreamAsString(is);
+			} else if (m_mode == WifiMode.ADHOC) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_adhoc_open");
+				fileAsString = readInputStreamAsString(is);
+				fileAsString = fileAsString
+						.replaceFirst("KURA_FREQUENCY", Integer.toString(this
+								.getChannelFrequencyMHz(this.m_scanChannels[0])));
+			} else {
+				throw KuraException
+						.internalError("Failed to generate wpa_supplicant.conf -- Invalid mode: "
+								+ this.m_mode);
+			}
+
+			// replace the necessary components
+			fileAsString = fileAsString.replaceFirst("KURA_MODE",
+					Integer.toString(this.getSupplicantMode()));
+
+			if (this.m_essid != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID",
+						this.m_essid);
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			if (this.m_bgscan != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN",
+						this.m_bgscan.toString());
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", "");
+			}
+
+			if(m_scanChannels != null && m_scanChannels.length > 0) {
+				fileAsString = fileAsString.replaceFirst("KURA_SCANFREQ",
+						this.getScanFrequenciesMHz(this.m_scanChannels));
+			} else {
+				fileAsString = fileAsString.replaceFirst("scan_freq=KURA_SCANFREQ",
+						"");
+			}
+
+		} else {
+			s_logger.error("unsupported security type: " + this.m_security);
+			throw KuraException.internalError("unsupported security type: "
+					+ this.m_security);
+		}
+		
+		// Remove the 'wheel' group assignment for Yocto image
+		/*
+		if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+			fileAsString = fileAsString.replaceFirst("ctrl_interface_group=wheel", "#ctrl_interface_group=wheel");
+		}
+		*/
+		
+		// everything is set and we haven't failed - write the file
+		this.copyFile(fileAsString, outputFile);
+	}
+
+	/*
+	 * This method copies supplied String to a file
+	 */
+	private void copyFile(String data, File destination) throws KuraException {
+		try {
+			FileOutputStream fos = new FileOutputStream(destination);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data);
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+
+			setPermissions(destination.toString());
+		} catch (IOException e) {
+			throw KuraException.internalError(e);
+		}
+	}
+
+	/*
+	 * This method sets permissions to wpa_supplicant configuration file
+	 */
+	private void setPermissions(String fileName) throws KuraException {
+		Process procChmod = null;
+		Process procDos = null;
+		try {
+			procChmod = ProcessUtil.exec("chmod 600 " + fileName);
+			procChmod.waitFor();
+
+			procDos = ProcessUtil.exec("dos2unix " + fileName);
+			procDos.waitFor();
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(procChmod);			
+			ProcessUtil.destroy(procDos);
+		}
+	}
+
+	/*
+	 * This method reads supplied input stream into a string
+	 */
+	private static String readInputStreamAsString(InputStream is)
+			throws IOException {
+		BufferedInputStream bis = new BufferedInputStream(is);
+		ByteArrayOutputStream buf = new ByteArrayOutputStream();
+		int result = bis.read();
+		while (result != -1) {
+			byte b = (byte) result;
+			buf.write(b);
+			result = bis.read();
+		}
+		return buf.toString();
+	}
+
+	/*
+	 * This method converts supplied string to hex
+	 */
+	private String toHex(String s) {
+		if (s == null) {
+			return null;
+		}
+		byte[] raw = s.getBytes();
+
+		StringBuffer hex = new StringBuffer(2 * raw.length);
+		for (int i = 0; i < raw.length; i++) {
+			hex.append(HEXES.charAt((raw[i] & 0xF0) >> 4)).append(
+					HEXES.charAt((raw[i] & 0x0F)));
+		}
+		return hex.toString();
+	}
+
+	/*
+	 * This method forms wpa_supplicant command
+	 */
+	private String formSupplicantCommand() {
+
+		StringBuffer sb = new StringBuffer();
+		sb.append("wpa_supplicant -B -D ");
+		sb.append(this.m_driver);
+		sb.append(" -i ");
+		sb.append(this.m_iface);
+		sb.append(" -c ");
+		sb.append(m_configFilename);
+
+		return sb.toString();
+	}
+
+	/*
+	 * This method forms wpa_supplicant configuration directory string
+	 */
+	private static String formSupplicantConfigDirectory() {
+
+		StringBuffer sb = new StringBuffer();
+		// sb.append("/tmp/.kura/");
+		// sb.append(WpaSupplicant.class.getPackage().getName());
+		sb.append("/etc/");
+
+		return sb.toString();
+	}
+
+	/*
+	 * This method forms wpa_supplicant configuration filename
+	 */
+	private static String formSupplicantConfigFilename() {
+
+		StringBuffer sb = new StringBuffer();
+		sb.append(WpaSupplicant.formSupplicantConfigDirectory());
+		sb.append("/wpa_supplicant.conf");
+
+		return sb.toString();
+	}
+
+	private Collection<String> getSupportedDrivers() throws Exception {
+
+		s_logger.debug("getting drivers supported by wpa_supplicant ...");
+		Collection<String> drivers = new HashSet<String>();
+		BufferedReader br = null;
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec("wpa_supplicant");
+			br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+			String line = null;
+			boolean fDrivers = false;
+
+			while ((line = br.readLine()) != null) {
+				if (fDrivers) {
+					if (line.startsWith("options:")) {
+						fDrivers = false;
+						break;
+					} else {
+						String[] asDriver = line.split("=");
+						drivers.add(asDriver[0].trim());
+					}
+				} else {
+					if (line.startsWith("drivers:")) {
+						fDrivers = true;
+					}
+				}
+			}
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+		return drivers;
+	}
+
+	private String getScanFrequenciesMHz(int[] channels) {
+
+		StringBuffer sbFrequencies = new StringBuffer();
+		if (channels != null && channels.length > 0) {
+			for (int i = 0; i < channels.length; i++) {
+				int freq = getChannelFrequencyMHz(channels[i]);
+				if(freq != -1) {
+					sbFrequencies.append(freq);
+					if (i < (channels.length - 1)) {
+						sbFrequencies.append(' ');
+					}
+				}
+			}
+		} else {
+			for (int i = 1; i <= 11; i++) {
+				sbFrequencies.append(this.getChannelFrequencyMHz(i));
+				if (i < 11) {
+					sbFrequencies.append(' ');
+				}
+			}
+		}
+
+		return sbFrequencies.toString().trim();
+	}
+	
+	private static Properties parseConfigFile () throws KuraException {
+		
+		Properties props = null;
+		
+		try {
+			File wpaConfigFile = new File(formSupplicantConfigFilename());
+			if (wpaConfigFile.exists()) {
+	
+				// Read into a string
+				BufferedReader br = new BufferedReader(
+						new FileReader(wpaConfigFile));
+				StringBuilder sb = new StringBuilder();
+				String line = null;
+				while ((line = br.readLine()) != null) {
+					sb.append(line).append("\n");
+				}
+				br.close();
+	
+				String newConfig = null;
+				int beginIndex = sb.toString().indexOf("network");
+				int endIndex = sb.toString().indexOf('}');
+				if ((beginIndex >= 0) && (endIndex > beginIndex)) {
+					newConfig = sb.toString().substring(beginIndex, endIndex);
+					beginIndex = newConfig.indexOf('{');
+					if (beginIndex >= 0) {
+						newConfig = newConfig.substring(beginIndex + 1);
+						props = new Properties();
+						props.load(new StringReader(newConfig));
+						Enumeration<Object> keys = props.keys();
+						while (keys.hasMoreElements()) {
+							String key = keys.nextElement().toString();
+							String val = props.getProperty(key);
+							if (val != null) {
+								if(val.startsWith("\"") && val.endsWith("\"") && val.length() > 1) {
+									props.setProperty(key, val.substring(1, val.length()-1));
+								}
+							}
+						}		
+					}
+				}
+			}
+		} catch (Exception e) {
+			throw KuraException
+					.internalError("wpa_supplicant failed to parse its configuration file");
+		}
+
+		return props;
+	}
+
+	private int getChannelFrequencyMHz(int channel) {
+
+		int frequency = -1;
+		if ((channel >= 1) && (channel <= 13)) {
+			frequency = 2407 + channel * 5;
+		} else {
+			s_logger.error("Invalid channel specified.  Must be between 1 and 13 (inclusive) but was set to: " + channel);
+		}
+		return frequency;
+	}
+	
+	private static int frequencyMhz2Channel(int frequency) {
+		
+		int channel = (frequency - 2407)/5;
+		return channel;
+	}
+
+	private int getSupplicantMode() {
+
+		int supplicantMode = MODE_INFRA;
+		if (m_mode == WifiMode.INFRA) {
+			supplicantMode = MODE_INFRA;
+		} else if (m_mode == WifiMode.ADHOC) {
+			supplicantMode = MODE_IBSS;
+		} else if (m_mode == WifiMode.MASTER) {
+			supplicantMode = MODE_AP;
+		}
+		return supplicantMode;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantManager.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2386f8bfe1fb7556a906729fcb4fe0b8af05290
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantManager.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.wifi;
+
+import java.io.File;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WpaSupplicantManager {
+	
+	private static Logger s_logger = LoggerFactory.getLogger(WpaSupplicantManager.class);
+	
+	private static final File CONFIG_FILE = new File("/etc/wpa_supplicant.conf");
+	private static final File TEMP_CONFIG_FILE = new File("/tmp/wpa_supplicant.conf");
+
+	private static String m_driver = null;
+	private static String m_interfaceName = null;
+	
+	public static void start(String interfaceName, final WifiMode mode, String driver) throws KuraException {
+		start (interfaceName, mode, driver, CONFIG_FILE);
+	}
+	
+	public static void startTemp(String interfaceName, final WifiMode mode, String driver) throws KuraException {
+		start (interfaceName, mode, driver, TEMP_CONFIG_FILE);
+	}
+	
+	private static synchronized void start(String interfaceName, final WifiMode mode, String driver, File configFile) throws KuraException {
+		
+		s_logger.debug("enable WPA Supplicant");
+		
+		Process proc = null;
+		try {
+			if(WpaSupplicantManager.isRunning()) {
+                stop();
+            }
+			
+			m_interfaceName = interfaceName;
+			m_driver = driver;
+
+			// start wpa_supplicant
+			String wpaSupplicantCommand = formSupplicantCommand(configFile);
+			s_logger.debug("starting wpa_supplicant -> " + wpaSupplicantCommand);
+			LinuxProcessUtil.start(wpaSupplicantCommand);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}
+
+	}
+
+	
+	/*
+	 * This method forms wpa_supplicant command
+	 */
+	private static String formSupplicantCommand(File configFile) {
+
+		StringBuffer sb = new StringBuffer();
+		sb.append("wpa_supplicant -B -D ");
+		sb.append(m_driver);
+		sb.append(" -i ");
+		sb.append(m_interfaceName);
+		sb.append(" -c ");
+		sb.append(configFile);
+
+		return sb.toString();
+	}
+	
+	/**
+	 * Reports if wpa_supplicant is running
+	 * 
+	 * @return {@link boolean}
+	 */
+	public static boolean isRunning() throws KuraException {
+		try {
+			// Check if wpa_supplicant is running
+			int pid = LinuxProcessUtil.getPid(formSupplicantCommand(CONFIG_FILE));
+			return (pid > -1);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	public static boolean isTempRunning() throws KuraException {
+		try {
+			// Check if wpa_supplicant is running
+			int pid = LinuxProcessUtil.getPid(formSupplicantCommand(TEMP_CONFIG_FILE));
+			return (pid > -1);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/**
+	 * Stops all instances of wpa_supplicant
+	 * 
+	 * @throws Exception
+	 */
+	public static void stop() throws KuraException {
+		try {
+			// kill wpa_supplicant
+			s_logger.debug("stopping wpa_supplicant");
+			
+			LinuxProcessUtil.start("killall wpa_supplicant");
+			if(m_interfaceName != null) {
+				LinuxNetworkUtil.disableInterface(m_interfaceName);
+			}
+			Thread.sleep(1000);
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantScan.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantScan.java
new file mode 100644
index 0000000000000000000000000000000000000000..2df450dd2fd94b95d75324a73fa02fd4d53435a7
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantScan.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.wifi;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.linux.util.ProcessStats;
+import org.eclipse.kura.net.wifi.WifiHotspotInfo;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+
+public class WpaSupplicantScan {
+	
+	private String m_iface = null;
+	private List <WifiHotspotInfo> m_listWifiHotspotInfo = null;
+	
+	public WpaSupplicantScan (String iface) {
+		m_iface = iface;
+		m_listWifiHotspotInfo = new ArrayList<WifiHotspotInfo>();
+	}
+
+	public void scan() throws KuraException {
+
+		String line = null;
+		ProcessStats processStats = null;
+		BufferedReader br = null;
+		String sScanCommand = formSupplicantScanCommand(m_iface);
+		
+		// scan for wireless networks
+		try { 	
+			processStats = LinuxProcessUtil.startWithStats(sScanCommand);
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		try {
+			br = new BufferedReader(new InputStreamReader(processStats.getInputStream()));
+	    	line = br.readLine();
+	    	if ((line == null) || !line.equals("OK")) {
+	    		throw new KuraException (KuraErrorCode.INTERNAL_ERROR, sScanCommand + " command failed");
+	    	}
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		} finally {
+			try {
+				br.close();
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+		
+		// get scan results
+		String sScanResultsCommand = formSupplicantScanResultsCommand(m_iface);
+		try { 	
+			processStats = LinuxProcessUtil.startWithStats(sScanResultsCommand);
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		try {
+			br = new BufferedReader(new InputStreamReader(processStats.getInputStream()));
+	    	String [] aScanInfo = null; 
+			while ((line = br.readLine()) != null) {
+				aScanInfo = line.split("\\s+");
+				if (aScanInfo.length > 0) {
+					String macAddress = aScanInfo[0];
+					int frequency = Integer.parseInt(aScanInfo[1]);
+					int signalLevel = Integer.parseInt(aScanInfo[2]);
+					
+					int securityCode = 0;
+					String sSecurity = aScanInfo[3].substring(aScanInfo[3].indexOf("[")+1, aScanInfo[3].lastIndexOf(']'));
+					StringTokenizer st = new StringTokenizer(sSecurity, "][");
+					while (st.hasMoreTokens()) {
+						String token = st.nextToken();
+						if (token.startsWith("WEP")) {
+							securityCode |= 1;
+						} else if (token.startsWith("WPA2")) {
+							securityCode |= 4;
+						} else if (token.startsWith("WPA")) {
+							securityCode |= 2;
+						}
+					}
+					WifiSecurity wifiSecurity = null;
+					switch (securityCode) {
+					case 1:
+						wifiSecurity = WifiSecurity.SECURITY_WEP;
+						break;
+					case 2:
+						wifiSecurity = WifiSecurity.SECURITY_WPA;
+						break;
+					case 4:
+						wifiSecurity = WifiSecurity.SECURITY_WPA2;
+						break;
+					case 6:
+						wifiSecurity = WifiSecurity.SECURITY_WPA_WPA2;
+						break;
+					default:
+						wifiSecurity = WifiSecurity.NONE;
+					}
+					
+					String ssid = aScanInfo[4];
+					
+					WifiHotspotInfo wifiHotspotInfo = new WifiHotspotInfo(ssid,
+							macAddress, signalLevel,
+							frequencyMhz2Channel(frequency), frequency,
+							wifiSecurity);
+					m_listWifiHotspotInfo.add(wifiHotspotInfo);
+				}
+	    	}
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		} finally {
+			try {
+				br.close();
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+	
+	public List <WifiHotspotInfo> getWifiHotspotInfo() {
+		return m_listWifiHotspotInfo;
+	}
+	
+	private static String formSupplicantScanCommand (String iface) {
+		
+		StringBuffer sb = new StringBuffer ();
+		sb.append("wpa_cli -i ");
+		sb.append(iface);
+		sb.append(" scan");
+		return sb.toString();
+	}
+	
+	private static String formSupplicantScanResultsCommand (String iface) {
+		
+		StringBuffer sb = new StringBuffer ();
+		sb.append("wpa_cli -i ");
+		sb.append(iface);
+		sb.append(" scan_results");
+		return sb.toString();
+	}
+	
+	private static int frequencyMhz2Channel(int frequency) {
+		int channel = (frequency - 2407)/5;
+		return channel;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantStatus.java b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..d45dba1dfe612bce7c28307675434998f5fad061
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/java/org/eclipse/kura/linux/net/wifi/WpaSupplicantStatus.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.net.wifi;
+
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WpaSupplicantStatus {
+	
+	private static Logger s_logger = LoggerFactory.getLogger(WpaSupplicantStatus.class);
+	
+	private static final String PROP_MODE = "mode";
+	private static final String PROP_BSSID = "bssid";
+	private static final String PROP_SSID = "ssid";
+	private static final String PROP_PAIRWISE_CIPHER = "pairwise_cipher";
+	private static final String PROP_GROUP_CIPHER = "group_cipher";
+	private static final String PROP_KEY_MGMT = "key_mgmt";
+	private static final String PROP_WPA_STATE = "wpa_state";
+	private static final String PROP_IP_ADDRESS = "ip_address";
+	private static final String PROP_ADDRESS = "address";
+	
+	private Properties m_props = null;
+	
+	public WpaSupplicantStatus (String iface) throws KuraException {
+		
+		m_props = new Properties();
+		Process proc = null;
+		try {
+			proc = ProcessUtil.exec(formSupplicantStatusCommand(iface));
+			m_props.load(proc.getInputStream());
+			
+			Enumeration<Object> keys = m_props.keys();
+			while (keys.hasMoreElements()) {
+				String key = (String)keys.nextElement();
+				s_logger.trace("[WpaSupplicant Status] " + key + "=" + m_props.getProperty(key));
+			}
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		finally {
+			ProcessUtil.destroy(proc);
+		}		
+	}
+	
+	public String getMode () {
+		return m_props.getProperty(PROP_MODE);
+	}
+	
+	public String getBssid () {	
+		return m_props.getProperty(PROP_BSSID);
+	}
+	
+	public String getSsid () {
+		return m_props.getProperty(PROP_SSID);
+	}
+	
+	public String getPairwiseCipher () {
+		return m_props.getProperty(PROP_PAIRWISE_CIPHER);
+	}
+	
+	public String getGroupCipher () {
+		return m_props.getProperty(PROP_GROUP_CIPHER);
+	}
+	
+	public String getKeyMgmt () {
+		return m_props.getProperty(PROP_KEY_MGMT);
+	}
+	
+	public String getWpaState () {
+		return m_props.getProperty(PROP_WPA_STATE);
+	}
+	
+	public String getIpAddress () {
+		return m_props.getProperty(PROP_IP_ADDRESS);
+	}
+	
+	public String getAddress () {
+		return m_props.getProperty(PROP_ADDRESS);
+	}
+	
+	private static String formSupplicantStatusCommand (String iface) {
+		
+		StringBuffer sb = new StringBuffer ();
+		sb.append("wpa_cli -i ");
+		sb.append(iface);
+		sb.append(" status");
+		return sb.toString();
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_master_wpa2_psk b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_master_wpa2_psk
new file mode 100644
index 0000000000000000000000000000000000000000..6822f0ea40ecc46bcf93de7887aa30f572526abf
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_master_wpa2_psk
@@ -0,0 +1,53 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WPA settings. We'll use stronger WPA2
+# bit0 = WPA
+# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
+wpa=2
+
+# Preshared key of between 8-63 ASCII characters.
+# If you define the key in here, make sure that the file is not readable
+# by anyone but root. Alternatively you can use a separate file for the
+# key; see original hostapd.conf for more information.
+#example TheKeyMyCatalystUSES!1
+wpa_passphrase=KURA_PASSPHRASE
+
+# Key management algorithm. In this case, a simple pre-shared key (PSK)
+wpa_key_mgmt=WPA-PSK
+
+# The cipher suite to use. We want to use stronger CCMP cipher.
+wpa_pairwise=CCMP
+
+# Change the broadcasted/multicasted keys after this many seconds.
+wpa_group_rekey=600
+
+# Change the master key after this many seconds. Master key is used as a basis
+# (source) for the encryption keys.
+wpa_gmk_rekey=86400
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_master_wpa_psk b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_master_wpa_psk
new file mode 100644
index 0000000000000000000000000000000000000000..f4046ccd6234f946ec58f5e858ea42d925719854
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_master_wpa_psk
@@ -0,0 +1,53 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WPA settings. We'll use stronger WPA2
+# bit0 = WPA
+# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
+wpa=1
+
+# Preshared key of between 8-63 ASCII characters.
+# If you define the key in here, make sure that the file is not readable
+# by anyone but root. Alternatively you can use a separate file for the
+# key; see original hostapd.conf for more information.
+#example TheKeyMyCatalystUSES!1
+wpa_passphrase=KURA_PASSPHRASE
+
+# Key management algorithm. In this case, a simple pre-shared key (PSK)
+wpa_key_mgmt=WPA-PSK
+
+# The cipher suite to use. We want to use stronger CCMP cipher.
+wpa_pairwise=CCMP TKIP
+
+# Change the broadcasted/multicasted keys after this many seconds.
+wpa_group_rekey=600
+
+# Change the master key after this many seconds. Master key is used as a basis
+# (source) for the encryption keys.
+wpa_gmk_rekey=86400
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_no_security b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_no_security
new file mode 100644
index 0000000000000000000000000000000000000000..49c9732a057f67fa712336afd1b996c3bf27b2fd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_no_security
@@ -0,0 +1,29 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_wep b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_wep
new file mode 100644
index 0000000000000000000000000000000000000000..3d7281fc5682b2b5d0d5427c0e0a51c2ea153f15
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/hostapd.conf_wep
@@ -0,0 +1,34 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WEP KEY The key length should be 5, 13, or 16 characters, or 10, 26, or 32
+# digits, depending on whether 40-bit (64-bit), 104-bit (128-bit), or
+# 128-bit (152-bit) WEP is used.
+#example: 123456789a
+wep_key0=KURA_WEP_KEY
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wifi_tool_locator b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wifi_tool_locator
new file mode 100644
index 0000000000000000000000000000000000000000..cff8d2ab96db32968ada54e6a0f911eb70764cd1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wifi_tool_locator
@@ -0,0 +1,5 @@
+/bin
+/sbin
+/usr/bin
+/usr/sbin
+/usr/local/bin
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_open b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_open
new file mode 100644
index 0000000000000000000000000000000000000000..70bb7048a7453e6b37b63d0c1105beaffc6b7e6a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_open
@@ -0,0 +1,12 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+ap_scan=2
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    key_mgmt=NONE
+    frequency=KURA_FREQUENCY
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep
new file mode 100644
index 0000000000000000000000000000000000000000..5165a9be34128cdfedaec5bb4232ad4657475adf
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep
@@ -0,0 +1,13 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+ap_scan=2
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    key_mgmt=NONE
+    frequency=KURA_FREQUENCY
+    wep_key0=KURA_WEP_KEY
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa
new file mode 100644
index 0000000000000000000000000000000000000000..c75f6044080f7909804febe26f8e20899eaf5841
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa
@@ -0,0 +1,16 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+ap_scan=2
+network={
+    mode=KURA_MODE
+    proto=WPA
+    ssid="KURA_ESSID"
+    key_mgmt=WPA-NONE
+    group=TKIP
+    frequency=KURA_FREQUENCY
+    psk="KURA_PASSPHRASE"
+    pairwise=KURA_PAIRWISE
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_open b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_open
new file mode 100644
index 0000000000000000000000000000000000000000..ce0ab8a51f488d434374e6c05752faa627b67257
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_open
@@ -0,0 +1,13 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    scan_ssid=1
+    key_mgmt=NONE
+    scan_freq=KURA_SCANFREQ
+    bgscan="KURA_BGSCAN"
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_wep b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_wep
new file mode 100644
index 0000000000000000000000000000000000000000..c9f3759a8192cb2d6fed3fb064b3104e71f5cf10
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_wep
@@ -0,0 +1,14 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+network={
+	mode=KURA_MODE
+    ssid="KURA_ESSID"
+    scan_ssid=1
+    key_mgmt=NONE
+    wep_key0=KURA_WEP_KEY
+	scan_freq=KURA_SCANFREQ
+    bgscan="KURA_BGSCAN"
+}
diff --git a/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_wpa b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_wpa
new file mode 100644
index 0000000000000000000000000000000000000000..efd0e9adfc7a0f024f7c6ad6eadc11e42769ecfb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.net/src/main/resources/wifi/wpasupplicant.conf_wpa
@@ -0,0 +1,17 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    scan_ssid=1
+    key_mgmt=WPA-PSK
+    psk="KURA_PASSPHRASE"
+    proto=KURA_PROTO
+    pairwise=KURA_PAIRWISE
+    group=KURA_GROUP
+    scan_freq=KURA_SCANFREQ
+    bgscan="KURA_BGSCAN"
+}
diff --git a/kura/org.eclipse.kura.linux.position/.gitignore b/kura/org.eclipse.kura.linux.position/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..3577b314ad065e9177d85a374826566629d7c1e6
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.position
+Bundle-SymbolicName: org.eclipse.kura.linux.position;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.comm; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.position; version="[0.2,0.3)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.osgi.util.measurement;version="1.0.1",
+ org.osgi.util.position;version="1.0.1",
+ org.slf4j;version="1.6.4",
+ org.osgi.framework,
+ javax.microedition.io
diff --git a/kura/org.eclipse.kura.linux.position/OSGI-INF/metatype/org.eclipse.kura.position.PositionService.xml b/kura/org.eclipse.kura.linux.position/OSGI-INF/metatype/org.eclipse.kura.position.PositionService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1c0e51a026e494c8d5a3a5353888b42eb0d71fc1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/OSGI-INF/metatype/org.eclipse.kura.position.PositionService.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.position.PositionService"
+         name="PositionService" 
+         description="The PositionService provides GPS positions for Kura.  The parameters define the serial port configuration of the device.">
+        
+        <Icon resource="PositionService" size="32"/>
+        
+        <AD id="enabled"
+            name="enabled"
+            type="Boolean"
+            cardinality="0"
+            required="true"
+            default="false"
+            description="Whether or not to enable the PositionService"/>
+            
+        <AD id="static"
+        	name="static"
+        	type="Boolean"
+        	cardinality="0"
+        	required="true"
+        	default="false"
+        	description="Specify static position instead of using GPS"/>
+        	
+       	<AD id="latitude"
+       		name="latitude"
+       		type="Double"
+       		cardinality="0"
+       		required="false"
+       		default="0"
+       		description="Static latitude value in degrees"/>
+       		
+       	<AD id="longitude"
+       		name="longitude"
+       		type="Double"
+       		cardinality="0"
+       		required="false"
+       		default="0"
+       		description="Static longitude value in degrees"/>
+       		
+       	<AD id="altitude"
+       		name="altitude"
+       		type="Double"
+       		cardinality="0"
+       		required="false"
+       		default="0"
+       		description="Static altitude value in meters"/>
+        
+        <AD id="port"
+            name="port"
+            type="String"
+            cardinality="0"
+            required="false"
+            default="/dev/ttyACM0"
+            description="The USB or serial port of the GPS device (e.g. 1-3.2 or /dev/ttyACM0)."/>
+        
+        <AD id="baudRate"  
+            name="baudRate"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="115200" 
+            description="The baud rate of the GPS device.">
+            <Option label="110" value="110"/>
+            <Option label="300" value="300"/>
+            <Option label="600" value="600"/>
+            <Option label="1200" value="1200"/>
+            <Option label="2400" value="2400"/>
+            <Option label="4800" value="4800"/>
+            <Option label="9600" value="9600"/>
+            <Option label="14400" value="14400"/>
+            <Option label="19200" value="19200"/>
+            <Option label="28800" value="28800"/>
+            <Option label="38400" value="38400"/>
+            <Option label="56000" value="56000"/>
+            <Option label="57600" value="57600"/>
+            <Option label="115200" value="115200"/>
+            <Option label="128000" value="128000"/>
+            <Option label="153600" value="153600"/>
+            <Option label="230400" value="230400"/>
+            <Option label="256000" value="256000"/>
+            <Option label="460800" value="460800"/>
+            <Option label="921600" value="921600"/>
+		</AD>
+		
+        <AD id="bitsPerWord"  
+            name="bitsPerWord"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="8" 
+            description="The number of bits per word or the 'data bits' for the serial communication to the GPS device.">
+            <Option label="5" value="5"/>
+            <Option label="6" value="6"/>
+            <Option label="7" value="7"/>
+            <Option label="8" value="8"/>
+		</AD>
+		
+        <AD id="stopBits"  
+            name="stopBits"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="1" 
+            description="The stop bits for the serial communication to the GPS device.">
+            <Option label="1" value="1"/>
+            <Option label="2" value="2"/>
+            <Option label="1.5" value="3"/>
+        </AD>
+
+        <AD id="parity"  
+            name="parity"
+            type="Integer"
+            cardinality="0" 
+            required="false"
+            default="0" 
+            description="The parity for the serial communication to the GPS device.">
+            <Option label="None" value="0"/>
+            <Option label="Odd" value="1"/>
+            <Option label="Even" value="2"/>
+            <Option label="Mark" value="3"/>
+            <Option label="Space" value="4"/>
+        </AD>
+
+    </OCD>
+    <Designate pid="org.eclipse.kura.position.PositionService">
+        <Object ocdref="org.eclipse.kura.position.PositionService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.linux.position/OSGI-INF/position.xml b/kura/org.eclipse.kura.linux.position/OSGI-INF/position.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3c998217b88858681d1f387ee218e7c4d44b84e0
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/OSGI-INF/position.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.position.PositionService">
+   <implementation class="org.eclipse.kura.linux.position.PositionServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.position.PositionService"/>
+      <provide interface="org.osgi.service.event.EventHandler"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.position.PositionService"/>
+   <reference bind="setConnectionFactory" cardinality="1..1" interface="org.osgi.service.io.ConnectionFactory" name="ConnectionFactory" policy="static" unbind="unsetConnectionFactory"/>
+   <reference name="EventAdmin" 
+              cardinality="1..1" 
+              policy="static"
+              bind="setEventAdmin"
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/>
+   <reference name="UsbService"
+              bind="setUsbService"
+              unbind="unsetUsbService"
+              cardinality="1..1"
+              policy="static"
+              interface="org.eclipse.kura.usb.UsbService"/>   
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.position/about.html b/kura/org.eclipse.kura.linux.position/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.position/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.position/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.position/build.properties b/kura/org.eclipse.kura.linux.position/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a2bef8fe3276b524f40358c5012908686fe1b869
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/build.properties
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.equinox.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.linux.position/pom.xml b/kura/org.eclipse.kura.linux.position/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..67ff784b35307b7dd1ed908880f5a7c1d032411c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.position</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..c09da14202e90b1834649babb261c7430d81fbf4
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java
@@ -0,0 +1,476 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.position;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraConnectionStatus;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.position.NmeaPosition;
+import org.eclipse.kura.position.PositionException;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.measurement.Measurement;
+import org.osgi.util.measurement.Unit;
+import org.osgi.util.position.Position;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * GPS Utility class, not intended to be used by the end user of Kura.<br>
+ * Assuming the device talks NMEA over a serial port configured thru PositionService
+ * 
+ */
+public class GpsDevice {
+	private static final Logger s_logger = LoggerFactory.getLogger(GpsDevice.class);
+
+	static final String PROTOCOL_NAME = "position";
+	
+	//private String unitName = PROTOCOL_NAME;
+	private SerialCommunicate comm;
+	private boolean connConfigd = false;
+	private boolean m_validPosition = false;
+	private String m_lastSentence;
+	
+	private Measurement m_latitude = null;
+	private Measurement m_longitude = null;
+	private Measurement m_altitude = null;
+	private Measurement m_speed = null;
+	private Measurement m_track = null;
+	private double m_latitudeNmea = 0;
+	private double m_longitudeNmea = 0;
+	private double m_altitudeNmea = 0;
+	private double m_speedNmea = 0;
+	private double m_trackNmea = 0;
+	private int m_fixQuality = 0;
+	private int m_nrSatellites = 0;
+	private double m_DOP = 0;
+	private double m_PDOP = 0;
+	private double m_HDOP = 0;
+	private double m_VDOP = 0;
+	private int m_3Dfix = 0;
+	private String m_dateNmea="";
+	private String m_timeNmea="";
+	
+	public GpsDevice() {
+		m_latitude = new Measurement(java.lang.Math.toRadians(0),Unit.rad);
+		m_longitude = new Measurement(java.lang.Math.toRadians(0),Unit.rad);					
+		m_altitude = new Measurement(0,Unit.m); 
+		m_speed = new Measurement(0,Unit.m_s); 
+		m_track = new Measurement(java.lang.Math.toRadians(0),Unit.rad); 
+	}
+
+	public String getProtocolName() {
+		return "position";
+	}
+
+	public String getUnitAddress() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public void configureProtocol(Properties protocolConfig)
+			throws PositionException {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void configureConnection(ConnectionFactory connFactory,
+			Properties connectionConfig) throws PositionException {
+
+		if (connConfigd) {
+			comm.disconnect();
+			comm = null;
+			connConfigd = false;
+		}
+
+		try {
+			comm = new SerialCommunicate(connFactory, connectionConfig);
+		} catch (PositionException e) {
+			throw(e);
+		}
+		connConfigd = true;
+	}
+
+	public int getConnectStatus() {
+		if (!connConfigd)
+			return KuraConnectionStatus.NEVERCONNECTED;
+		return comm.getConnectStatus();
+	}
+
+	public Position getPosition() {
+		return new Position(m_latitude, m_longitude, m_altitude, m_speed, m_track);
+	}
+
+	public NmeaPosition getNmeaPosition() {
+		return new NmeaPosition(m_latitudeNmea, m_longitudeNmea, m_altitudeNmea, m_speedNmea, m_trackNmea, 
+								m_fixQuality, 
+								m_nrSatellites, 
+								m_DOP, 
+								m_PDOP, 
+								m_HDOP, 
+								m_VDOP, 
+								m_3Dfix);
+	}
+	
+	public boolean isValidPosition() {
+		return m_validPosition;
+	}
+
+	public String getDateNmea() {
+		return m_dateNmea;
+	}
+
+	public String getTimeNmea() {
+		return m_timeNmea;
+	}
+
+	public void connect() throws PositionException {
+		if (!connConfigd)
+			throw new PositionException("Invalid serial port configuration");
+		comm.connect();
+	}
+
+	public void disconnect() {
+		if (connConfigd && comm != null)
+			comm.disconnect();
+	}
+
+	public String getLastSentence() {
+		return m_lastSentence;
+	}
+
+	/**
+	 * Installation of a serial connection to communicate, using javax.comm.SerialPort 
+	 * <li>port : the actual device port, such as "/dev/ttyUSB0" in linux</li>
+	 * <li>baudRate : baud rate to be configured for the port</li>
+	 * <li>stopBits : number of stop bits to be configured for the port</li>
+	 * <li>parity : parity mode to be configured for the port</li>
+	 * <li>bitsPerWord : only RTU mode supported, bitsPerWord must be 8</li>
+	 * see {@link org.eclipse.kura.comm.CommConnection CommConnection} package for more
+	 * detail.
+	 */
+	private final class SerialCommunicate {
+		
+		private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+		
+		private ScheduledExecutorService m_executor;
+		private ScheduledFuture<?>  m_task;
+		
+		InputStream in;
+		CommConnection conn=null;
+
+		public SerialCommunicate(ConnectionFactory connFactory, Properties connectionConfig)
+				throws PositionException {
+			s_logger.debug("Configure serial connection");
+			
+			
+			String sPort;
+			String sBaud;
+			String sStop;
+			String sParity;
+			String sBits;				
+
+			if (((sPort = connectionConfig.getProperty("port")) == null)
+					|| ((sBaud = connectionConfig.getProperty("baudRate")) == null)
+					|| ((sStop = connectionConfig.getProperty("stopBits")) == null)
+					|| ((sParity = connectionConfig.getProperty("parity")) == null)
+					|| ((sBits = connectionConfig.getProperty("bitsPerWord")) == null))
+				throw new PositionException("Invalid serial port configuration");
+			
+			int baud = Integer.valueOf(sBaud).intValue();
+			int stop = Integer.valueOf(sStop).intValue();
+			int parity = Integer.valueOf(sParity).intValue();
+			int bits = Integer.valueOf(sBits).intValue();
+
+			String uri = new CommURI.Builder(sPort)
+									.withBaudRate(baud)
+									.withDataBits(bits)
+									.withStopBits(stop)
+									.withParity(parity)
+									.withTimeout(2000)
+									.build().toString();
+
+			try {
+				conn = (CommConnection) connFactory.createConnection(uri, 1, false);
+			} catch (IOException e1) {
+				throw new PositionException("Invalid GPS serial Port", e1);
+			}
+
+			// get the streams
+			try {
+				in = conn.openInputStream();
+				conn.openOutputStream();
+			} catch (Exception e) {
+				throw new PositionException("input stream", e);
+			}
+			
+			//clean up if this is not our first run
+			if ((m_task != null) && (!m_task.isDone())) {
+	    		s_logger.debug("SerialCommunicate() :: Cancelling GpsSerialCommunicate task ...");
+	    		m_task.cancel(true);
+	    		s_logger.info("SerialCommunicate() :: GpsSerialCommunicate task cancelled? = {}", m_task.isDone());
+	    		m_task = null;
+	    	}
+			
+			m_executor = Executors.newSingleThreadScheduledExecutor();
+			
+			m_task = m_executor.scheduleAtFixedRate(new Runnable() {
+	    		@Override
+	    		public void run() {
+		    		Thread.currentThread().setName("GpsSerialCommunicate");
+		    		doPollWork();
+	    	}}, 0, 20, TimeUnit.MILLISECONDS);			
+		}
+
+		public void connect() {
+			/*
+			 * always connected
+			 */
+		}
+
+		public void disconnect() {
+			
+			if ((m_task != null) && (!m_task.isDone())) {
+	    		s_logger.debug("disconnect() :: Cancelling GpsSerialCommunicate task ...");
+	    		m_task.cancel(true);
+	    		s_logger.info("disconnect() :: GpsSerialCommunicate task cancelled? = {}", m_task.isDone());
+	    		m_task = null;
+	    	}
+	    	
+	    	if (m_executor != null) {
+	    		s_logger.debug("disconnect() :: Terminating GpsSerialCommunicate Thread ...");
+	    		m_executor.shutdownNow();
+	    		try {
+					m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+				} catch (InterruptedException e) {
+					s_logger.warn("Interrupted", e);
+				}
+	    		s_logger.info("disconnect() :: GpsSerialCommunicate Thread terminated? - {}", m_executor.isTerminated());
+				m_executor = null;
+	    	}
+			
+			if (conn!=null) {
+				try {
+					if(in!=null){
+						in.close();
+						in=null;
+					}
+					conn.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+				conn = null;
+			}
+		}
+
+		public int getConnectStatus() {
+			return KuraConnectionStatus.CONNECTED;
+		}
+
+		public void doPollWork() {
+			try {
+				StringBuffer readBuffer = new StringBuffer();
+				int c=-1;
+				if (in != null) {
+					while (c != 10) {
+						try {
+							c = in.read();
+						} catch (Exception e) {
+							s_logger.error("IOexception in gps read");
+							try {
+								Thread.sleep(1000);
+							} catch (InterruptedException e1) {
+							}
+						}
+						if (c != 13 && c != -1) {
+							readBuffer.append((char) c);
+						}
+					}
+					try {
+						if (readBuffer.length() > 0) {
+							s_logger.debug("GPS RAW: " + readBuffer.toString());
+							parseNmeaSentence(readBuffer.toString());
+						}
+					} catch (Exception e) {
+						s_logger.error("Exception in parseNmeaSentence ");
+					}
+				} else {
+					s_logger.debug("GPS InputStream is null");
+					try {
+						Thread.sleep(1000);
+					} catch (InterruptedException e) {}
+				}
+			} catch (Exception e) {
+				s_logger.error("Exception in Gps doPollWork");
+				try {
+					Thread.sleep(1000);
+				} catch (InterruptedException e1) {}
+			}
+		}
+
+		private void parseNmeaSentence(String scannedInput) {
+
+			double lon, lat, speed, alt, track;
+			
+			// got a message... do a cksum
+			if (!NmeaCksum(scannedInput)){
+				s_logger.error("NMEA checksum not valid");
+				return;
+			}
+			//s_logger.info(scannedInput);
+			m_lastSentence=scannedInput;
+			NMEAParser gpsParser = new NMEAParser();
+
+			gpsParser.parseSentence(scannedInput);
+			m_validPosition=gpsParser.is_validPosition();
+			//s_logger.debug("Parse : "+scannedInput+" position valid = "+m_validPosition);
+			
+			if(!m_validPosition)
+				return;
+			
+			if(scannedInput.startsWith("$GPTXT")) {
+				s_logger.debug("U-Blox init message: " + scannedInput);
+			} else if (scannedInput.startsWith("$GPGGA")) {
+				try {
+					lon = gpsParser.get_longNmea();
+					lat = gpsParser.get_latNmea();
+					alt = gpsParser.get_altNmea();
+					m_fixQuality = gpsParser.get_fixQuality();
+					m_latitude = new Measurement(java.lang.Math.toRadians(lat),Unit.rad);
+					m_longitude = new Measurement(java.lang.Math.toRadians(lon),Unit.rad);					
+					m_altitude = new Measurement(alt,Unit.m); 
+					m_latitudeNmea = lat;
+					m_longitudeNmea = lon;					
+					m_altitudeNmea = alt; 
+					m_DOP = gpsParser.get_DOPNmea();
+					m_nrSatellites = gpsParser.get_nrSatellites();
+					m_timeNmea = gpsParser.get_timeNmea();
+				} catch (Exception e) {
+					m_latitude = null;
+					m_longitude = null;					
+					m_altitude = null;
+					m_latitudeNmea = 0;
+					m_longitudeNmea = 0;					
+					m_altitudeNmea = 0; 
+				}
+			} else if (scannedInput.startsWith("$GPGLL")) {
+				try {
+					lon = gpsParser.get_longNmea();
+					lat = gpsParser.get_latNmea();
+					m_latitude = new Measurement(java.lang.Math.toRadians(lat),Unit.rad);
+					m_longitude = new Measurement(java.lang.Math.toRadians(lon),Unit.rad);	
+					m_latitudeNmea = lat;
+					m_longitudeNmea = lon;					
+				} catch (Exception e) {
+					m_latitude = null;
+					m_longitude = null;					
+					m_latitudeNmea = 0;
+					m_longitudeNmea = 0;					
+				}
+			} else if (scannedInput.startsWith("$GPGSA")) {
+				try {
+					m_PDOP = gpsParser.get_PDOPNmea();
+					m_HDOP = gpsParser.get_HDOPNmea();
+					m_VDOP = gpsParser.get_VDOPNmea();
+					m_3Dfix = gpsParser.get_3DfixNmea();
+					//System.out.println("m_PDOP = "+m_PDOP+"  m_HDOP = "+m_HDOP+"  m_VDOP = "+m_VDOP+"  m_3Dfix = "+m_3Dfix);
+				} catch (Exception e) {
+					m_PDOP = 0;
+					m_HDOP = 0;
+					m_VDOP = 0;
+					m_3Dfix = 0;
+				}
+			} else if (scannedInput.startsWith("$GPGSV")) {
+			} else if (scannedInput.startsWith("$GPRMC")) {
+				try {
+					lon = gpsParser.get_longNmea();
+					lat = gpsParser.get_latNmea();
+					speed = gpsParser.get_speedNmea();
+					track = gpsParser.get_trackNmea();
+					m_latitude = new Measurement(java.lang.Math.toRadians(lat),Unit.rad);
+					m_longitude = new Measurement(java.lang.Math.toRadians(lon),Unit.rad);		
+					m_speed = new Measurement(speed,Unit.m_s);
+					m_track = new Measurement(java.lang.Math.toRadians(track),Unit.rad); 
+					m_latitudeNmea = lat;
+					m_longitudeNmea = lon;	
+					m_speedNmea = speed;
+					m_dateNmea = gpsParser.get_dateNmea();
+				} catch (Exception e) {
+					m_latitude = null;
+					m_longitude = null;		
+					m_speed = null;
+					m_latitudeNmea = 0;
+					m_longitudeNmea = 0;	
+					m_speedNmea = 0;
+				}
+			} else if (scannedInput.startsWith("$GPVTG")) {
+				try {
+					speed = gpsParser.get_speedNmea();
+					m_speed = new Measurement(speed,Unit.m_s);
+					m_speedNmea = speed;
+				} catch (Exception e) {
+					m_speed = null;
+					m_speedNmea = 0;
+				}
+			} else if (scannedInput.indexOf("FOM") != -1) {
+				//FOM = scannedInput;
+			} else if (scannedInput.indexOf("PPS") != -1) {
+				//PPS = scannedInput;
+			} else {
+				s_logger.warn("Unrecognized NMEA sentence: " + scannedInput);
+			}
+		}
+
+		private boolean NmeaCksum(String nmeaMessageIn){
+			int starpos = nmeaMessageIn.indexOf('*');
+			String s_Cksum = nmeaMessageIn.substring(starpos+1,nmeaMessageIn.length()-1);
+			int i_Cksum = Integer.parseInt(s_Cksum,16); // Check sum is coded in hex string
+
+			int i_newCksum = 0;
+			for (int i = 1; i < starpos; i++) {
+				i_newCksum ^= nmeaMessageIn.charAt(i);
+			}
+			
+			return(i_newCksum==i_Cksum);
+		}
+	}
+	
+	public String toString(){
+		StringBuilder sb = new StringBuilder();
+		sb.append(" longitude=");
+		sb.append(m_longitudeNmea);
+		sb.append("\n latitude=");
+		sb.append(m_latitudeNmea);
+		sb.append("\n altitude=");
+		sb.append(m_altitudeNmea);
+		sb.append("\n speed=");
+		sb.append(m_speedNmea);
+		sb.append("\n date=");
+		sb.append(m_dateNmea);
+		sb.append("   time=");
+		sb.append(m_timeNmea);
+		sb.append("\n DOP=");
+		sb.append(m_DOP);
+		sb.append("\n 3Dfix=");
+		sb.append(m_3Dfix);
+		sb.append("\n fixQuality=");
+		sb.append(m_fixQuality);
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..6295fb5172b0cc9885f04dcfc54df85f314b7930
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.position;
+
+/**
+ * Implements NMEA sentences parser functions.
+ * 
+ */
+public class NMEAParser {
+	
+	private int m_fixQuality;
+	private String m_timeNmea;
+	private String m_dateNmea;
+	private double m_longNmea;
+	private double m_latNmea;
+	private double m_speedNmea;
+	private double m_altNmea;
+	private double m_trackNmea;
+	private double m_DOPNmea;
+	private double m_PDOPNmea;
+	private double m_HDOPNmea;
+	private double m_VDOPNmea;
+	private int    m_3DfixNmea;
+	private int    m_nrSatellites;
+	private static boolean m_validPosition;
+	
+	/**
+	 * Fill the fields of GPS position depending of the type of the sentence
+	 * 
+	 * @param sentence most recent sentence String from GPS modem
+	 */
+	public void parseSentence(String sentence) {
+		// first remove the end "*"+chksum
+		int starpos = sentence.indexOf('*');
+		String s_sentence = sentence.substring(0, starpos);
+		
+		String[] tokens = s_sentence.split(",");
+	    if (tokens[0].contains("$GPGGA")) {
+	    	if(tokens.length>9){
+	    		m_validPosition=true;
+	    		if(!tokens[1].isEmpty()) m_timeNmea=tokens[1];else m_validPosition=false;
+		    	if(!tokens[2].isEmpty()) m_latNmea=convertPositionlat(tokens[2],tokens[3]);else m_validPosition=false;
+		    	if(!tokens[4].isEmpty()) m_longNmea=convertPositionlon(tokens[4],tokens[5]);else m_validPosition=false;
+		    	if(!tokens[6].isEmpty()){
+		    		m_fixQuality=Integer.parseInt(tokens[6]);
+		    		if(m_fixQuality==0) m_validPosition=false;
+		    	}
+		    	else m_validPosition=false;
+		    	if(!tokens[7].isEmpty()) m_nrSatellites=Integer.parseInt(tokens[7]);else m_validPosition=false;
+		    	if(!tokens[8].isEmpty()) m_DOPNmea=Double.parseDouble(tokens[8]);else m_validPosition=false;
+		    	if(!tokens[9].isEmpty()) m_altNmea=Double.parseDouble(tokens[9]);else m_validPosition=false;
+	    	}
+	    	else m_validPosition=false;
+	    }
+	    else if (tokens[0].contains("$GPGLL")) {
+	    	if(tokens.length>5){
+	    		m_validPosition=true;
+	    		if(!tokens[1].isEmpty()) m_latNmea=convertPositionlat(tokens[1],tokens[2]);else m_validPosition=false;
+	    		if(!tokens[3].isEmpty()) m_longNmea=convertPositionlon(tokens[3],tokens[4]);else m_validPosition=false;
+	    		if(!tokens[5].isEmpty()) m_timeNmea=tokens[5];else m_validPosition=false;
+	    		if(!tokens[6].isEmpty()){ // check validity
+	    			if(!new String("A").equals(tokens[6]))
+	    				m_validPosition=false;
+	    		}
+	    		else m_validPosition=false;
+	    	}
+	    	else m_validPosition=false;
+	    }
+	    else if (tokens[0].contains("$GPRMC")) {
+	    	if(tokens.length>8){
+	    		m_validPosition=true;
+	    		if(!tokens[1].isEmpty()) m_timeNmea=tokens[1];
+	    		if(!tokens[2].isEmpty()){ // check validity
+	    			if(!new String("A").equals(tokens[2]))
+	    				m_validPosition=false;
+	    		}
+	    		else m_validPosition=false;
+	    		if(!tokens[3].isEmpty()) m_latNmea=convertPositionlat(tokens[3],tokens[4]);else m_validPosition=false; 
+	    		if(!tokens[5].isEmpty()) m_longNmea=convertPositionlon(tokens[5],tokens[6]);else m_validPosition=false;
+	    		if(!tokens[7].isEmpty()) m_speedNmea=Double.parseDouble(tokens[7])/1.94384449; // conversion speed in knots to m/s : 1 m/s = 1.94384449 knots
+	    		if(!tokens[8].isEmpty()) m_trackNmea=Double.parseDouble(tokens[8]);
+	    		if(!tokens[9].isEmpty()) m_dateNmea=tokens[9];else m_validPosition=false;
+	    	}
+	    	else m_validPosition=false;
+	    }
+	    else if (tokens[0].contains("$GPGSA")) {
+	    	if(tokens.length>5){
+	    		m_validPosition=true;
+	    		if(!tokens[2].isEmpty()){
+	    			m_3DfixNmea=Integer.parseInt(tokens[2]);
+	    			if(m_3DfixNmea==1) m_validPosition=false; 
+	    		}
+	    		else m_validPosition=false;
+		    	int index = tokens.length - 3;
+		    	if(!tokens[index].isEmpty()) m_PDOPNmea=Double.parseDouble(tokens[index]);else m_validPosition=false;
+		    	if(!tokens[index+1].isEmpty()) m_HDOPNmea=Double.parseDouble(tokens[index+1]);else m_validPosition=false;
+		    	if(!tokens[index+2].isEmpty()) m_VDOPNmea=Double.parseDouble(tokens[index+2]);else m_validPosition=false;
+	    	}
+	    	else m_validPosition=false;
+	    }
+	    else if (tokens[0].contains("$GPVTG")) {
+	    	if((tokens.length>7)&&(!tokens[7].isEmpty())){ 
+	    		m_speedNmea=Double.parseDouble(tokens[7])*0.277777778; // conversion km/h in m/s : 1 km/h -> 0,277777778 m/s;
+	    	}
+	    }
+	}
+
+	double convertPositionlat(String pos, String direction){
+		double floatLatDegrees = 0;
+		double floatLatMinutes = 0;
+		String s;
+
+		if(pos.length()<6) return 0;
+		
+		// This copies the arrays to temporary arrays
+		s=pos.substring(0, 2);
+		floatLatDegrees=Double.parseDouble(s);
+		s=pos.substring(2);
+		floatLatMinutes=Double.parseDouble(s);		
+		floatLatDegrees = floatLatDegrees + floatLatMinutes/60;
+		if (direction.contains("S")) {
+			floatLatDegrees = floatLatDegrees * -1;
+		}		
+		return floatLatDegrees;
+	}
+	
+	double convertPositionlon(String pos, String direction){
+		double floatLonDegrees = 0;
+		double floatLonMinutes = 0;
+		String s;
+
+		if(pos.length()<6) return 0;
+		
+		// This copies the arrays to temporary arrays
+		s=pos.substring(0, 3);
+		floatLonDegrees=Double.parseDouble(s);
+		s=pos.substring(3);
+		floatLonMinutes=Double.parseDouble(s);		
+		floatLonDegrees = floatLonDegrees + floatLonMinutes/60;
+		if (direction.contains("W")) {
+			floatLonDegrees = floatLonDegrees * -1;
+		}
+		return floatLonDegrees;
+	}
+	
+	public String get_timeNmea() {
+		return m_timeNmea;
+	}
+
+	public int get_fixQuality() {
+		return m_fixQuality;
+	}
+
+	public String get_dateNmea() {
+		return m_dateNmea;
+	}
+
+	public double get_longNmea() {
+		return m_longNmea;
+	}
+
+	public double get_latNmea() {
+		return m_latNmea;
+	}
+
+	public double get_speedNmea() {
+		return m_speedNmea;
+	}
+
+	public double get_altNmea() {
+		return m_altNmea;
+	}
+
+	public double get_trackNmea() {
+		return m_trackNmea;
+	}
+
+	public double get_DOPNmea() {
+		return m_DOPNmea;
+	}
+
+	public double get_PDOPNmea() {
+		return m_PDOPNmea;
+	}
+
+	public double get_HDOPNmea() {
+		return m_HDOPNmea;
+	}
+
+	public double get_VDOPNmea() {
+		return m_VDOPNmea;
+	}
+
+	public int get_3DfixNmea() {
+		return m_3DfixNmea;
+	}
+
+	public int get_nrSatellites() {
+		return m_nrSatellites;
+	}
+
+	public boolean is_validPosition() {
+		return m_validPosition;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..85127bc235453131bd3dfc264e94b32b7ed021d5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java
@@ -0,0 +1,491 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.position;
+
+import java.io.File;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.position.NmeaPosition;
+import org.eclipse.kura.position.PositionLockedEvent;
+import org.eclipse.kura.position.PositionLostEvent;
+import org.eclipse.kura.position.PositionService;
+import org.eclipse.kura.usb.UsbDeviceAddedEvent;
+import org.eclipse.kura.usb.UsbDeviceRemovedEvent;
+import org.eclipse.kura.usb.UsbService;
+import org.eclipse.kura.usb.UsbTtyDevice;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.measurement.Measurement;
+import org.osgi.util.measurement.Unit;
+import org.osgi.util.position.Position;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PositionServiceImpl implements PositionService, ConfigurableComponent, EventHandler {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(PositionServiceImpl.class);
+
+	private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+
+	private static Future<?>				monitorTask;
+	private static boolean 					stopThread;
+
+	private Map<String,Object>				m_properties;
+	private ConnectionFactory 	            m_connectionFactory;
+	private GpsDevice					 	m_gpsDevice;
+	private ExecutorService                 m_executor;
+	private EventAdmin            			m_eventAdmin;
+	private UsbService						m_usbService;
+
+	private int pollInterval = 500;	//milliseconds
+	private boolean m_configured;
+	private boolean m_useGpsd = false;
+	private boolean m_configEnabled;
+	private boolean m_isRunning;
+	private boolean m_hasLock;
+
+	// to avoid NPE don't return a null pointer
+	private Position m_defaultPosition=null;
+	private NmeaPosition m_defaultNmeaPosition=null;
+
+	// add gpsd variables
+	private Position m_GpsdPosition=null;
+	private NmeaPosition m_GpsdNmeaPosition=null;
+	private String m_GpsdTimeNmea="";
+	private String m_GpsdDateNmea="";
+	private String m_GpsdLastSentence="";
+	private boolean m_GpsdIsValidPosition=false;
+
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = connectionFactory;
+	}
+
+	public void unsetConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = null;
+	}
+
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = eventAdmin;
+	}
+
+	public void unsetEventAdmin(EventAdmin eventAdmin) {
+		this.m_eventAdmin = null;
+	}
+
+	public void setUsbService(UsbService usbService) {
+		this.m_usbService = usbService;
+	}
+
+	public void unsetUsbService(UsbService usbService) {
+		this.m_usbService = null;
+	}
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+	{
+		s_logger.debug("Activating...");
+
+		m_configured = false;		
+		m_configEnabled = false;
+		m_isRunning = false;
+		m_hasLock = false;
+		m_useGpsd = false;
+		initializeDefaultPosition(0, 0, 0);
+
+		m_executor = Executors.newSingleThreadExecutor();
+
+		// install event listener for serial ports
+		Dictionary<String, String[]> props = new Hashtable<String, String[]>();
+		String[] topic = {UsbDeviceAddedEvent.USB_EVENT_DEVICE_ADDED_TOPIC,UsbDeviceRemovedEvent.USB_EVENT_DEVICE_REMOVED_TOPIC};
+		props.put(EventConstants.EVENT_TOPIC, topic);
+		componentContext.getBundleContext().registerService(EventHandler.class.getName(), this, props);
+
+		updated(properties);
+		s_logger.info("Activating... Done.");
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		stop();
+		if (m_executor != null) {
+			s_logger.debug("Terminating PositionServiceImpl Thread ...");
+			m_executor.shutdownNow();
+			try {
+				m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+			s_logger.info("PositionServiceImpl Thread terminated? - {}", m_executor.isTerminated());
+			m_executor = null;
+		}
+
+		m_properties = null;
+		s_logger.info("Deactivating... Done.");
+	}
+
+	public void updated(Map<String,Object> properties) 
+	{
+		s_logger.debug("Updating...");
+		if(m_isRunning) {
+			stop();
+		}
+
+		m_properties = properties;
+		m_configured = false;
+		m_configEnabled = false;
+		m_isRunning = false;
+		m_hasLock = false;
+		//m_useGpsd = (Boolean)m_properties.get("useGpsd");
+
+		try {
+			if ((Boolean)m_properties.get("enabled") && (Boolean) m_properties.get("static")) {
+				initializeDefaultPosition((Double) m_properties.get("latitude"), (Double) m_properties.get("longitude"), (Double) m_properties.get("altitude"));
+			}
+			else {
+				configureGpsDevice();
+				start();
+			}
+		} catch (Exception e) {
+			s_logger.error("Error starting PositionService background operations.", e);
+		}
+		s_logger.info("Updating... Done.");
+	}
+
+
+	// ----------------------------------------------------------------
+	//
+	//   Service APIs
+	//
+	// ----------------------------------------------------------------
+
+	@Override
+	public Position getPosition() {
+		if(m_useGpsd)
+			return m_GpsdPosition;
+		else if(m_gpsDevice!=null)
+			return m_gpsDevice.getPosition();
+		else return m_defaultPosition;
+	}
+
+	@Override
+	public NmeaPosition getNmeaPosition() {
+		if(m_useGpsd)
+			return m_GpsdNmeaPosition;
+		else if(m_gpsDevice!=null)
+			return m_gpsDevice.getNmeaPosition();
+		else return m_defaultNmeaPosition;
+	}
+
+	public boolean isLocked() {
+		return m_hasLock;
+	}
+
+	@Override
+	public String getNmeaTime() {
+		if(m_useGpsd)
+			return m_GpsdTimeNmea;
+		else if(m_gpsDevice!=null)
+			return m_gpsDevice.getTimeNmea();
+		else return null;
+	}
+
+	@Override
+	public String getNmeaDate() {
+		if(m_useGpsd)
+			return m_GpsdDateNmea;
+		else if(m_gpsDevice!=null)
+			return m_gpsDevice.getDateNmea();
+		else return null;
+	}
+
+	public String getLastSentence() {
+		if(m_useGpsd)
+			return m_GpsdLastSentence;
+		else if(m_gpsDevice!=null)
+			return m_gpsDevice.getLastSentence();
+		else return null;
+	}
+
+	public void handleEvent(Event event) {
+		if(!m_useGpsd){
+			if(UsbDeviceAddedEvent.USB_EVENT_DEVICE_ADDED_TOPIC.contains(event.getTopic())){
+				if(serialPortExists()){
+					s_logger.debug("GPS connected");
+
+					//we already have properties - just do it
+					try {
+						if(!m_isRunning) {
+							configureGpsDevice();
+							start();
+						}
+					} catch(Exception e) {
+						e.printStackTrace();
+					}
+				}
+			}
+			else if(UsbDeviceRemovedEvent.USB_EVENT_DEVICE_REMOVED_TOPIC.contains(event.getTopic())){
+				if(!serialPortExists()) {
+					s_logger.debug("GPS disconnected");
+					stop();
+				}
+			}
+		}
+	}
+
+	private void start() {
+		s_logger.debug("PositionService configured and starting");
+		stopThread = false;
+		if (monitorTask == null) {
+			monitorTask = m_executor.submit(new Runnable() {
+				public void run() {
+					Thread.currentThread().setName("PositionServiceImpl");
+					while(!stopThread) {
+						performPoll();
+						try {
+							Thread.sleep(pollInterval);
+						} catch (InterruptedException e) {
+							//e.printStackTrace();
+							//exit silently ...
+						};
+					}
+				}
+			});
+		}
+
+		m_isRunning = true;
+	}
+
+	private void stop() {
+		s_logger.debug("PositionService stopping");
+		if ((monitorTask != null) && (!monitorTask.isDone())) {
+			stopThread = true;
+			monitorTask.cancel(true);
+			monitorTask = null;
+		}		
+		if(m_gpsDevice!=null) {
+			m_gpsDevice.disconnect();
+		}
+
+		m_configured = false;		
+		m_configEnabled = false;
+		m_isRunning = false;
+		m_hasLock = false;
+	}
+
+	private void initializeDefaultPosition(double lat, double lon, double alt){
+		Measurement l_latitude = new Measurement(java.lang.Math.toRadians(lat),Unit.rad);
+		Measurement l_longitude = new Measurement(java.lang.Math.toRadians(lon),Unit.rad);					
+		Measurement l_altitude = new Measurement(alt,Unit.m); 
+		Measurement l_speed = new Measurement(0,Unit.m_s); // conversion speed in knots to m/s : 1 m/s = 1.94384449 knots
+		Measurement l_track = new Measurement(java.lang.Math.toRadians(0),Unit.rad); 
+		double l_latitudeNmea = lat;
+		double l_longitudeNmea = lon;					
+		double l_altitudeNmea = alt; 
+		double l_speedNmea = 0;
+		double l_trackNmea = 0; 
+		int l_fixQuality = 0;
+		int l_nrSatellites = 0;
+		double l_DOP = 0;
+		double l_PDOP = 0;
+		double l_HDOP = 0;
+		double l_VDOP = 0;
+		int l_3Dfix = 0;
+
+		m_defaultPosition = new Position(l_latitude, l_longitude, l_altitude, l_speed, l_track);
+		m_defaultNmeaPosition = new NmeaPosition(l_latitudeNmea, l_longitudeNmea, l_altitudeNmea, l_speedNmea, l_trackNmea, 
+				l_fixQuality, l_nrSatellites, l_DOP, l_PDOP, l_HDOP, l_VDOP, l_3Dfix);
+
+		m_GpsdPosition = new Position(l_latitude, l_longitude, l_altitude, l_speed, l_track);
+		m_GpsdNmeaPosition = new NmeaPosition(l_latitudeNmea, l_longitudeNmea, l_altitudeNmea, l_speedNmea, l_trackNmea, 
+				l_fixQuality, l_nrSatellites, l_DOP, l_PDOP, l_HDOP, l_VDOP, l_3Dfix);
+	}
+
+	private void performPoll() {		
+		if(m_configEnabled && m_configured){
+			boolean isValidPosition;
+			if(m_useGpsd)isValidPosition=m_GpsdIsValidPosition;
+			else isValidPosition=m_gpsDevice.isValidPosition();
+			if(isValidPosition){
+				if(!m_hasLock){
+					m_hasLock=true;
+					m_eventAdmin.postEvent( new PositionLockedEvent( new HashMap<String,Object>()));
+					s_logger.info("The Position is valid");
+					if(!m_useGpsd){
+						s_logger.info(m_gpsDevice.getLastSentence());
+						s_logger.info(m_gpsDevice.toString());
+					}
+				}
+			}
+			else{
+				if(m_hasLock){
+					m_hasLock=false;
+					m_eventAdmin.postEvent( new PositionLostEvent( new HashMap<String,Object>()));
+					s_logger.info("The Position is not valid");
+					if(!m_useGpsd){
+						s_logger.info(m_gpsDevice.getLastSentence());
+					}
+				}
+			}
+		}
+	}
+
+	private void configureGpsDevice() throws Exception {
+
+		Properties serialProperties = getSerialConnectionProperties();			
+		if(serialProperties == null) 
+			return;
+
+		if(m_gpsDevice!=null){
+			m_gpsDevice.disconnect();
+			m_gpsDevice=null;
+		}
+
+		if(!serialPortExists()) {
+			s_logger.warn("GPS device is not present - waiting for it to be ready");
+			return;
+		}
+
+		try {
+
+			//Properties serialProperties = getSerialConnectionProperties();			
+			if(serialProperties != null) {
+
+				s_logger.debug("Connecting to serial port: " + serialProperties.getProperty("port"));
+
+				// configure connection & protocol
+				GpsDevice gpsDevice = new GpsDevice();
+				gpsDevice.configureConnection(m_connectionFactory, serialProperties);
+				gpsDevice.configureProtocol(getProtocolProperties());	
+				m_gpsDevice = gpsDevice;
+				m_configured = true;
+			}
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
+	private boolean serialPortExists()
+	{
+		String portName;
+		if(m_properties != null){				
+			if(m_properties.get("port") != null){
+				portName = (String) m_properties.get("port");
+
+				if(portName != null) {
+					if(portName.contains("/dev/")) {
+						File f = new File(portName);
+						if(f.exists()) {
+							return true;
+						}
+					} else {
+						List<UsbTtyDevice> utd = m_usbService.getUsbTtyDevices();	
+						if(utd!=null){
+							for (UsbTtyDevice u : utd) {
+								if(portName.equals(u.getUsbPort())) {
+									return true;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	private Properties getSerialConnectionProperties() {
+		Properties prop = new Properties();
+
+		if(m_properties!=null){
+			String portName = null;
+			int baudRate = -1;
+			int bitsPerWord = -1;
+			int stopBits = -1;
+			int parity = -1;
+
+			if(m_properties.get("enabled") != null) {
+				m_configEnabled = (Boolean)m_properties.get("enabled");
+				if(!m_configEnabled) {
+					return null;
+				}
+			} else {
+				m_configEnabled = false;
+				return null;
+			}
+
+			portName = (String) m_properties.get("port");
+			if(portName != null && !portName.contains("/dev/")) {
+				List<UsbTtyDevice> utds = m_usbService.getUsbTtyDevices();
+				for(UsbTtyDevice utd : utds) {
+					if(utd.getUsbPort().equals(portName)) {
+						portName = utd.getDeviceNode();
+						break;
+					}
+				}
+			}
+			if(m_properties.get("baudRate") != null) baudRate 		= (Integer) m_properties.get("baudRate");
+			if(m_properties.get("bitsPerWord") != null) bitsPerWord = (Integer) m_properties.get("bitsPerWord");
+			if(m_properties.get("stopBits") != null) stopBits 		= (Integer) m_properties.get("stopBits");
+			if(m_properties.get("parity") != null) parity 			= (Integer) m_properties.get("parity");
+
+			if(portName==null)
+				return null;			
+			prop.setProperty("port", portName);
+			prop.setProperty("baudRate", Integer.toString(baudRate));
+			prop.setProperty("stopBits", Integer.toString(stopBits));
+			prop.setProperty("parity", Integer.toString(parity));
+			prop.setProperty("bitsPerWord", Integer.toString(bitsPerWord));
+
+			s_logger.debug("port name: " + portName);
+			s_logger.debug("baud rate " + baudRate);
+			s_logger.debug("stop bits " + stopBits);
+			s_logger.debug("parity " + parity);
+			s_logger.debug("bits per word " + bitsPerWord);
+			return prop;
+		} else {
+			return null;
+		}
+	}
+
+	private Properties getProtocolProperties() {
+		Properties prop = new Properties();
+
+		prop.setProperty("unitName", "Gps");
+
+		return prop;
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.usb/.gitignore b/kura/org.eclipse.kura.linux.usb/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.usb/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.usb/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..ea1fd7a8539d5fce76adfdf3e555f1e517fb4450
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.usb
+Bundle-SymbolicName: org.eclipse.kura.linux.usb;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Bundle-NativeCode: lib/linux/x86/libEurotechLinuxUdev.so; osname=Linux; processor=x86,
+ lib/linux/x86_64/libEurotechLinuxUdev.so; osname=Linux; processor=x86-64,
+ lib/linux/armv6_hf/libEurotechLinuxUdev.so; osname=Linux; processor=ARM; selection-filter="(&(kura.arch=armv7_hf))",
+ lib/linux/armv5_sf/libEurotechLinuxUdev.so; osname=Linux; processor=ARM; selection-filter="(&(kura.arch=armv7_sf))",
+ lib/linux/armv6_hf/libEurotechLinuxUdev.so; osname=Linux; processor=ARM; selection-filter="(&(kura.arch=armv6_hf))",
+ lib/linux/armv5_sf/libEurotechLinuxUdev.so; osname=Linux; processor=ARM; selection-filter="(&(kura.arch=armv6_sf))",
+ lib/linux/armv5_sf/libEurotechLinuxUdev.so; osname=Linux; processor=ARM; selection-filter="(&(kura.arch=armv5_sf))",
+ *
+Import-Package: com.ibm.jusb;version="1.0.2",
+ com.ibm.jusb.event;version="1.0.2",
+ com.ibm.jusb.os;version="1.0.2",
+ com.ibm.jusb.util;version="1.0.2",
+ javax.usb;version="1.0.2",
+ javax.usb.event;version="1.0.2",
+ javax.usb.util;version="1.0.2",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.linux.udev,
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+
diff --git a/kura/org.eclipse.kura.linux.usb/OSGI-INF/usb.xml b/kura/org.eclipse.kura.linux.usb/OSGI-INF/usb.xml
new file mode 100644
index 0000000000000000000000000000000000000000..371c00b8084b04ae99186b5f842471c7b02dec5d
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/OSGI-INF/usb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" name="org.eclipse.kura.usb.UsbService">
+   <implementation class="org.eclipse.kura.linux.usb.UsbServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.usb.UsbService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.usb.UsbService"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="dynamic" unbind="unsetEventAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.usb/about.html b/kura/org.eclipse.kura.linux.usb/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.usb/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.usb/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.usb/build.properties b/kura/org.eclipse.kura.linux.usb/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4c07afe06297f174cc4d4e8c7270270ae741ecf7
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/build.properties
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/,\
+               lib/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     javax.usb.api,\
+                     javax.usb.common,\
+                     org.eclipse.equinox.io,\
+                     org.eclipse.kura.core
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.linux.usb/lib/cgi-0.6.jar b/kura/org.eclipse.kura.linux.usb/lib/cgi-0.6.jar
new file mode 100644
index 0000000000000000000000000000000000000000..42ae018b3fe7136e4e57aedad80578cad8dface6
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/cgi-0.6.jar differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/debug-disable-1.1.jar b/kura/org.eclipse.kura.linux.usb/lib/debug-disable-1.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..399390f844a3e53a06b29a48e9b825445a7607b1
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/debug-disable-1.1.jar differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/debug-enable-1.1.jar b/kura/org.eclipse.kura.linux.usb/lib/debug-enable-1.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..488c8834abbb4c185d89928d29887bcdfa26974f
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/debug-enable-1.1.jar differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/hexdump-0.2.jar b/kura/org.eclipse.kura.linux.usb/lib/hexdump-0.2.jar
new file mode 100644
index 0000000000000000000000000000000000000000..976b68ceb28882ea8188e820def1031b3fdf4fae
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/hexdump-0.2.jar differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/io-0.1.jar b/kura/org.eclipse.kura.linux.usb/lib/io-0.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d7ca2ce5b497dd3739c27cce04d702e1a05e3dec
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/io-0.1.jar differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/armv5_sf/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/armv5_sf/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..daf22d67e21634c11f215ad6129c530a86f249cd
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/armv5_sf/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/armv5_sf/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/armv5_sf/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..dfc9dcd38fdf12eea2c81f302103c9c2070d51e9
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/armv5_sf/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/armv6_hf/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/armv6_hf/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..6f2e72d4e7ee732eef0b02223d37f80febcfd15d
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/armv6_hf/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/armv6_hf/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/armv6_hf/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..48a752fb1c08f9f68b46c2c719e489de99fa04b9
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/armv6_hf/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..3126b0fde0d2cfc1d0de1084b92a2828d21514b7
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..48a752fb1c08f9f68b46c2c719e489de99fa04b9
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/raspberry-pi/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/raspberry-pi/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..6f2e72d4e7ee732eef0b02223d37f80febcfd15d
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/raspberry-pi/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/raspberry-pi/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/raspberry-pi/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..48a752fb1c08f9f68b46c2c719e489de99fa04b9
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/raspberry-pi/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux32/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux32/libEurotechLinuxUdev.so
new file mode 100644
index 0000000000000000000000000000000000000000..3ba199965f4a740e0200f632987ee8ef4a56e947
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux32/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux32/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux32/libJavaxUsb.so
new file mode 100644
index 0000000000000000000000000000000000000000..7d31bcc668b32a06436f05c97a2618d2eac1156d
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux32/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux64/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux64/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..770cd362757bf5749d3c1285e68d71bb8c237722
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux64/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux64/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux64/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..a16402a3d05993b8eef5eca13db5413f5d972946
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/old/x86/linux64/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/x86/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/x86/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..af3e6352f3b9ee3923a72a0dd02a23e068728e55
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/x86/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/x86/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/x86/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..d7d32d097245ef57a98878ab853bb55cf430f348
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/x86/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/x86_64/libEurotechLinuxUdev.so b/kura/org.eclipse.kura.linux.usb/lib/linux/x86_64/libEurotechLinuxUdev.so
new file mode 100755
index 0000000000000000000000000000000000000000..8e93b4dcbc56d10c821ba98edeef2c1d476bd556
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/x86_64/libEurotechLinuxUdev.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/linux/x86_64/libJavaxUsb.so b/kura/org.eclipse.kura.linux.usb/lib/linux/x86_64/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..e93af2b9c764c65e1a679b4c4a2c5a8daa5ad63f
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/linux/x86_64/libJavaxUsb.so differ
diff --git a/kura/org.eclipse.kura.linux.usb/lib/unix-0.5.jar b/kura/org.eclipse.kura.linux.usb/lib/unix-0.5.jar
new file mode 100644
index 0000000000000000000000000000000000000000..13846ec82546bf1d885c5eca60a9b49aa9673434
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/lib/unix-0.5.jar differ
diff --git a/kura/org.eclipse.kura.linux.usb/pom.xml b/kura/org.eclipse.kura.linux.usb/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fbf5e159e20456df5ed88e565ef290d1af5dd62f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.usb</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsb.h b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsb.h
new file mode 100644
index 0000000000000000000000000000000000000000..a93fa5dccbef18861cc4eca3c40e3b79378592a9
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsb.h
@@ -0,0 +1,289 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAXUSBUTIL_H
+#define _JAVAXUSBUTIL_H
+
+#include "com_ibm_jusb_os_linux_JavaxUsb.h"
+#include "JavaxUsbLog.h"
+#include "JavaxUsbChecks.h"
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/poll.h>
+#include <sys/time.h>
+#include <sys/dir.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <pthread.h>
+#include <errno.h>
+
+/* Need to include this last or gcc will give warnings */
+#include "JavaxUsbKernel.h"
+
+#define MAX_LINE_LENGTH 255
+#define MAX_KEY_LENGTH 255
+#define MAX_PATH_LENGTH 255
+
+#define MAX_POLLING_ERRORS 64
+
+/* These must match the defines in JavaxUsb.java */
+#define SPEED_UNKNOWN 0
+#define SPEED_LOW 1
+#define SPEED_FULL 2
+
+//******************************************************************************
+// Descriptor structs 
+
+struct jusb_device_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned short bcdUSB;
+	unsigned char bDeviceClass;
+	unsigned char bDeviceSubClass;
+	unsigned char bDeviceProtocol;
+	unsigned char bMaxPacketSize0;
+	unsigned short idVendor;
+	unsigned short idProduct;
+	unsigned short bcdDevice;
+	unsigned char iManufacturer;
+	unsigned char iProduct;
+	unsigned char iSerialNumber;
+	unsigned char bNumConfigurations;
+};
+
+struct jusb_config_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned short wTotalLength;
+	unsigned char bNumInterfaces;
+	unsigned char bConfigurationValue;
+	unsigned char iConfiguration;
+	unsigned char bmAttributes;
+	unsigned char bMaxPower;
+};
+
+struct jusb_interface_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned char bInterfaceNumber;
+	unsigned char bAlternateSetting;
+	unsigned char bNumEndpoints;
+	unsigned char bInterfaceClass;
+	unsigned char bInterfaceSubClass;
+	unsigned char bInterfaceProtocol;
+	unsigned char iInterface;
+};
+
+struct jusb_endpoint_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned char bEndpointAddress;
+	unsigned char bmAttributes;
+	unsigned short wMaxPacketSize;
+	unsigned char bInterval;
+};
+
+struct jusb_string_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned char bString[254];
+};
+
+//******************************************************************************
+// Request methods
+
+int pipe_request( JNIEnv *env, int fd, jobject linuxRequest );
+int isochronous_request( JNIEnv *env, int fd, jobject linuxRequest );
+
+void cancel_pipe_request( JNIEnv *env, int fd, jobject linuxRequest );
+void cancel_isochronous_request( JNIEnv *env, int fd, jobject linuxRequest );
+
+int complete_pipe_request( JNIEnv *env, jobject linuxRequest );
+int complete_isochronous_request( JNIEnv *env, jobject linuxRequest );
+
+int set_configuration( JNIEnv *env, int fd, jobject linuxRequest );
+int set_interface( JNIEnv *env, int fd, jobject linuxRequest );
+
+int claim_interface( JNIEnv *env, int fd, int claim, jobject linuxRequest );
+int is_claimed( JNIEnv *env, int fd, jobject linuxRequest );
+
+int control_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int bulk_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int interrupt_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int isochronous_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+
+int complete_control_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int complete_bulk_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int complete_interrupt_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int complete_isochronous_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+
+//******************************************************************************
+// Config and Interface active checking methods
+
+/* Pick a way to determine active config.
+ *
+ * Most of these generate bus traffic to one or more devices.
+ * This is BAD when using non-queueing (up to 2.5.44) UHCI Host Controller Driver,
+ * as it can interfere with other drivers and the results are unpredictable - ranging
+ * from nothing to complete loss of use of the device(s).
+ *
+ * CONFIG_SETTING_ASK_DEVICE:
+ * Asking the device directly is the best available way,
+ * as bus traffic is generated only for the specific device in question,
+ * and only 1 standard request.
+ *
+ * CONFIG_SETTING_USE_DEVICES_FILE:
+ * Reading/parsing the /proc/bus/usb/devices file generates bus traffic,
+ * by asking ALL connected devices for their 3 standard String-descriptors;
+ * Manufacturer, Product, and SerialNumber.  This is a lot of bus traffic and
+ * can cause problems with any or all connected devices (if using a non-queueing UHCI driver).
+ *
+ * CONFIG_SETTING_1_ALWAYS_ACTIVE:
+ * This does not communicate with the device at all, but always marks the first
+ * configuration (number 1, as configs must be numbered consecutively starting with 1)
+ * as active.  This should work for all devices, but will produce incorrect results
+ * for devices whose active configuration has been changed outside of the current javax.usb
+ * instance.
+ *
+ * All or none may be used, attempts are in order shown, failure moves to the next one.
+ * If none are defined (or all fail) then the result will be no configs active, i.e.
+ * the device will appear to be (but will not really be) in a Not Configured state.
+ *
+ * Most people want at least the CONFIG_1_ALWAYS_ACTIVE define, as it is always
+ * the last attempted and will do the right thing in many more cases than leaving the
+ * device to appear as Not Configured.
+ */
+#define CONFIG_SETTING_ASK_DEVICE
+#undef CONFIG_SETTING_USE_DEVICES_FILE
+#define CONFIG_SETTING_1_ALWAYS_ACTIVE
+
+/* Pick a way to determine active interface alternate setting.
+ *
+ * INTERFACE_SETTING_ASK_DEVICE:
+ * This directly asks the device in the same manner as above.  The only difference is,
+ * to communicate with an interface, the interface must be claimed;
+ * for a device that already has a driver (which is usually most devices)
+ * this will not work since the interface will already be claimed.
+ *
+ * INTERFACE_SETTING_USE_DEVICES_FILE:
+ * This uses the /proc/bus/usb/devices file in the same manner as above.
+ * However, until kernel 2.5.XX, the devices file does not provide active
+ * interface setting information, so this will fail on those kernels.
+ *
+ * If none are defined (or all fail) then the result will be first setting is active.
+ */
+#undef INTERFACE_SETTING_ASK_DEVICE
+#undef INTERFACE_SETTING_USE_DEVICES_FILE
+
+int getActiveConfig( JNIEnv *env, int fd, unsigned char bus, unsigned char dev );
+int getActiveInterfaceSetting( JNIEnv *env, int fd, unsigned char bus, unsigned char dev, unsigned char interface );
+
+//******************************************************************************
+// Utility methods
+
+static inline unsigned short bcd( unsigned char msb, unsigned char lsb ) 
+{
+    return ( (msb << 8) & 0xff00 ) | ( lsb & 0x00ff );
+}
+
+static inline int open_device( JNIEnv *env, jstring javaKey, int oflag ) 
+{
+	const char *node;
+	int filed;
+
+	node = (*env)->GetStringUTFChars( env, javaKey, NULL );
+	log( LOG_INFO, "Opening node %s", node );
+	if (0 > (filed = open( node, oflag )))
+		log( LOG_ERROR, "Could not open node %s : %s", node, strerror(errno) );
+	(*env)->ReleaseStringUTFChars( env, javaKey, node );
+	return filed;
+}
+
+static inline int bus_node_to_name( int bus, int node, char *name )
+{
+	sprintf( name, usbdevfs_sprintf_node(), bus, node );
+	return strlen( name );
+}
+
+static inline int get_busnum_from_name( const char *name )
+{
+	int bus, node;
+	if (1 > (sscanf( name, usbdevfs_sscanf_node(), &bus, &node )))
+		return -1;
+	else return bus;
+}
+
+static inline int get_busnum_from_jname( JNIEnv *env, jstring jname )
+{
+	const char *name = (*env)->GetStringUTFChars( env, jname, NULL );
+	int busnum = get_busnum_from_name( name );
+	(*env)->ReleaseStringUTFChars( env, jname, name );
+	return busnum;
+}
+
+static inline int get_devnum_from_name( const char *name )
+{
+	int bus, node;
+	if (2 > (sscanf( name, usbdevfs_sscanf_node(), &bus, &node )))
+		return -1;
+	else return node;
+}
+
+static inline int get_devnum_from_jname( JNIEnv *env, jstring jname )
+{
+	const char *name = (*env)->GetStringUTFChars( env, jname, NULL );
+	int devnum = get_devnum_from_name( name );
+	(*env)->ReleaseStringUTFChars( env, jname, name );
+	return devnum;
+}
+
+/**
+ * Debug a URB.
+ * @env The JNIEnv*.
+ * @param calling_method The name of the calling method.
+ * @param urb The usbdevfs_urb.
+ */
+static inline void debug_urb( JNIEnv *env, char *calling_method, struct usbdevfs_urb *urb )
+{
+	if (!tracing)
+		return;
+
+//FIXME - add device number and/or other dev info
+	log( LOG_URB_METADATA, "%s : URB address = %p", calling_method, urb );
+	log( LOG_URB_METADATA, "%s : URB endpoint = %x status = %d signal = %x", calling_method, urb->endpoint, urb->status, urb->signr );
+	log( LOG_URB_METADATA, "%s : URB buffer length = %d actual length = %d", calling_method, urb->buffer_length, urb->actual_length );
+
+	if (urb->buffer && (0 < urb->buffer_length)) {
+		static const char hex[] = "0123456789abcdef";
+		int i, loglen = (3*urb->buffer_length);
+		char logbuf[loglen], *bufp = logbuf;
+		char* p = (char *)urb->buffer;
+		for (i=0; i<urb->buffer_length; i++) {
+			int c = *p++;
+			*bufp++ = hex[(c>>4)&0xf]; // index to array
+			*bufp++ = hex[c&0xf]; // index to array
+			*bufp++ = ' ';
+		}
+		logbuf[loglen-1] = 0; // null terminate string
+		log( LOG_URB_DATA, "%s : URB data = %s", calling_method, logbuf );
+ 	} else {
+ 		log( LOG_URB_DATA, "%s : URB data empty", calling_method );
+ 	}
+}
+
+#endif /* _JAVAXUSBUTIL_H */
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbActive.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbActive.c
new file mode 100644
index 0000000000000000000000000000000000000000..357dcb72da90138e5d6c19d1d3164b4348a4858f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbActive.c
@@ -0,0 +1,392 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+/* This file uses getline(), a GNU extention */
+#define _GNU_SOURCE
+
+#include "JavaxUsb.h"
+
+#ifdef CONFIG_SETTING_USE_DEVICES_FILE
+static int config_use_devices_file( JNIEnv *env, unsigned char bus, unsigned char dev )
+{
+	FILE *file = NULL;
+#define LINELEN 1024
+	ssize_t linelen, len;
+	char *line = NULL, busstr[32], devstr[32];
+	int in_dev = 0;
+	int ret = -1;
+	int config;
+
+	if (!(line = malloc(LINELEN))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto end;
+	}
+
+	linelen = LINELEN - 1;
+
+	sprintf(busstr, "Bus=%2.2d", bus);
+	sprintf(devstr, "Dev#=%3d", dev);
+#define cfgstr "Cfg#=%2d"
+
+	errno = 0;
+	if (!(file = fopen(usbdevfs_devices_filename(), "r"))) {
+		log( LOG_HOTPLUG_ERROR, "Could not open %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+		ret = -errno
+		goto end;
+	}
+
+	log( LOG_HOTPLUG_OTHER, "Checking %s", usbdevfs_devices_filename() );
+
+	while (1) {
+		memset(line, 0, LINELEN);
+
+		errno = 0;
+		if (0 > (len = getline(&line, &linelen, file))) {
+			log( LOG_HOTPLUG_ERROR, "Could not read from %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+			ret = -errno;
+			break;
+		}
+
+		if (!len) {
+			log( LOG_HOTPLUG_ERROR, "No device matching %s/%s found!", busstr, devstr );
+			ret = -ENODEV;
+			break;
+		}
+
+		if (strstr(line, "T:")) {
+			if (in_dev) {
+				log( LOG_HOTPLUG_ERROR, "No active config found in device %s/%s!", cfgstr, busstr, devstr );
+				ret = -EINVAL;
+				break;
+			}
+			if (strstr(line, busstr) && strstr(line, devstr)) {
+				log( LOG_HOTPLUG_OTHER, "Found section for device %s/%s", busstr, devstr );
+				in_dev = 1;
+				continue;
+			}
+		}
+
+		if (in_dev && strstr(line, "C:*")) {
+			if (1 == sscanf(line, cfgstr, config)) {
+				ret = config;
+				break;
+			}
+		}
+	}
+
+end:
+	if (line) free(line);
+	if (file) fclose(file);
+
+	return ret;
+}
+#endif /* CONFIG_SETTING_USE_DEVICES_FILE */
+
+#ifdef INTERFACE_SETTING_USE_DEVICES_FILE
+static int interface_use_devices_file( JNIEnv *env, unsigned char bus, unsigned char dev, unsigned char interface )
+{
+	FILE *file = NULL;
+#define LINELEN 1024
+	ssize_t linelen, len;
+	char *line = NULL, busstr[32], devstr[32], cfgstr[32], ifstr[32];
+	int in_dev = 0, in_cfg = 0;
+	int ret = -1;
+	int setting;
+
+	if (!(line = malloc(LINELEN))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		goto end;
+	}
+
+	linelen = LINELEN - 1;
+
+	sprintf(busstr, "Bus=%2.2d", bus);
+	sprintf(devstr, "Dev#=%3d", dev);
+	sprintf(ifstr, "If#=%2d", interface );
+#define setstr "Alt=%2d"
+
+	errno = 0;
+	if (!(file = fopen(usbdevfs_devices_filename(), "r"))) {
+		log( LOG_HOTPLUG_ERROR, "Could not open %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+		ret = -errno;
+		goto end;
+	}
+
+	log( LOG_HOTPLUG_OTHER, "Checking %s", usbdevfs_devices_filename() );
+
+	while (1) {
+		memset(line, 0, LINELEN);
+
+		errno = 0;
+		if (0 > (len = getline(&line, &linelen, file))) {
+			log( LOG_HOTPLUG_ERROR, "Could not read from %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+			ret = -errno;
+			break;
+		}
+
+		if (!len) {
+			log( LOG_HOTPLUG_ERROR, "No device matching %s/%s found!", busstr, devstr );
+			ret = -ENODEV;
+			break;
+		}
+
+		if (strstr(line, "T:")) {
+			if (in_dev) {
+				log( LOG_HOTPLUG_ERROR, "No config matching %s found in device %s/%s!", cfgstr, busstr, devstr );
+				ret = -EINVAL;
+				break;
+			}
+			if (strstr(line, busstr) && strstr(line, devstr)) {
+				log( LOG_HOTPLUG_OTHER, "Found section for device %s/%s", busstr, devstr );
+				in_dev = 1;
+				continue;
+			}
+		}
+
+		if (in_dev && strstr(line, "C:*")) {
+			in_cfg = 1;
+			continue;
+		}
+
+		if (in_cfg) {
+			if (strstr(line, "C:")) {
+				log( LOG_HOTPLUG_ERROR, "No active interface matching %s found in device %s/%s for active config!", ifstr, busstr, devstr );
+				ret = -EINVAL;
+				break;
+			}
+			if (strstr(line, ifstr) && strstr(line, "I:*")) {
+				if (1 == sscanf(line, setstr, setting)) {
+					ret = setting;
+					break;
+				}
+			}
+		}
+	}
+
+end:
+	if (line) free(line);
+	if (file) fclose(file);
+
+	return ret;
+}
+#endif /* INTERFACE_SETTING_USE_DEVICES_FILE */
+
+#ifdef CONFIG_SETTING_ASK_DEVICE
+#define CONFIG_ASK_DEVICE_TIMEOUT 500 /* ms */
+static int config_ask_device( JNIEnv *env, int fd )
+{
+	int ret = 0;
+
+	struct usbdevfs_ctrltransfer *ctrl = NULL;
+	unsigned char *actconfig = NULL;
+
+	if (!(ctrl = malloc(sizeof(*ctrl))) || !(actconfig = malloc(1))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto CONFIG_ASK_DEVICE_END;
+	}
+
+	*actconfig = 0;
+
+	ctrl->bmRequestType = (unsigned char)0x80;
+	ctrl->bRequest = 0x08;
+	ctrl->wValue = 0x00;
+	ctrl->wIndex = 0x00;
+	ctrl->wLength = 1;
+	ctrl->timeout = CONFIG_ASK_DEVICE_TIMEOUT;
+	ctrl->data = actconfig;
+
+	errno = 0;
+	if (0 > (ioctl(fd, USBDEVFS_CONTROL, ctrl))) {
+		log( LOG_HOTPLUG_ERROR, "Could not get active configuration from device : %s", strerror(errno) );
+		ret = -errno;
+	} else {
+		log( LOG_HOTPLUG_OTHER, "Active device configuration is %d", *actconfig );
+		ret = *actconfig;
+	}
+
+CONFIG_ASK_DEVICE_END:
+	if (ctrl) free(ctrl);
+	if (actconfig) free(actconfig);
+
+	return ret;
+}
+#endif /* CONFIG_SETTING_ASK_DEVICE */
+
+#ifdef INTERFACE_SETTING_ASK_DEVICE
+#define INTERFACE_ASK_DEVICE_TIMEOUT 500 /* ms */
+static int interface_ask_device( JNIEnv *env, int fd, unsigned char interface )
+{
+	int ret = 0;
+
+	struct javaxusb_usbdevfs_ctrltransfer *ctrl = NULL;
+	unsigned char *actsetting = NULL;
+
+	if (!(ctrl = malloc(sizeof(*ctrl))) || !(actsetting = malloc(1))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto INTERFACE_ASK_DEVICE_END;
+	}
+
+	*actsetting = 0;
+
+	ctrl->bmRequestType = (unsigned char)0x81;
+	ctrl->bRequest = 0x0a;
+	ctrl->wValue = 0x00;
+	ctrl->wIndex = interface;
+	ctrl->wLength = 1;
+	ctrl->timeout = INTERFACE_ASK_DEVICE_TIMEOUT;
+	ctrl->data = actsetting;
+
+	errno = 0;
+	if (0 > (ioctl(fd, USBDEVFS_CONTROL, ctrl))) {
+		log( LOG_HOTPLUG_ERROR, "Could not get active interface %d setting from device : %s", interface, strerror(errno) );
+		ret = -errno;
+	} else {
+		log( LOG_HOTPLUG_OTHER, "Active interface %d setting is %d", interface, *actsetting );
+		ret = *actsetting;
+	}
+
+INTERFACE_ASK_DEVICE_END:
+	if (ctrl) free(ctrl);
+	if (actsetting) free(actsetting);
+
+	return ret;
+}
+#endif /* INTERFACE_SETTING_ASK_DEVICE */
+
+int getActiveConfig( JNIEnv *env, int fd, unsigned char bus, unsigned char dev )
+{
+	int ret = -1; /* -1 = failure */
+
+#ifdef CONFIG_SETTING_ASK_DEVICE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active config using GET_CONFIGURATION standard request." );
+		ret = config_ask_device( env, fd );
+		log( LOG_HOTPLUG_OTHER, "Device returned %d%s.", ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+#ifdef CONFIG_SETTING_USE_DEVICES_FILE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active config using %s.", usbdevfs_devices_filename() );
+		ret = config_use_devices_file( env, bus, dev );
+		log( LOG_HOTPLUG_OTHER, "%s returned %d%s.", usbdevfs_devices_filename(), ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+#ifdef CONFIG_SETTING_1_ALWAYS_ACTIVE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Returning config 1 as active; no checking." );
+		ret = 1;
+	}
+#endif
+
+	return ret;
+}
+
+int getActiveInterfaceSetting( JNIEnv *env, int fd, unsigned char bus, unsigned char dev, unsigned char interface )
+{
+	int ret = -1; /* -1 = failure  */
+
+#ifdef INTERFACE_SETTING_ASK_DEVICE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active interface %d setting using GET_INTERFACE standard request.", interface );
+		ret = interface_ask_device( env, fd, interface );
+		log( LOG_HOTPLUG_OTHER, "Device returned %d%s.", ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+#ifdef INTERFACE_SETTING_USE_DEVICES_FILE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active interface %d setting using %s.", interface, usbdevfs_devices_filename() );
+		ret = interface_use_devices_file( env, bus, dev, interface );
+		log( LOG_HOTPLUG_OTHER, "%s returned %d%s.", usbdevfs_devices_filename(), ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+
+	return ret;
+}
+
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveConfigurationNumber
+(JNIEnv *env, jclass JavaxUsb, jobject linuxDeviceOsImp)
+{
+	int fd;
+	unsigned char busnum, devnum;
+	int configNumber;
+
+	jclass LinuxDeviceOsImp = NULL, LinuxDeviceProxy = NULL;
+	jobject linuxDeviceProxy = NULL;
+	jfieldID linuxDeviceProxyID;
+	jmethodID getKey;
+	jstring jname = NULL;
+
+	LinuxDeviceOsImp = CheckedGetObjectClass( env, linuxDeviceOsImp );
+	linuxDeviceProxyID = CheckedGetFieldID( env, LinuxDeviceOsImp, "linuxDeviceProxy", "Lcom/ibm/jusb/os/linux/LinuxDeviceProxy;" );
+	linuxDeviceProxy = (*env)->GetObjectField( env, linuxDeviceOsImp, linuxDeviceProxyID );
+	LinuxDeviceProxy = CheckedGetObjectClass( env, linuxDeviceProxy );
+	getKey = CheckedGetMethodID( env, LinuxDeviceProxy, "getKey", "()Ljava/lang/String;" );
+	jname = (jstring)CheckedCallObjectMethod( env, linuxDeviceProxy, getKey );
+	(*env)->DeleteLocalRef( env, LinuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, linuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, LinuxDeviceOsImp );
+
+	if (0 > (fd = open_device( env, jname, O_RDWR ))) {
+		(*env)->DeleteLocalRef( env, jname );
+		return errno ? -errno : -1;
+	}
+
+	busnum = (unsigned char)get_busnum_from_jname( env, jname );
+	devnum = (unsigned char)get_devnum_from_jname( env, jname );
+
+	configNumber = getActiveConfig( env, fd, busnum, devnum );
+
+	close(fd);
+	(*env)->DeleteLocalRef( env, jname );
+
+	return (jint)configNumber;
+}
+
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveInterfaceSettingNumber
+(JNIEnv *env, jclass JavaxUsb, jobject linuxDeviceOsImp, jint interfaceNumber)
+{
+	int fd;
+	unsigned char busnum, devnum;
+	int settingNumber;
+
+	jclass LinuxDeviceOsImp = NULL, LinuxDeviceProxy = NULL;
+	jobject linuxDeviceProxy = NULL;
+	jfieldID linuxDeviceProxyID;
+	jmethodID getKey;
+	jstring jname = NULL;
+
+	LinuxDeviceOsImp = CheckedGetObjectClass( env, linuxDeviceOsImp );
+	linuxDeviceProxyID = CheckedGetFieldID( env, LinuxDeviceOsImp, "linuxDeviceProxy", "Lcom/ibm/jusb/os/linux/LinuxDeviceProxy;" );
+	linuxDeviceProxy = (*env)->GetObjectField( env, linuxDeviceOsImp, linuxDeviceProxyID );
+	LinuxDeviceProxy = CheckedGetObjectClass( env, linuxDeviceProxy );
+	getKey = CheckedGetMethodID( env, LinuxDeviceProxy, "getKey", "()Ljava/lang/String;" );
+	jname = (jstring)CheckedCallObjectMethod( env, linuxDeviceProxy, getKey );
+	(*env)->DeleteLocalRef( env, LinuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, linuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, LinuxDeviceOsImp );
+
+	if (0 > (fd = open_device( env, jname, O_RDWR ))) {
+		(*env)->DeleteLocalRef( env, jname );
+		return errno ? -errno : -1;
+	}
+
+	busnum = (unsigned char)get_busnum_from_jname( env, jname );
+	devnum = (unsigned char)get_devnum_from_jname( env, jname );
+
+	settingNumber = getActiveInterfaceSetting( env, fd, busnum, devnum, (unsigned char)interfaceNumber );
+
+	close(fd);
+	(*env)->DeleteLocalRef( env, jname );
+
+	return (jint)settingNumber;	
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbBulkRequest.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbBulkRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..db50e9ec84047bc37ed193eede02d2c9b33ac72b
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbBulkRequest.c
@@ -0,0 +1,94 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Submit a bulk pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int bulk_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer );
+
+	urb->type = getBulkType();
+	urb->flags = getBulkFlags(urb->flags);
+
+	debug_urb( env, "bulk_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a bulk pipe request.
+ * @param env The JNIEnv.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_bulk_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxPipeRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer );
+
+	CheckedCallVoidMethod( env, linuxPipeRequest, setActualLength, urb->actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->status;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbChecks.h b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbChecks.h
new file mode 100644
index 0000000000000000000000000000000000000000..f879c2ba3e46ba9c5b491f1991c13d75087a0aef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbChecks.h
@@ -0,0 +1,164 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAXUSBCHECKS_H
+#define _JAVAXUSBCHECKS_H
+
+/* exception checks */
+
+#define check_for_exception(env) get_exception(env,1)
+#define check_for_exception_noexit(env) get_exception(env,0)
+
+/* Non-static checked JNI function wrappers */
+
+#define CheckedGetObjectClass(env,object) debugGetObjectClass(__FILE__,__func__,__LINE__,env,object,#env","#object)
+#define CheckedGetMethodID(env,class,name,id) debugGetMethodID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+#define CheckedGetFieldID(env,class,name,id) debugGetFieldID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+#define CheckedNewStringUTF(env,string) debugNewStringUTF(__FILE__,__func__,__LINE__,env,string,#env","#string)
+#define CheckedNewGlobalRef(env,object) debugNewGlobalRef(__FILE__,__func__,__LINE__,env,object,#env","#object)
+#define CheckedDeleteLocalRef(env,object) debugDeleteLocalRef(__FILE__,__func__,__LINE__,env,object,#env","#object)
+#define CheckedDeleteGlobalRef(env,object) debugDeleteGlobalRef(__FILE__,__func__,__LINE__,env,object,#env","#object)
+
+#define CheckedGetByteArrayRegion(env,array,offset,length,buffer) debugGetByteArrayRegion(__FILE__,__func__,__LINE__,env,array,offset,length,buffer,#env","#array","#offset","#length","#buffer)
+#define CheckedSetByteArrayRegion(env,array,offset,length,buffer) debugSetByteArrayRegion(__FILE__,__func__,__LINE__,env,array,offset,length,buffer,#env","#array","#offset","#length","#buffer)
+#define CheckedGetArrayLength(env,array) debugGetArrayLength(__FILE__,__func__,__LINE__,env,array,#env","#array)
+
+//FIXME - implement
+#define CheckedCallObjectMethod(env,object,method,args...) (*env)->CallObjectMethod(env,object,method,##args)
+#define CheckedCallLongMethod(env,object,method,args...) (*env)->CallLongMethod(env,object,method,##args)
+#define CheckedCallIntMethod(env,object,method,args...) (*env)->CallIntMethod(env,object,method,##args)
+#define CheckedCallShortMethod(env,object,method,args...) (*env)->CallShortMethod(env,object,method,##args)
+#define CheckedCallByteMethod(env,object,method,args...) (*env)->CallByteMethod(env,object,method,##args)
+#define CheckedCallBooleanMethod(env,object,method,args...) (*env)->CallBooleanMethod(env,object,method,##args)
+#define CheckedCallVoidMethod(env,object,method,args...) (*env)->CallVoidMethod(env,object,method,##args)
+
+/* Static checked JNI function wrappers */
+
+#define CheckedGetStaticMethodID(env,class,name,id) debugGetStaticMethodID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+#define CheckedGetStaticFieldID(env,class,name,id) debugGetStaticFieldID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+
+//FIXME - implement
+#define CheckedCallStaticObjectMethod(env,class,method,args...) (*env)->CallStaticObjectMethod(env,class,method,##args)
+#define CheckedCallStaticLongMethod(env,class,method,args...) (*env)->CallStaticLongMethod(env,class,method,##args)
+#define CheckedCallStaticIntMethod(env,class,method,args...) (*env)->CallStaticIntMethod(env,class,method,##args)
+#define CheckedCallStaticShortMethod(env,class,method,args...) (*env)->CallStaticShortMethod(env,class,method,##args)
+#define CheckedCallStaticByteMethod(env,class,method,args...) (*env)->CallStaticByteMethod(env,class,method,##args)
+#define CheckedCallStaticBooleanMethod(env,class,method,args...) (*env)->CallStaticBooleanMethod(env,class,method,##args)
+#define CheckedCallStaticVoidMethod(env,class,method,args...) (*env)->CallStaticVoidMethod(env,class,method,##args)
+
+/*
+ * Check for and return an exception, or null.
+ *
+ * @should_exit If the JVM should exit immediately and without warning if there is an Exception.
+ */
+static inline jthrowable get_exception( JNIEnv *env, int should_exit )
+{
+	jthrowable e = (*env)->ExceptionOccurred( env );
+
+	if (e) {
+		log( LOG_CRITICAL, "Exception occured!\n" );
+		if (should_exit)
+			exit(1);
+	}
+
+	return e;
+}
+
+static inline void debug_exception( JNIEnv *env, const char *file, const char *func, int line, char *jnicall, char *args )
+{
+	if (JNI_TRUE == (*env)->ExceptionCheck(env)) {
+		log( LOG_CRITICAL, "!! JNI Exception : file (%s) function (%s) line (%d)\n", file, func, line );
+		log( LOG_CRITICAL, "!!!!! Failure at : (*env)->%s(%s)\n", jnicall, args );
+		exit(1);
+	}
+}
+
+static inline jclass debugGetObjectClass( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	jclass class = (*env)->GetObjectClass( env, object );
+	debug_exception( env, file, func, line, "GetObjectClass", args );
+	return class;
+}
+
+static inline jmethodID debugGetMethodID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jmethodID method = (*env)->GetMethodID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetMethodID", args );
+	return method;
+}
+
+static inline jfieldID debugGetFieldID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jfieldID field = (*env)->GetFieldID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetFieldID", args );
+	return field;
+}
+
+static inline jstring debugNewStringUTF( const char *file, const char *func, int line, JNIEnv *env, char *str, char *args )
+{
+	jstring string = (*env)->NewStringUTF( env, str );
+	debug_exception( env, file, func, line, "NewStringUTF", args );
+	return string;
+}
+
+static inline jobject debugNewGlobalRef( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	jobject newObject = (*env)->NewGlobalRef( env , object );
+	debug_exception( env, file, func, line, "NewGlobalRef", args );
+	return newObject;
+}
+
+static inline void debugDeleteLocalRef( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	(*env)->DeleteLocalRef( env, object );
+	debug_exception( env, file, func, line, "DeleteLocalRef", args );
+}
+
+static inline void debugDeleteGlobalRef( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	(*env)->DeleteGlobalRef( env, object );
+	debug_exception( env, file, func, line, "DeleteGlobalRef", args );
+}
+
+static inline void debugGetByteArrayRegion( const char *file, const char *func, int line, JNIEnv *env, jbyteArray array, jsize offset, jsize length, jbyte *buffer, char *args )
+{
+	(*env)->GetByteArrayRegion( env, array, offset, length, buffer );
+	debug_exception( env, file, func, line, "GetByteArrayRegion", args );
+}
+
+static inline void debugSetByteArrayRegion( const char *file, const char *func, int line, JNIEnv *env, jbyteArray array, jsize offset, jsize length, jbyte *buffer, char *args )
+{
+	(*env)->SetByteArrayRegion( env, array, offset, length, buffer );
+	debug_exception( env, file, func, line, "SetByteArrayRegion", args );
+}
+
+static inline jsize debugGetArrayLength( const char *file, const char *func, int line, JNIEnv *env, jarray array, char *args )
+{
+	jsize size = (*env)->GetArrayLength( env, array );
+	debug_exception( env, file, func, line, "GetArrayLength", args );
+	return size;
+}
+
+static inline jmethodID debugGetStaticMethodID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jmethodID method = (*env)->GetStaticMethodID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetStaticMethodID", args );
+	return method;
+}
+
+static inline jfieldID debugGetStaticFieldID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jfieldID field = (*env)->GetStaticFieldID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetStaticFieldID", args );
+	return field;
+}
+
+#endif /* _JAVAXUSBCHECKS_H */
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbControlRequest.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbControlRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..75f876d38835e271994a05a84d7cf3752e4b5799
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbControlRequest.c
@@ -0,0 +1,191 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Submit a control pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxControlRequest The LinuxControlRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int control_pipe_request( JNIEnv *env, int fd, jobject linuxControlRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxControlRequest = NULL;
+	jmethodID getSetupPacket, getData, getOffset, getLength;
+	jbyteArray setupPacket = NULL, data = NULL;
+
+	LinuxControlRequest = CheckedGetObjectClass( env, linuxControlRequest );
+	getSetupPacket = CheckedGetMethodID( env, LinuxControlRequest, "getSetupPacket", "()[B" );
+	getData = CheckedGetMethodID( env, LinuxControlRequest, "getData", "()[B" );
+	getOffset = CheckedGetMethodID( env, LinuxControlRequest, "getOffset", "()I" );
+	getLength = CheckedGetMethodID( env, LinuxControlRequest, "getLength", "()I" );
+	setupPacket = CheckedCallObjectMethod( env, linuxControlRequest, getSetupPacket );
+	data = CheckedCallObjectMethod( env, linuxControlRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxControlRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length + 8))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, setupPacket, 0, 8, urb->buffer );
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer + 8 );
+
+	/* Add 8 for the setup packet */
+	urb->buffer_length += 8;
+
+	urb->type = getControlType();
+	urb->flags = getControlFlags(urb->flags);
+
+	debug_urb( env, "control_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (setupPacket) CheckedDeleteLocalRef( env, setupPacket );
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a control pipe request.
+ * @param env The JNIEnv.
+ * @param linuxControlRequest The LinuxControlRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_control_pipe_request( JNIEnv *env, jobject linuxControlRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxControlRequest = CheckedGetObjectClass( env, linuxControlRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxControlRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxControlRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxControlRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxControlRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxControlRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxControlRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer + 8 );
+
+	CheckedCallVoidMethod( env, linuxControlRequest, setActualLength, urb->actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->status;
+}
+
+/**
+ * Set a configuration.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxSetConfigurationRequest The LinuxSetConfigurationRequest.
+ * @return The error, or 0.
+ */
+int set_configuration( JNIEnv *env, int fd, jobject linuxSetConfigurationRequest )
+{
+	unsigned int *configuration = NULL;
+	int ret = 0;
+
+	jclass LinuxSetConfigurationRequest;
+	jmethodID getConfiguration;
+
+	LinuxSetConfigurationRequest = CheckedGetObjectClass( env, linuxSetConfigurationRequest );
+	getConfiguration = CheckedGetMethodID( env, LinuxSetConfigurationRequest, "getConfiguration", "()I" );
+	CheckedDeleteLocalRef( env, LinuxSetConfigurationRequest );
+
+	if (!(configuration = malloc(sizeof(*configuration)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return -ENOMEM;
+	}
+
+	*configuration = (unsigned int)CheckedCallIntMethod( env, linuxSetConfigurationRequest, getConfiguration );
+
+	log( LOG_XFER_META, "Setting configuration to %d", *configuration );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SETCONFIGURATION, configuration )))
+		ret = -errno;
+
+	if (ret)
+		log( LOG_XFER_ERROR, "Could not set configuration (errno %d)", ret );
+	else
+		log( LOG_XFER_META, "set_configuration : Set configuration" );
+
+	free(configuration);
+
+	return ret;
+}
+
+/**
+ * Set a interface setting.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxSetInterfaceRequest The LinuxSetInterfaceRequest.
+ * @return The error, or 0.
+ */
+int set_interface( JNIEnv *env, int fd, jobject linuxSetInterfaceRequest )
+{
+	struct usbdevfs_setinterface *interface = NULL;
+	int ret = 0;
+
+	jclass LinuxSetInterfaceRequest;
+	jmethodID getInterface, getSetting;
+
+	LinuxSetInterfaceRequest = CheckedGetObjectClass( env, linuxSetInterfaceRequest );
+	getInterface = CheckedGetMethodID( env, LinuxSetInterfaceRequest, "getInterface", "()I" );
+	getSetting = CheckedGetMethodID( env, LinuxSetInterfaceRequest, "getSetting", "()I" );
+	CheckedDeleteLocalRef( env, LinuxSetInterfaceRequest );
+
+	if (!(interface = malloc(sizeof(*interface)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return -ENOMEM;
+	}
+
+	interface->interface = (unsigned int)CheckedCallIntMethod( env, linuxSetInterfaceRequest, getInterface );
+	interface->altsetting = (unsigned int)CheckedCallIntMethod( env, linuxSetInterfaceRequest, getSetting );
+
+	log( LOG_XFER_META, "Setting interface %d to setting %d", interface->interface, interface->altsetting );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SETINTERFACE, interface )))
+		ret = -errno;
+
+	if (ret)
+		log( LOG_XFER_ERROR, "Could not set interface (errno %d)", ret );
+	else
+		log( LOG_XFER_META, "Set interface" );
+
+	free(interface);
+
+	return ret;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbDeviceProxy.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbDeviceProxy.c
new file mode 100644
index 0000000000000000000000000000000000000000..12bf9d9ca04a807dca9a67aa7767d379aa447a4a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbDeviceProxy.c
@@ -0,0 +1,253 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/* These MUST match those defined in com/ibm/jusb/os/linux/LinuxRequest.java */
+#define LINUX_PIPE_REQUEST 1
+#define LINUX_SET_INTERFACE_REQUEST 2
+#define LINUX_SET_CONFIGURATION_REQUEST 3
+#define LINUX_CLAIM_INTERFACE_REQUEST 4
+#define LINUX_IS_CLAIMED_INTERFACE_REQUEST 5
+#define LINUX_RELEASE_INTERFACE_REQUEST 6
+#define LINUX_ISOCHRONOUS_REQUEST 7
+
+static void submitRequest( JNIEnv *env, int fd, jobject linuxRequest );
+static void cancelRequest( JNIEnv *env, int fd, jobject linuxRequest );
+static void completeRequest( JNIEnv *env, jobject linuxRequest );
+
+/*
+ * Proxy for all I/O with a device
+ * @author Dan Streetman
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeDeviceProxy
+  ( JNIEnv *env, jclass JavaxUsb, jobject linuxDeviceProxy )
+{
+	int fd = 0;
+	struct usbdevfs_urb *urb;
+
+	jclass LinuxDeviceProxy;
+	jobject linuxRequest;
+	jstring jkey;
+	jmethodID startCompleted, isRequestWaiting, getReadyRequest, getCancelRequest;
+	jmethodID getKey;
+
+	LinuxDeviceProxy = CheckedGetObjectClass( env, linuxDeviceProxy );
+	startCompleted = CheckedGetMethodID( env, LinuxDeviceProxy, "startCompleted", "(I)V" );
+	isRequestWaiting = CheckedGetMethodID( env, LinuxDeviceProxy, "isRequestWaiting", "()Z" );
+	getReadyRequest = CheckedGetMethodID( env, LinuxDeviceProxy, "getReadyRequest", "()Lcom/ibm/jusb/os/linux/LinuxRequest;" );
+	getCancelRequest = CheckedGetMethodID( env, LinuxDeviceProxy, "getCancelRequest", "()Lcom/ibm/jusb/os/linux/LinuxRequest;" );
+	getKey = CheckedGetMethodID( env, LinuxDeviceProxy, "getKey", "()Ljava/lang/String;" );
+	jkey = CheckedCallObjectMethod( env, linuxDeviceProxy, getKey );
+	CheckedDeleteLocalRef( env, LinuxDeviceProxy );
+
+	errno = 0;
+	fd = open_device( env, jkey, O_RDWR );
+	CheckedDeleteLocalRef( env, jkey );
+
+	if (0 > fd) {
+		log( LOG_XFER_ERROR, "Could not open node for device!" );
+		CheckedCallVoidMethod( env, linuxDeviceProxy, startCompleted, errno );
+		return;
+	}
+
+	CheckedCallVoidMethod( env, linuxDeviceProxy, startCompleted, 0 );
+
+	/* run forever...? */
+	while (1) {
+		usleep( 1000 ); // Sleep 1 ms to avoid too much polling
+
+		if (JNI_TRUE == CheckedCallBooleanMethod( env, linuxDeviceProxy, isRequestWaiting )) {
+			if ((linuxRequest = CheckedCallObjectMethod( env, linuxDeviceProxy, getReadyRequest ))) {
+				log( LOG_XFER_REQUEST, "Got Request" );
+				submitRequest( env, fd, linuxRequest );
+				CheckedDeleteLocalRef( env, linuxRequest );
+				log( LOG_XFER_REQUEST, "Completed Request" );
+			}
+
+			if ((linuxRequest = CheckedCallObjectMethod( env, linuxDeviceProxy, getCancelRequest ))) {
+				log( LOG_XFER_REQUEST, "Got Abort Request" );
+				cancelRequest( env, fd, linuxRequest );
+				CheckedDeleteLocalRef( env, linuxRequest );
+				log( LOG_XFER_REQUEST, "Completed Abort Request" );
+			}
+		}
+
+		errno = 0;
+		if (!(ioctl( fd, USBDEVFS_REAPURBNDELAY, &urb ))) {
+			log( LOG_XFER_REQUEST, "Got completed URB" );
+			linuxRequest = urb->usercontext;
+			completeRequest( env, linuxRequest );
+			CheckedDeleteGlobalRef( env, linuxRequest );
+			log( LOG_XFER_REQUEST, "Finished completed URB" );
+		} else if (ENODEV == errno) {
+			break;
+		}
+	}
+
+	log( LOG_XFER_OTHER, "Device Proxy exiting." );
+
+	close( fd );
+}
+
+/**
+ * Submit a LinuxRequest.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ */
+static void submitRequest( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	int type, err, sync = 0;
+
+	jclass LinuxRequest;
+	jmethodID getType, setError, setCompleted;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getType = CheckedGetMethodID( env, LinuxRequest, "getType", "()I" );
+	setCompleted = CheckedGetMethodID( env, LinuxRequest, "setCompleted", "(Z)V" );
+	setError = CheckedGetMethodID( env, LinuxRequest, "setError", "(I)V" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	type = CheckedCallIntMethod( env, linuxRequest, getType );
+
+	log( LOG_XFER_OTHER, "Submitting Request.");
+
+	switch (type) {
+	case LINUX_PIPE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting Pipe Request.");
+		err = pipe_request( env, fd, linuxRequest );
+		break;
+	case LINUX_SET_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting SetInterface Request.");
+		err = set_interface( env, fd, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_SET_CONFIGURATION_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting SetConfiguration Request.");
+		err = set_configuration( env, fd, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_CLAIM_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting ClaimInterface Request.");
+		err = claim_interface( env, fd, 1, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_RELEASE_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting ReleaseInterface Request.");
+		err = claim_interface( env, fd, 0, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_IS_CLAIMED_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting IsClaimed Request.");
+		err = is_claimed( env, fd, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_ISOCHRONOUS_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting Isochronous Request.");
+		err = isochronous_request( env, fd, linuxRequest );
+		break;
+	default: /* ? */
+		log( LOG_XFER_ERROR, "Unknown Request type %d", type );
+		err = -EINVAL;
+		break;
+	}
+
+	if (err)
+		CheckedCallVoidMethod( env, linuxRequest, setError, err );
+
+	if (sync || err)
+		CheckedCallVoidMethod( env, linuxRequest, setCompleted, JNI_TRUE );
+}
+
+/**
+ * Cancel a LinuxRequest.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ */
+static void cancelRequest( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	int type;
+
+	jclass LinuxRequest;
+	jmethodID getType;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getType = CheckedGetMethodID( env, LinuxRequest, "getType", "()I" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	type = CheckedCallIntMethod( env, linuxRequest, getType );
+
+	switch (type) {
+	case LINUX_PIPE_REQUEST:
+		cancel_pipe_request( env, fd, linuxRequest );
+		break;
+	case LINUX_SET_INTERFACE_REQUEST:
+	case LINUX_SET_CONFIGURATION_REQUEST:
+	case LINUX_CLAIM_INTERFACE_REQUEST:
+	case LINUX_IS_CLAIMED_INTERFACE_REQUEST:
+	case LINUX_RELEASE_INTERFACE_REQUEST:
+		/* cannot abort these synchronous requests */
+		break;
+	case LINUX_ISOCHRONOUS_REQUEST:
+		cancel_isochronous_request( env, fd, linuxRequest );
+		break;
+	default: /* ? */
+		log( LOG_XFER_ERROR, "Unknown Request type %d", type );
+		break;
+	}	
+}
+
+/**
+ * Complete a LinuxRequest.
+ * @param env The JNIEnv.
+ * @param linuxRequest The LinuxRequest.
+ */
+static void completeRequest( JNIEnv *env, jobject linuxRequest )
+{
+	int type, err;
+
+	jclass LinuxRequest;
+	jmethodID getType, setError, setCompleted;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getType = CheckedGetMethodID( env, LinuxRequest, "getType", "()I" );
+	setCompleted = CheckedGetMethodID( env, LinuxRequest, "setCompleted", "(Z)V" );
+	setError = CheckedGetMethodID( env, LinuxRequest, "setError", "(I)V" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	type = CheckedCallIntMethod( env, linuxRequest, getType );
+
+	switch (type) {
+	case LINUX_PIPE_REQUEST:
+		err = complete_pipe_request( env, linuxRequest );
+		break;
+	case LINUX_SET_INTERFACE_REQUEST:
+	case LINUX_SET_CONFIGURATION_REQUEST:
+	case LINUX_CLAIM_INTERFACE_REQUEST:
+	case LINUX_IS_CLAIMED_INTERFACE_REQUEST:
+	case LINUX_RELEASE_INTERFACE_REQUEST:
+		/* these are synchronous, completion happens during submit */
+		break;
+	case LINUX_ISOCHRONOUS_REQUEST:
+		err = complete_isochronous_request( env, linuxRequest );
+		break;
+	default: /* ? */
+		log( LOG_XFER_ERROR, "Unknown Request type %d", type );
+		err = -EINVAL;
+		break;
+	}
+
+	if (err)
+		CheckedCallVoidMethod( env, linuxRequest, setError, err );
+
+	CheckedCallVoidMethod( env, linuxRequest, setCompleted, JNI_TRUE );
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbError.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbError.c
new file mode 100644
index 0000000000000000000000000000000000000000..a7b99e0dcfc6a1e52c11736ccc5cc832bad5a501
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbError.c
@@ -0,0 +1,66 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/*
+ * Get String message for specified error number
+ * @author Dan Streetman
+ */
+JNIEXPORT jstring JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetErrorMessage
+  (JNIEnv *env, jclass JavaxUsb, jint error) {
+	if (0 > error) error = -error;
+
+	switch (error) {
+		case EPERM			: return CheckedNewStringUTF( env, "Operation not permitted" );
+		case ENOENT		: return CheckedNewStringUTF( env, "Submission aborted" );
+		case EINTR			: return CheckedNewStringUTF( env, "Interrupted system call" );
+		case EIO			: return CheckedNewStringUTF( env, "I/O error" );
+		case ENXIO			: return CheckedNewStringUTF( env, "Cannot queue certain submissions on Universal Host Controller (unsupported in Linux driver)" );
+		case EAGAIN		: return CheckedNewStringUTF( env, "Temporarily busy, try again" );
+		case ENOMEM		: return CheckedNewStringUTF( env, "Out of memory" );
+		case EACCES		: return CheckedNewStringUTF( env, "Permission denied" );
+		case EBUSY			: return CheckedNewStringUTF( env, "Device or resource busy" );
+		case ENODEV		: return CheckedNewStringUTF( env, "Device removed (or no such device)" );
+		case EINVAL		: return CheckedNewStringUTF( env, "Invalid" );
+		case ENOSYS		: return CheckedNewStringUTF( env, "Function not implemented" );
+		case ENODATA		: return CheckedNewStringUTF( env, "No data available" );
+		case ERESTART		: return CheckedNewStringUTF( env, "Interrupted system call should be restarted" );
+		case EOPNOTSUPP	: return CheckedNewStringUTF( env, "Operation not supported on transport endpoint" );
+		case ECONNRESET	: return CheckedNewStringUTF( env, "Connection reset by peer" );
+		case ENOBUFS 		: return CheckedNewStringUTF( env, "No buffer space available" );
+		case ETIMEDOUT		: return CheckedNewStringUTF( env, "Timed out" );
+		case ECONNREFUSED	: return CheckedNewStringUTF( env, "Connection refused" );
+		case EALREADY		: return CheckedNewStringUTF( env, "Operation already in progress" );
+		case EINPROGRESS	: return CheckedNewStringUTF( env, "Operation now in progress" );
+		default				: {
+			char err[32];
+			sprintf(err, "Error %d", (int)error);
+			return CheckedNewStringUTF( env, err );
+		}
+	}
+}
+
+/*
+ * Check if specified error is serious (continued error condition)
+ * @author Dan Streetman
+ */
+JNIEXPORT jboolean JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeIsErrorSerious
+  (JNIEnv *env, jclass JavaxUsb, jint error) {
+	if (0 < error) error = -error;
+
+	switch (error) {
+		case -ENODEV :
+		case -EPIPE :
+			return JNI_TRUE;
+		default :
+			return JNI_FALSE;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbInterfaceRequest.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbInterfaceRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..b5da448829d69290726094a0db95d0e5f15ba10a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbInterfaceRequest.c
@@ -0,0 +1,156 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/*
+ * JavaxUsbInterfaceRequest.c
+ *
+ * This handles requests to claim/release interfaces
+ *
+ */
+
+/**
+ * Disconnect the driver from the specified interface.
+ * @param end The JNIEnv.
+ * @param fd The file descriptor.
+ * @param interface The interface number.
+ */
+void disconnect_interface_driver(JNIEnv *env, int fd, int interface)
+{
+	struct usbdevfs_ioctl *disc_ioctl = NULL;
+
+	if (!(disc_ioctl = malloc(sizeof(*disc_ioctl)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return;
+	}
+
+	disc_ioctl->ifno = interface;
+	disc_ioctl->ioctl_code = USBDEVFS_DISCONNECT;
+	disc_ioctl->data = NULL;
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_IOCTL, disc_ioctl ))) {
+		if (ENODATA == errno)
+			log( LOG_ERROR, "No driver associated with interface %d.", interface );
+		else if (ENOSYS == errno)
+			log( LOG_ERROR, "This kernel does not support driver disconnection via USBDEVFS_DISCONNECT." );
+		else
+			log( LOG_ERROR, "Could not disconnect driver from interface %d : %s", interface, strerror(errno) );
+	} else {
+		log( LOG_INFO, "Disconnected driver from interface %d", interface );
+	}
+
+	free(disc_ioctl);
+}
+
+/**
+ * Claim or release a specified interface.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param claim Whether to claim or release.
+ * @param linuxRequest The request.
+ * @return error.
+ */
+int claim_interface( JNIEnv *env, int fd, int claim, jobject linuxRequest )
+{
+	int ret = 0, *interface = NULL;
+	int triedDisconnect = 0;
+
+	jclass LinuxRequest = NULL;
+	jmethodID getInterfaceNumber, getForceClaim;
+	jboolean forceClaim;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getInterfaceNumber = CheckedGetMethodID( env, LinuxRequest, "getInterfaceNumber", "()I" );
+	getForceClaim = CheckedGetMethodID( env, LinuxRequest, "getForceClaim", "()Z" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+	forceClaim = CheckedCallBooleanMethod( env, linuxRequest, getForceClaim );
+
+	if (!(interface = malloc(sizeof(*interface)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return -ENOMEM;
+	}
+
+	*interface = CheckedCallIntMethod( env, linuxRequest, getInterfaceNumber );
+
+	while(1) {
+		ret = 0;
+
+		log( LOG_FUNC, "%s interface %d", claim ? "Claiming" : "Releasing", *interface );
+
+		errno = 0;
+		if (0 > (ioctl( fd, claim ? USBDEVFS_CLAIMINTERFACE : USBDEVFS_RELEASEINTERFACE, interface )))
+			ret = -errno;
+
+		if (ret)
+			log( LOG_ERROR, "Could not %s interface %d : errno %d", claim ? "claim" : "release", *interface, ret );
+		else
+			log( LOG_FUNC, "%s interface %d", claim ? "Claimed" : "Released", *interface );
+
+		if (ret && claim && !triedDisconnect && (JNI_TRUE == forceClaim)) {
+			triedDisconnect = 1;
+			disconnect_interface_driver(env, fd, *interface);
+		} else
+			break;
+	}
+
+	free(interface);
+
+	return ret;
+}
+
+/**
+ * Check if an interface is claimed.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ */
+int is_claimed( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	struct usbdevfs_getdriver *gd;
+	int ret = 0;
+
+	jclass LinuxRequest;
+	jmethodID getInterfaceNumber, setClaimed;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getInterfaceNumber = CheckedGetMethodID( env, LinuxRequest, "getInterfaceNumber", "()I" );
+	setClaimed = CheckedGetMethodID( env, LinuxRequest, "setClaimed", "(Z)V" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	if (!(gd = malloc(sizeof(*gd)))) {
+		log( LOG_CRITICAL, "Out of memory!");
+		return -ENOMEM;
+	}
+
+	memset(gd, 0, sizeof(*gd));
+
+	gd->interface = CheckedCallIntMethod( env, linuxRequest, getInterfaceNumber );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_GETDRIVER, gd ))) {
+		ret = -errno;
+
+		if (-ENODATA == ret)
+			log( LOG_INFO, "Interface %d is not claimed.", gd->interface );
+		else
+			log( LOG_ERROR, "Could not determine if interface %d is claimed.", gd->interface );
+	} else {
+		log( LOG_INFO, "Interface %d is claimed by driver %s.", gd->interface, gd->driver );
+	}
+
+	CheckedCallVoidMethod( env, linuxRequest, setClaimed, (ret ? JNI_FALSE : JNI_TRUE) );
+
+	free(gd);
+
+	return (-ENODATA == ret ? 0 : ret);
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbInterruptRequest.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbInterruptRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..e043f0a4cb039a0ab1fc4d3c1757a357e357173d
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbInterruptRequest.c
@@ -0,0 +1,94 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Submit a interrupt pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int interrupt_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer );
+
+	urb->type = getInterruptType();
+	urb->flags = getInterruptFlags(urb->flags);
+
+	debug_urb( env, "interrupt_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a interrupt pipe request.
+ * @param env The JNIEnv.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_interrupt_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxPipeRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer );
+
+	CheckedCallVoidMethod( env, linuxPipeRequest, setActualLength, urb->actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->status;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbIsochronousRequest.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbIsochronousRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..4bf2003d5ecf46afbaba4f8ba9b7a66f4618e579
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbIsochronousRequest.c
@@ -0,0 +1,331 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/* simple isochronous functions */
+
+/**
+ * Submit a simple isochronous pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int isochronous_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer );
+
+	urb->type = getIsochronousType();
+	urb->flags = getIsochronousFlags(urb->flags);
+	urb->number_of_packets = 1;
+	urb->iso_frame_desc[0].length = urb->buffer_length;
+
+	debug_urb( env, "isochronous_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a simple isochronous pipe request.
+ * @param env The JNIEnv.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_isochronous_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxPipeRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer );
+
+	CheckedCallVoidMethod( env, linuxPipeRequest, setActualLength, urb->iso_frame_desc[0].actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->iso_frame_desc[0].status;
+}
+
+/* Complex isochronous functions */
+
+static inline int create_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb );
+static inline int destroy_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb );
+
+/**
+ * Submit a complex isochronous pipe request.
+ * Note that this does not support _disabling_ short packets.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxIsochronousRequest The LinuxIsochronousRequest.
+ * @return The error that occurred, or 0.
+ */
+int isochronous_request( JNIEnv *env, int fd, jobject linuxIsochronousRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret = 0, npackets, bufsize, urbsize;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getAcceptShortPacket, getTotalLength, size, setUrbAddress, getEndpointAddress;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getAcceptShortPacket = CheckedGetMethodID( env, LinuxIsochronousRequest, "getAcceptShortPacket", "()Z" );
+	getTotalLength = CheckedGetMethodID( env, LinuxIsochronousRequest, "getTotalLength", "()I" );
+	size = CheckedGetMethodID( env, LinuxIsochronousRequest, "size", "()I" );
+	setUrbAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "setUrbAddress", "(J)V" );
+	getEndpointAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "getEndpointAddress", "()B" );
+	npackets = (unsigned int)CheckedCallIntMethod( env, linuxIsochronousRequest, size );
+	bufsize = (unsigned int)CheckedCallIntMethod( env, linuxIsochronousRequest, getTotalLength );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	urbsize = sizeof(*urb) + (npackets * sizeof(struct usbdevfs_iso_packet_desc));
+
+	if (!(urb = malloc(urbsize))) {
+		log( LOG_CRITICAL, "Out of memory! (%d bytes needed)", urbsize );
+		ret = -ENOMEM;
+		goto ISOCHRONOUS_REQUEST_END;
+	}
+
+	memset(urb, 0, urbsize);
+
+	urb->number_of_packets = npackets;
+	urb->buffer_length = bufsize;
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory! (%d needed)", urb->buffer_length );
+		ret = -ENOMEM;
+		goto ISOCHRONOUS_REQUEST_END;
+	}
+
+	memset(urb->buffer, 0, urb->buffer_length);
+
+	if ((ret = create_iso_buffer( env, linuxIsochronousRequest, urb )))
+		goto ISOCHRONOUS_REQUEST_END;
+
+	urb->type = getIsochronousType();
+	urb->usercontext = CheckedNewGlobalRef( env, linuxIsochronousRequest );
+	urb->endpoint = (unsigned char)CheckedCallByteMethod( env, linuxIsochronousRequest, getEndpointAddress );
+	urb->flags = getIsochronousFlags(urb->flags);
+
+	log( LOG_XFER_OTHER, "Submitting URB" );
+	debug_urb( env, "isochronous_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+	if (ret) {
+		log( LOG_XFER_ERROR, "Could not submit URB (errno %d)", ret );
+	} else {
+		log( LOG_XFER_OTHER, "isochronous_request : Submitted URB" );
+		CheckedCallVoidMethod( env, linuxIsochronousRequest, setUrbAddress, urb );
+	}
+
+ISOCHRONOUS_REQUEST_END:
+	if (ret) {
+		if (urb) {
+			if (urb->usercontext) CheckedDeleteGlobalRef( env, urb->usercontext);
+			if (urb->buffer) free(urb->buffer);
+			free(urb);
+		}
+	}
+
+	return ret;
+}
+
+/**
+ * Cancel a complex isochronous request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxIsochronousRequest The LinuxIsochronousRequest.
+ */
+void cancel_isochronous_request( JNIEnv *env, int fd, jobject linuxIsochronousRequest )
+{
+	struct usbdevfs_urb *urb;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getUrbAddress;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getUrbAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "getUrbAddress", "()J" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	log( LOG_XFER_OTHER, "Canceling URB" );
+
+	urb = (struct usbdevfs_urb *)CheckedCallLongMethod( env, linuxIsochronousRequest, getUrbAddress );
+
+	if (!urb) {
+		log( LOG_XFER_ERROR, "No URB to cancel" );
+		return;
+	}
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_DISCARDURB, urb )))
+		log( LOG_XFER_ERROR, "Could not unlink urb %p (error %d)", urb, -errno );
+}
+
+/**
+ * Complete a complex isochronous pipe request.
+ * @param env The JNIEnv.
+ * @param linuxIsochronousRequest The LinuxIsochronousRequest.
+ * @return The error that occurred, or 0.
+ */
+int complete_isochronous_request( JNIEnv *env, jobject linuxIsochronousRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getUrbAddress;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getUrbAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "getUrbAddress", "()J" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	if (!(urb = (struct usbdevfs_urb*)CheckedCallLongMethod( env, linuxIsochronousRequest, getUrbAddress ))) {
+		log( LOG_XFER_ERROR, "No URB to complete!" );
+		return -EINVAL;
+	}
+
+	log( LOG_XFER_OTHER, "Completing URB" );
+	debug_urb( env, "complete_isochronous_request", urb );
+
+	ret = destroy_iso_buffer( env, linuxIsochronousRequest, urb );
+
+	free(urb->buffer);
+	free(urb);
+
+	log( LOG_XFER_OTHER, "Completed URB" );
+
+	return ret;
+}
+
+/**
+ * Create the multi-packet ISO buffer and iso_frame_desc's.
+ */
+static inline int create_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb )
+{
+	int i, offset = 0, buffer_offset = 0;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getDirection, getData, getOffset, getLength;
+	jbyteArray jbuf;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getDirection = CheckedGetMethodID( env, LinuxIsochronousRequest, "getDirection", "()B" );
+	getData = CheckedGetMethodID( env, LinuxIsochronousRequest, "getData", "(I)[B" );
+	getOffset = CheckedGetMethodID( env, LinuxIsochronousRequest, "getOffset", "(I)I" );
+	getLength = CheckedGetMethodID( env, LinuxIsochronousRequest, "getLength", "(I)I" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	for (i=0; i<urb->number_of_packets; i++) {
+	  if (!(jbuf = CheckedCallObjectMethod( env, linuxIsochronousRequest, getData, i ))) {
+		log( LOG_XFER_ERROR, "Could not access data at index %d", i );
+		return -EINVAL;
+	  }
+
+	  offset = CheckedCallIntMethod( env, linuxIsochronousRequest, getOffset, i );
+	  urb->iso_frame_desc[i].length = CheckedCallIntMethod( env, linuxIsochronousRequest, getLength, i );
+	  CheckedGetByteArrayRegion( env, jbuf, offset, urb->iso_frame_desc[i].length, urb->buffer + buffer_offset );
+	  buffer_offset += urb->iso_frame_desc[i].length;
+
+	  CheckedDeleteLocalRef( env, jbuf );
+	}
+
+	return 0;
+}
+
+/**
+ * Destroy the multi-packet ISO buffer and iso_frame_desc's.
+ */
+static inline int destroy_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb )
+{
+	int i, offset = 0, buffer_offset = 0, actual_length = 0;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getDirection, getData, getOffset, setActualLength, setError;
+	jbyteArray jbuf;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getDirection = CheckedGetMethodID( env, LinuxIsochronousRequest, "getDirection", "()B" );
+	getData = CheckedGetMethodID( env, LinuxIsochronousRequest, "getData", "(I)[B" );
+	getOffset = CheckedGetMethodID( env, LinuxIsochronousRequest, "getOffset", "(I)I" );
+	setActualLength = CheckedGetMethodID( env, LinuxIsochronousRequest, "setActualLength", "(II)V" );
+	setError = CheckedGetMethodID( env, LinuxIsochronousRequest, "setError", "(II)V" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	for (i=0; i<urb->number_of_packets; i++) {
+	  if (!(jbuf = CheckedCallObjectMethod( env, linuxIsochronousRequest, getData, i ))) {
+		log( LOG_XFER_ERROR, "Could not access data buffer at index %d", i );
+		return -EINVAL;
+	  }
+
+	  offset = CheckedCallIntMethod( env, linuxIsochronousRequest, getOffset, i );
+	  actual_length = urb->iso_frame_desc[i].actual_length;
+	  if ((offset + actual_length) > CheckedGetArrayLength( env, jbuf )) {
+		log( LOG_XFER_ERROR, "Data buffer %d too small, data truncated!", i );
+		actual_length = CheckedGetArrayLength( env, jbuf ) - offset;
+	  }
+	  CheckedSetByteArrayRegion( env, jbuf, offset, actual_length, urb->buffer + buffer_offset );
+	  CheckedCallVoidMethod( env, linuxIsochronousRequest, setActualLength, i, actual_length );
+	  if (0 > urb->iso_frame_desc[i].status)
+		CheckedCallVoidMethod( env, linuxIsochronousRequest, setError, i, urb->iso_frame_desc[i].status );
+	  buffer_offset += urb->iso_frame_desc[i].length;
+
+	  CheckedDeleteLocalRef( env, jbuf );
+	}
+			
+//FIXME - what should we return here, this or something based on each packet's status?
+	return urb->status;
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbKernel.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbKernel.c
new file mode 100644
index 0000000000000000000000000000000000000000..22440ff85176e103c65f8e43b439770385926d63
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbKernel.c
@@ -0,0 +1,152 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+static int kernel_version = 0;
+
+#define KERNEL_VERSION(version,patchlevel,sublevel) ((version<<16) | (patchlevel<<8) | sublevel)
+
+// This is defined as various names in different kernel versions but the number is always the same
+#define NO_ACCEPT_SHORT_PACKET 0x0001
+
+// This is defined only in 2.4 kernels.
+#define QUEUE_BULK 0x10
+#define QUEUE_BULK_LAST_KERNEL_VERSION KERNEL_VERSION(2,4,29)
+
+// 2.4 USB subsystems do not allow queued interrupt transfers but do allow (encourage?) interrupt-using-bulk
+#define INTERRUPT_USES_BULK_LAST_KERNEL_VERSION KERNEL_VERSION(2,4,99)
+
+static void setKernelVersion(void)
+{
+	struct utsname name;
+
+	if (!uname(&name)) {
+		char *p = name.release;
+		int num[3], i;
+
+		for (i=0; i<3; i++) {
+		  			errno = 0;
+ 			if (((int)*p < '0') || ((int)*p > '9')) {
+		  				log(LOG_ERROR, "Could not parse release string %s : %s", name.release, strerror(errno));
+		  				break;
+		  			} else {
+                        num[i] = strtol(p, &p,0);
+		  				p++;
+			}
+		}
+		if (3 == i) {
+			log(LOG_INFO, "Kernel version string %s parsed as %d.%d.%d",name.release,num[0],num[1],num[2]);
+			kernel_version = KERNEL_VERSION(num[0],num[1],num[2]);
+			return;
+		}
+	}
+
+	log(LOG_CRITICAL, "Could not determine kernel version : %s", strerror(errno));
+	log(LOG_ERROR, "Using (most likely wrong) kernel version of 2.4.0");
+	kernel_version = KERNEL_VERSION(2,4,0);
+}
+
+static int getKernelVersion(void)
+{
+	if (!kernel_version)
+		setKernelVersion();
+
+	return kernel_version;
+}
+
+/* Get the flag for queueing bulk transfers, only used on older kernels. */
+static int getQueueBulkFlag(void)
+{
+	return (QUEUE_BULK_LAST_KERNEL_VERSION >= getKernelVersion() ? QUEUE_BULK : 0);
+}
+
+/* Get the flag for accepting/rejecting short packets.
+ * The parameter is whether short packets should be accepted or not.
+ */
+int getShortPacketFlag(int accept) { return ( accept ? 0 : NO_ACCEPT_SHORT_PACKET ); }
+
+/* This sets/clears flags as appropriate to the transfer type.
+ * The parameter is the existing flags, the return is the modified flags.
+ */
+int getIsochronousFlags(int flags) { return (~NO_ACCEPT_SHORT_PACKET & (USBDEVFS_URB_ISO_ASAP | flags)); }
+int getControlFlags(int flags) { return flags; }
+int getBulkFlags(int flags) { return getQueueBulkFlag() | flags; }
+int getInterruptFlags(int flags)
+{
+	return ((INTERRUPT_USES_BULK_LAST_KERNEL_VERSION >= getKernelVersion()) ? (getBulkFlags(flags)) : flags);
+}
+
+// These #defined values have never changed name
+int getIsochronousType(void) { return USBDEVFS_URB_TYPE_ISO; }
+int getControlType(void) { return USBDEVFS_URB_TYPE_CONTROL; }
+int getBulkType(void) { return USBDEVFS_URB_TYPE_BULK; }
+int getInterruptType(void)
+{
+	return (INTERRUPT_USES_BULK_LAST_KERNEL_VERSION >= getKernelVersion() ? getBulkType() : USBDEVFS_URB_TYPE_INTERRUPT);
+}
+
+
+// These are probably not the best way to determine where the usbfs is but it's simple.
+
+#define USBDEVFS_PATH_OLD "/proc/bus/usb"
+#define USBDEVFS_DEVICES_OLD "/proc/bus/usb/devices"
+#define USBDEVFS_SPRINTF_NODE_OLD "/proc/bus/usb/%3.03d/%3.03d"
+#define USBDEVFS_SSCANF_NODE_OLD "/proc/bus/usb/%3d/%3d"
+
+#define USBDEVFS_PATH_NEW "/dev/bus/usb"
+#define USBDEVFS_DEVICES_NEW "/dev/bus/usb/devices"
+#define USBDEVFS_SPRINTF_NODE_NEW1 "/dev/bus/usb/%3.03d/%3.03d"
+#define USBDEVFS_SPRINTF_NODE_NEW2 "/dev/bus/usb/%d/%d"
+#define USBDEVFS_SSCANF_NODE_NEW1 "/dev/bus/usb/%3d/%3d"
+#define USBDEVFS_SSCANF_NODE_NEW2 "/dev/bus/usb/%d/%d"
+#define USBDEVFS_CHECK_NODE_NEW1 "/dev/bus/usb/001/001"
+#define USBDEVFS_CHECK_NODE_NEW2 "/dev/bus/usb/1/1"
+
+char *usbdevfs_path()
+{
+	struct stat buf;
+	if ((0 == stat(USBDEVFS_PATH_NEW, &buf)) && S_ISDIR(buf.st_mode))
+		return USBDEVFS_PATH_NEW;
+	else
+		return USBDEVFS_PATH_OLD;
+}
+
+char *usbdevfs_devices_filename()
+{
+	struct stat buf;
+	if (0 == stat(USBDEVFS_DEVICES_NEW, &buf))
+		return USBDEVFS_DEVICES_NEW;
+	else
+		return USBDEVFS_DEVICES_OLD;
+}
+
+char *usbdevfs_sscanf_node()
+{
+	struct stat buf;
+	if ((0 == stat(USBDEVFS_CHECK_NODE_NEW1, &buf)))
+		return USBDEVFS_SSCANF_NODE_NEW1;
+	else if ((0 == stat(USBDEVFS_CHECK_NODE_NEW2, &buf)))
+		return USBDEVFS_SSCANF_NODE_NEW2;
+	else
+		return USBDEVFS_SSCANF_NODE_OLD;
+}
+
+char *usbdevfs_sprintf_node()
+{
+	struct stat buf;
+	if ((0 == stat(USBDEVFS_CHECK_NODE_NEW1, &buf)))
+		return USBDEVFS_SPRINTF_NODE_NEW1;
+	else if ((0 == stat(USBDEVFS_CHECK_NODE_NEW2, &buf)))
+		return USBDEVFS_SPRINTF_NODE_NEW2;
+	else
+		return USBDEVFS_SPRINTF_NODE_OLD;
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbKernel.h b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..909495bce874792909cf6f11ffaa02ea4dc47668
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbKernel.h
@@ -0,0 +1,155 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAX_USB_KERNEL_H
+#define _JAVAX_USB_KERNEL_H
+
+//******************************************************************************
+// Kernel-specific
+
+#include <sys/utsname.h>
+
+// I give up - the kernel guys can't keep their headers clean enough to include them from userspace programs.
+// So everything we need is redefined here.
+
+#define USB_DT_DEVICE			0x01
+#define USB_DT_CONFIG			0x02
+#define USB_DT_STRING			0x03
+#define USB_DT_INTERFACE		0x04
+#define USB_DT_ENDPOINT			0x05
+
+#define USB_DT_HID			0x21
+#define USB_DT_REPORT			0x22
+#define USB_DT_PHYSICAL			0x23
+#define USB_DT_HUB			0x29
+
+/*
+ * Descriptor sizes per descriptor type
+ */
+#define USB_DT_DEVICE_SIZE		18
+#define USB_DT_CONFIG_SIZE		9
+#define USB_DT_INTERFACE_SIZE		9
+#define USB_DT_ENDPOINT_SIZE		7
+#define USB_DT_ENDPOINT_AUDIO_SIZE	9	/* Audio extension */
+#define USB_DT_HUB_NONVAR_SIZE		7
+
+#define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
+#define USB_CLASS_AUDIO			1
+#define USB_CLASS_COMM			2
+#define USB_CLASS_HID			3
+#define USB_CLASS_PRINTER		7
+#define USB_CLASS_PTP			6
+#define USB_CLASS_MASS_STORAGE		8
+#define USB_CLASS_HUB			9
+#define USB_CLASS_DATA			10
+#define USB_CLASS_VENDOR_SPEC		0xff
+
+#define USBDEVFS_URB_SHORT_NOT_OK          1
+#define USBDEVFS_URB_ISO_ASAP              2
+
+#define USBDEVFS_URB_TYPE_ISO		   0
+#define USBDEVFS_URB_TYPE_INTERRUPT	   1
+#define USBDEVFS_URB_TYPE_CONTROL	   2
+#define USBDEVFS_URB_TYPE_BULK		   3
+
+struct usbdevfs_ctrltransfer {
+	unsigned char bmRequestType;
+	unsigned char bRequest;
+	unsigned short wValue;
+	unsigned short wIndex;
+	unsigned short wLength;
+	unsigned int timeout;  /* in milliseconds */
+	void *data;
+};
+
+struct usbdevfs_setinterface {
+	unsigned int interface;
+	unsigned int altsetting;
+};
+
+struct usbdevfs_iso_packet_desc {
+	unsigned int length;
+	unsigned int actual_length;
+	unsigned int status;
+};
+
+struct usbdevfs_urb {
+	unsigned char type;
+	unsigned char endpoint;
+	int status;
+	unsigned int flags;
+	void  *buffer;
+	int buffer_length;
+	int actual_length;
+	int start_frame;
+	int number_of_packets;
+	int error_count;
+	unsigned int signr;  /* signal to be sent on error, -1 if none should be sent */
+	void *usercontext;
+	struct usbdevfs_iso_packet_desc iso_frame_desc[0];
+};
+
+#define USBDEVFS_MAXDRIVERNAME 255
+
+struct usbdevfs_getdriver {
+	unsigned int interface;
+	char driver[USBDEVFS_MAXDRIVERNAME + 1];
+};
+
+struct usbdevfs_connectinfo {
+	unsigned int devnum;
+	unsigned char slow;
+};
+
+struct usbdevfs_ioctl {
+	int	ifno;		/* interface 0..N ; negative numbers reserved */
+	int	ioctl_code;	/* MUST encode size + direction of data so the
+				 * macros in <asm/ioctl.h> give correct values */
+	void  *data;	/* param buffer (in, or out) */
+};
+
+struct usbdevfs_hub_portinfo {
+	char nports;		/* number of downstream ports in this hub */
+	char port [127];	/* e.g. port 3 connects to device 27 */
+};
+
+#define USBDEVFS_CONTROL           _IOWR('U', 0, struct usbdevfs_ctrltransfer)
+#define USBDEVFS_SETINTERFACE      _IOR('U', 4, struct usbdevfs_setinterface)
+#define USBDEVFS_SETCONFIGURATION  _IOR('U', 5, unsigned int)
+#define USBDEVFS_GETDRIVER         _IOW('U', 8, struct usbdevfs_getdriver)
+#define USBDEVFS_SUBMITURB         _IOR('U', 10, struct usbdevfs_urb)
+#define USBDEVFS_DISCARDURB        _IO('U', 11)
+#define USBDEVFS_REAPURB           _IOW('U', 12, void *)
+#define USBDEVFS_REAPURBNDELAY     _IOW('U', 13, void *)
+#define USBDEVFS_CLAIMINTERFACE    _IOR('U', 15, unsigned int)
+#define USBDEVFS_RELEASEINTERFACE  _IOR('U', 16, unsigned int)
+#define USBDEVFS_CONNECTINFO       _IOW('U', 17, struct usbdevfs_connectinfo)
+#define USBDEVFS_IOCTL             _IOWR('U', 18, struct usbdevfs_ioctl)
+#define USBDEVFS_HUB_PORTINFO      _IOR('U', 19, struct usbdevfs_hub_portinfo)
+#define USBDEVFS_DISCONNECT        _IO('U', 22)
+
+int getShortPacketFlag(int accept);
+
+int getIsochronousFlags(int flags);
+int getInterruptFlags(int flags);
+int getControlFlags(int flags);
+int getBulkFlags(int flags);
+
+int getIsochronousType(void);
+int getInterruptType(void);
+int getControlType(void);
+int getBulkType(void);
+
+char *usbdevfs_path();
+char *usbdevfs_devices_filename();
+char *usbdevfs_sscanf_node();
+char *usbdevfs_sprintf_node();
+
+#endif /* _JAVAX_USB_KERNEL_H */
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbLog.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbLog.c
new file mode 100644
index 0000000000000000000000000000000000000000..227d48d59c12587bc1ed469f5985c95ef07b2069
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbLog.c
@@ -0,0 +1,91 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+#define JAVAXUSB_CLASSNAME "com/ibm/jusb/os/linux/JavaxUsb"
+
+jboolean tracing = JNI_TRUE;
+jboolean trace_default = JNI_TRUE;
+jboolean trace_hotplug = JNI_TRUE;
+jboolean trace_xfer = JNI_TRUE;
+jboolean trace_urb = JNI_FALSE;
+int trace_level = LOG_CRITICAL;
+FILE *trace_output = NULL;
+
+//FIXME - add parameter to modify this!!!
+jboolean trace_flush = JNI_TRUE;
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTracing
+(JNIEnv *env, jclass JavaxUsb, jboolean enable)
+{
+	tracing = enable;
+}
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceType
+(JNIEnv *env, jclass JavaxUsb, jboolean setting, jstring jname)
+{
+	const char *name = (*env)->GetStringUTFChars( env, jname, NULL );
+	if (!strcmp("default", name))
+		trace_default = setting;
+	else if (!strcmp("hotplug", name))
+		trace_hotplug = setting;
+	else if (!strcmp("xfer", name))
+		trace_xfer = setting;
+	else if (!strcmp("urb", name))
+		trace_urb = setting;
+	else
+		log( LOG_ERROR, "No match for log type %s", name );
+	(*env)->ReleaseStringUTFChars( env, jname, name );
+}
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceLevel
+(JNIEnv *env, jclass JavaxUsb, jint level)
+{
+	if (LOG_LEVEL_MIN > level || LOG_LEVEL_MAX < level)
+		log( LOG_ERROR, "Invalid trace level %d", level );
+	else
+		trace_level = level;
+}
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceOutput
+(JNIEnv *env, jclass JavaxUsb, jint output, jstring filename)
+{
+	switch (output) {
+		case 1:
+			trace_output = stdout;
+			break;
+
+		case 2:
+			trace_output = stderr;
+			break;
+
+		case 3:
+		case 4:
+			{
+				const char *name = (*env)->GetStringUTFChars( env, filename, NULL );
+				FILE *f = NULL;
+				const char *mode = (3 == output ? "w" : "a"); /* w = trunc, a = append */
+
+				if ((f = fopen(name, mode)))
+					trace_output = f;
+				else
+					log( LOG_ERROR, "Could not open file %s for JNI tracing : %s\n", name, strerror(errno) );
+
+				(*env)->ReleaseStringUTFChars( env, filename, name );
+			}
+			break;
+
+		default:
+			log( LOG_ERROR, "Invalid trace output setting %d\n", output );
+			break;
+	}
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbLog.h b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbLog.h
new file mode 100644
index 0000000000000000000000000000000000000000..d917a2898d3f1c1e676c6488c190ab16c9031afd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbLog.h
@@ -0,0 +1,109 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAXUSBLOG_H
+#define _JAVAXUSBLOG_H
+
+#include <jni.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern jboolean tracing;
+extern jboolean trace_default;
+extern jboolean trace_hotplug;
+extern jboolean trace_xfer;
+extern jboolean trace_urb;
+extern int trace_level;
+extern FILE *trace_output;
+extern jboolean trace_flush;
+
+/* Log to trace_output FILE* (stderr by default). */
+#define log(level,args...) do { \
+  if (!tracing || (trace_level < LOG_LEVEL(level))) break; \
+  if (LOG_XFER_FLAG&level) log_xfer(level,args); \
+  else if (LOG_HOTPLUG_FLAG&level) log_hotplug(level,args); \
+  else if (LOG_URB_FLAG&level) log_urb(level,args); \
+  else log_default(level,args); \
+} while(0)
+
+#define LOG_LEVEL(level) (LOG_LEVEL_MASK&level)
+#define LOG_TYPE(type) (LOG_FLAG_MASK&level)
+
+#define LOG_LEVEL_MASK    0x00ff
+#define LOG_LEVEL_MIN     0x0000
+#define LOG_LEVEL_MAX     0x00ff
+#define LOG_FLAG_MASK     0x0f00
+#define LOG_XFER_FLAG     0x0100
+#define LOG_HOTPLUG_FLAG  0x0200
+#define LOG_URB_FLAG      0x0400
+
+/* Logging levels: */
+#define LOG_CRITICAL  0x00 /* critical messages, this is the default */
+#define LOG_ERROR     0x01 /* error messages */
+#define LOG_INFO      0x02 /* function internal */
+#define LOG_FUNC      0x03 /* function entry/exit */
+#define LOG_DEBUG     0x04 /* debugging */
+#define LOG_OTHER     0x05 /* all other logging */
+
+/* Log data transfers */
+#define log_xfer(level,args...) do { if (trace_xfer) log_named(level,"xfer",args); } while(0)
+#define LOG_XFER_CRITICAL  (LOG_XFER_FLAG | 0x00) /* critical xfers errors */
+#define LOG_XFER_ERROR     (LOG_XFER_FLAG | 0x01) /* xfer errors */
+#define LOG_XFER_REQUEST   (LOG_XFER_FLAG | 0x02) /* request received or completed */
+#define LOG_XFER_META      (LOG_XFER_FLAG | 0x03) /* metadata (device, endpoint, setup, etc) */
+#define LOG_XFER_DATA      (LOG_XFER_FLAG | 0x04) /* raw data only */
+#define LOG_XFER_OTHER     (LOG_XFER_FLAG | 0x05) /* all other transfer logging */
+
+/* Log hotplug / initialization */
+#define log_hotplug(level,args...) do { if (trace_hotplug) log_named(level,"hotplug",args); } while(0)
+#define LOG_HOTPLUG_CRITICAL (LOG_HOTPLUG_FLAG | 0x00) /* critical hotplug errors */
+#define LOG_HOTPLUG_ERROR    (LOG_HOTPLUG_FLAG | 0x01) /* hotplug errors */
+#define LOG_HOTPLUG_CHANGE   (LOG_HOTPLUG_FLAG | 0x02) /* connect/disconnect notices */
+#define LOG_HOTPLUG_DEVICE   (LOG_HOTPLUG_FLAG | 0x03) /* device information */
+#define LOG_HOTPLUG_OTHER    (LOG_HOTPLUG_FLAG | 0x04) /* all other logging */
+
+/* Log urb data */
+#define log_urb(level,args...) do { if (trace_urb) log_named(level,"urb",args); } while(0)
+#define LOG_URB_METADATA (LOG_URB_FLAG | 0x02) /* URB fields */
+#define LOG_URB_DATA     (LOG_URB_FLAG | 0x03) /* Actual URB data */
+
+#define log_default(level,args...) do { if (trace_default) log_named(level,"default",args); } while(0)
+
+static char *log_oom = "Out of memory while logging!";
+#define DEFAULT_LOG_LEN 256
+#define OLD_GLIBC_MAX_LOG_LEN 1024 /* If glibc is 2.0 or lower, snprintf does not report needed length, so set this as max */
+#define log_named(level,logname,args...) \
+do { \
+  char buf1[DEFAULT_LOG_LEN], *buf2 = NULL, *buffer = buf1; \
+  int real_len; \
+  real_len = snprintf(buffer, DEFAULT_LOG_LEN, args); \
+  if (0 > real_len || DEFAULT_LOG_LEN <= real_len) { \
+    int full_len = (0 > real_len ? OLD_GLIBC_MAX_LOG_LEN : real_len+1); \
+    if (!(buf2 = malloc(full_len))) { \
+      buffer = log_oom; \
+    } else { \
+      buffer = buf2; \
+      real_len = snprintf(buffer, full_len, args); \
+      buffer[((real_len < full_len-1 && 0 <= real_len) ? real_len : full_len-1)] = 0; \
+    } \
+  } \
+  do_log(logname,(LOG_LEVEL_MASK&level),__FILE__,__func__,__LINE__,buffer); \
+  if (buf2) free(buf2); \
+} while (0)
+
+#define do_log(logname, level, file, func, line, msg) do { \
+	if (trace_output) { \
+		fprintf(trace_output, "[%s](%d) %s.%s[%d] %s\n",logname,level,file,func,line,msg); \
+		if (JNI_TRUE == trace_flush) fflush(trace_output); \
+	} \
+} while(0)
+
+#endif /* _JAVAXUSBLOG_H */
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbPipeRequest.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbPipeRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..8ef2085cc6385c010fafedfc23c41288f7317cfb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbPipeRequest.c
@@ -0,0 +1,160 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/* These MUST match those defined in com/ibm/jusb/os/linux/LinuxPipeRequest.java */
+#define PIPE_CONTROL 1
+#define PIPE_BULK 2
+#define PIPE_INTERRUPT 3
+#define PIPE_ISOCHRONOUS 4
+
+/**
+ * Submit a pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ * @return The error, or 0.
+ */
+int pipe_request( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret = 0, type, urbsize;
+
+	jclass LinuxPipeRequest = NULL;
+	jobject linuxPipeRequest = NULL;
+	jmethodID setUrbAddress, getAcceptShortPacket, getEndpointAddress, getPipeType;
+	jboolean acceptShortPacket;
+
+	linuxPipeRequest = CheckedNewGlobalRef( env, linuxRequest );
+	LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	getEndpointAddress = CheckedGetMethodID( env, LinuxPipeRequest, "getEndpointAddress", "()B" );
+	getPipeType = CheckedGetMethodID( env, LinuxPipeRequest, "getPipeType", "()I" );
+	type = CheckedCallIntMethod( env, linuxPipeRequest, getPipeType );
+	setUrbAddress = CheckedGetMethodID( env, LinuxPipeRequest, "setUrbAddress", "(J)V" );
+	getAcceptShortPacket = CheckedGetMethodID( env, LinuxPipeRequest, "getAcceptShortPacket", "()Z" );
+	acceptShortPacket = CheckedCallBooleanMethod( env, linuxPipeRequest, getAcceptShortPacket );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	urbsize = sizeof(*urb);
+	if (PIPE_ISOCHRONOUS == type)
+		urbsize += sizeof(struct usbdevfs_iso_packet_desc);
+
+	if (!(urb = malloc(urbsize))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto end;
+	}
+
+	memset(urb, 0, sizeof(*urb));
+
+	urb->endpoint = (unsigned char)CheckedCallByteMethod( env, linuxPipeRequest, getEndpointAddress );
+	urb->usercontext = linuxPipeRequest;
+	urb->flags |= getShortPacketFlag(acceptShortPacket);
+
+	log( LOG_XFER_REQUEST, "Submitting URB" );
+
+	switch (type) {
+	case PIPE_CONTROL: ret = control_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	case PIPE_BULK: ret = bulk_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	case PIPE_INTERRUPT: ret = interrupt_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	case PIPE_ISOCHRONOUS: ret = isochronous_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	default: log( LOG_XFER_ERROR, "Unknown pipe type %d", type ); ret = -EINVAL; break;
+	}
+
+	if (ret) {
+		log( LOG_XFER_ERROR, "Could not submit URB (errno %d)", ret );
+	} else {
+		log( LOG_XFER_REQUEST, "Submitted URB" );
+		CheckedCallVoidMethod( env, linuxPipeRequest, setUrbAddress, urb );
+	}
+
+end:
+	if (ret) {
+			if (linuxPipeRequest) CheckedDeleteGlobalRef( env, linuxPipeRequest );
+			if (urb) free(urb);
+	}
+
+	return ret;
+}
+
+/**
+ * Complete a pipe request.
+ * @param env The JNIEnv.
+ * @param linuxRequest The LinuxRequest.
+ * @return The error or 0.
+ */
+int complete_pipe_request( JNIEnv *env, jobject linuxPipeRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret = 0, type;
+
+	jclass LinuxPipeRequest;
+	jmethodID getPipeType, getUrbAddress;
+
+	LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	getPipeType = CheckedGetMethodID( env, LinuxPipeRequest, "getPipeType", "()I" );
+	getUrbAddress = CheckedGetMethodID( env, LinuxPipeRequest, "getUrbAddress", "()J" );
+	type = CheckedCallIntMethod( env, linuxPipeRequest, getPipeType );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (!(urb = (struct usbdevfs_urb*)CheckedCallLongMethod( env, linuxPipeRequest, getUrbAddress ))) {
+		log( LOG_XFER_ERROR, "No URB to complete." );
+		return -EINVAL;
+	}
+
+	log( LOG_XFER_REQUEST, "Completing URB." );
+	debug_urb( env, "complete_pipe_request", urb );
+
+	switch (type) {
+	case PIPE_CONTROL: ret = complete_control_pipe_request( env, linuxPipeRequest, urb ); break;
+	case PIPE_BULK: ret = complete_bulk_pipe_request( env, linuxPipeRequest, urb ); break;
+	case PIPE_INTERRUPT: ret = complete_interrupt_pipe_request( env, linuxPipeRequest, urb ); break;
+	case PIPE_ISOCHRONOUS: ret = complete_isochronous_pipe_request( env, linuxPipeRequest, urb ); break;
+	default: log( LOG_XFER_ERROR, "Unknown pipe type %d", type); ret = -EINVAL; break;
+	}
+
+	free(urb);
+
+	log( LOG_XFER_REQUEST, "Completed URB." );
+
+	return ret;
+}
+
+/**
+ * Abort a pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ */
+void cancel_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest )
+{
+	struct usbdevfs_urb *urb;
+
+	jclass LinuxPipeRequest;
+	jmethodID getUrbAddress;
+
+	LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	getUrbAddress = CheckedGetMethodID( env, LinuxPipeRequest, "getUrbAddress", "()J" );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	log( LOG_XFER_REQUEST, "Canceling URB." );
+
+	urb = (struct usbdevfs_urb *)CheckedCallLongMethod( env, linuxPipeRequest, getUrbAddress );
+
+	if (!urb) {
+		log( LOG_XFER_ERROR, "No URB to cancel." );
+		return;
+	}
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_DISCARDURB, urb )))
+		log( LOG_XFER_ERROR, "Could not unlink urb %p (error %d)", urb, -errno );
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbTopologyListener.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbTopologyListener.c
new file mode 100644
index 0000000000000000000000000000000000000000..4824ccd947bb5f23c9c2dde4c1f559c68ce21ca3
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbTopologyListener.c
@@ -0,0 +1,76 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Listener for connect/disconnect events
+ * @author Dan Streetman
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyListener
+			( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices ) {
+	struct pollfd devpoll;
+	int poll_timeout = -1;
+	int descriptor = 0;
+	int error = 0;
+	unsigned int pollingError = 0;
+
+	jclass LinuxUsbServices = CheckedGetObjectClass( env, linuxUsbServices );
+
+	jmethodID topologyChange = CheckedGetMethodID( env, LinuxUsbServices, "topologyChange", "()V" );
+
+	errno = 0;
+	descriptor = open( usbdevfs_devices_filename(), O_RDONLY, 0 );
+	if ( 0 >= descriptor ) {
+		log( LOG_HOTPLUG_CRITICAL, "Could not open %s", usbdevfs_devices_filename() );
+		error = errno;
+		goto TOPOLOGY_LISTENER_CLEANUP;
+	}
+
+	devpoll.fd = descriptor;
+	devpoll.events = POLLIN;
+
+	while ( 1 ) {
+		poll(&devpoll, 1, poll_timeout);
+
+		// Skip empty wake-ups
+		if ( 0x0 == devpoll.revents ) continue;
+
+		// Polling Error...strange...
+		if ( devpoll.revents & POLLERR ) {
+			log( LOG_HOTPLUG_ERROR, "Topology Polling error." );
+			if (MAX_POLLING_ERRORS < ++pollingError) {
+				log( LOG_HOTPLUG_CRITICAL, "%d polling errors; aborting!", pollingError );
+				error = -ENOLINK; /* gotta pick one of 'em */
+				break;
+			} else continue;
+		}
+
+		// Connect/Disconnect event...
+		if ( devpoll.revents & POLLIN ) {
+			log( LOG_HOTPLUG_CHANGE, "Got topology change event." );
+			CheckedCallVoidMethod( env, linuxUsbServices, topologyChange );
+			continue;
+		}
+
+		// Freak event...
+		log( LOG_HOTPLUG_CHANGE, "Unknown event received = 0x%x", devpoll.revents );
+	}
+
+	/* This should NOT happen! */
+	log( LOG_HOTPLUG_CRITICAL, "TopologyListener Exiting!" );
+	close( descriptor );
+
+TOPOLOGY_LISTENER_CLEANUP:
+	CheckedDeleteLocalRef( env, LinuxUsbServices );
+
+	return error;
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbTopologyUpdater.c b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbTopologyUpdater.c
new file mode 100644
index 0000000000000000000000000000000000000000..7fe47bda5ac07248627f2ef767b997fbb24f2d90
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/JavaxUsbTopologyUpdater.c
@@ -0,0 +1,353 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+static inline int build_device( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices, unsigned char bus, unsigned char dev,
+	jobject parent, int parentport, jobject connectedDevices, jobject disconnectedDevices );
+
+static inline int build_config( JNIEnv *env, jclass JavaxUsb, int fd, jobject device, unsigned char bus, unsigned char dev );
+
+static inline jobject build_interface( JNIEnv *env, jclass JavaxUsb, int fd, jobject config, struct jusb_interface_descriptor *if_desc, unsigned char bus, unsigned char dev );
+
+static inline void build_endpoint( JNIEnv *env, jclass JavaxUsb, jobject interface, struct jusb_endpoint_descriptor *ep_desc );
+
+static inline void *get_descriptor( JNIEnv *env, int fd );
+
+static int select_usbfs(const struct dirent *entry);
+
+/**
+ * Update topology tree
+ * @author Dan Streetman
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyUpdater
+			( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices, jobject connectedDevices, jobject disconnectedDevices )
+{
+	int busses, port, devices = 0;
+	struct dirent **buslist = NULL;
+
+	jclass LinuxUsbServices = CheckedGetObjectClass( env, linuxUsbServices );
+	jmethodID getRootUsbHubImp = CheckedGetMethodID( env, LinuxUsbServices, "getRootUsbHubImp", "()Lcom/ibm/jusb/UsbHubImp;" );
+	jobject rootHub = CheckedCallObjectMethod( env, linuxUsbServices, getRootUsbHubImp );
+	CheckedDeleteLocalRef( env, LinuxUsbServices );
+
+	if (0 > (*env)->EnsureLocalCapacity(env, 40)) {
+		log( LOG_CRITICAL, "Could not reserve enough local references, Out of Memory!\n");
+		return -ENOMEM;
+	}
+
+ 	if (!rootHub) {
+		log( LOG_ERROR, "Could not get rootHub!\n");
+		return -EINVAL;
+	}
+
+	errno = 0;
+	if (0 > (busses = scandir(usbdevfs_path(), &buslist, select_usbfs, alphasort)) ) {
+		log( LOG_ERROR, "Could not access %s : %s", usbdevfs_path(), strerror(errno) );
+		return -errno;
+	}
+
+	for (port=0; port<busses; port++) {
+		struct dirent **devlist = NULL;
+		int bus, hcAddress, devs;
+		int busdir_len = strlen(usbdevfs_path()) + strlen(buslist[port]->d_name) + 2;
+		char busdir[busdir_len];
+
+		sprintf(busdir, "%s/%s", usbdevfs_path(), buslist[port]->d_name);
+		bus = atoi( buslist[port]->d_name );
+
+		errno = 0;
+		devs = scandir(busdir, &devlist, select_usbfs, alphasort);
+
+		if (0 > devs) {
+			log( LOG_ERROR, "Could not access device nodes in %s : %s", busdir, strerror(errno) );
+		} else if (!devs) {
+			log( LOG_ERROR, "No device nodes found in %s : %s", busdir, strerror(errno) );
+		} else {
+			/* Hopefully, the host controller has the lowest numbered address on this bus! */
+			hcAddress = atoi( devlist[0]->d_name );
+			devices += build_device( env, JavaxUsb, linuxUsbServices, bus, hcAddress, rootHub, port, connectedDevices, disconnectedDevices );
+		}
+
+		while (0 < devs) free(devlist[--devs]);
+		if (devlist) free(devlist);
+
+		free(buslist[port]);
+	}
+	free(buslist);
+
+	if (rootHub) CheckedDeleteLocalRef( env, rootHub );
+
+	return 0;
+}
+
+static inline int build_device( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices, unsigned char bus, unsigned char dev,
+	jobject parent, int parentport, jobject connectedDevices, jobject disconnectedDevices )
+{
+	int fd = 0, port, ncfg;
+	int devices = 0, speed = SPEED_UNKNOWN;
+	struct usbdevfs_ioctl *usbioctl = NULL;
+	struct usbdevfs_hub_portinfo *portinfo = NULL;
+	struct usbdevfs_connectinfo *connectinfo = NULL;
+	struct jusb_device_descriptor *dev_desc = NULL;
+	int node_len = strlen(usbdevfs_path()) + 1 + 3 + 1 + 3 + 1;
+	char node[node_len];
+
+	jobject device = NULL, existingDevice = NULL;
+	jstring keyString = NULL;
+
+	jclass LinuxUsbServices = CheckedGetObjectClass( env, linuxUsbServices );
+	jmethodID createUsbHubImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbHubImp", "(Ljava/lang/String;I)Lcom/ibm/jusb/UsbHubImp;" );
+	jmethodID createUsbDeviceImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbDeviceImp", "(Ljava/lang/String;)Lcom/ibm/jusb/UsbDeviceImp;" );
+	jmethodID configureUsbDeviceImp = CheckedGetStaticMethodID( env, JavaxUsb, "configureUsbDeviceImp", "(Lcom/ibm/jusb/UsbDeviceImp;BBBBBBBBBBSSSSI)V" );
+	jmethodID checkUsbDeviceImp = CheckedGetMethodID( env, LinuxUsbServices, "checkUsbDeviceImp", "(Lcom/ibm/jusb/UsbHubImp;ILcom/ibm/jusb/UsbDeviceImp;Ljava/util/List;Ljava/util/List;)Lcom/ibm/jusb/UsbDeviceImp;" );
+	CheckedDeleteLocalRef( env, LinuxUsbServices );
+
+	sprintf(node, usbdevfs_sprintf_node(), (0xff&bus), (0xff&dev));
+
+	keyString = CheckedNewStringUTF( env, node );
+
+	log( LOG_HOTPLUG_DEVICE, "Building device %s", node );
+
+	fd = open( node, O_RDWR );
+	if ( 0 >= fd ) {
+		log( LOG_ERROR, "Could not access %s", node );
+		goto BUILD_DEVICE_EXIT;
+	}
+
+	if (!(dev_desc = get_descriptor( env, fd ))) {
+		log( LOG_ERROR, "Short read on device descriptor" );
+		goto BUILD_DEVICE_EXIT;
+	}
+
+	if (dev_desc->bDeviceClass == USB_CLASS_HUB) {
+		usbioctl = malloc(sizeof(*usbioctl));
+		portinfo = malloc(sizeof(*portinfo));
+		usbioctl->ioctl_code = USBDEVFS_HUB_PORTINFO;
+		usbioctl->ifno = 0;
+		usbioctl->data = portinfo;
+		errno = 0;
+		if (0 >= ioctl( fd, USBDEVFS_IOCTL, usbioctl )) {
+			log( LOG_ERROR, "Could not get portinfo from hub, error = %d", errno );
+			goto BUILD_DEVICE_EXIT;
+		} else {
+		  log( LOG_HOTPLUG_DEVICE, "Device is hub with %d ports",portinfo->nports );
+		}
+		free(usbioctl);
+		usbioctl = NULL;
+		device = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbHubImp, keyString, portinfo->nports );
+	} else {
+	  device = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbDeviceImp, keyString );
+	}
+
+	connectinfo = malloc(sizeof(*connectinfo));
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_CONNECTINFO, connectinfo ))) {
+		log( LOG_ERROR, "Could not get connectinfo from device, error = %d", errno );
+		goto BUILD_DEVICE_EXIT;
+	} else {
+	  log( LOG_HOTPLUG_OTHER, "Device speed is %s", (connectinfo->slow?"1.5 Mbps":"12 Mbps") );
+	}
+	speed = ( connectinfo->slow ? SPEED_LOW : SPEED_FULL );
+	free(connectinfo);
+	connectinfo = NULL;
+
+	CheckedCallStaticVoidMethod( env, JavaxUsb, configureUsbDeviceImp, device, 
+		dev_desc->bLength, dev_desc->bDescriptorType,
+		dev_desc->bDeviceClass, dev_desc->bDeviceSubClass, dev_desc->bDeviceProtocol,
+		dev_desc->bMaxPacketSize0, dev_desc->iManufacturer, dev_desc->iProduct, dev_desc->iSerialNumber,
+		dev_desc->bNumConfigurations, dev_desc->idVendor, dev_desc->idProduct,
+		dev_desc->bcdDevice, dev_desc->bcdUSB, speed );
+
+	/* Build config descriptors */
+	for (ncfg=0; ncfg<dev_desc->bNumConfigurations; ncfg++) {
+		if (build_config( env, JavaxUsb, fd, device, bus, dev )) {
+			log( LOG_ERROR, "Could not get config %d for device %d", ncfg, dev );
+			goto BUILD_DEVICE_EXIT;
+		}
+	}
+
+	existingDevice = CheckedCallObjectMethod( env, linuxUsbServices, checkUsbDeviceImp, parent, parentport+1, device, connectedDevices, disconnectedDevices );
+	CheckedDeleteLocalRef( env, device );
+	device = existingDevice;
+
+	/* This device is set up and ready! */
+	devices = 1;
+	close( fd );
+	fd = 0;
+
+	if ((dev_desc->bDeviceClass == USB_CLASS_HUB) && portinfo)
+		for (port=0; port<(portinfo->nports); port++)
+			if (portinfo->port[port]) {
+				log( LOG_HOTPLUG_OTHER, "Building device %d attached to port %d", portinfo->port[port], port);
+				devices += build_device( env, JavaxUsb, linuxUsbServices, bus, portinfo->port[port], device, port, connectedDevices, disconnectedDevices );
+			}
+
+BUILD_DEVICE_EXIT:
+	if (fd) close(fd);
+	if (device) CheckedDeleteLocalRef( env, device );
+	if (connectinfo) free(connectinfo);
+	if (dev_desc) free(dev_desc);
+	if (usbioctl) free(usbioctl);
+	if (portinfo) free(portinfo);
+	if (keyString) CheckedDeleteLocalRef( env, keyString );
+
+	return devices;
+}
+
+static inline int build_config( JNIEnv *env, jclass JavaxUsb, int fd, jobject device, unsigned char bus, unsigned char dev )
+{
+	int result = -1;
+	struct jusb_config_descriptor *cfg_desc = NULL;
+	unsigned char *desc = NULL;
+	unsigned short wTotalLength;
+	unsigned int pos;
+	jobject config = NULL, interface = NULL;
+	jmethodID createUsbConfigurationImp;
+
+	if (!(cfg_desc = get_descriptor( env, fd ))) {
+		log( LOG_ERROR, "Short read on config desriptor." );
+		goto BUILD_CONFIG_EXIT;
+	}
+
+	createUsbConfigurationImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbConfigurationImp", "(Lcom/ibm/jusb/UsbDeviceImp;BBSBBBBB)Lcom/ibm/jusb/UsbConfigurationImp;" );
+
+	log( LOG_HOTPLUG_OTHER, "Building config %d", cfg_desc->bConfigurationValue );
+
+	wTotalLength = cfg_desc->wTotalLength;
+	pos = cfg_desc->bLength;
+
+	config = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbConfigurationImp, device,
+		cfg_desc->bLength, cfg_desc->bDescriptorType, wTotalLength,
+		cfg_desc->bNumInterfaces, cfg_desc->bConfigurationValue, cfg_desc->iConfiguration,
+		cfg_desc->bmAttributes, cfg_desc->bMaxPower );
+
+	while (pos < wTotalLength) {
+		desc = get_descriptor( env, fd );
+		if ((!desc) || (2 > desc[0])) {
+			log( LOG_ERROR, "Short read on descriptor" );
+			goto BUILD_CONFIG_EXIT;
+		}
+		pos += desc[0];
+		switch( desc[1] ) {
+			case USB_DT_DEVICE:
+				log( LOG_ERROR, "Got device descriptor inside of config descriptor" );
+				goto BUILD_CONFIG_EXIT;
+
+			case USB_DT_CONFIG:
+				log( LOG_ERROR, "Got config descriptor inside of config descriptor" );
+				goto BUILD_CONFIG_EXIT;
+
+			case USB_DT_INTERFACE:
+				if (interface) CheckedDeleteLocalRef( env, interface );
+				interface = build_interface( env, JavaxUsb, fd, config, (struct jusb_interface_descriptor*)desc, bus, dev );
+				break;
+
+			case USB_DT_ENDPOINT:
+				build_endpoint( env, JavaxUsb, interface, (struct jusb_endpoint_descriptor*)desc );
+				break;
+
+			default:
+				/* Ignore proprietary descriptor */
+				break;
+		}
+		free(desc);
+		desc = NULL;
+	}
+
+	result = 0;
+
+BUILD_CONFIG_EXIT:
+	if (config) CheckedDeleteLocalRef( env, config );
+	if (interface) CheckedDeleteLocalRef( env, interface );
+	if (cfg_desc) free(cfg_desc);
+	if (desc) free(desc);
+
+	return result;
+}
+
+static inline jobject build_interface( JNIEnv *env, jclass JavaxUsb, int fd, jobject config, struct jusb_interface_descriptor *if_desc, unsigned char bus, unsigned char dev )
+{
+	jobject interface;
+
+	jmethodID createUsbInterfaceImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbInterfaceImp", "(Lcom/ibm/jusb/UsbConfigurationImp;BBBBBBBBB)Lcom/ibm/jusb/UsbInterfaceImp;" );
+
+	log( LOG_HOTPLUG_OTHER, "Building interface %d", if_desc->bInterfaceNumber );
+
+	interface = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbInterfaceImp, config,
+		if_desc->bLength, if_desc->bDescriptorType,
+		if_desc->bInterfaceNumber, if_desc->bAlternateSetting, if_desc->bNumEndpoints, if_desc->bInterfaceClass,
+		if_desc->bInterfaceSubClass, if_desc->bInterfaceProtocol, if_desc->iInterface );
+
+	return interface;
+}
+
+static inline void build_endpoint( JNIEnv *env, jclass JavaxUsb, jobject interface, struct jusb_endpoint_descriptor *ep_desc )
+{
+	jmethodID createUsbEndpointImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbEndpointImp", "(Lcom/ibm/jusb/UsbInterfaceImp;BBBBBS)Lcom/ibm/jusb/UsbEndpointImp;" );
+
+	log( LOG_HOTPLUG_OTHER, "Building endpoint 0x%2.02x", ep_desc->bEndpointAddress );
+
+	if (!interface) {
+		log( LOG_ERROR, "Interface is NULL");
+		return;
+	}
+
+	CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbEndpointImp, interface,
+		ep_desc->bLength, ep_desc->bDescriptorType,
+		ep_desc->bEndpointAddress, ep_desc->bmAttributes, ep_desc->bInterval, ep_desc->wMaxPacketSize );
+}
+
+static inline void *get_descriptor( JNIEnv *env, int fd )
+{
+	unsigned char *buffer = NULL, *len = NULL;
+	int nread;
+
+	len = malloc(1);
+	if (1 > read( fd, len, 1 )) {
+		log( LOG_ERROR, "Cannot read from file!" );
+		goto GET_DESCRIPTOR_EXIT;
+	}
+
+	if (*len == 0) {
+		log( LOG_ERROR, "Zero-length descriptor?" );
+		goto GET_DESCRIPTOR_EXIT;
+	}
+
+	buffer = malloc(*len);
+	buffer[0] = *len;
+	free(len);
+	len = NULL;
+
+	nread = read( fd, buffer+1, buffer[0]-1 );
+	if (buffer[0]-1 != nread) {
+		if (buffer[0]-1 > nread) log( LOG_ERROR, "Short read on file" );
+		else log( LOG_ERROR, "Long read on file" );
+		free(buffer);
+		buffer = NULL;
+	}
+
+GET_DESCRIPTOR_EXIT:
+	if (len) free(len);
+
+	return buffer;
+}
+
+static int select_usbfs(const struct dirent *entry)
+{
+	/* This originally used entry->d_type, however Linux 2.4 doesn't implement d_type,
+	 * and POSIX apparently doesn't define it either.  So let's just do name matching.
+	 * Hope that doesn't change.
+	 */
+	int n = atoi(entry->d_name);
+	/* If the number conversion of the name is 1-999, it's (hopefully) ok.
+	 */
+	return (0 < n) && (n < 1000);
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/Makefile b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..dc4c5e34a87164730bc392181f71323e2ff977cb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/Makefile
@@ -0,0 +1,54 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Java Usb
+#
+# Dan Streetman
+#
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	JavaxUsbKernel.o \
+	JavaxUsbLog.o \
+	JavaxUsbTopologyUpdater.o JavaxUsbTopologyListener.o JavaxUsbActive.o \
+	JavaxUsbDeviceProxy.o \
+	JavaxUsbPipeRequest.o JavaxUsbInterfaceRequest.o \
+	JavaxUsbControlRequest.o JavaxUsbBulkRequest.o JavaxUsbInterruptRequest.o JavaxUsbIsochronousRequest.o \
+	JavaxUsbError.o
+HEADER = com_ibm_jusb_os_linux_JavaxUsb.h
+
+JSR80_CC = gcc
+JSR80_CCLD = $(JSR80_CC)
+
+JSR80_INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux $(CINCLUDES)
+
+JSR80_CFLAGS = -Wall -fPIC $(JUSB_FLAGS) $(CFLAGS)
+JSR80_SOFLAGS = -shared $(SOFLAGS)
+
+JSR80_COMPILE = $(JSR80_CC) $(JSR80_INCLUDES) $(JSR80_CFLAGS)
+JSR80_LINK = $(JSR80_CCLD) $(JSR80_CFLAGS) -o $@
+
+# This is the final shared library
+all: libJavaxUsb.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(JSR80_COMPILE) -c $<
+
+# Build the shared library
+libJavaxUsb.so: $(OBJECTS)
+	@[ -n "${JAVA_HOME}" ] || (echo "";echo "*** Please set your JAVA_HOME variable (I need the JNI headers!) ***";echo "";exit 1)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libJavaxUsb.so
+	$(JSR80_LINK) $(JSR80_SOFLAGS) $(OBJECTS)
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libJavaxUsb.so $(OBJECTS) $(HEADER) *.o *.so
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/com_ibm_jusb_os_linux_JavaxUsb.h b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/com_ibm_jusb_os_linux_JavaxUsb.h
new file mode 100644
index 0000000000000000000000000000000000000000..06d5e0a12b14920480270ca294a005794d17c0b8
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/javax.usb.linux/com_ibm_jusb_os_linux_JavaxUsb.h
@@ -0,0 +1,100 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_ibm_jusb_os_linux_JavaxUsb */
+
+#ifndef _Included_com_ibm_jusb_os_linux_JavaxUsb
+#define _Included_com_ibm_jusb_os_linux_JavaxUsb
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* Inaccessible static: msgLevelTable */
+#undef com_ibm_jusb_os_linux_JavaxUsb_SPEED_UNKNOWN
+#define com_ibm_jusb_os_linux_JavaxUsb_SPEED_UNKNOWN 0L
+#undef com_ibm_jusb_os_linux_JavaxUsb_SPEED_LOW
+#define com_ibm_jusb_os_linux_JavaxUsb_SPEED_LOW 1L
+#undef com_ibm_jusb_os_linux_JavaxUsb_SPEED_FULL
+#define com_ibm_jusb_os_linux_JavaxUsb_SPEED_FULL 2L
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTracing
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTracing
+  (JNIEnv *, jclass, jboolean);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTraceType
+ * Signature: (ZLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceType
+  (JNIEnv *, jclass, jboolean, jstring);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTraceLevel
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceLevel
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTraceOutput
+ * Signature: (ILjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceOutput
+  (JNIEnv *, jclass, jint, jstring);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeTopologyUpdater
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxUsbServices;Ljava/util/List;Ljava/util/List;)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyUpdater
+  (JNIEnv *, jclass, jobject, jobject, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeGetActiveConfigurationNumber
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxDeviceOsImp;)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveConfigurationNumber
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeGetActiveInterfaceSettingNumber
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxDeviceOsImp;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveInterfaceSettingNumber
+  (JNIEnv *, jclass, jobject, jint);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeTopologyListener
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxUsbServices;)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyListener
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeDeviceProxy
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxDeviceProxy;)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeDeviceProxy
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeGetErrorMessage
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetErrorMessage
+  (JNIEnv *, jclass, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/COPYING b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/COPYING
new file mode 100644
index 0000000000000000000000000000000000000000..75300cc2b75f5676552b2d8566411b0a7a934d02
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/COPYING
@@ -0,0 +1,21 @@
+These Java libraries are Copyright Matthew Johnson 2006-2011 and are licenced
+under the terms of the Expat license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/INSTALL b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/INSTALL
new file mode 100644
index 0000000000000000000000000000000000000000..d94da85dfc86d6a3bc0d7f446b66f6ffde5dada0
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/INSTALL
@@ -0,0 +1,10 @@
+libmatthew-java installation guide
+-----------------------------
+
+To compile libmatthew-java you will need a Java 1.4 or better JDK, and a
+standard unix build environment including a C compiler.
+
+The libraries can be compiled and installed with `make' and `make install'
+respectively. By default they will be installed into /usr/local/share/java and
+/usr/local/lib/jni. This location can be configured by giving PREFIX, JARDIR
+and LIBDIR variables to make.
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/Makefile b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..03c2e8a8b801cf2cb1b9b1d74fbdaddc721156ea
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/Makefile
@@ -0,0 +1,142 @@
+JAVAC?=javac
+JAVADOC?=javadoc
+JAR?=jar
+JAVAH?=javah
+GCJ?=gcj
+CC?=gcc
+LD?=gcc
+JPPFLAGS+=-C -P
+CFLAGS+=-Wall -Os -pedantic -Werror
+CSTD?=-std=c99
+CSHAREFLAG+=-fpic -fno-stack-protector
+GCJJNIFLAG=-fjni
+JVERCFLAGS+=-source 1.5
+JCFLAGS+=
+INCLUDES+=-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
+JAVADOCFLAGS?=-quiet -author -link http://java.sun.com/j2se/1.4.2/docs/api/
+
+LDVER?=$(shell ld -v | cut -d' ' -f1)
+UNAME?=$(shell uname -s)
+
+ifeq ($(LDVER),GNU)
+LDSHAREFLAGS+=-fpic -shared
+else
+LDSHAREFLAGS+=-lc
+endif
+
+PREFIX?=/usr/local
+JARDIR?=$(PREFIX)/share/java
+DOCDIR?=$(PREFIX)/share/doc/libmatthew-java/
+LIBDIR?=$(PREFIX)/lib/jni
+
+MATTVER=0.8
+DEBUGVER=1.1
+UNIXVER=0.5
+CGIVER=0.6
+IOVER=0.1
+HEXVER=0.2
+
+SRC=$(shell find cx -name '*.java' -and -not -name 'Debug.java')
+
+DEBUG?=disable
+
+.NOPARALLEL:
+.NO_PARALLEL:
+.NOTPARALLEL:
+
+all: unix-$(UNIXVER).jar cgi-$(CGIVER).jar debug-enable-$(DEBUGVER).jar debug-disable-$(DEBUGVER).jar io-$(IOVER).jar hexdump-$(HEXVER).jar libcgi-java.so libunix-java.so
+
+classes: .classes 
+.classes: $(SRC) 
+	mkdir -p classes
+	$(MAKE) .$(DEBUG)debug
+	$(JAVAC) $(JVERCFLAGS) $(JCFLAGS) -d classes -cp classes $^
+	touch .classes
+clean:
+	rm -rf classes doc
+	rm -f .classes .enabledebug .disabledebug *.o *.h *.so *.tar.gz *.jar *.cgi Manifest
+	rm -rf libmatthew-java-$(MATTVER)
+
+cgi-$(CGIVER).jar: .classes
+	(cd classes; $(JAR) cf ../$@ cx/ath/matthew/cgi/*class)
+io-$(IOVER).jar: .classes
+	(cd classes; $(JAR) cf ../$@ cx/ath/matthew/io/*class)
+unix-$(UNIXVER).jar: .classes
+ifeq ($(DEBUG),enable)
+	echo "Class-Path: $(JARDIR)/debug-$(DEBUG).jar" > Manifest
+else
+	echo "Class-Path: " > Manifest
+endif
+	(cd classes; $(JAR) cfm ../$@ ../Manifest cx/ath/matthew/unix/*class)
+
+hexdump-$(HEXVER).jar: .classes
+	(cd classes; $(JAR) cf ../$@ cx/ath/matthew/utils/Hexdump.class)
+
+%.o: %.c %.h
+	$(CC) $(CFLAGS) $(CSTD) $(CSHAREFLAG) $(INCLUDES) -c -o $@ $<
+lib%.so: %.o
+	$(CC) $(LDFLAGS) $(LDSHAREFLAGS) -o $@ $<
+unix-java.h: .classes
+	$(JAVAH) -classpath classes -o $@ cx.ath.matthew.unix.UnixServerSocket cx.ath.matthew.unix.UnixSocket cx.ath.matthew.unix.USInputStream cx.ath.matthew.unix.USOutputStream
+cgi-java.h: .classes
+	$(JAVAH) -classpath classes -o $@ cx.ath.matthew.cgi.CGI
+
+test.cgi: cgi-$(CGIVER).jar libcgi-java.so
+	$(GCJ) $(GCJFLAGS) $(GCJJNIFLAG) -L. -lcgi-java -o test.cgi --main=cx.ath.matthew.cgi.testcgi cgi-$(CGIVER).jar
+	
+libmatthew-java-$(MATTVER).tar.gz: Makefile cx cgi-java.c unix-java.c README INSTALL COPYING changelog
+	mkdir -p libmatthew-java-$(MATTVER)
+	cp -a $^ libmatthew-java-$(MATTVER)
+	tar zcf $@ libmatthew-java-$(MATTVER)
+
+debug-enable-$(DEBUGVER).jar: cx/ath/matthew/debug/Debug.jpp
+	make .enabledebug
+	echo "Class-Path: $(JARDIR)/hexdump.jar" > Manifest
+	(cd classes;jar cfm ../$@ ../Manifest cx/ath/matthew/debug/*.class)
+debug-disable-$(DEBUGVER).jar: cx/ath/matthew/debug/Debug.jpp
+	make .disabledebug
+	echo "Class-Path: $(JARDIR)/hexdump.jar" > Manifest
+	(cd classes;jar cfm ../$@ ../Manifest cx/ath/matthew/debug/*.class)
+.enabledebug: cx/ath/matthew/debug/Debug.jpp 
+	mkdir -p classes
+	cpp $(PPFLAGS) $(JPPFLAGS) -DDEBUGSETTING=true < cx/ath/matthew/debug/Debug.jpp > cx/ath/matthew/debug/Debug.java
+	$(JAVAC) $(JVERCFLAGS) $(JCFLAGS) -cp classes -d classes cx/ath/matthew/debug/Debug.java cx/ath/matthew/utils/Hexdump.java
+	rm -f .disabledebug
+	touch .enabledebug
+.disabledebug: cx/ath/matthew/debug/Debug.jpp 
+	mkdir -p classes
+	cpp $(PPFLAGS) $(JPPFLAGS) -DDEBUGSETTING=false < cx/ath/matthew/debug/Debug.jpp > cx/ath/matthew/debug/Debug.java
+	$(JAVAC) $(JVERCFLAGS) $(JCFLAGS) -cp classes -d classes cx/ath/matthew/debug/Debug.java cx/ath/matthew/utils/Hexdump.java
+	rm -f .enabledebug
+	touch .disabledebug
+cx/ath/matthew/debug/Debug.java: .disabledebug
+doc/index.html: 
+	$(JAVADOC) $(JAVADOCFLAGS) -d doc/ cx/ath/matthew/debug/Debug.java $(SRC)
+
+doc: doc/index.html
+
+install-doc: doc/index.html
+	install -d $(DESTDIR)$(DOCDIR)
+	cp -a doc $(DESTDIR)$(DOCDIR)/api
+
+install-native: libcgi-java.so libunix-java.so 
+	install -d $(DESTDIR)$(LIBDIR) 
+	install libcgi-java.so $(DESTDIR)$(LIBDIR)
+	install libunix-java.so $(DESTDIR)$(LIBDIR)
+
+install-jar: unix-$(UNIXVER).jar cgi-$(CGIVER).jar debug-enable-$(DEBUGVER).jar debug-disable-$(DEBUGVER).jar io-$(IOVER).jar hexdump-$(HEXVER).jar
+	install -d $(DESTDIR)$(JARDIR)
+	install -m 644 debug-enable-$(DEBUGVER).jar $(DESTDIR)$(JARDIR)
+	install -m 644 debug-disable-$(DEBUGVER).jar $(DESTDIR)$(JARDIR)
+	install -m 644 unix-$(UNIXVER).jar $(DESTDIR)$(JARDIR)
+	install -m 644 cgi-$(CGIVER).jar $(DESTDIR)$(JARDIR)
+	install -m 644 io-$(IOVER).jar $(DESTDIR)$(JARDIR)
+	install -m 644 hexdump-$(HEXVER).jar $(DESTDIR)$(JARDIR)
+	ln -sf debug-disable-$(DEBUGVER).jar $(DESTDIR)$(JARDIR)/debug-disable.jar
+	ln -sf debug-enable-$(DEBUGVER).jar $(DESTDIR)$(JARDIR)/debug-enable.jar
+	ln -sf unix-$(UNIXVER).jar $(DESTDIR)$(JARDIR)/unix.jar
+	ln -sf io-$(IOVER).jar $(DESTDIR)$(JARDIR)/io.jar
+	ln -sf cgi-$(CGIVER).jar $(DESTDIR)$(JARDIR)/cgi.jar
+	ln -sf hexdump-$(HEXVER).jar $(DESTDIR)$(JARDIR)/hexdump.jar
+
+install: install-native install-jar
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/README b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/README
new file mode 100644
index 0000000000000000000000000000000000000000..acdc874f3e7eea086a17cce7eefd83aad35bd987
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/README
@@ -0,0 +1,41 @@
+libmatthew-java v0.1
+--------------------
+
+These are a selection of libraries for Java which I have written because they
+are useful and not provided with normal Java. They are available for download
+here and are licensed under the GPL or LGPL. They all come with example
+applications using the libraries. 
+
+The ones I consider distribution-worthy are packaged up together. Several other
+classes are available separately below. 
+
+Unix Sockets Library
+
+This is a collection of classes and native code to allow you to read and write
+Unix sockets in Java. 
+
+Debug Library
+
+This is a comprehensive logging and debugging solution. 
+
+CGI Library
+
+This is a collection of classes and native code to allow you to write CGI
+applications in Java. 
+
+I/O Library
+
+This provides a few much needed extensions to the Java I/O subsystem. Firstly,
+there is a class which will connect and InputStream with an OutputStream and
+copy data between them. 
+
+Secondly there are two classes for inserting into an Input or OutputStream pipe
+a command line command, so that everything is piped through that command. 
+
+Thirdly there are a pair of classes for splitting streams in two. This can
+either be to two OuputStreams, or to an OutputStream and a file. Equivelent to
+the UNIX tool tee in UNIX pipes. 
+
+Hexdump
+
+This class formats byte-arrays in hex and ascii for display.
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cgi-java.c b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cgi-java.c
new file mode 100644
index 0000000000000000000000000000000000000000..64aed24b792766baf5dd4af2ba9a730617dd30db
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cgi-java.c
@@ -0,0 +1,64 @@
+/*
+ * Java CGI Library
+ *
+ * Copyright (c) Matthew Johnson 2005
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ * 
+ * To Contact the author, please email src@matthew.ath.cx
+ *
+ */
+
+#include <jni.h>
+#include "cgi-java.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+extern char **environ;
+
+extern jobjectArray Java_cx_ath_matthew_cgi_CGI_getfullenv (JNIEnv *env, jobject obj, jclass type)
+{
+   int i;
+   for (i = 0; environ[i]; i++);
+   jobjectArray joa =  (*env)->NewObjectArray(env, i+1, type, NULL);
+   for (i = 0; environ[i]; i++)
+      (*env)->SetObjectArrayElement(env, joa, i, (*env)->NewStringUTF(env, environ[i]));
+   return joa;   
+}
+
+extern jstring Java_cx_ath_matthew_cgi_CGI_getenv (JNIEnv *env, jobject obj, jstring ename)
+{
+   const char *estr = (*env)->GetStringUTFChars(env, ename, 0);
+   char *eval = getenv(estr);
+   (*env)->ReleaseStringUTFChars(env, ename, estr);
+   if (NULL == eval)
+      return NULL;
+   else
+      return (*env)->NewStringUTF(env, eval);
+}
+
+extern void Java_cx_ath_matthew_cgi_CGI_setenv (JNIEnv *env, jobject obj, jstring var, jstring val)
+{
+#ifdef setenv
+   const char *cvar = (*env)->GetStringUTFChars(env, var, 0);
+   const char *cval = (*env)->GetStringUTFChars(env, val, 0);
+   setenv(cvar, cval, 1);
+#endif
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/changelog b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/changelog
new file mode 100644
index 0000000000000000000000000000000000000000..e7a2183979dec66a9a153b463a14547e8b2b91e4
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/changelog
@@ -0,0 +1,73 @@
+Version 0.8:
+
+	* Change to expat licence 
+
+	* Patches to the CGI libraries from Andy Canfield <andy -dot- canfield -at-
+	  pimco -dot- mobi>
+
+Version 0.7.3:
+
+	* Patch from 石頭成 <shirock -dot- tw -at- gmail -dot- com> to avoid a
+	  memory leak
+
+Version 0.7.2:
+
+	* Also add .NO_PARALLEL and .NOTPARALLEL because I have no idea
+	  which one is correct
+	* Apply patch from Omair Majid <omajid -at- redhat -dot- com>
+	  which make overriding CFLAGS easier
+	* Use -source 1.5 rather than -source 5.0, the former works with more
+	  Java compilers
+	* Add -fno-stack-protector to fix compilation issues in various distros
+	* Fix spin-on-disconnection bug (Spotted by Christopher Armstrong 
+	  <carmstrong -at- fastmail -dot- com -dot- au>)
+
+Version 0.7.1:
+
+	* Fix compiler warning on 64bit systems (spotted by 
+	  serkankaba -at- gmail -dot- com)
+	* Fix compilation with glibc 2.8 (patch from Omair Majid
+	  <omajid -at- redhat -dot- com>)
+
+Version 0.7:
+
+	* use += not ?= when setting *FLAGS
+	* Possible SIGSEGV in native_close, possible fix
+	* Don't include debug-disable in any manifests
+	* Fix some compiler warnings. Setenv doesn't exist on all platforms.
+
+Version 0.6:
+
+	* Add toByteArray to Hexdump for creating byte-array-literals in
+	  generated code.
+	* UnixSocket output streams can now send multiple byte[] at once
+	  to use scatter-gather for efficiency
+	* Add fuctions to get peer credentials
+	* Work on BSD
+
+Version 0.5:
+
+	* Add licence headers to files which are missing
+	* fix javadoc calls so that -link is replacable with local docs
+	* add .NOPARALLEL: to disable parallel building. Fails to get debugging
+	right
+
+Version 0.4:
+	
+	* Add javadoc target
+	* Add Manifest with Class-Path to relevant jars
+
+Version 0.2:
+
+	* Fix Unix Sockets not to lose reference if IO streams are still
+	referenced.
+	* Add methods to Debug to set the config manually
+	* update Debug defaults
+	* add ALL as a class name to Debug
+	* write installation guide
+	* fix UnixSocket.setBlocking
+	* add UnixSocket.setSoTimeout
+
+Version 0.1:
+
+	* Initial code and packaging.
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGI.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGI.java
new file mode 100644
index 0000000000000000000000000000000000000000..f69f39a406c32a67947e7c9fd228a8d988e6d4ca
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGI.java
@@ -0,0 +1,549 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+/**
+ * This is the main class you have to extend with your CGI program.
+ * You should implement the cgi() method.
+ *
+ * @author Matthew Johnson &lt;src@matthew.ath.cx&gt;
+ */
+abstract public class CGI
+{
+   private CGIErrorHandler errorhandler = new DefaultErrorHandler();
+   private boolean headers_sent = false;
+   private HashMap headers = new HashMap();
+   private Vector cookies = new Vector();
+   private LinkedList pagedata = new LinkedList();
+   private LinkedList rawdata = new LinkedList();
+   
+   private native String getenv(String var);
+   /** MUST pass String.class and ALWAYS returns a String[] */
+   private native Object[] getfullenv(Class c);
+   private native void setenv(String var, String value);
+   {
+      System.loadLibrary("cgi-java");
+   }
+
+   /**
+    * Called by CGIs to send a header to the output
+    *
+    * @param variable The header variable to set.
+    * @param value The value of the variable.
+    *
+    * @throws CGIHeaderSentException if the headers have already been sent.
+    *
+    * @see #flush
+    */
+   public final void header(String variable, String value) throws CGIHeaderSentException
+   {
+      // only send headers once
+      if (headers_sent) throw new CGIHeaderSentException();
+
+      // buffer the variable (Map so that each header is only set once)
+      headers.put(variable.toLowerCase(), value);
+   }
+
+   /**
+    * Sets a Cookie in the web browser, with extended attributes.
+    * Calls header() so must be called before sending any output.
+    *
+    * A parameter will not be sent if it is null.
+    * 
+    * @param variable The cookie variable to set.
+    * @param value The value of the variable.
+    * @param path The path that the cookie will be returned for.
+    * @param domain The domain that the cookie will be returned for.
+    * @param expires The expiry date of the cookie.
+    * @param secure Will only send the cookie over HTTPS if this is true.
+    *
+    * @throws CGIHeaderSentException if the headers have already been sent.
+    *
+    * @see #flush
+    * @see #header
+    */
+   public final void setcookie(String variable, String value, String path, String domain, Date expires, boolean secure) throws CGIHeaderSentException
+   {
+      if (headers_sent) throw new CGIHeaderSentException();
+
+      //Set-Cookie: NAME=VALUE; expires=DATE;
+      //path=PATH; domain=DOMAIN_NAME; secure
+      //Wdy, DD-Mon-YYYY HH:MM:SS GMT
+      DateFormat df = new SimpleDateFormat("E, dd-MMM-yyyy HH:mm:ss zzz");
+      String cookie = variable+"="+value;
+      if (null != path) cookie += "; path="+path;
+      if (null != domain) cookie += "; domain="+domain;
+      if (null != expires) cookie += "; expires="+df.format(expires);
+      if (secure) cookie += "; secure";
+      cookies.add("Set-Cookie: "+ cookie);
+   }
+ 
+   /**
+    * Sets a Cookie in the web browser.
+    * Calls header() so must be called before sending any output.
+    * 
+    * @param variable The cookie variable to set.
+    * @param value The value of the variable.
+    *
+    * @throws CGIHeaderSentException if the headers have already been sent.
+    *
+    * @see #flush
+    * @see #header
+    */
+   public final void setcookie(String variable, String value) throws CGIHeaderSentException
+   {
+      if (headers_sent) throw new CGIHeaderSentException();
+
+      //Set-Cookie: NAME=VALUE; expires=DATE;
+      //path=PATH; domain=DOMAIN_NAME; secure
+      cookies.add("Set-Cookie: "+ variable+"="+value);
+   }
+    
+   /**
+    * Called by CGIs to send byte data to the output.
+    * The data is buffered until the CGI exits, or a call of flush.
+    *
+    * @param data The page data.
+    * @throws CGIInvalidContentFormatException if text data has already been sent.
+    *
+    * @see #flush
+    */
+   public final void out(byte[] data) throws CGIInvalidContentFormatException
+   {
+      if (pagedata.size() > 0) throw new CGIInvalidContentFormatException();
+      rawdata.add(data);
+   }
+  
+   /**
+    * Called by CGIs to send a string to the output.
+    * The data is buffered until the CGI exits, or a call of flush.
+    *
+    * @param data The page data.
+    * @throws CGIInvalidContentFormatException if raw data has already been sent.
+    *
+    * @see #flush
+    */
+   public final void out(String data) throws CGIInvalidContentFormatException
+   {
+      if (rawdata.size() > 0) throw new CGIInvalidContentFormatException();
+      pagedata.add(data);
+   }
+
+   /**
+    * This will return an OutputStream that you can write data
+    * directly to. Calling this method will cause the output to be 
+    * flushed and the Headers sent. At the moment this is not buffered
+    * and will be sent directly to the client. Subsequent calls
+    * to out() will appear after data written to the output stream.
+    *
+    * @see #out
+    * @return an OutputStream
+    */
+   public final OutputStream getOutputStream() throws IOException
+   {
+      flush();
+      return System.out;
+   }
+
+   /**
+    * Flushes the output. 
+    * Note that you cannot send a header after a flush.
+    * If you want to send both text and binary data in a page 
+    * you may do so either side of a flush.
+    *
+    * @see #header
+    */
+   public final void flush() throws IOException
+   {
+      if (!headers_sent) {
+         // don't send headers again
+         headers_sent = true;
+         // send headers
+         Iterator i = headers.keySet().iterator();
+         while (i.hasNext()) {
+            String key = (String) i.next();
+            String value = (String) headers.get(key);
+            System.out.println(key + ": " + value);
+         }
+         // send cookies
+         i = cookies.iterator();
+         while (i.hasNext()) {
+            System.out.println((String) i.next());
+         }
+         System.out.println();
+      }
+
+      // send data
+      if (pagedata.size() >0) {
+         Iterator j = pagedata.iterator();
+         while (j.hasNext()) {
+            System.out.println((String) j.next());
+         }
+         pagedata.clear();
+      } else if (rawdata.size() > 0) {
+         Iterator j = rawdata.iterator();
+         while (j.hasNext()) {
+            System.out.write((byte[]) j.next());
+         }
+         pagedata.clear();
+      }
+         System.out.flush();
+   }
+
+   /**
+    * Sets a custom exception handler.
+    * Gets called when an exception is thrown. 
+    * The default error handler prints the error nicely in HTML
+    * and then exits gracefully.
+    *
+    * @param handler The new exception handler
+    */
+   protected final void setErrorHandler(CGIErrorHandler handler)
+   {
+      errorhandler = handler;
+   }
+   
+   /**
+    * Override this method in your CGI program.
+    *
+    * @param POST A Map of variable =$gt; value for the POST variables.
+    * @param GET A Map of variable =$gt; value for the GET variables.
+    * @param ENV A Map of variable =$gt; value for the Webserver environment variables.
+    * @param COOKIES A Map of variable =$gt; value for the browser-sent cookies.
+    * @param params An array of parameters passed to the CGI (GET with no variable assignments)
+    *
+    * @throws Exception You can throw anything, it will be caught by the error handler.
+    */
+   abstract protected void cgi(Map POST, Map GET, Map ENV, Map COOKIES, String[] params) throws Exception;
+
+   /**
+    * Reads variables from a String like a=b&amp;c=d to a Map {a =&gt; b, c =&gt; d}.
+    *
+    * @param s String to read from.
+    * @param seperator seperator character between variables (eg &amp;)
+    * @param values whether or not this string has values for variables
+    *
+    * @return a Map with values, a Vector without
+    */
+   private Object readVariables(String s, char seperator, boolean values)
+   {
+      HashMap vars = new HashMap();
+      Vector varv = new Vector();
+      String temp = "";
+      String variable = null;
+      for (int i = 0; i < s.length(); i++) {
+         char c = s.charAt(i);
+         if (c == seperator) { // new variable
+            if (null != temp) temp = temp.trim();
+            if (values) {
+               if (variable == null) {variable = temp; temp = "";}
+               else variable.trim();
+               if (!variable.equals("")) {
+                  Object o = vars.get(variable);
+                  if (o == null)
+                     vars.put(variable.trim(), temp);
+                  else if (o instanceof String) {
+                     LinkedList l = new LinkedList();
+                     l.add(o);
+                     l.add(temp);
+                     vars.put(variable.trim(), l);
+                  } else if (o instanceof LinkedList) 
+                     ((LinkedList) o).add(temp);
+               }
+               temp = "";
+            }
+            else {
+               varv.add(temp);
+               temp = "";
+            }
+            variable = null;
+            continue;
+         }
+         if (values && c == '=') {
+            variable = temp;
+            temp = "";
+            continue;
+         }
+         switch (c) {
+            case '%': // escaped character   
+               try {
+                  char a = s.charAt(++i);
+                  char b = s.charAt(++i);
+                  int ch = 0;
+                  switch (a) {
+                     case '0':
+                     case '1':
+                     case '2':
+                     case '3':
+                     case '4':
+                     case '5':
+                     case '6':
+                     case '7':
+                     case '8':
+                     case '9':
+                        ch += 0x10 * (a - '0');
+                        break;
+                     case 'a':
+                     case 'b':
+                     case 'c':
+                     case 'd':
+                     case 'e':
+                     case 'f':
+                        ch += 0x10 * (a - 'a' + 0xa);
+                        break;
+                     case 'A':
+                     case 'B':
+                     case 'C':
+                     case 'D':
+                     case 'E':
+                     case 'F':
+                        ch += 0x10 * (a - 'A' + 0xA);
+                        break;
+                  }
+                  switch (b) {
+                     case '0':
+                     case '1':
+                     case '2':
+                     case '3':
+                     case '4':
+                     case '5':
+                     case '6':
+                     case '7':
+                     case '8':
+                     case '9':
+                        ch += (b - '0');
+                        break;
+                     case 'a':
+                     case 'b':
+                     case 'c':
+                     case 'd':
+                     case 'e':
+                     case 'f':
+                        ch += (b - 'a' + 0xa);
+                        break;
+                     case 'A':
+                     case 'B':
+                     case 'C':
+                     case 'D':
+                     case 'E':
+                     case 'F':
+                        ch += (b - 'A' + 0xA);
+                        break;
+                  }
+                  temp += (char) ch;
+               } catch (StringIndexOutOfBoundsException SIOOBe) {
+                  // this means someone has included an invalid escape sequence.
+                  // Invalid URIs can just be thrown on the floor.
+               }
+               break;
+            // + is a space
+            case '+':
+               temp += ' ';
+               break;
+            default:
+               temp += c;               
+         }
+      }
+      if (values) {
+         if (variable == null) {variable = temp; temp = "";}
+         else variable.trim();
+         //out("DEBUG variable read: "+variable+"/"+temp);
+         if (!variable.equals("")) {
+            Object o = vars.get(variable);
+            if (o == null)
+               vars.put(variable.trim(), temp);
+            else if (o instanceof String) {
+               LinkedList l = new LinkedList();
+               l.add(o);
+               l.add(temp);
+               vars.put(variable.trim(), l);
+            } else if (o instanceof LinkedList) 
+               ((LinkedList) o).add(temp);
+         }
+
+         return vars;
+      }
+      else {
+         varv.add(temp);
+         return varv;
+      }
+   }
+   
+   /**
+    * Sets up the POST variables
+    */
+   private Map getPOST() 
+   {
+      try {
+         String s = "";
+         while(System.in.available() > 0)
+            s += (char) System.in.read();
+         //out("DEBUG: POST STRING: "+s);
+         return (Map) readVariables(s, '&', true);
+      } catch (IOException IOe) {
+         try {
+         out("ERROR: IOException: "+IOe);
+         } catch (CGIInvalidContentFormatException CGIICFe) {
+            System.err.println("ERROR: IOException: "+IOe);
+         }
+         return new HashMap();
+      }
+   }
+ 
+   /**
+    * Sets up the COOKIEs
+    */
+   private Map getCOOKIE()
+   {
+      String s = getenv("HTTP_COOKIE");
+      if (null == s)
+         return new HashMap();
+      else
+         return (Map) readVariables(s, ';', true);
+   }
+  
+   /**
+    * Sets up the GET variables
+    */
+   private Map getGET()
+   {
+      String s = getenv("QUERY_STRING");
+      if (null == s)
+         return new HashMap();
+      else
+         return (Map) readVariables(s, '&', true);
+   }
+  
+   /**
+    * Sets up the ENV variables
+    */
+   private  Map getENV()
+   {
+      Map m = new HashMap();
+      String[] env = (String[]) getfullenv(String.class);
+      for (int i = 0; i < env.length; i++){
+         if (null == env[i]) continue;
+         String[] e = env[i].split("=");
+         if (1 == e.length)
+            m.put(e[0], "");
+         else
+            m.put(e[0], e[1]);
+      }
+         
+/*
+      m.put("SERVER_SOFTWARE", getenv("SERVER_SOFTWARE"));
+      m.put("SERVER_NAME", getenv("SERVER_NAME"));
+      m.put("GATEWAY_INTERFACE", getenv("GATEWAY_INTERFACE"));
+      m.put("SERVER_PROTOCOL", getenv("SERVER_PROTOCOL"));
+      m.put("SERVER_PORT", getenv("SERVER_PORT"));
+      m.put("REQUEST_METHOD", getenv("REQUEST_METHOD"));
+      m.put("PATH_INFO", getenv("PATH_INFO"));
+      m.put("PATH_TRANSLATED", getenv("PATH_TRANSLATED"));
+      m.put("SCRIPT_NAME", getenv("SCRIPT_NAME"));
+      m.put("QUERY_STRING", getenv("QUERY_STRING"));
+      m.put("REMOTE_HOST", getenv("REMOTE_HOST"));
+      m.put("REMOTE_ADDR", getenv("REMOTE_ADDR"));
+      m.put("AUTH_TYPE", getenv("AUTH_TYPE"));
+      m.put("REMOTE_USER", getenv("REMOTE_USER"));
+      m.put("REMOTE_IDENT", getenv("REMOTE_IDENT"));
+      m.put("CONTENT_TYPE", getenv("CONTENT_TYPE"));
+      m.put("CONTENT_LENGTH", getenv("CONTENT_LENGTH"));
+      m.put("HTTP_ACCEPT", getenv("HTTP_ACCEPT"));
+      m.put("HTTP_USER_AGENT", getenv("HTTP_USER_AGENT"));
+      m.put("HTTP_COOKIE", getenv("HTTP_COOKIE"));
+      m.put("HTTP_ACCEPT_CHARSET", getenv("HTTP_ACCEPT_CHARSET"));
+      m.put("HTTP_ACCEPT_ENCODING", getenv("HTTP_ACCEPT_ENCODING"));
+      m.put("HTTP_CACHE_CONTROL", getenv("HTTP_CACHE_CONTROL"));
+      m.put("HTTP_REFERER", getenv("HTTP_REFERER"));
+      m.put("HTTP_X_FORWARDED_FOR", getenv("HTTP_X_FORWARDED_FOR"));
+      m.put("HTTP_HOST", getenv("HTTP_HOST"));
+      m.put("REQUEST_URI", getenv("REQUEST_URI"));
+      m.put("DOCUMENT_ROOT", getenv("DOCUMENT_ROOT"));
+      m.put("PATH", getenv("PATH"));
+      m.put("SERVER_ADDR", getenv("SERVER_ADDR"));
+      m.put("SCRIPT_FILENAME", getenv("SCRIPT_FILENAME"));
+      m.put("HTTP_COOKIE2", getenv("HTTP_COOKIE2"));
+      m.put("HTTP_CONNECTION", getenv("HTTP_CONNECTION"));
+      m.put("LANG", getenv("LANG"));
+      m.put("REDIRECT_LANG", getenv("REDIRECT_LANG"));
+  */    
+      return m;
+   }
+  
+   /**
+    * Sets up the param variables
+    */
+   private  String[] getParams(String args)
+   {
+      Vector v = (Vector) readVariables(args, ',', false);
+      String[] params = new String[v.size()];
+      Iterator i = v.iterator();
+      for (int j = 0; j < params.length; j++) 
+         params[j] = (String) i.next();
+      return params;
+   }
+
+   /**
+    * This method sets up all the CGI variables and calls the cgi() method, then writes out the page data.
+    */
+   public final void doCGI(String[] args)
+   {
+      CGI cgiclass = null;
+      // wrap everything in a try, we need to handle all our own errors.
+      try {
+         // setup the CGI variables
+         Map POST = getPOST();
+         Map GET = getGET();
+         Map ENV = getENV();
+         Map COOKIE = getCOOKIE();
+         String[] params = new String[] {};
+         if (args.length >= 1)
+            params = getParams(args[0]);
+
+         // instantiate CGI class
+         /*   Class c = Class.forName(args[0]);
+         cgiclass = (CGI) c.newInstance();        */ 
+
+         // set default headers
+         /*cgiclass.*/header("Content-type", "text/html");
+         
+         // execute the CGI
+         /*cgiclass.*/cgi(POST, GET, ENV, COOKIE, params);
+         
+         // send the output / remaining output
+         /*cgiclass.*/flush();
+      } 
+      
+      // yes, we really want to do this. CGI programs can't send errors. Print nicely to the screen.
+      catch (Exception e) {
+         errorhandler.print(/*null == cgiclass ? false : cgiclass.*/headers_sent, e);
+      }
+      catch (Throwable t) {
+         t.printStackTrace(); // this is bad enough to produce stderr errors
+         errorhandler.print(/*null == cgiclass ? false : cgiclass.*/headers_sent, new Exception(t.toString()));
+      }
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIErrorHandler.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIErrorHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d94a3b646e6c2ab0cb802c65112fbdaba4435e9
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIErrorHandler.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+/**
+ * Interface to handle exceptions in the CGI.
+ */
+public interface CGIErrorHandler
+{
+   /**
+    * This is called if an exception is not caught in the CGI.
+    * It should handle printing the error message nicely to the user,
+    * and then exit gracefully.
+    */
+   public void print(boolean headers_sent, Exception e);
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIHeaderSentException.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIHeaderSentException.java
new file mode 100644
index 0000000000000000000000000000000000000000..77f5bd982acc2cbd71cb4a274c1a29c7d74ded2f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIHeaderSentException.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+/**
+ * Thrown if the headers have already been sent and CGI.header is called.
+ */
+public class CGIHeaderSentException extends Exception
+{
+   public CGIHeaderSentException()
+   {
+      super("Headers already sent by CGI");
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIInvalidContentFormatException.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIInvalidContentFormatException.java
new file mode 100644
index 0000000000000000000000000000000000000000..a58586ec0726db1531409b626de9123f0beffc06
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGIInvalidContentFormatException.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+/**
+ * Thrown if both raw and text data are set in the same page.
+ */
+public class CGIInvalidContentFormatException extends Exception
+{
+   public CGIInvalidContentFormatException()
+   {
+      super("Cannot send both raw and text data");
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGITools.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGITools.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c163f49f03d1983698e23971849981039d2b802
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CGITools.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+abstract class CGITools
+{
+   /**
+    * Escape a character in a string.
+    * @param in String to escape in.
+    * @param c Character to escape.
+    * @return in with c replaced with \c
+    */
+   public static String escapeChar(String in, char c)
+   {
+      String out = "";
+      for (int i = 0; i < in.length(); i++) {
+         if (in.charAt(i) == c) out += '\\';
+         out += in.charAt(i);
+      }
+      return out;
+   }
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CheckBox.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CheckBox.java
new file mode 100644
index 0000000000000000000000000000000000000000..003c8cd88a722d297d5f220afca5bbaeca6dc5ca
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/CheckBox.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public class CheckBox extends Field
+{
+   boolean checked;
+   public CheckBox(String name, String label, boolean checked)
+   {
+      this.name = name;
+      this.label = label;
+      this.checked = checked;
+   }
+   protected String print()
+   {
+      return "<input type='checkbox' name='"+name+"'"+(checked?" checked='checked'":"")+" />";
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DefaultErrorHandler.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DefaultErrorHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..b83bfd2aa9be0d21bdb48f9743a2105051a9927e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DefaultErrorHandler.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+/**
+ * Interface to handle exceptions in the CGI.
+ */
+public class DefaultErrorHandler implements CGIErrorHandler
+{
+   /**
+    * This is called if an exception is not caught in the CGI.
+    * It should handle printing the error message nicely to the user,
+    * and then exit gracefully.
+    */
+   public void print(boolean headers_sent, Exception e)
+   {
+      if (!headers_sent) {
+         System.out.println("Content-type: text/html");
+         System.out.println("");
+         System.out.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">");
+         System.out.println("<HTML><HEAD>");
+         System.out.println("<TITLE>Exception in CGI</TITLE>");
+         System.out.println("</HEAD><BODY>");
+      }
+      System.out.println("<HR>");
+      System.out.println("<H1>"+e.getClass().toString()+"</H1>");
+      System.out.println("<P>");
+      System.out.println("Exception Message: "+e.getMessage());
+      System.out.println("</P>");
+      System.out.println("<P>");
+      System.out.println("Stack Trace:");
+      System.out.println("</P>");
+      System.out.println("<PRE>");
+      e.printStackTrace(System.out);
+      System.out.println("</PRE>");
+      System.out.println("<HR>");
+      if (!headers_sent) {
+         System.out.println("</BODY></HTML>");
+      }
+      System.exit(1);
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DisplayField.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DisplayField.java
new file mode 100644
index 0000000000000000000000000000000000000000..184223b43a48ff1c0379f89fc1671d4735a9627b
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DisplayField.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public class DisplayField extends Field
+{
+   String value;
+   public DisplayField(String label, String value)
+   {
+      this.name = "";
+      this.label = label;
+      this.value = value;
+   }
+   protected String print()
+   {
+      return value;
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DropDown.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DropDown.java
new file mode 100644
index 0000000000000000000000000000000000000000..685ff19c4db246adc61042028975ad907e1cdd6e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/DropDown.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+import java.util.List;
+
+public class DropDown extends Field
+{
+   Object[] values;
+   Object defval;
+   boolean indexed = false;
+   /**
+    * Create a new DropDown list.
+    *
+    * @param name The HTML field name.
+    * @param label The label to display
+    * @param values The values for the drop down list
+    * @param defval If this parameter is set then this element will be selected by default.
+    * @param indexed If this is set to true, then indexes will be returned, rather than values.
+    */
+   public DropDown(String name, String label, Object[] values, Object defval, boolean indexed)
+   {
+      this.name = name;
+      this.label = label;
+      this.values = values;
+      this.indexed = indexed;
+      this.defval = defval;
+   }
+   /**
+    * Create a new DropDown list.
+    *
+    * @param name The HTML field name.
+    * @param label The label to display
+    * @param values The values for the drop down list
+    * @param defval If this parameter is set then this element will be selected by default.
+    * @param indexed If this is set to true, then indexes will be returned, rather than values.
+    */
+   public DropDown(String name, String label, Object[] values, int defval, boolean indexed)
+   {
+      this.name = name;
+      this.label = label;
+      this.values = values;
+      if (defval < 0)
+         this.defval = null;
+      else
+         this.defval = values[defval];
+      this.indexed = indexed;
+   }
+   /**
+    * Create a new DropDown list.
+    *
+    * @param name The HTML field name.
+    * @param label The label to display
+    * @param values The values for the drop down list
+    * @param defval If this parameter is set then this element will be selected by default.
+    * @param indexed If this is set to true, then indexes will be returned, rather than values.
+    */
+   public DropDown(String name, String label, List values, Object defval, boolean indexed)
+   {
+      this.name = name;
+      this.label = label;
+      this.values = (Object[]) values.toArray(new Object[] {});
+      this.defval = defval;
+      this.indexed = indexed;
+   }
+   /**
+    * Create a new DropDown list.
+    *
+    * @param name The HTML field name.
+    * @param label The label to display
+    * @param values The values for the drop down list
+    * @param defval If this parameter is set then this element will be selected by default.
+    * @param indexed If this is set to true, then indexes will be returned, rather than values.
+    */
+   public DropDown(String name, String label, List values, int defval, boolean indexed)
+   {
+      this.name = name;
+      this.label = label;
+      this.values = (Object[]) values.toArray(new Object[] {});
+      if (defval < 0)
+         this.defval = null;
+      else
+         this.defval = values.get(defval);
+      this.indexed = indexed;
+   }
+   protected String print()
+   {
+      String s = "";
+      s += "<select name='"+name+"'>\n";
+      for (int i=0; i<values.length; i++) {
+         if (indexed)
+            s += "   <option value='"+i+"'";
+         else
+            s += "   <option";
+         if (values[i].equals(defval))
+            s += " selected='selected'>"+values[i]+"</option>\n";
+         else
+            s += ">"+values[i]+"</option>\n";
+      }
+      s += "</select>\n";
+      return s;
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Field.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Field.java
new file mode 100644
index 0000000000000000000000000000000000000000..1301b48b543a6163cc39ed326ac665936c5828ce
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Field.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public abstract class Field
+{
+   protected String name;
+   protected String label;
+   protected abstract String print();
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/HTMLForm.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/HTMLForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca50781f1d664e86f0c40c90db0f6046ac88c555
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/HTMLForm.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+import java.util.Iterator;
+import java.util.Vector;
+
+
+/**
+ * Class to manage drawing HTML forms
+ */
+public class HTMLForm
+{
+   private String target;
+   private String submitlabel;
+   private String tableclass;
+   private Vector fields;
+   private boolean post = true;
+   
+    /**
+    * @param target The module to submit to
+    */
+   public HTMLForm(String target)
+   {
+      this(target, "Submit", null);
+   }
+  
+   /**
+    * @param target The module to submit to
+    * @param submitlabel The string to display on the submit button
+    */
+   public HTMLForm(String target, String submitlabel)
+   {
+      this(target, submitlabel, null);
+   }
+
+   /**
+    * @param target The module to submit to
+    * @param submitlabel The string to display on the submit button
+    * @param tableclass The class= parameter for the generated table
+    */
+   public HTMLForm(String target, String submitlabel, String tableclass)
+   {
+      this.target = target;
+      this.submitlabel = submitlabel;
+      this.tableclass = tableclass;
+      fields = new Vector();
+   }
+
+   /**
+    * Add a field to be displayed in the form.
+    *
+    * @param field A Field subclass.
+    */
+   public void addField(Field field)
+   {
+      fields.add(field);
+   }
+
+   /**
+    * Set GET method rather than POST
+    * @param enable Enable/Disable GET
+    */
+   public void setGET(boolean enable)
+   {
+      post = !enable;
+   }
+   
+   /**
+    * Shows the form.
+    * @param cgi The CGI instance that is handling output
+    */
+   public void display(CGI cgi)
+   {
+      try {
+         cgi.out("<form action='"+CGITools.escapeChar(target,'"')+"' method='"+
+               (post?"post":"get")+"'>");
+         if (null == tableclass)
+            cgi.out("<table>");
+         else
+            cgi.out("<table class='"+tableclass+"'>");
+         
+         Iterator i = fields.iterator();
+         while (i.hasNext()) {
+            Field f = (Field) i.next();
+          if (f instanceof NewTable) {
+             cgi.out(f.print());
+          }
+            if (!(f instanceof HiddenField) && !(f instanceof SubmitButton) && !(f instanceof NewTable)) {
+               cgi.out("   <tr>");
+               cgi.out("      <td>"+f.label+"</td>");
+               cgi.out("      <td>"+f.print()+"</td>");
+               cgi.out("   </tr>");
+            }
+         }
+         cgi.out("   <tr>");
+         cgi.out("      <td colspan='2' style='text-align:center;'>");
+         i = fields.iterator();
+         while (i.hasNext()) {
+            Field f = (Field) i.next();
+            if (f instanceof HiddenField || f instanceof SubmitButton) {
+               cgi.out("         "+f.print());
+            }
+         }      
+         cgi.out("         <input type='submit' name='submit' value='"+CGITools.escapeChar(submitlabel,'\'')+"' />");
+         cgi.out("      </td>");
+         cgi.out("   </tr>");
+         cgi.out("</table>");
+         cgi.out("</form>");
+      } catch (CGIInvalidContentFormatException CGIICFe) {}
+   }
+}
+
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/HiddenField.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/HiddenField.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b9d8303bb038d164079c751620f4726b9f4e87f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/HiddenField.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public class HiddenField extends Field
+{
+   String value;
+   public HiddenField(String name, String value)
+   {
+      this.name = name;
+      this.label = "";
+      this.value = value;
+   }
+   protected String print()
+   {
+      return "<input type=\"hidden\" name=\""+name+"\" value=\""+CGITools.escapeChar(value, '"')+"\" />";
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/MultipleDropDown.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/MultipleDropDown.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4ee5ea0f1eaccf5095ce70f17fd2df2879d6b61
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/MultipleDropDown.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package cx.ath.matthew.cgi;
+
+import java.util.List;
+
+/**
+ * @author Agent
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class MultipleDropDown extends DropDown {
+
+	/**
+	 * @param name
+	 * @param label
+	 * @param values
+	 * @param defval
+	 * @param indexed
+	 */
+	public MultipleDropDown(String name, String label, String[] values,
+			String defval, boolean indexed) {
+		super(name, label, values, defval, indexed);
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param name
+	 * @param label
+	 * @param values
+	 * @param defval
+	 * @param indexed
+	 */
+	public MultipleDropDown(String name, String label, String[] values,
+			int defval, boolean indexed) {
+		super(name, label, values, defval, indexed);
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param name
+	 * @param label
+	 * @param values
+	 * @param defval
+	 * @param indexed
+	 */
+	public MultipleDropDown(String name, String label, List values,
+			String defval, boolean indexed) {
+		super(name, label, values, defval, indexed);
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param name
+	 * @param label
+	 * @param values
+	 * @param defval
+	 * @param indexed
+	 */
+	public MultipleDropDown(String name, String label, List values, int defval,
+			boolean indexed) {
+		super(name, label, values, defval, indexed);
+		// TODO Auto-generated constructor stub
+	}
+	
+	protected String print()
+	   {
+	      String s = "";
+	      s += "<select name='"+name+"' multiple='multiple' size='"+values.length+"'>\n";
+	      for (int i=0; i<values.length; i++) {
+	         if (indexed)
+	            s += "   <option value='"+i+"'";
+	         else
+	            s += "   <option";
+	         if (values[i].equals(defval))
+	            s += " selected='selected'>"+values[i]+"</option>\n";
+	         else
+	            s += ">"+values[i]+"</option>\n";
+	      }
+	      s += "</select>\n";
+	      return s;
+	   }
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/NewTable.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/NewTable.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ae6d889bf4975795514034e293d928eaebc5714
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/NewTable.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+public class NewTable extends Field {
+	
+	private String name;
+	private String cssClass;
+	
+	public NewTable (String name, String css) {
+		this.name = name;
+		this.cssClass = css;
+	}
+	
+	protected String print() {
+		return "</table>\n<table class=\""+cssClass+"\">";
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Password.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Password.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7bb2f169f6da51d295c6e1b03d01098c52b6263
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Password.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public class Password extends Field
+{
+   String defval;
+   public Password(String name, String label, String defval)
+   {
+      this.name = name;
+      this.label = label;
+      this.defval = defval;
+   }
+   protected String print()
+   {
+      return "<input type='password' name='"+name+"' value='"+CGITools.escapeChar(defval, '\'')+"' />";
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Radio.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Radio.java
new file mode 100644
index 0000000000000000000000000000000000000000..37f2cd422a5802492f48a52ff3a211957f7d3ffb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/Radio.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public class Radio extends Field
+{
+   boolean checked;
+   public Radio(String name, String label, boolean checked)
+   {
+      this.name = name;
+      this.label = label;
+      this.checked = checked;
+   }
+   protected String print()
+   {
+      return "<input type='radio' name='"+name+"'"+(checked?" checked='checked'":"")+" />";
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/SubmitButton.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/SubmitButton.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd453aaf7241daca11d6a52476ab30422d65a1e3
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/SubmitButton.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package cx.ath.matthew.cgi;
+
+/**
+ * @author Agent
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class SubmitButton extends Field {
+
+	public SubmitButton(String name, String label) {
+		this.name = name;
+		this.label = label;
+	}
+	/* (non-Javadoc)
+	 * @see cx.ath.matthew.cgi.Field#print()
+	 */
+	protected String print() {
+		return "<input type='submit' name='"+name+"' value='"+CGITools.escapeChar(label,'\'')+"' />";
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/TextArea.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/TextArea.java
new file mode 100644
index 0000000000000000000000000000000000000000..950659a01ff7e95b748d3291244a9106e2d9abf5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/TextArea.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+public class TextArea extends Field
+{
+   String defval;
+   int cols;
+   int rows;
+   public TextArea(String name, String label, String defval)
+   {
+      this(name, label, defval, 30, 4);
+   }
+   public TextArea(String name, String label, String defval, int cols, int rows)
+   {
+      this.name = name;
+      this.label = label;
+      if (null == defval)
+         this.defval = "";
+      else
+         this.defval = defval;
+      this.cols = cols;
+      this.rows = rows;
+   }
+   protected String print()
+   {
+      return "<textarea name='"+name+"' cols='"+cols+"' rows='"+rows+"'>"+defval+"</textarea>";
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/TextField.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/TextField.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4d882576f1d39b85ae0a95225ff67e5c8d66618
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/TextField.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package cx.ath.matthew.cgi;
+
+
+public class TextField extends Field
+{
+   String defval;
+   int length;
+   public TextField(String name, String label)
+   {
+      this.name = name;
+      this.label = label;
+      this.defval = "";
+      this.length = 0;
+   }
+   public TextField(String name, String label, String defval)
+   {
+      this.name = name;
+      this.label = label;
+      if (null == defval)
+         this.defval = "";
+      else
+         this.defval = defval;
+      this.length = 0;
+   }
+   public TextField(String name, String label, String defval, int length)
+   {
+      this.name = name;
+      this.label = label;
+      if (null == defval)
+         this.defval = "";
+      else
+         this.defval = defval;
+      this.length = length;
+   }
+   protected String print()
+   {
+      return "<input type=\"text\" name=\""+name+"\" value=\""+CGITools.escapeChar(defval,'"')+"\" "+(length==0?"":"size=\""+length+"\"")+" />";
+   }
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/testcgi.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/testcgi.java
new file mode 100644
index 0000000000000000000000000000000000000000..13f125f1087097355944f9b58f69606d9418421e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/cgi/testcgi.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.cgi;
+
+import java.util.Iterator;
+import java.util.Map;
+
+class testcgi extends CGI
+{
+   protected void cgi(Map POST, Map GET, Map ENV, Map COOKIE, String[] params) throws Exception
+   {
+      header("Content-type", "text/plain");
+      setcookie("testcgi", "You have visited us already");
+      out("This is a test CGI program");
+      out("These are the params:");
+      for (int i=0; i < params.length; i++)
+         out("-- "+params[i]);
+      
+      out("These are the POST vars:");
+      Iterator i = POST.keySet().iterator();
+      while (i.hasNext()) {
+         String s = (String) i.next();
+         out("-- "+s+" => "+POST.get(s));
+      }
+      
+      out("These are the GET vars:");
+      i = GET.keySet().iterator();
+      while (i.hasNext()) {
+         String s = (String) i.next();
+         out("-- "+s+" => "+GET.get(s));
+      }
+        
+      out("These are the ENV vars:");
+      i = ENV.keySet().iterator();
+      while (i.hasNext()) {
+         String s = (String) i.next();
+         out("-- "+s+" => "+ENV.get(s));
+      }
+      
+      out("These are the COOKIEs:");
+      i = COOKIE.keySet().iterator();
+      while (i.hasNext()) {
+         String s = (String) i.next();
+         out("-- "+s+" => "+COOKIE.get(s));
+      }   
+   }
+
+   public static void main(String[] args)
+   {
+      CGI cgi = new testcgi();
+      cgi.doCGI(args);
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.class b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.class
new file mode 100644
index 0000000000000000000000000000000000000000..9afabe6a7ae81a183b78a01f853705a17a4a7621
Binary files /dev/null and b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.class differ
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b8b37429cc208d02aba344ee5f6c9615b994af0
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.java
@@ -0,0 +1,579 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.debug;
+
+import cx.ath.matthew.utils.Hexdump;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+  Add debugging to your program, has support for large projects with multiple
+  classes and debug levels per class. Supports optional enabling of debug 
+  per-level per-class and debug targets of files, Streams or stderr. 
+  Also supports timing between debug outputs, printing of stack traces for Throwables
+  and files/line numbers on each message.
+  <p>
+   Debug now automatically figures out which class it was called from, so all
+   methods passing in the calling class are deprecated.
+  </p>
+  <p>
+   The defaults are to print all messages to stderr with class and method name.
+  </p>
+  <p>
+  Should be called like this:
+  </p>
+  <pre>
+   if (Debug.debug) Debug.print(Debug.INFO, "Debug Message");
+  </pre>
+  */
+public class Debug
+{
+   /**
+     This interface can be used to provide custom printing filters
+     for certain classes.
+     */
+   public static interface FilterCommand
+   {
+      /** 
+        Called to print debug messages with a custom filter.
+        @param output The PrintStream to output to.
+        @param level The debug level of this message.
+        @param location The textual location of the message.
+        @param extra Extra information such as timing details.
+        @param message The debug message.
+        @param lines Other lines of a multiple-line debug message.
+       */
+      public void filter(PrintStream output, int level, String location, String extra, String message, String[] lines);
+   }
+   /** Highest priority messages */
+   public static final int CRIT = 1;
+   /** Error messages */
+   public static final int ERR = 2;
+   /** Warnings */
+   public static final int WARN = 3;
+   /** Information */
+   public static final int INFO = 4;
+   /** Debug messages */
+   public static final int DEBUG = 5;
+   /** Verbose debug messages */
+   public static final int VERBOSE = 6;
+   /** Set this to false to disable compilation of Debug statements */
+   public static final boolean debug = false;
+   /** The current output stream (defaults to System.err) */
+   public static PrintStream debugout = System.err;
+   private static Properties prop = null;
+   private static boolean timing = false;
+   private static boolean ttrace = false;
+   private static boolean lines = false;
+   private static boolean hexdump = false;
+   private static long last = 0;
+   private static int balen = 36;
+   private static int bawidth = 80;
+   private static Class saveclass = null;
+   //TODO: 1.5 private static Map<Class<? extends Object>, FilterCommand> filterMap = new HashMap<Class<? extends Object>, FilterCommand>();
+   private static Map filterMap = new HashMap();
+   /**
+     Set properties to configure debugging.
+     Format of properties is class =&gt; level, e.g.
+     <pre>
+      cx.ath.matthew.io.TeeOutputStream = INFO
+      cx.ath.matthew.io.DOMPrinter = DEBUG
+     </pre>
+     The debug level can be one of CRIT, ERR, WARN, INFO, DEBUG or VERBOSE which
+     correspond to all messages up to that level. The special words YES, ALL and TRUE
+     cause all messages to be printed regardless of level. All other terms disable 
+     messages for that class. CRIT and ERR messages are always printed if debugging is enabled
+     unless explicitly disabled.
+     The special class name ALL can be used to set the default level for all classes.
+     @param prop Properties object to use.
+   */
+   public static void setProperties(Properties prop)
+   {
+      Debug.prop = prop;
+   }
+   /**
+     Read which class to debug on at which level from the given File.
+     Syntax the same as Java Properties files:
+     <pre>
+     &lt;class&gt; = &lt;debuglevel&gt;
+     </pre>
+     E.G.
+     <pre>
+      cx.ath.matthew.io.TeeOutputStream = INFO
+      cx.ath.matthew.io.DOMPrinter = DEBUG
+     </pre>
+     The debug level can be one of CRIT, ERR, WARN, INFO, DEBUG or VERBOSE which
+     correspond to all messages up to that level. The special words YES, ALL and TRUE
+     cause all messages to be printed regardless of level. All other terms disable 
+     messages for that class. CRIT and ERR messages are always printed if debugging is enabled
+     unless explicitly disabled.
+     The special class name ALL can be used to set the default level for all classes.
+     @param f File to read from.
+   */
+   public static void loadConfig(File f) throws IOException
+   {
+      prop = new Properties();
+      prop.load(new FileInputStream(f));
+   }
+   /** @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in. */
+   //TODO: 1.5 @Deprecated()
+   public static boolean debugging(Class c, int loglevel)
+   {
+      if (debug) {
+         if (null == c) return true;
+         return debugging(c.getName(), loglevel);
+      }
+      return false;
+   }
+   public static boolean debugging(String s, int loglevel)
+   {
+      if (debug) {
+         try {
+            if (null == s) return true;
+            if (null == prop) return loglevel <= DEBUG;
+            String d = prop.getProperty(s);
+            if (null == d || "".equals(d)) d = prop.getProperty("ALL");
+            if (null == d) return loglevel <= ERR;
+            if ("".equals(d)) return loglevel <= ERR;
+            d = d.toLowerCase();
+            if ("true".equals(d)) return true;
+            if ("yes".equals(d)) return true;
+            if ("all".equals(d)) return true;
+            if ("verbose".equals(d)) return loglevel <= VERBOSE;
+            if ("debug".equals(d)) return loglevel <= DEBUG;
+            if ("info".equals(d)) return loglevel <= INFO;
+            if ("warn".equals(d)) return loglevel <= WARN;
+            if ("err".equals(d)) return loglevel <= ERR;
+            if ("crit".equals(d)) return loglevel <= CRIT;
+            int i = Integer.parseInt(d); return i >= loglevel;
+         } catch (Exception e) { return false; }
+      }
+      return false;
+   }
+
+   /**
+     Output to the given Stream */
+   public static void setOutput(PrintStream p) throws IOException
+   {
+      debugout = p;
+   }
+   /**
+     Output to the given file */
+   public static void setOutput(String filename) throws IOException
+   {
+      debugout = new PrintStream(new FileOutputStream(filename, true));
+   }
+
+   /**
+     Output to the default debug.log */
+   public static void setOutput() throws IOException {
+      setOutput("./debug.log");
+   }
+   /**
+      Log at DEBUG
+      @param d The object to log */
+   public static void print(Object d)
+   {
+      if (debug) {
+         if (d instanceof String)
+            print(DEBUG, (String) d);
+         else if (d instanceof Throwable)
+            print(DEBUG, (Throwable) d);
+         else if (d instanceof byte[])
+            print(DEBUG, (byte[]) d);
+         else if (d instanceof Map)
+            printMap(DEBUG, (Map) d);
+         else print(DEBUG, d);
+      }
+   }
+   /**
+      Log at DEBUG
+      @param o The object doing the logging
+      @param d The object to log 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, Object d)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(d);
+      }
+   }
+
+   /**
+      Log an Object
+      @param o The object doing the logging
+      @param loglevel The level to log at (DEBUG, WARN, etc)
+      @param d The object to log with d.toString() 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, int loglevel, Object d)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(loglevel, d);
+      }
+   }
+   /**
+      Log a String
+      @param o The object doing the logging
+      @param loglevel The level to log at (DEBUG, WARN, etc)
+      @param s The log message 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, int loglevel, String s)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(loglevel, s);
+      }
+   }
+   /**
+      Log a Throwable
+      @param o The object doing the logging
+      @param loglevel The level to log at (DEBUG, WARN, etc)
+      @param t The throwable to log with .toString and .printStackTrace 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, int loglevel, Throwable t)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(loglevel, t);
+      }
+   }
+
+   /**
+     Log a Throwable
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param t The throwable to log with .toString and .printStackTrace 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Class c, int loglevel, Throwable t)
+   {
+      if (debug) {
+         saveclass = c;
+         print(loglevel, t);
+      }
+   }
+   /**
+     Log a Throwable
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param t The throwable to log with .toString and .printStackTrace 
+     @see #setThrowableTraces to turn on stack traces.
+    */
+   public static void print(int loglevel, Throwable t)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }
+            String[] lines = null;
+            if (ttrace) {
+               StackTraceElement[] ste = t.getStackTrace();
+               lines = new String[ste.length];
+               for (int i = 0; i < ste.length; i++)
+                  lines[i] = "\tat "+ste[i].toString();
+            }
+            _print(t.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, t.toString(), lines);
+         }
+      }
+   }
+
+   /**
+     Log a byte array
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param b The byte array to print.
+     @see #setHexDump to enable hex dumping.
+     @see #setByteArrayCount to change how many bytes are printed. 
+     @see #setByteArrayWidth to change the formatting width of hex. */
+   public static void print(int loglevel, byte[] b)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }
+            String[] lines = null;
+            if (hexdump) {
+               if (balen >= b.length)
+                  lines = Hexdump.format(b, bawidth).split("\n");
+               else {
+                  byte[] buf = new byte[balen];
+                  System.arraycopy(b, 0, buf, 0, balen);
+                  lines = Hexdump.format(buf, bawidth).split("\n");
+               }
+            }
+            _print(b.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, b.length+" bytes", lines);
+         }
+      }
+   }
+   /**
+     Log a String
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param s The string to log with d.toString() 
+    */
+   public static void print(int loglevel, String s)
+   {
+      if (debug)
+         print(loglevel, (Object) s);
+   }
+   /**
+     Log an Object
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param d The object to log with d.toString() 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Class c, int loglevel, Object d)
+   {
+      if (debug) {
+         saveclass = c;
+         print(loglevel, d);
+      }
+   }
+   /**
+     Log a String
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param s The log message 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Class c, int loglevel, String s)
+   {
+      if (debug) {
+         saveclass = c;
+         print(loglevel, s);
+      }
+   }
+   private static String[] getTraceElements()
+   {
+      String[] data = new String[] { "", "", "" };
+      try {
+         Method m = Thread.class.getMethod("getStackTrace", new Class[0]);
+         StackTraceElement[] stes = (StackTraceElement[]) m.invoke(Thread.currentThread(), new Object[0]);
+         for (StackTraceElement ste: stes) {
+            if (Debug.class.getName().equals(ste.getClassName())) continue;
+            if (Thread.class.getName().equals(ste.getClassName())) continue;
+            if (Method.class.getName().equals(ste.getClassName())) continue;
+            if (ste.getClassName().startsWith("sun.reflect")) continue;
+            data[0] = ste.getClassName();
+            data[1] = ste.getMethodName();
+            if (lines)
+               data[2] = " "+ste.getFileName()+":"+ste.getLineNumber();
+            break;
+         }
+      } catch (NoSuchMethodException NSMe) {
+         if (null != saveclass)
+            data[0] = saveclass.getName();
+      } catch (IllegalAccessException IAe) {
+      } catch (InvocationTargetException ITe) {
+      }
+      return data;
+   }
+   /**
+     Log an Object
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param o The object to log
+    */
+   public static void print(int loglevel, Object o)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }
+            _print(o.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, o.toString(), null);
+         }
+      }
+   }
+
+   /**
+     Log a Map
+     @param o The object doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param m The Map to print out 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void printMap(Object o, int loglevel, Map m)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         printMap(loglevel, m);
+      }
+   }
+   /**
+     Log a Map
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param m The Map to print out 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void printMap(Class c, int loglevel, Map m)
+   {
+      if (debug) {
+         saveclass = c;
+         printMap(loglevel, m);
+      }
+   }
+   /**
+     Log a Map at DEBUG log level
+     @param m The Map to print out 
+    */
+   public static void printMap(Map m)
+   {
+      printMap(DEBUG, m);
+   }
+   /**
+     Log a Map
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param m The Map to print out 
+    */
+   public static void printMap(int loglevel, Map m)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }
+            Iterator i = m.keySet().iterator();
+            String[] lines = new String[m.size()];
+            int j = 0;
+            while (i.hasNext()) {
+               Object key = i.next();
+               lines[j++] = "\t\t- "+key+" => "+m.get(key);
+            }
+            _print(m.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, "Map:", lines);
+         }
+      }
+   }
+   /**
+     Enable or disable stack traces in Debuging throwables.
+    */
+   public static void setThrowableTraces(boolean ttrace)
+   {
+      Debug.ttrace = ttrace;
+   }
+   /**
+     Enable or disable timing in Debug messages.
+    */
+   public static void setTiming(boolean timing)
+   {
+      Debug.timing = timing;
+   }
+   /**
+     Enable or disable line numbers.
+    */
+   public static void setLineNos(boolean lines)
+   {
+      Debug.lines = lines;
+   }
+   /**
+     Enable or disable hexdumps.
+    */
+   public static void setHexDump(boolean hexdump)
+   {
+      Debug.hexdump = hexdump;
+   }
+   /**
+     Set the size of hexdumps.
+     (Default: 36)
+    */
+   public static void setByteArrayCount(int count)
+   {
+      Debug.balen = count;
+   }
+   /**
+     Set the formatted width of hexdumps.
+     (Default: 80 chars)
+    */
+   public static void setByteArrayWidth(int width)
+   {
+      Debug.bawidth = width;
+   }
+   /**
+     Add a filter command for a specific type.
+     This command will be called with the output stream
+     and the text to be sent. It should perform any
+     changes necessary to the text and then print the
+     result to the output stream.
+    */
+   public static void addFilterCommand(Class c, FilterCommand f)
+      //TODO 1.5: public static void addFilterCommand(Class<? extends Object> c, FilterCommand f)
+   {
+      filterMap.put(c, f);
+   }
+   private static void _print(Class c, int level, String loc, String extra, String message, String[] lines)
+   {
+      //TODO 1.5: FilterCommand f = filterMap.get(c);
+      FilterCommand f = (FilterCommand) filterMap.get(c);
+      if (null == f) {
+         debugout.println("["+loc+"] " +extra + message);
+         if (null != lines)
+            for (String s: lines)
+               debugout.println(s);
+      } else
+         f.filter(debugout, level, loc, extra, message, lines);
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.jpp b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.jpp
new file mode 100644
index 0000000000000000000000000000000000000000..56fd4ac7a1d00ebda64c55edfe1a591148b5bf83
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/debug/Debug.jpp
@@ -0,0 +1,597 @@
+/*
+ * Java Debug Library
+ *
+ * Copyright (c) Matthew Johnson 2005
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * To Contact the author, please email src@matthew.ath.cx
+ *
+ */
+
+package cx.ath.matthew.debug;
+
+import cx.ath.matthew.utils.Hexdump;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+  Add debugging to your program, has support for large projects with multiple
+  classes and debug levels per class. Supports optional enabling of debug 
+  per-level per-class and debug targets of files, Streams or stderr. 
+  Also supports timing between debug outputs, printing of stack traces for Throwables
+  and files/line numbers on each message.
+  <p>
+   Debug now automatically figures out which class it was called from, so all
+   methods passing in the calling class are deprecated.
+  </p>
+  <p>
+   The defaults are to print all messages to stderr with class and method name.
+  </p>
+  <p>
+  Should be called like this:
+  </p>
+  <pre>
+   if (Debug.debug) Debug.print(Debug.INFO, "Debug Message");
+  </pre>
+  */
+public class Debug
+{
+   /**
+     This interface can be used to provide custom printing filters
+     for certain classes.
+     */
+   public static interface FilterCommand
+   {
+      /** 
+        Called to print debug messages with a custom filter.
+        @param output The PrintStream to output to.
+        @param level The debug level of this message.
+        @param location The textual location of the message.
+        @param extra Extra information such as timing details.
+        @param message The debug message.
+        @param lines Other lines of a multiple-line debug message.
+       */
+      public void filter(PrintStream output, int level, String location, String extra, String message, String[] lines);
+   }
+   /** Highest priority messages */
+   public static final int CRIT = 1;
+   /** Error messages */
+   public static final int ERR = 2;
+   /** Warnings */
+   public static final int WARN = 3;
+   /** Information */
+   public static final int INFO = 4;
+   /** Debug messages */
+   public static final int DEBUG = 5;
+   /** Verbose debug messages */
+   public static final int VERBOSE = 6;
+   /** Set this to false to disable compilation of Debug statements */
+   public static final boolean debug = DEBUGSETTING;
+   /** The current output stream (defaults to System.err) */
+   public static PrintStream debugout = System.err;   
+   private static Properties prop = null;
+   private static boolean timing = false;
+   private static boolean ttrace = false;
+   private static boolean lines = false;
+   private static boolean hexdump = false;
+   private static long last = 0;
+   private static int balen = 36;
+   private static int bawidth = 80;
+   private static Class saveclass = null;
+   //TODO: 1.5 private static Map<Class<? extends Object>, FilterCommand> filterMap = new HashMap<Class<? extends Object>, FilterCommand>();
+   private static Map filterMap = new HashMap();
+   /**
+     Set properties to configure debugging.
+     Format of properties is class =&gt; level, e.g.
+     <pre>
+      cx.ath.matthew.io.TeeOutputStream = INFO
+      cx.ath.matthew.io.DOMPrinter = DEBUG
+     </pre>
+     The debug level can be one of CRIT, ERR, WARN, INFO, DEBUG or VERBOSE which
+     correspond to all messages up to that level. The special words YES, ALL and TRUE
+     cause all messages to be printed regardless of level. All other terms disable 
+     messages for that class. CRIT and ERR messages are always printed if debugging is enabled
+     unless explicitly disabled.
+     The special class name ALL can be used to set the default level for all classes.
+     @param prop Properties object to use.
+   */
+   public static void setProperties(Properties prop)
+   {
+      Debug.prop = prop;
+   }
+   /**
+     Read which class to debug on at which level from the given File.
+     Syntax the same as Java Properties files:
+     <pre>
+     &lt;class&gt; = &lt;debuglevel&gt;
+     </pre>
+     E.G.
+     <pre>
+      cx.ath.matthew.io.TeeOutputStream = INFO
+      cx.ath.matthew.io.DOMPrinter = DEBUG
+     </pre>
+     The debug level can be one of CRIT, ERR, WARN, INFO, DEBUG or VERBOSE which
+     correspond to all messages up to that level. The special words YES, ALL and TRUE
+     cause all messages to be printed regardless of level. All other terms disable 
+     messages for that class. CRIT and ERR messages are always printed if debugging is enabled
+     unless explicitly disabled.
+     The special class name ALL can be used to set the default level for all classes.
+     @param f File to read from.
+   */
+   public static void loadConfig(File f) throws IOException
+   {
+      prop = new Properties();
+      prop.load(new FileInputStream(f));
+   }
+   /** @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in. */
+   //TODO: 1.5 @Deprecated()
+   public static boolean debugging(Class c, int loglevel)
+   {
+      if (debug) {
+         if (null == c) return true;
+         return debugging(c.getName(), loglevel);
+      }
+      return false;
+   }
+   public static boolean debugging(String s, int loglevel)
+   {
+      if (debug) {
+         try {
+            if (null == s) return true;
+            if (null == prop) return loglevel <= DEBUG;
+            String d = prop.getProperty(s);
+            if (null == d || "".equals(d)) d = prop.getProperty("ALL");
+            if (null == d) return loglevel <= ERR;
+            if ("".equals(d)) return loglevel <= ERR;
+            d = d.toLowerCase();
+            if ("true".equals(d)) return true;
+            if ("yes".equals(d)) return true;
+            if ("all".equals(d)) return true;
+            if ("verbose".equals(d)) return loglevel <= VERBOSE;
+            if ("debug".equals(d)) return loglevel <= DEBUG;
+            if ("info".equals(d)) return loglevel <= INFO;
+            if ("warn".equals(d)) return loglevel <= WARN;
+            if ("err".equals(d)) return loglevel <= ERR;
+            if ("crit".equals(d)) return loglevel <= CRIT;
+            int i = Integer.parseInt(d); return i >= loglevel;
+         } catch (Exception e) { return false; }
+      }
+      return false;
+   }
+
+   /**
+     Output to the given Stream */
+   public static void setOutput(PrintStream p) throws IOException
+   {
+      debugout = p;
+   }
+   /**
+     Output to the given file */
+   public static void setOutput(String filename) throws IOException
+   {
+      debugout = new PrintStream(new FileOutputStream(filename, true));
+   }
+
+   /**
+     Output to the default debug.log */
+   public static void setOutput() throws IOException {
+      setOutput("./debug.log");
+   }
+   /**
+      Log at DEBUG
+      @param d The object to log */
+   public static void print(Object d)
+   {
+      if (debug) {
+         if (d instanceof String)
+            print(DEBUG, (String) d);
+         else if (d instanceof Throwable)
+            print(DEBUG, (Throwable) d);
+         else if (d instanceof byte[])
+            print(DEBUG, (byte[]) d);
+         else if (d instanceof Map)
+            printMap(DEBUG, (Map) d);
+         else print(DEBUG, d);
+      }
+   }
+   /**
+      Log at DEBUG
+      @param o The object doing the logging
+      @param d The object to log 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, Object d)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(d);
+      }
+   }
+
+   /**
+      Log an Object
+      @param o The object doing the logging
+      @param loglevel The level to log at (DEBUG, WARN, etc)
+      @param d The object to log with d.toString() 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, int loglevel, Object d)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(loglevel, d);
+      }
+   }
+   /**
+      Log a String
+      @param o The object doing the logging
+      @param loglevel The level to log at (DEBUG, WARN, etc)
+      @param s The log message 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, int loglevel, String s)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(loglevel, s);
+      }
+   }
+   /**
+      Log a Throwable
+      @param o The object doing the logging
+      @param loglevel The level to log at (DEBUG, WARN, etc)
+      @param t The throwable to log with .toString and .printStackTrace 
+      @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Object o, int loglevel, Throwable t)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         print(loglevel, t);
+      }
+   }
+
+   /**
+     Log a Throwable
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param t The throwable to log with .toString and .printStackTrace 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Class c, int loglevel, Throwable t)
+   {
+      if (debug) {
+         saveclass = c;
+         print(loglevel, t);
+      }
+   }
+   /**
+     Log a Throwable
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param t The throwable to log with .toString and .printStackTrace 
+     @see #setThrowableTraces to turn on stack traces.
+    */
+   public static void print(int loglevel, Throwable t)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }  
+            String[] lines = null;
+            if (ttrace) {
+               StackTraceElement[] ste = t.getStackTrace();
+               lines = new String[ste.length];
+               for (int i = 0; i < ste.length; i++)
+                  lines[i] = "\tat "+ste[i].toString();
+            }
+            _print(t.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, t.toString(), lines);
+         }
+      }
+   }
+
+   /**
+     Log a byte array
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param b The byte array to print.
+     @see #setHexDump to enable hex dumping.
+     @see #setByteArrayCount to change how many bytes are printed. 
+     @see #setByteArrayWidth to change the formatting width of hex. */
+   public static void print(int loglevel, byte[] b)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }  
+            String[] lines = null;
+            if (hexdump) {
+               if (balen >= b.length) 
+                  lines = Hexdump.format(b, bawidth).split("\n");
+               else {
+                  byte[] buf = new byte[balen];
+                  System.arraycopy(b, 0, buf, 0, balen);
+                  lines = Hexdump.format(buf, bawidth).split("\n");
+               }
+            }
+            _print(b.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, b.length+" bytes", lines);
+         }
+      }
+   }
+   /**
+     Log a String
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param s The string to log with d.toString() 
+    */
+   public static void print(int loglevel, String s)
+   {
+      if (debug)
+         print(loglevel, (Object) s);
+   }
+   /**
+     Log an Object
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param d The object to log with d.toString() 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Class c, int loglevel, Object d)
+   {
+      if (debug) {
+         saveclass = c;
+         print(loglevel, d);
+      }
+   }
+   /**
+     Log a String
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param s The log message 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void print(Class c, int loglevel, String s)
+   {
+      if (debug) {
+         saveclass = c;
+         print(loglevel, s);
+      }
+   }
+   private static String[] getTraceElements()
+   {
+      String[] data = new String[] { "", "", "" };
+      try {
+         Method m = Thread.class.getMethod("getStackTrace", new Class[0]);
+         StackTraceElement[] stes = (StackTraceElement[]) m.invoke(Thread.currentThread(), new Object[0]);
+         for (StackTraceElement ste: stes) {
+            if (Debug.class.getName().equals(ste.getClassName())) continue;
+            if (Thread.class.getName().equals(ste.getClassName())) continue;
+            if (Method.class.getName().equals(ste.getClassName())) continue;
+            if (ste.getClassName().startsWith("sun.reflect")) continue;
+            data[0] = ste.getClassName();
+            data[1] = ste.getMethodName();
+            if (lines) 
+               data[2] = " "+ste.getFileName()+":"+ste.getLineNumber();
+            break;
+         }
+      } catch (NoSuchMethodException NSMe) {
+         if (null != saveclass)
+            data[0] = saveclass.getName();
+      } catch (IllegalAccessException IAe) {
+      } catch (InvocationTargetException ITe) {
+      }
+      return data;
+   }
+   /**
+     Log an Object
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param o The object to log
+    */
+   public static void print(int loglevel, Object o)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }  
+            _print(o.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, o.toString(), null);
+         }
+      }
+   }
+
+   /**
+     Log a Map
+     @param o The object doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param m The Map to print out 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void printMap(Object o, int loglevel, Map m)
+   {
+      if (debug) {
+         if (o instanceof Class)
+            saveclass = (Class) o;
+         else
+            saveclass = o.getClass();
+         printMap(loglevel, m);
+      }
+   }
+   /**
+     Log a Map
+     @param c The class doing the logging
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param m The Map to print out 
+     @deprecated In Java 1.5 calling class is automatically identified, no need to pass it in.
+    */
+   //TODO: 1.5 @Deprecated()
+   public static void printMap(Class c, int loglevel, Map m)
+   {
+      if (debug) {
+         saveclass = c;
+         printMap(loglevel, m);
+      }
+   }
+   /**
+     Log a Map at DEBUG log level
+     @param m The Map to print out 
+    */
+   public static void printMap(Map m)
+   {
+      printMap(DEBUG, m);
+   }
+   /**
+     Log a Map
+     @param loglevel The level to log at (DEBUG, WARN, etc)
+     @param m The Map to print out 
+    */
+   public static void printMap(int loglevel, Map m)
+   {
+      if (debug) {
+         String timestr = "";
+         String[] data = getTraceElements();
+         if (debugging(data[0], loglevel)) {
+            if (timing) {
+               long now = System.currentTimeMillis();
+               timestr = "{" + (now-last) + "} ";
+               last = now;
+            }  
+            Iterator i = m.keySet().iterator();
+            String[] lines = new String[m.size()];
+            int j = 0;
+            while (i.hasNext()) {
+               Object key = i.next();
+               lines[j++] = "\t\t- "+key+" => "+m.get(key);
+            }
+            _print(m.getClass(), loglevel, data[0]+"."+data[1]+"()" + data[2], timestr, "Map:", lines);
+         }
+      }
+   }
+   /**
+     Enable or disable stack traces in Debuging throwables.
+    */
+   public static void setThrowableTraces(boolean ttrace)
+   {
+      Debug.ttrace = ttrace;
+   }
+   /**
+     Enable or disable timing in Debug messages.
+    */
+   public static void setTiming(boolean timing)
+   {
+      Debug.timing = timing;
+   }
+   /**
+     Enable or disable line numbers.
+    */
+   public static void setLineNos(boolean lines)
+   {
+      Debug.lines = lines;
+   }
+   /**
+     Enable or disable hexdumps.
+    */
+   public static void setHexDump(boolean hexdump)
+   {
+      Debug.hexdump = hexdump;
+   }
+   /**
+     Set the size of hexdumps.
+     (Default: 36)
+    */
+   public static void setByteArrayCount(int count)
+   {
+      Debug.balen = count;
+   }
+   /**
+     Set the formatted width of hexdumps.
+     (Default: 80 chars)
+    */
+   public static void setByteArrayWidth(int width)
+   {
+      Debug.bawidth = width;
+   }
+   /**
+     Add a filter command for a specific type.
+     This command will be called with the output stream
+     and the text to be sent. It should perform any
+     changes necessary to the text and then print the
+     result to the output stream.
+    */
+   public static void addFilterCommand(Class c, FilterCommand f)
+      //TODO 1.5: public static void addFilterCommand(Class<? extends Object> c, FilterCommand f)
+   {
+      filterMap.put(c, f);
+   }
+   private static void _print(Class c, int level, String loc, String extra, String message, String[] lines)
+   {
+      //TODO 1.5: FilterCommand f = filterMap.get(c);
+      FilterCommand f = (FilterCommand) filterMap.get(c);
+      if (null == f) {
+         debugout.println("["+loc+"] " +extra + message);
+         if (null != lines)
+            for (String s: lines)
+               debugout.println(s);
+      } else
+         f.filter(debugout, level, loc, extra, message, lines);
+   } 
+}
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/DOMPrinter.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/DOMPrinter.java
new file mode 100644
index 0000000000000000000000000000000000000000..72fa4902da7e810d052010b72663bc082def0d9c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/DOMPrinter.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Print a DOM tree to the given OutputStream
+ */
+public class DOMPrinter
+{
+   /**
+    * Print the given node and all its children.
+    * @param n The Node to print.
+    * @param os The Stream to print to.
+    */
+   public static void printNode(Node n, OutputStream os)
+   {
+      PrintStream p = new PrintStream(os);
+      printNode(n, p);
+   }
+   /**
+    * Print the given node and all its children.
+    * @param n The Node to print.
+    * @param p The Stream to print to.
+    */
+   public static void printNode(Node n, PrintStream p)
+   {
+      if (null != n.getNodeValue()) p.print(n.getNodeValue());
+      else {
+         p.print("<"+n.getNodeName());      
+         if (n.hasAttributes()) {
+            NamedNodeMap nnm = n.getAttributes();
+            for (int i = 0; i < nnm.getLength(); i++) {
+               Node attr = nnm.item(i);
+               p.print(" "+attr.getNodeName()+"='"+attr.getNodeValue()+"'");
+            }
+         }
+         if (n.hasChildNodes()) {
+            p.print(">");
+            NodeList nl = n.getChildNodes();
+            for (int i = 0; i < nl.getLength(); i++)
+               printNode(nl.item(i), p);
+            p.print("</"+n.getNodeName()+">");
+         } else {
+            p.print("/>");
+         }
+      }
+   }
+   /**
+    * Print the given document and all its children.
+    * @param d The Document to print.
+    * @param p The Stream to print to.
+    */
+   public static void printDOM(Document d, PrintStream p)
+   {
+      DocumentType dt = d.getDoctype();
+      if (null != dt) {
+         p.print("<!DOCTYPE "+dt.getName());
+         String pub = dt.getPublicId();
+         String sys = dt.getSystemId();
+         if (null != pub) p.print(" PUBLIC \""+pub+"\" \""+sys+"\"");
+         else if (null != sys) p.print(" SYSTEM \""+sys+"\"");
+         p.println(">");
+      }
+      Element e = d.getDocumentElement();
+      printNode(e, p);
+   }
+   /**
+    * Print the given document and all its children.
+    * @param d The Document to print.
+    * @param os The Stream to print to.
+    */
+   public static void printDOM(Document d, OutputStream os)
+   {
+      PrintStream p = new PrintStream(os);
+      printDOM(d, p);
+   }
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/ExecInputStream.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/ExecInputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..03912790501a15e46d512ccd9204dc37052a0b55
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/ExecInputStream.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+
+import java.io.FilterInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Class to pipe an InputStream through a command using stdin/stdout.
+ * E.g.
+ * <pre>
+ *    Reader r = new InputStreamReader(new ExecInputStream(new FileInputStream("file"), "command"));
+ * </pre>
+ */
+public class ExecInputStream extends FilterInputStream
+{
+   private Process proc;
+   private InputStream stdout;
+   private OutputStream stdin;
+   private InOutCopier copy;
+
+   /**
+    * Create a new ExecInputStream on the given InputStream
+    * using the process to filter the stream.
+    * @param is Reads from this InputStream
+    * @param p Filters data through stdin/out on this Process
+    */
+   public ExecInputStream(InputStream is, Process p) throws IOException
+   {
+      super(is);
+      proc = p;
+      stdin = p.getOutputStream();
+      stdout = p.getInputStream();
+      copy = new InOutCopier(in, stdin);
+      copy.start();
+   }
+   /**
+    * Create a new ExecInputStream on the given InputStream
+    * using the process to filter the stream.
+    * @param is Reads from this InputStream
+    * @param cmd Creates a Process from this string to filter data through stdin/out 
+    */
+   public ExecInputStream(InputStream is, String cmd) throws IOException
+   { this(is, Runtime.getRuntime().exec(cmd)); }
+   /**
+    * Create a new ExecInputStream on the given InputStream
+    * using the process to filter the stream.
+    * @param is Reads from this InputStream
+    * @param cmd Creates a Process from this string array (command, arg, ...) to filter data through stdin/out 
+    */
+   public ExecInputStream(InputStream is, String[] cmd) throws IOException
+   { this(is, Runtime.getRuntime().exec(cmd)); }
+   /**
+    * Create a new ExecInputStream on the given InputStream
+    * using the process to filter the stream.
+    * @param is Reads from this InputStream
+    * @param cmd Creates a Process from this string to filter data through stdin/out 
+    * @param env Setup the environment for the command
+    */
+   public ExecInputStream(InputStream is, String cmd, String[] env) throws IOException
+   { this(is, Runtime.getRuntime().exec(cmd, env)); }
+   /**
+    * Create a new ExecInputStream on the given InputStream
+    * using the process to filter the stream.
+    * @param is Reads from this InputStream
+    * @param cmd Creates a Process from this string array (command, arg, ...) to filter data through stdin/out 
+    * @param env Setup the environment for the command
+    */
+   public ExecInputStream(InputStream is, String[] cmd, String[] env) throws IOException
+   { this(is, Runtime.getRuntime().exec(cmd, env)); }
+
+   public void close() throws IOException
+   {
+      try {
+         proc.waitFor();
+      } catch (InterruptedException Ie)  {}
+      //copy.close();
+      try {
+         copy.join();
+      } catch (InterruptedException Ie)  {}
+      stdin.close();
+      in.close();
+      stdout.close();
+   }
+   public void flush() throws IOException
+   {
+      copy.flush();
+   }
+   public int	available() throws IOException
+   { return stdout.available(); } 
+   public int	read() throws IOException
+   { return stdout.read(); }
+   public int	read(byte[] b) throws IOException
+   { return stdout.read(b); }
+   public int	read(byte[] b, int off, int len) throws IOException
+   { return stdout.read(b, off, len); }
+   public long	skip(long n) throws IOException
+   { return stdout.skip(n); }
+   public void	mark(int readlimit)
+   {}
+   public boolean	markSupported()
+   { return false; }
+   public void	reset() 
+   {}
+
+   public void finalize()
+   {
+      try {
+         close();
+      } catch (Exception e) {}
+   }
+}
+
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/ExecOutputStream.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/ExecOutputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..4148f66ea68a9c20e13548300d91a57265748d1a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/ExecOutputStream.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+
+import java.io.FilterOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Class to pipe an OutputStream through a command using stdin/stdout.
+ * E.g.
+ * <pre>
+ *    Writer w = new OutputStreamWriter(new ExecOutputStream(new FileOutputStream("file"), "command"));
+ * </pre>
+ */
+public class ExecOutputStream extends FilterOutputStream
+{
+   private Process proc;
+   private InputStream stdout;
+   private OutputStream stdin;
+   private InOutCopier copy;
+
+   /**
+    * Create a new ExecOutputStream on the given OutputStream
+    * using the process to filter the stream.
+    * @param os Writes to this OutputStream
+    * @param p Filters data through stdin/out on this Process
+    */
+   public ExecOutputStream(OutputStream os, Process p) throws IOException
+   {
+      super(os);
+      proc = p;
+      stdin = p.getOutputStream();
+      stdout = p.getInputStream();
+      copy = new InOutCopier(stdout, out);
+      copy.start();
+   }
+   /**
+    * Create a new ExecOutputStream on the given OutputStream
+    * using the process to filter the stream.
+    * @param os Writes to this OutputStream
+    * @param cmd Creates a Process from this string to filter data through stdin/out 
+    */
+   public ExecOutputStream(OutputStream os, String cmd) throws IOException
+   { this(os, Runtime.getRuntime().exec(cmd)); }
+   /**
+    * Create a new ExecOutputStream on the given OutputStream
+    * using the process to filter the stream.
+    * @param os Writes to this OutputStream
+    * @param cmd Creates a Process from this string array (command, arg, ...) to filter data through stdin/out 
+    */
+   public ExecOutputStream(OutputStream os, String[] cmd) throws IOException
+   { this(os, Runtime.getRuntime().exec(cmd)); }
+   /**
+    * Create a new ExecOutputStream on the given OutputStream
+    * using the process to filter the stream.
+    * @param os Writes to this OutputStream
+    * @param cmd Creates a Process from this string to filter data through stdin/out 
+    * @param env Setup the environment for the command
+    */
+   public ExecOutputStream(OutputStream os, String cmd, String[] env) throws IOException
+   { this(os, Runtime.getRuntime().exec(cmd, env)); }
+   /**
+    * Create a new ExecOutputStream on the given OutputStream
+    * using the process to filter the stream.
+    * @param os Writes to this OutputStream
+    * @param cmd Creates a Process from this string array (command, arg, ...) to filter data through stdin/out 
+    * @param env Setup the environment for the command
+    */
+   public ExecOutputStream(OutputStream os, String[] cmd, String[] env) throws IOException
+   { this(os, Runtime.getRuntime().exec(cmd, env)); }
+
+   public void close() throws IOException
+   {
+      stdin.close();
+      try {
+         proc.waitFor();
+      } catch (InterruptedException Ie)  {}
+      //copy.close();
+      try {
+         copy.join();
+      } catch (InterruptedException Ie)  {}
+      stdout.close();
+      out.close();
+   }
+   public void flush() throws IOException
+   {
+      stdin.flush();
+      copy.flush();
+      out.flush();
+   }
+   public void write(byte[] b) throws IOException
+   {
+      stdin.write(b);
+   }
+   public void write(byte[] b, int off, int len) throws IOException
+   {
+      stdin.write(b, off, len);
+   }
+   public void write(int b) throws IOException
+   {
+      stdin.write(b);
+   }
+   public void finalize()
+   {
+      try {
+         close();
+      } catch (Exception e) {}
+   }
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/InOutCopier.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/InOutCopier.java
new file mode 100644
index 0000000000000000000000000000000000000000..3374a0ad0459c25ff0cc01e4fe5ce883e2653e2f
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/InOutCopier.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Copies from an input stream to an output stream using a Thread.
+ * example:
+ *
+ * <pre>
+ * InputStream a = getInputStream();
+ * OutputStream b = getOutputStream();
+ * InOutCopier copier = new InOutCopier(a, b);
+ * copier.start();
+ * &lt;do stuff that writes to the inputstream&gt;
+ * </pre>
+ */
+public class InOutCopier extends Thread
+{
+   private static final int BUFSIZE=1024;
+   private static final int POLLTIME=100;
+   private BufferedInputStream is;
+   private OutputStream os;
+   private boolean enable;
+   /**
+    * Create a copier from an inputstream to an outputstream
+    * @param is The stream to copy from
+    * @param os the stream to copy to
+    */
+   public InOutCopier(InputStream is, OutputStream os) throws IOException
+   {
+      this.is = new BufferedInputStream(is);
+      this.os = os;
+      this.enable = true;
+   }
+   /**
+    * Force close the stream without waiting for EOF on the source
+    */
+   public void close()
+   {
+      enable = false;
+      interrupt();
+   }
+   /**
+    * Flush the outputstream
+    */
+   public void flush() throws IOException
+   {
+      os.flush();
+   }
+   /** Start the thread and wait to make sure its really started */
+   public synchronized void start()
+   {
+      super.start();
+      try {
+         wait();
+      } catch (InterruptedException Ie) {}
+   }
+   /**
+    * Copies from the inputstream to the outputstream
+    * until EOF on the inputstream or explicitly closed
+    * @see #close()
+    */
+   public void run() 
+   {
+      byte[] buf = new byte[BUFSIZE];
+      synchronized (this) {
+         notifyAll();
+      }
+      while (enable)
+         try {
+            int n = is.read(buf);
+            if (0 > n)
+               break;
+            if (0 < n) {
+               os.write(buf, 0, (n> BUFSIZE? BUFSIZE:n));
+               os.flush();
+            }
+         } catch (IOException IOe) { 
+            break;
+         }
+      try { os.close(); } catch (IOException IOe) {}
+   }
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/TeeInputStream.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/TeeInputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd823edcb9e15881778f7a897186881549e8d4ed
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/TeeInputStream.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FilterInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Class to copy a stream to a file or another stream as it is being sent through a stream pipe
+ * E.g.
+ * <pre>
+ *    Reader r = new InputStreamReader(new TeeInputStream(new FileInputStream("file"), new File("otherfile")));
+ * </pre>
+ */
+public class TeeInputStream extends FilterInputStream
+{
+   private InputStream in;
+   private OutputStream fos;
+   /**
+    * Create a new TeeInputStream on the given InputStream
+    * and copy the stream to the given File.
+    * @param is Reads from this InputStream
+    * @param tos Write to this OutputStream
+    */
+   public TeeInputStream(InputStream is, OutputStream tos) throws IOException
+   {
+      super(is);
+      this.in = is;
+      this.fos = tos;
+   }
+   /**
+    * Create a new TeeInputStream on the given InputStream
+    * and copy the stream to the given File.
+    * @param is Reads from this InputStream
+    * @param f Write to this File
+    * @param append Append to file not overwrite
+    */
+   public TeeInputStream(InputStream is, File f, boolean append) throws IOException
+   {
+      super(is);
+      this.in = is;
+      this.fos = new FileOutputStream(f, append);
+   }
+   /**
+    * Create a new TeeInputStream on the given InputStream
+    * and copy the stream to the given File.
+    * @param is Reads from this InputStream
+    * @param f Write to this File
+    */
+   public TeeInputStream(InputStream is, File f) throws IOException
+   {
+      super(is);
+      this.in = is;
+      this.fos = new FileOutputStream(f);
+   }
+   /**
+    * Create a new TeeInputStream on the given InputStream
+    * and copy the stream to the given File.
+    * @param is Reads from this InputStream
+    * @param f Write to this File
+    * @param append Append to file not overwrite
+    */
+   public TeeInputStream(InputStream is, String f, boolean append) throws IOException
+   {
+      this(is, new File(f), append);
+   }
+   /**
+    * Create a new TeeInputStream on the given InputStream
+    * and copy the stream to the given File.
+    * @param is Reads from this InputStream
+    * @param f Write to this File
+    */
+   public TeeInputStream(InputStream is, String f) throws IOException
+   {
+      this(is, new File(f));
+   }
+   public void close() throws IOException
+   {
+      in.close();
+      fos.close();
+   }
+   public void flush() throws IOException
+   {
+      fos.flush();
+   }
+   public int	available() throws IOException
+   {
+      return in.available();
+   } 
+   public int	read() throws IOException
+   {
+      int i = in.read();
+      if (-1 != i) fos.write(i);
+      return i;
+   }
+   public int	read(byte[] b) throws IOException
+   {
+      int c = in.read(b);
+      if (-1 != c) fos.write(b, 0, c);
+      return c;
+   }
+   public int	read(byte[] b, int off, int len) throws IOException
+   {  
+      int c = in.read(b, off, len);
+      if (-1 != c) fos.write(b, off, c);
+      return c;
+   }
+   public long	skip(long n) throws IOException
+   { return in.skip(n); }
+   public void	mark(int readlimit)
+   {}
+   public boolean	markSupported()
+   { return false; }
+   public void	reset() throws IOException
+   { in.reset(); }
+
+   public void finalize()
+   {
+      try {
+         close();
+      } catch (Exception e) {}
+   }
+}
+
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/TeeOutputStream.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/TeeOutputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3742098ea9978682b13b83202bda887d10d4170
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/TeeOutputStream.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FilterOutputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * Class to copy a stream to another stream or file as it is being sent through a stream pipe
+ * E.g.
+ * <pre>
+ *    PrintWriter r = new PrintWriter(new TeeOutputStream(new FileOutputStream("file"), new File("otherfile")));
+ * </pre>
+ */
+public class TeeOutputStream extends FilterOutputStream
+{
+   private File f;
+   private OutputStream out;
+   private OutputStream fos;
+   /**
+    * Create a new TeeOutputStream on the given OutputStream
+    * and copy the stream to the other OuputStream.
+    * @param os Writes to this OutputStream
+    * @param tos Write to this OutputStream
+    */
+   public TeeOutputStream(OutputStream os, OutputStream tos) throws IOException
+   {
+      super(os);
+      this.out = os;
+      this.fos = tos;
+   }
+   /**
+    * Create a new TeeOutputStream on the given OutputStream
+    * and copy the stream to the given File.
+    * @param os Writes to this OutputStream
+    * @param f Write to this File
+    * @param append Append to file not overwrite
+    */
+   public TeeOutputStream(OutputStream os, File f, boolean append) throws IOException
+   {
+      super(os);
+      this.out = os;
+      this.fos = new FileOutputStream(f, append);
+   }
+   /**
+    * Create a new TeeOutputStream on the given OutputStream
+    * and copy the stream to the given File.
+    * @param os Writes to this OutputStream
+    * @param f Write to this File
+    */
+   public TeeOutputStream(OutputStream os, File f) throws IOException
+   {
+      super(os);
+      this.out = os;
+      this.fos = new FileOutputStream(f);
+   }
+   /**
+    * Create a new TeeOutputStream on the given OutputStream
+    * and copy the stream to the given File.
+    * @param os Writes to this OutputStream
+    * @param f Write to this File
+    * @param append Append to file not overwrite
+    */
+   public TeeOutputStream(OutputStream os, String f, boolean append) throws IOException
+   {
+      this(os, new File(f), append);
+   }
+   /**
+    * Create a new TeeOutputStream on the given OutputStream
+    * and copy the stream to the given File.
+    * @param os Writes to this OutputStream
+    * @param f Write to this File
+    */
+   public TeeOutputStream(OutputStream os, String f) throws IOException
+   {
+      this(os, new File(f));
+   }
+   public void close() throws IOException
+   {
+      out.close();
+      fos.close();
+   }
+   public void flush() throws IOException
+   {
+      fos.flush();
+      out.flush();
+   }
+   public void write(int b) throws IOException
+   {
+      fos.write(b);
+      out.write(b);
+   }
+   public void write(byte[] b) throws IOException
+   {
+      fos.write(b);
+      out.write(b);
+   }
+   public void write(byte[] b, int off, int len) throws IOException
+   {  
+      fos.write(b, off, len);
+      out.write(b, off, len);
+   }
+
+   public void finalize()
+   {
+      try {
+         close();
+      } catch (Exception e) {}
+   }
+}
+
+
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test.java
new file mode 100644
index 0000000000000000000000000000000000000000..62596dd5f0dafb348d86d79d296647e09a5f6d51
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+import java.io.PrintWriter;
+import java.io.OutputStreamWriter;
+class test
+{
+   public static void main(String[] args) throws Exception
+   {
+      PrintWriter out = new PrintWriter(new OutputStreamWriter(new ExecOutputStream(System.out, "xsltproc mcr.xsl -")));///java cx.ath.matthew.io.findeof")));
+      
+      out.println("<?xml version='1.0'?>");
+      out.println("   <?xml-stylesheet href='style/mcr.xsl' type='text/xsl'?>");
+      out.println("   <mcr xmlns:xi='http://www.w3.org/2001/XInclude'>");
+      out.println("   <title>TEST</title>");
+      out.println("   <content title='TEST'>");
+      out.println("hello, he is helping tie up helen's lemmings");
+      out.println("we are being followed and we break out");
+      out.println("   </content>");
+      out.println("   </mcr>");
+      out.close();
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test2.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test2.java
new file mode 100644
index 0000000000000000000000000000000000000000..b19f270faeb2603e5ea92540479bfe13569c5857
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test2.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+class test2
+{
+   public static void main(String[] args) throws Exception
+   {
+      BufferedReader in = new BufferedReader(new InputStreamReader(new ExecInputStream(System.in, "xsltproc mcr.xsl -")));
+      String s;
+      while (null != (s = in.readLine())) System.out.println(s);
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test3.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test3.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f228cadbf36ff9f4af17a78ff8555a429fa4683
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/io/test3.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.io;
+import java.io.PrintWriter;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+class test3
+{
+   public static void main(String[] args) throws Exception
+   {
+      String file = args[0];
+      PrintWriter p = new PrintWriter(new TeeOutputStream(System.out, file));
+      BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+      String s;
+      while (null != (s = r.readLine()))
+         p.println(s);
+      p.close();
+      r.close();
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/NotConnectedException.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/NotConnectedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..8296363719d885f50d2062f5e5c66fbaea2b78fc
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/NotConnectedException.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.net.SocketException;
+
+public class NotConnectedException extends SocketException
+{
+   public NotConnectedException()
+   {
+      super("The Socket is Not Connected");
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/USInputStream.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/USInputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6371e6c5d2121eae76e2d7f6b964046811a14d3
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/USInputStream.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+public class USInputStream extends InputStream
+{ 
+   public static final int MSG_DONTWAIT = 0x40;
+   private native int native_recv(int sock, byte[] b, int off, int len, int flags, int timeout) throws IOException;
+   private int sock;
+   boolean closed = false;
+   private byte[] onebuf = new byte[1];
+   private UnixSocket us;
+   private boolean blocking = true;
+   private int flags = 0;
+   private int timeout = 0;
+   public USInputStream(int sock, UnixSocket us)
+   {
+      this.sock = sock;
+      this.us = us;
+   }
+   public void close() throws IOException
+   {
+      closed = true;
+      us.close();
+   }
+   public boolean markSupported() { return false; }
+   public int read() throws IOException
+   {
+      int rv = 0;
+      while (0 >= rv) rv = read(onebuf);
+      if (-1 == rv) return -1;
+      return 0 > onebuf[0] ? -onebuf[0] : onebuf[0];
+   }
+   public int read(byte[] b, int off, int len) throws IOException
+   {
+      if (closed) throw new NotConnectedException();
+      int count = native_recv(sock, b, off, len, flags, timeout);
+      /* Yes, I really want to do this. Recv returns 0 for 'connection shut down'.
+       * read() returns -1 for 'end of stream.
+       * Recv returns -1 for 'EAGAIN' (all other errors cause an exception to be raised)
+       * whereas read() returns 0 for '0 bytes read', so yes, I really want to swap them here.
+       */
+      if (0 == count) return -1;
+      else if (-1 == count) return 0;
+      else return count;
+   }
+   public boolean isClosed() { return closed; }
+   public UnixSocket getSocket() { return us; }
+   public void setBlocking(boolean enable)
+   {
+      flags = enable ? 0 : MSG_DONTWAIT;
+   }
+   public void setSoTimeout(int timeout)
+   {
+      this.timeout = timeout;
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/USOutputStream.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/USOutputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..a030c1b6a7edd31248a640b966e0185c73e6cda6
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/USOutputStream.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class USOutputStream extends OutputStream
+{
+   private native int native_send(int sock, byte[] b, int off, int len) throws IOException;
+   private native int native_send(int sock, byte[][] b) throws IOException;
+   private int sock;
+   boolean closed = false;
+   private byte[] onebuf = new byte[1];
+   private UnixSocket us;
+   public USOutputStream(int sock, UnixSocket us)
+   {
+      this.sock = sock;
+      this.us = us;
+   }
+   public void close() throws IOException
+   {
+      closed = true;
+      us.close();
+   }
+   public void flush() {} // no-op, we do not buffer
+   public void write(byte[][] b) throws IOException
+   {
+      if (closed) throw new NotConnectedException();
+      native_send(sock, b);
+   }
+   public void write(byte[] b, int off, int len) throws IOException
+   {
+      if (closed) throw new NotConnectedException();
+      native_send(sock, b, off, len);
+   }
+   public void write(int b) throws IOException
+   {
+      onebuf[0] = (byte) (b % 0x7F);
+      if (1 == (b % 0x80)) onebuf[0] = (byte) -onebuf[0];
+      write(onebuf);
+   }
+   public boolean isClosed() { return closed; }
+   public UnixSocket getSocket() { return us; }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixIOException.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixIOException.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e5383e28c7c8c26708828181980c68dcafa306e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixIOException.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.IOException;
+
+/**
+ * An IO Exception which occurred during UNIX Socket IO
+ */
+public class UnixIOException extends IOException
+{
+   private int no;
+   private String message;
+   public UnixIOException(int no, String message)
+   {
+      super(message);
+      this.message = message;
+      this.no = no;
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixServerSocket.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixServerSocket.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d099b67462a878a361879b283b8002bea32e733
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixServerSocket.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.IOException;
+
+/**
+ * Represents a listening UNIX Socket.
+ */
+public class UnixServerSocket
+{
+   static { System.loadLibrary("unix-java"); }
+   private native int native_bind(String address, boolean abs) throws IOException;
+   private native void native_close(int sock) throws IOException;
+   private native int native_accept(int sock) throws IOException;
+   private UnixSocketAddress address = null;
+   private boolean bound = false;
+   private boolean closed = false;
+   private int sock;
+   /**
+    * Create an un-bound server socket.
+    */
+   public UnixServerSocket()
+   {
+   }
+   /**
+    * Create a server socket bound to the given address.
+    * @param address Path to the socket.
+    */
+   public UnixServerSocket(UnixSocketAddress address) throws IOException
+   {
+      bind(address);
+   }
+   /**
+    * Create a server socket bound to the given address.
+    * @param address Path to the socket.
+    */
+   public UnixServerSocket(String address) throws IOException
+   {
+      this(new UnixSocketAddress(address));
+   }
+   /**
+    * Accepts a connection on the ServerSocket.
+    * @return A UnixSocket connected to the accepted connection.
+    */
+   public UnixSocket accept() throws IOException
+   {
+      int client_sock = native_accept(sock);
+      return new UnixSocket(client_sock, address);
+   }
+   /**
+    * Closes the ServerSocket.
+    */
+   public synchronized void close() throws IOException
+   {
+      native_close(sock);
+      sock = 0;
+      closed = true;
+      bound = false;
+   }
+   /**
+    * Binds a server socket to the given address.
+    * @param address Path to the socket.
+    */
+   public void bind(UnixSocketAddress address) throws IOException
+   {
+      if (bound) close();
+      sock = native_bind(address.path, address.abs);
+      bound = true;
+      closed = false;
+      this.address = address;
+   }
+   /**
+    * Binds a server socket to the given address.
+    * @param address Path to the socket.
+    */
+   public void bind(String address) throws IOException
+   {
+      bind(new UnixSocketAddress(address));
+   }   
+   /**
+    * Return the address this socket is bound to.
+    * @return The UnixSocketAddress if bound or null if unbound.
+    */
+   public UnixSocketAddress getAddress()
+   {
+      return address;
+   }
+   /**
+    * Check the status of the socket.
+    * @return True if closed.
+    */
+   public boolean isClosed()
+   {
+      return closed;
+   }
+   /**
+    * Check the status of the socket.
+    * @return True if bound.
+    */
+   public boolean isBound()
+   {
+      return bound;
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixSocket.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixSocket.java
new file mode 100644
index 0000000000000000000000000000000000000000..662a1907ae87f9edb56d5c5024edd95e9cdc5cb5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixSocket.java
@@ -0,0 +1,305 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import cx.ath.matthew.debug.Debug;
+
+/**
+ * Represents a UnixSocket.
+ */
+public class UnixSocket
+{
+   static { System.loadLibrary("unix-java"); }
+   private native void native_set_pass_cred(int sock, boolean passcred) throws IOException;
+   private native int native_connect(String address, boolean abs) throws IOException;
+   private native void native_close(int sock) throws IOException;
+   private native int native_getPID(int sock);
+   private native int native_getUID(int sock);
+   private native int native_getGID(int sock);
+   private native void native_send_creds(int sock, byte data) throws IOException;
+   private native byte native_recv_creds(int sock, int[] creds) throws IOException;
+
+   private UnixSocketAddress address = null;
+   private USOutputStream os = null;
+   private USInputStream is = null;
+   private boolean closed = false;
+   private boolean connected = false;
+   private boolean passcred = false;
+   private int sock = 0;
+   private boolean blocking = true;
+   private int uid = -1;
+   private int pid = -1;
+   private int gid = -1;
+   UnixSocket(int sock, UnixSocketAddress address)
+   {
+      this.sock = sock;
+      this.address = address;
+      this.connected = true;
+      this.os = new USOutputStream(sock, this);
+      this.is = new USInputStream(sock, this);
+   }
+   /**
+    * Create an unconnected socket.
+    */
+   public UnixSocket()
+   {
+   }
+   /**
+    * Create a socket connected to the given address.
+    * @param address The Unix Socket address to connect to
+    */
+   public UnixSocket(UnixSocketAddress address) throws IOException
+   {
+      connect(address);
+   }
+   /**
+    * Create a socket connected to the given address.
+    * @param address The Unix Socket address to connect to
+    */
+   public UnixSocket(String address) throws IOException
+   {
+      this(new UnixSocketAddress(address));
+   }
+   /**
+    * Connect the socket to this address.
+    * @param address The Unix Socket address to connect to
+    */
+   public void connect(UnixSocketAddress address) throws IOException
+   {
+      if (connected) close();
+      this.sock = native_connect(address.path, address.abs);
+      this.os = new USOutputStream(this.sock, this);
+      this.is = new USInputStream(this.sock, this);
+      this.address = address;
+      this.connected = true;
+      this.closed = false;
+      this.is.setBlocking(blocking);
+   }
+   /**
+    * Connect the socket to this address.
+    * @param address The Unix Socket address to connect to
+    */
+   public void connect(String address) throws IOException
+   {
+      connect(new UnixSocketAddress(address));
+   }
+   public void finalize()
+   {
+      try { 
+         close();
+      } catch (IOException IOe) {}
+   }
+   /**
+    * Closes the connection.
+    */
+   public synchronized void close() throws IOException
+   {
+      if (Debug.debug) Debug.print(Debug.INFO, "Closing socket");
+      native_close(sock);
+      sock = 0;
+      this.closed = true;
+      this.connected = false;
+      os = null;
+      is = null;
+   }
+   /**
+    * Returns an InputStream for reading from the socket.
+    * @return An InputStream connected to this socket.
+    */
+   public InputStream getInputStream()
+   {
+      return is;
+   }
+   /**
+    * Returns an OutputStream for writing to the socket.
+    * @return An OutputStream connected to this socket.
+    */
+   public OutputStream getOutputStream()
+   {
+      return os;
+   }
+   /**
+    * Returns the address this socket is connected to.
+    * Returns null if the socket is unconnected.
+    * @return The UnixSocketAddress the socket is connected to
+    */
+   public UnixSocketAddress getAddress()
+   { 
+      return address;
+   }
+   /**
+    * Send a single byte of data with credentials.
+    * (Works on BSDs)
+    * @param data The byte of data to send.
+    */
+   public void sendCredentialByte(byte data) throws IOException
+   {
+      if (!connected) throw new NotConnectedException();
+      native_send_creds(sock, data);
+   }
+   /**
+    * Receive a single byte of data, with credentials.
+    * (Works on BSDs)
+    * @see getPeerUID
+    * @see getPeerPID
+    * @see getPeerGID
+    * @param data The byte of data to send.
+    */
+   public byte recvCredentialByte() throws IOException
+   {
+      if (!connected) throw new NotConnectedException();
+      int[] creds = new int[] { -1, -1, -1 };
+      byte data = native_recv_creds(sock, creds);
+      pid = creds[0];
+      uid = creds[1];
+      gid = creds[2];
+      return data;
+   }
+   /**
+    * Get the credential passing status.
+    * (only effective on linux)
+    * @return The current status of credential passing.
+    * @see setPassCred
+    */
+   public boolean getPassCred()
+   {
+      return passcred;
+   }
+   /**
+    * Return the uid of the remote process.
+    * Some data must have been received on the socket to do this.
+    * Either setPassCred must be called on Linux first, or recvCredentialByte
+    * on BSD.
+    * @return the UID or -1 if it is not available
+    */
+   public int getPeerUID()
+   {
+      if (-1 == uid)
+         uid = native_getUID(sock);
+      return uid;
+   }
+   /**
+    * Return the gid of the remote process.
+    * Some data must have been received on the socket to do this.
+    * Either setPassCred must be called on Linux first, or recvCredentialByte
+    * on BSD.
+    * @return the GID or -1 if it is not available
+    */
+   public int getPeerGID()
+   {
+      if (-1 == gid)
+         gid = native_getGID(sock);
+      return gid;
+   }
+   /**
+    * Return the pid of the remote process.
+    * Some data must have been received on the socket to do this.
+    * Either setPassCred must be called on Linux first, or recvCredentialByte
+    * on BSD.
+    * @return the PID or -1 if it is not available
+    */
+   public int getPeerPID()
+   {
+      if (-1 == pid)
+         pid = native_getPID(sock);
+      return pid;
+   }
+   /**
+    * Set the credential passing status.
+    * (Only does anything on linux, for other OS, you need
+    * to use send/recv credentials)
+    * @param enable Set to true for credentials to be passed.
+    */
+   public void setPassCred(boolean enable) throws IOException
+   {
+      native_set_pass_cred(sock, enable);
+      passcred = enable;
+   }
+   /**
+    * Get the blocking mode.
+    * @return true if reads are blocking.
+    * @see setBlocking
+    */
+   public boolean getBlocking()
+   {
+      return blocking;
+   }
+   /**
+    * Set the blocking mode.
+    * @param enable Set to false for non-blocking reads.
+    */
+   public void setBlocking(boolean enable)
+   {
+      blocking = enable;
+      if (null != is) is.setBlocking(enable);
+   }
+
+   /**
+    * Check the socket status.
+    * @return true if closed.
+    */
+   public boolean isClosed()
+   {
+      return closed;
+   }
+   /**
+    * Check the socket status.
+    * @return true if connected.
+    */
+   public boolean isConnected()
+   {
+      return connected;
+   }
+   /**
+    * Check the socket status.
+    * @return true if the input stream has been shutdown
+    */
+   public boolean isInputShutdown()
+   {
+      return is.isClosed();
+   }
+   /**
+    * Check the socket status.
+    * @return true if the output stream has been shutdown
+    */
+   public boolean isOutputShutdown()
+   {
+      return os.isClosed();
+   }
+   /**
+    * Shuts down the input stream.
+    * Subsequent reads on the associated InputStream will fail.
+    */
+   public void shutdownInput()
+   {
+      is.closed = true;
+   }
+   /**
+    * Shuts down the output stream.
+    * Subsequent writes to the associated OutputStream will fail.
+    */
+   public void shutdownOutput()
+   {
+      os.closed = true;
+   }
+   /**
+    * Set timeout of read requests.
+    */
+   public void setSoTimeout(int timeout)
+   {
+      is.setSoTimeout(timeout);
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixSocketAddress.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixSocketAddress.java
new file mode 100644
index 0000000000000000000000000000000000000000..97a63a883656ad7b5a51abce4f1c872f4c6e04c9
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/UnixSocketAddress.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+/**
+ * Represents an address for a Unix Socket
+ */
+public class UnixSocketAddress
+{
+   String path;
+   boolean abs;
+  /**
+    * Create the address.
+    * @param path The path to the Unix Socket.
+    * @param abs True if this should be an abstract socket.
+    */
+   public UnixSocketAddress(String path, boolean abs)
+   {
+      this.path = path;
+      this.abs = abs;
+   }
+   /**
+    * Create the address.
+    * @param path The path to the Unix Socket.
+    */
+   public UnixSocketAddress(String path)
+   {
+      this.path = path;
+      this.abs = false;
+   }
+   /**
+    * Return the path.
+    */
+   public String getPath()
+   {
+      return path;
+   }
+   /**
+    * Returns true if this an address for an abstract socket.
+    */
+   public boolean isAbstract()
+   {
+      return abs;
+   }
+   /**
+    * Return the Address as a String.
+    */
+   public String toString()
+   {
+      return "unix"+(abs?":abstract":"")+":path="+path;
+   }
+   public boolean equals(Object o)
+   {
+      if (!(o instanceof UnixSocketAddress)) return false;
+      return ((UnixSocketAddress) o).path.equals(this.path);
+   }
+   public int hashCode()
+   {
+      return path.hashCode();
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/java-unix.h b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/java-unix.h
new file mode 100644
index 0000000000000000000000000000000000000000..f0d1ebe3ee2372e8da7cf52bfaf5a58fb315daa9
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/java-unix.h
@@ -0,0 +1,112 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class cx_ath_matthew_unix_UnixServerSocket */
+
+#ifndef _Included_cx_ath_matthew_unix_UnixServerSocket
+#define _Included_cx_ath_matthew_unix_UnixServerSocket
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     cx_ath_matthew_unix_UnixServerSocket
+ * Method:    native_bind
+ * Signature: (Ljava/lang/String;Z)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixServerSocket_native_1bind
+  (JNIEnv *, jobject, jstring, jboolean);
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixServerSocket
+ * Method:    native_close
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixServerSocket_native_1close
+  (JNIEnv *, jobject, jint);
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixServerSocket
+ * Method:    native_accept
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixServerSocket_native_1accept
+  (JNIEnv *, jobject, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cx_ath_matthew_unix_UnixSocket */
+
+#ifndef _Included_cx_ath_matthew_unix_UnixSocket
+#define _Included_cx_ath_matthew_unix_UnixSocket
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_set_pass_cred
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1set_1pass_1cred
+  (JNIEnv *, jobject, jint, jboolean);
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_connect
+ * Signature: (Ljava/lang/String;Z)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1connect
+  (JNIEnv *, jobject, jstring, jboolean);
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_close
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1close
+  (JNIEnv *, jobject, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cx_ath_matthew_unix_USInputStream */
+
+#ifndef _Included_cx_ath_matthew_unix_USInputStream
+#define _Included_cx_ath_matthew_unix_USInputStream
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef cx_ath_matthew_unix_USInputStream_SKIP_BUFFER_SIZE
+#define cx_ath_matthew_unix_USInputStream_SKIP_BUFFER_SIZE 2048L
+/*
+ * Class:     cx_ath_matthew_unix_USInputStream
+ * Method:    native_recv
+ * Signature: (I[BII)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_USInputStream_native_1recv
+  (JNIEnv *, jobject, jint, jbyteArray, jint, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cx_ath_matthew_unix_USOutputStream */
+
+#ifndef _Included_cx_ath_matthew_unix_USOutputStream
+#define _Included_cx_ath_matthew_unix_USOutputStream
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     cx_ath_matthew_unix_USOutputStream
+ * Method:    native_send
+ * Signature: (I[BII)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_USOutputStream_native_1send
+  (JNIEnv *, jobject, jint, jbyteArray, jint, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/testclient.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/testclient.java
new file mode 100644
index 0000000000000000000000000000000000000000..18bfc98cd3e61ab8e29b7d19898ae1651e023f6a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/testclient.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+public class testclient
+{
+   public static void main(String args[]) throws IOException
+   {
+      UnixSocket s = new UnixSocket(new UnixSocketAddress("testsock", true));
+      OutputStream os = s.getOutputStream();
+      PrintWriter o = new PrintWriter(os);
+      BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+      String l;
+      while (null != (l = r.readLine())) {
+         byte[] buf = (l+"\n").getBytes();
+         os.write(buf, 0, buf.length);
+      }
+      s.close();
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/testserver.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/testserver.java
new file mode 100644
index 0000000000000000000000000000000000000000..f31dec0e8a5078cb8ec29d6913548c01af1ba8d6
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/unix/testserver.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.unix;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+public class testserver
+{
+   public static void main(String args[]) throws IOException
+   {
+      UnixServerSocket ss = new UnixServerSocket(new UnixSocketAddress("testsock", true));
+      UnixSocket s = ss.accept();
+      BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));
+      String l;
+      while (null != (l = r.readLine()))
+         System.out.println(l);/*
+      InputStream is = s.getInputStream();
+      int r;
+      do {
+         r = is.read();
+         System.out.print((char)r);
+      } while (-1 != r);*/
+      s.close();
+      ss.close();
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/utils/Hexdump.java b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/utils/Hexdump.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f1b59d4ac2063b607d30171fd371dc7f647ee25
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/cx/ath/matthew/utils/Hexdump.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package cx.ath.matthew.utils;
+
+import java.io.PrintStream;
+
+public class Hexdump
+{
+   public static final char[] hexchars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+   public static String toHex(byte[] buf)
+   {
+      return toHex(buf, 0, buf.length);
+   }
+   public static String toHex(byte[] buf, int ofs, int len)
+   {
+      StringBuffer sb = new StringBuffer();
+      int j = ofs+len;
+      for (int i = ofs; i < j; i++) {
+         if (i < buf.length) {
+            sb.append(hexchars[(buf[i] & 0xF0) >> 4]);
+            sb.append(hexchars[buf[i] & 0x0F]);
+            sb.append(' ');
+         } else {
+            sb.append(' ');
+            sb.append(' ');
+            sb.append(' ');
+         }
+      }
+      return sb.toString();
+   }
+   
+   public static String toAscii(byte[] buf)
+   {
+      return toAscii(buf, 0, buf.length);
+   }
+   public static String toAscii(byte[] buf, int ofs, int len)
+   {
+      StringBuffer sb = new StringBuffer();
+      int j = ofs+len;
+      for (int i = ofs; i < j ; i++) {
+         if (i < buf.length) {
+            if (20 <= buf[i] && 126 >= buf[i])
+               sb.append((char) buf[i]);
+            else
+               sb.append('.');
+         } else
+            sb.append(' ');
+      }
+      return sb.toString();
+   }
+   public static String format(byte[] buf)
+   {
+      return format(buf, 80);
+   }
+   public static String format(byte[] buf, int width)
+   {
+      int bs = (width - 8) / 4;
+      int i = 0;
+      StringBuffer sb = new StringBuffer();
+      do {
+         for (int j = 0; j < 6; j++) {
+            sb.append(hexchars[(i << (j*4)  & 0xF00000) >> 20]);
+         }
+         sb.append('\t');
+         sb.append(toHex(buf, i, bs));
+         sb.append(' ');
+         sb.append(toAscii(buf, i, bs));
+         sb.append('\n');
+         i += bs;
+      } while (i < buf.length);
+      return sb.toString();
+   }
+   public static void print(byte[] buf)
+   {
+      print(buf, System.err);
+   }
+   public static void print(byte[] buf, int width)
+   {
+      print(buf, width, System.err);
+   }
+   public static void print(byte[] buf, int width, PrintStream out)
+   {
+      out.print(format(buf, width));
+   }
+   public static void print(byte[] buf, PrintStream out)
+   {
+      out.print(format(buf));
+   }
+   /**
+    * Returns a string which can be written to a Java source file as part
+    * of a static initializer for a byte array. 
+    * Returns data in the format 0xAB, 0xCD, ....
+    * use like:
+    * javafile.print("byte[] data = {")
+    * javafile.print(Hexdump.toByteArray(data));
+    * javafile.println("};");
+    */
+   public static String toByteArray(byte[] buf)
+   {
+      return toByteArray(buf, 0, buf.length);
+   }
+   /**
+    * Returns a string which can be written to a Java source file as part
+    * of a static initializer for a byte array. 
+    * Returns data in the format 0xAB, 0xCD, ....
+    * use like:
+    * javafile.print("byte[] data = {")
+    * javafile.print(Hexdump.toByteArray(data));
+    * javafile.println("};");
+    */
+   public static String toByteArray(byte[] buf, int ofs, int len)
+   {
+      StringBuffer sb = new StringBuffer();
+      for (int i = ofs; i < len && i < buf.length; i++) {
+         sb.append('0');
+         sb.append('x');
+         sb.append(hexchars[(buf[i] & 0xF0) >> 4]);
+         sb.append(hexchars[buf[i] & 0x0F]);
+         if ((i+1) < len && (i+1) < buf.length)
+            sb.append(',');
+      }
+      return sb.toString();
+   }
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/unix-java.c b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/unix-java.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c49b0f45689bfbc1454efa875e53c5c50619d4e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/libmatthew-java/unix-java.c
@@ -0,0 +1,464 @@
+/*
+ * Java Unix Sockets Library
+ *
+ * Copyright (c) Matthew Johnson 2005
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ * 
+ * To Contact the author, please email src@matthew.ath.cx
+ *
+ */
+
+
+/* _GNU_SOURCE is required to use struct ucred in glibc 2.8 */
+#define _GNU_SOURCE
+
+#include "unix-java.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/un.h>
+
+#ifndef IOV_MAX
+#define IOV_MAX 1024
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void throw(JNIEnv* env, int err, const char* msg)
+{
+   jstring jmsg = (*env)->NewStringUTF(env, msg);
+   jclass exc = (*env)->FindClass(env, "cx/ath/matthew/unix/UnixIOException");
+   jmethodID cons = (*env)->GetMethodID(env, exc, "<init>", "(ILjava/lang/String;)V");
+   jobject exo = (*env)->NewObject(env, exc, cons, err, jmsg);
+   (*env)->DeleteLocalRef(env, exc);
+   (*env)->DeleteLocalRef(env, jmsg);
+   (*env)->Throw(env, exo);
+   (*env)->DeleteLocalRef(env, exo);
+}
+
+void handleerrno(JNIEnv *env)
+{
+   if (0 == errno) return;
+   int err = errno;
+   if (EAGAIN == err) return; // we read 0 bytes due to a timeout
+   const char* msg = strerror(err);
+   throw(env, err, msg);
+}
+   
+/*
+ * Class:     cx_ath_matthew_unix_UnixServerSocket
+ * Method:    native_bind
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixServerSocket_native_1bind
+  (JNIEnv *env, jobject o, jstring address, jboolean abstract)
+{
+   int sock = socket(PF_UNIX, SOCK_STREAM, 0);
+   if (-1 == sock) { handleerrno(env); return -1; }
+   const char* caddr = (*env)->GetStringUTFChars(env, address, 0);
+   int slen = (*env)->GetStringUTFLength(env, address)+1;
+   struct sockaddr_un *sad = malloc(sizeof(sa_family_t)+slen);
+   if (abstract)  {
+      char* shifted = sad->sun_path+1;
+      strncpy(shifted, caddr, slen-1);
+      sad->sun_path[0] = 0;
+   } else
+      strncpy(sad->sun_path, caddr, slen);
+   (*env)->ReleaseStringUTFChars(env, address, caddr);
+   sad->sun_family = AF_UNIX;
+   int rv = bind(sock, (const  struct  sockaddr*) sad, sizeof(sa_family_t)+slen);
+   free(sad);
+   if (-1 == rv) { handleerrno(env); return -1; }
+   rv = listen(sock, 10);
+   if (-1 == rv) { handleerrno(env); return -1; }
+   return sock;
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixServerSocket
+ * Method:    native_close
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixServerSocket_native_1close
+  (JNIEnv * env, jobject o, jint sock)
+{
+   if (0 == sock) return;
+   int rv = shutdown(sock, SHUT_RDWR);
+   if (-1 == rv) { handleerrno(env); }
+   else {
+      rv = close(sock);
+      if (-1 == rv) { handleerrno(env); }
+   }
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixServerSocket
+ * Method:    native_accept
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixServerSocket_native_1accept
+  (JNIEnv * env, jobject o, jint sock)
+{
+   int newsock = accept(sock, NULL, NULL);
+   if (-1 == newsock) handleerrno(env);
+   return newsock;
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_set_pass_cred
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1set_1pass_1cred
+  (JNIEnv *env, jobject o, jint sock, jboolean enable)
+{
+#ifdef SO_PASSCRED
+   int opt = enable;
+   int rv = setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &opt, sizeof(int));
+   if (-1 == rv) { handleerrno(env);}
+#endif
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_connect
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1connect
+  (JNIEnv *env, jobject o, jstring address, jboolean abstract)
+{
+   int sock = socket(PF_UNIX, SOCK_STREAM, 0);
+   if (-1 == sock) { handleerrno(env); return -1; }
+   const char* caddr = (*env)->GetStringUTFChars(env, address, 0);
+   int slen = (*env)->GetStringUTFLength(env, address)+1;
+   struct sockaddr_un *sad = malloc(sizeof(sa_family_t)+slen);
+   if (abstract)  {
+      char* shifted = sad->sun_path+1;
+      strncpy(shifted, caddr, slen-1);
+      sad->sun_path[0] = 0;
+   } else
+      strncpy(sad->sun_path, caddr, slen);
+   (*env)->ReleaseStringUTFChars(env, address, caddr);
+   sad->sun_family = AF_UNIX;
+   int rv = connect(sock, (const struct sockaddr*) sad, sizeof(sa_family_t)+slen);
+   free(sad);
+   if (-1 == rv) { handleerrno(env); return -1; }
+   return sock;
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_close
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1close
+  (JNIEnv *env, jobject o, jint sock)
+{
+   if (0 == sock) return;
+   int rv = shutdown(sock, SHUT_RDWR);
+   if (-1 == rv) { handleerrno(env); }
+   else {
+      rv = close(sock);
+      if (-1 == rv) { handleerrno(env); }
+   }
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_USInputStream
+ * Method:    native_recv
+ * Signature: ([BII)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_USInputStream_native_1recv
+  (JNIEnv *env, jobject o, jint sock, jbyteArray buf, jint offs, jint len, jint flags, jint timeout)
+{
+   fd_set rfds;
+   struct timeval tv;
+   jbyte* cbuf = (*env)->GetByteArrayElements(env, buf, NULL);
+   void* recvb = cbuf + offs;
+   int rv;
+
+   if (timeout > 0) {
+      FD_ZERO(&rfds);
+      FD_SET(sock, &rfds);
+      tv.tv_sec = 0;
+      tv.tv_usec = timeout;
+      rv = select(sock+1, &rfds, NULL, NULL, &tv);
+      rv = recv(sock, recvb, len, flags);
+      if (-1 == rv) { handleerrno(env); rv = -1; }
+      (*env)->ReleaseByteArrayElements(env, buf, cbuf, 0);
+      return rv;
+   } else  {
+      rv = recv(sock, recvb, len, flags);
+      (*env)->ReleaseByteArrayElements(env, buf, cbuf, 0);
+      if (-1 == rv) { handleerrno(env); return -1; }
+      return rv;
+   }
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_USOutputStream
+ * Method:    native_send
+ * Signature: (I[BII)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_USOutputStream_native_1send__I_3BII
+  (JNIEnv *env, jobject o, jint sock, jbyteArray buf, jint offs, jint len)
+{
+   jbyte* cbuf = (*env)->GetByteArrayElements(env, buf, NULL);
+   void* sendb = cbuf + offs;
+   int rv = send(sock, sendb, len, 0);
+   (*env)->ReleaseByteArrayElements(env, buf, cbuf, 0);
+   if (-1 == rv) { handleerrno(env); return -1; }
+   return rv;
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_USOutputStream
+ * Method:    native_send
+ * Signature: (I[[B)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_USOutputStream_native_1send__I_3_3B
+  (JNIEnv *env, jobject o, jint sock, jobjectArray bufs)
+{
+   size_t sblen = 1;
+   socklen_t sblen_size = sizeof(sblen);
+   getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sblen, &sblen_size);
+
+   struct msghdr msg;
+   struct iovec *iov;
+   msg.msg_name = NULL;
+   msg.msg_namelen = 0;
+   msg.msg_control = NULL;
+   msg.msg_controllen = 0;
+   msg.msg_flags = 0;
+   size_t els = (*env)->GetArrayLength(env, bufs);
+   iov = (struct iovec*) malloc((els<IOV_MAX?els:IOV_MAX) * sizeof(struct iovec));
+   msg.msg_iov = iov;
+   jbyteArray *b = (jbyteArray*) malloc(els * sizeof(jbyteArray));
+   int rv = 0;
+   
+   for (int i = 0, j = 0, s = 0; i <= els; i++, j++) {
+      if (i == els) {
+         msg.msg_iovlen = j;
+         rv = sendmsg(sock, &msg, 0);
+         for (int k = i-1, l = j-1; l >= 0; k--, l--)
+            (*env)->ReleaseByteArrayElements(env, b[k], iov[l].iov_base, 0);
+         if (-1 == rv) { handleerrno(env); return -1; }
+         break;
+      }
+      b[i] = (*env)->GetObjectArrayElement(env, bufs, i);
+      if (NULL == b[i]) {
+         msg.msg_iovlen = j;
+         rv = sendmsg(sock, &msg, 0);
+         for (int k = i-1, l = j-1; l >= 0; k--, l--)
+            (*env)->ReleaseByteArrayElements(env, b[k], iov[l].iov_base, 0);
+         if (-1 == rv) { handleerrno(env); return -1; }
+         break;
+      }
+      size_t l = (*env)->GetArrayLength(env, b[i]);
+      if (s+l > sblen || j == IOV_MAX) {
+         msg.msg_iovlen = j;
+         rv = sendmsg(sock, &msg, 0);
+         s = 0;
+         for (int k = i-1, l = j-1; l >= 0; k--, l--)
+            (*env)->ReleaseByteArrayElements(env, b[k], iov[l].iov_base, 0);
+         j = 0;
+         if (-1 == rv) { handleerrno(env); return -1; }
+      }
+      iov[j].iov_base = (*env)->GetByteArrayElements(env, b[i], NULL);
+      iov[j].iov_len = l;
+      s += l;
+   }
+   
+   free(iov);
+   free(b);
+   return rv;
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_getPID
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1getPID
+  (JNIEnv * env, jobject o, jint sock)
+{
+#ifdef SO_PEERCRED
+   struct ucred cr;
+   socklen_t cl=sizeof(cr);
+
+   if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cr, &cl)==0) 
+      return cr.pid;
+   else
+      return -1;
+#else
+   return -1;
+#endif
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_getUID
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1getUID
+  (JNIEnv * env, jobject o, jint sock)
+{
+#ifdef SO_PEERCRED
+   struct ucred cr;
+   socklen_t cl=sizeof(cr);
+
+   if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cr, &cl)==0) 
+      return cr.uid;
+   else
+      return -1;
+#else
+   return -1;
+#endif
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_getGID
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1getGID
+  (JNIEnv * env, jobject o, jint sock)
+{
+#ifdef SO_PEERCRED
+   struct ucred cr;
+   socklen_t cl=sizeof(cr);
+
+   if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cr, &cl)==0) 
+      return cr.gid;
+   else
+      return -1;
+#else
+   return -1;
+#endif
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_send_creds
+ * Signature: (B)V
+ */
+JNIEXPORT void JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1send_1creds
+  (JNIEnv * env, jobject o, jint sock, jbyte data)
+{
+   struct msghdr msg;
+   struct iovec iov;
+   msg.msg_name = NULL;
+   msg.msg_namelen = 0;
+   msg.msg_flags = 0;
+   msg.msg_iov = &iov;
+   msg.msg_iovlen = 1;
+   msg.msg_control = NULL;
+   msg.msg_controllen = 0;
+   iov.iov_base = &data;
+   iov.iov_len = 1;
+
+#ifdef SCM_CREDENTIALS
+   char buf[CMSG_SPACE(sizeof(struct ucred))];
+   msg.msg_control = buf;
+   msg.msg_controllen = sizeof buf;
+   struct cmsghdr *cmsg;
+   struct ucred *creds;
+
+   cmsg = CMSG_FIRSTHDR(&msg);
+   cmsg->cmsg_level = SOL_SOCKET;
+   cmsg->cmsg_type = SCM_CREDENTIALS;
+   cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
+   /* Initialize the payload: */
+   creds = (struct ucred *)CMSG_DATA(cmsg);
+   creds->pid = getpid();
+   creds->uid = getuid();
+   creds->gid = getgid();
+#endif
+
+   int rv = sendmsg(sock, &msg, 0);
+   if (-1 == rv) { handleerrno(env); }
+}
+
+/*
+ * Class:     cx_ath_matthew_unix_UnixSocket
+ * Method:    native_recv_creds
+ * Signature: ([I)B
+ */
+JNIEXPORT jbyte JNICALL Java_cx_ath_matthew_unix_UnixSocket_native_1recv_1creds
+  (JNIEnv *env, jobject o, jint sock, jintArray jcreds)
+{
+   struct msghdr msg;
+   char iov_buf = 0;
+   struct iovec iov;
+   msg.msg_name = NULL;
+   msg.msg_namelen = 0;
+   msg.msg_flags = 0;
+   msg.msg_iov = &iov;
+   msg.msg_iovlen = 1;
+   msg.msg_control = NULL;
+   msg.msg_controllen = 0;
+   iov.iov_base = &iov_buf;
+   iov.iov_len = 1;
+
+#ifdef SCM_CREDENTIALS
+   char buf[CMSG_SPACE(sizeof(struct ucred))];
+   msg.msg_control = buf;
+   msg.msg_controllen = sizeof buf;
+   struct cmsghdr *cmsg;
+   struct ucred *creds = NULL;
+#endif
+
+   recvmsg(sock, &msg, 0);
+
+#ifdef SCM_CREDENTIALS
+   for (cmsg = CMSG_FIRSTHDR(&msg);
+         cmsg != NULL;
+         cmsg = CMSG_NXTHDR(&msg,cmsg)) {
+      if (cmsg->cmsg_level == SOL_SOCKET
+            && cmsg->cmsg_type == SCM_CREDENTIALS) {
+         creds = (struct ucred *) CMSG_DATA(cmsg);        
+         break;
+      }
+   }
+   if (NULL != creds) {
+      jint cred_array[3];
+      cred_array[0] = creds->pid;
+      cred_array[1] = creds->uid;
+      cred_array[2] = creds->gid;
+      (*env)->SetIntArrayRegion(env, jcreds, 0, 3, &cred_array[0]);
+   }
+#endif
+
+   return iov_buf;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/LinuxUdev.c b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/LinuxUdev.c
new file mode 100644
index 0000000000000000000000000000000000000000..a1ed2256584b95d74e435dfe7676c2bb7f171b38
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/LinuxUdev.c
@@ -0,0 +1,292 @@
+#include "LinuxUdev.h"
+
+JNIEXPORT jobject JNICALL Java_org_eclipse_kura_linux_usb_LinuxUdevNative_getUsbDevices(JNIEnv *env, jclass LinuxUdevNative, jstring deviceClass) {
+	struct udev *udev;
+	struct udev_enumerate *enumerate;
+	struct udev_list_entry *devices, *dev_list_entry;
+	struct udev_device *dev;
+
+	const char *nativeDeviceClass = (*env)->GetStringUTFChars(env, deviceClass, 0);
+	jclass UsbDeviceClass;
+	jmethodID UsbDeviceConstructor;
+	jobject UsbDeviceObject;
+
+	//specifics for BLOCK devices
+	jstring blockDeviceNode;
+
+	//specifics for NET devices
+	jstring interfaceName;
+
+	//specifics for TTY devices
+	jstring ttyDeviceNode;
+
+	//initialize the ArrayList for the return
+	jclass arrayClass = (*env)->FindClass(env, "java/util/ArrayList");
+	if (arrayClass == NULL) return NULL;
+	jmethodID mid_init =  (*env)->GetMethodID(env, arrayClass, "<init>", "()V");
+	if (mid_init == NULL) return NULL;
+	jobject objArr = (*env)->NewObject(env, arrayClass, mid_init);
+	if (objArr == NULL) return NULL;
+	jmethodID mid_add = (*env)->GetMethodID(env, arrayClass, "add", "(Ljava/lang/Object;)Z");
+	if (mid_add == NULL) return NULL;
+
+	//set up our specific device type constructor
+	if(strcmp(nativeDeviceClass,"block")==0) {
+		UsbDeviceClass = (*env)->FindClass(env, "org/eclipse/kura/usb/UsbBlockDevice");
+		UsbDeviceConstructor = (*env)->GetMethodID(env, UsbDeviceClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+	} else if(strcmp(nativeDeviceClass,"net")==0) {
+		UsbDeviceClass = (*env)->FindClass(env, "org/eclipse/kura/usb/UsbNetDevice");
+		UsbDeviceConstructor = (*env)->GetMethodID(env, UsbDeviceClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+	} else if(strcmp(nativeDeviceClass,"tty")==0) {
+		UsbDeviceClass = (*env)->FindClass(env, "org/eclipse/kura/usb/UsbTtyDevice");
+		UsbDeviceConstructor = (*env)->GetMethodID(env, UsbDeviceClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+	}
+
+	/* Create the udev object */
+	udev = udev_new();
+	if (!udev) {
+		printf("Can't create udev\n");
+		exit(1);
+	}
+
+	/* Create a list of the devices in the '/sys/class/' subsystem. */
+	enumerate = udev_enumerate_new(udev);
+	udev_enumerate_add_match_subsystem(enumerate, nativeDeviceClass);
+
+	udev_enumerate_scan_devices(enumerate);
+	devices = udev_enumerate_get_list_entry(enumerate);
+
+	//loop through what we've found
+	udev_list_entry_foreach(dev_list_entry, devices) {
+		const char *path;
+
+		/* Get the filename of the /sys entry for the device
+		   and create a udev_device object (dev) representing it */
+		path = udev_list_entry_get_name(dev_list_entry);
+		dev = udev_device_new_from_syspath(udev, path);
+
+		/* usb_device_get_devnode() returns the path to the device node
+		   itself in /dev - save this for TTY devices */
+		//printf("Device Node Path: %s\n", udev_device_get_devnode(dev));
+		if(strcmp(nativeDeviceClass,"block")==0) {
+			blockDeviceNode = (*env)->NewStringUTF(env, udev_device_get_devnode(dev));
+		} else if(strcmp(nativeDeviceClass,"net")==0) {
+			interfaceName = (*env)->NewStringUTF(env, udev_device_get_sysname(dev));
+		} else if(strcmp(nativeDeviceClass,"tty")==0) {
+			ttyDeviceNode = (*env)->NewStringUTF(env, udev_device_get_devnode(dev));
+		}
+
+		/* The device pointed to by dev contains information about
+		   the /sys/class/ device. In order to get information about the
+		   USB device, get the parent device with the
+		   subsystem/devtype pair of "usb"/"usb_device". This will
+		   be several levels up the tree, but the function will find
+		   it.*/
+		dev = udev_device_get_parent_with_subsystem_devtype(
+		       dev,
+		       "usb",
+		       "usb_device");
+		if (dev) {
+			if(strcmp(nativeDeviceClass,"block")==0) {
+				UsbDeviceObject = (*env)->NewObject(env, UsbDeviceClass, UsbDeviceConstructor,
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idVendor")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idProduct")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "manufacturer")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "product")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "busnum")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "devpath")),
+										blockDeviceNode);
+			} else if(strcmp(nativeDeviceClass,"net")==0) {
+				UsbDeviceObject = (*env)->NewObject(env, UsbDeviceClass, UsbDeviceConstructor,
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idVendor")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idProduct")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "manufacturer")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "product")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "busnum")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "devpath")),
+										interfaceName);
+			} else if(strcmp(nativeDeviceClass,"tty")==0) {
+				UsbDeviceObject = (*env)->NewObject(env, UsbDeviceClass, UsbDeviceConstructor,
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idVendor")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idProduct")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "manufacturer")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "product")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "busnum")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "devpath")),
+										ttyDeviceNode);
+			}
+
+			//add it to the ArrayList
+			jboolean jbool = (*env)->CallBooleanMethod(env, objArr, mid_add, UsbDeviceObject);
+			if (jbool == NULL) return NULL;
+
+			udev_device_unref(dev);
+		}
+	}
+	/* Free the enumerator object */
+	udev_enumerate_unref(enumerate);
+
+	udev_unref(udev);
+
+	//release the nativeDeviceClass
+	(*env)->ReleaseStringUTFChars(env, deviceClass, nativeDeviceClass);
+
+	return objArr;
+}
+
+JNIEXPORT void JNICALL Java_org_eclipse_kura_linux_usb_LinuxUdevNative_nativeHotplugThread(JNIEnv *env, jclass LinuxUdevNative, jobject linuxUdevNative) {
+
+	jclass UsbDeviceClass;
+	jmethodID UsbDeviceConstructor;
+	jobject UsbDeviceObject;
+
+	//event type enum for return
+	jstring eventType;
+
+	//specifics for BLOCK devices
+	jstring blockDeviceNode;
+
+	//specifics for NET devices
+	jstring interfaceName;
+
+	//specifics for TTY devices
+	jstring ttyDeviceNode;
+
+	struct udev *udev;
+
+	/* Create the udev object */
+	udev = udev_new();
+	if (!udev) {
+		printf("Can't create udev\n");
+		return;
+	}
+
+	/* Set up a monitor to monitor selected USB devices */
+	struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev");
+	udev_monitor_filter_add_match_subsystem_devtype(mon, "block", NULL);
+	udev_monitor_filter_add_match_subsystem_devtype(mon, "net", NULL);
+	udev_monitor_filter_add_match_subsystem_devtype(mon, "tty", NULL);
+	udev_monitor_enable_receiving(mon);
+	/* Get the file descriptor (fd) for the monitor.
+	   This fd will get passed to select() */
+	int fd = udev_monitor_get_fd(mon);
+
+	/* This section will run continuously, calling usleep() at
+	   the end of each pass. This is to demonstrate how to use
+	   a udev_monitor in a non-blocking way. */
+	while (1) {
+		/* Set up the call to select(). In this case, select() will
+		   only operate on a single file descriptor, the one
+		   associated with our udev_monitor. Note that the timeval
+		   object is set to 0, which will cause select() to not
+		   block. */
+		fd_set fds;
+		struct timeval tv;
+		int ret;
+
+		FD_ZERO(&fds);
+		FD_SET(fd, &fds);
+		tv.tv_sec = 0;
+		tv.tv_usec = 0;
+
+		ret = select(fd+1, &fds, NULL, NULL, &tv);
+
+		/* Check if our file descriptor has received data. */
+		if (ret > 0 && FD_ISSET(fd, &fds)) {
+			//printf("\nselect() says there should be data\n");
+
+			/* Make the call to receive the device.
+			   select() ensured that this will not block. */
+			struct udev_device *dev = udev_monitor_receive_device(mon);
+			if (dev) {
+				char *subsystem = udev_device_get_subsystem(dev);
+
+				if(strcmp(subsystem,"block")==0) {
+					blockDeviceNode = (*env)->NewStringUTF(env, udev_device_get_devnode(dev));
+				} else if(strcmp(subsystem,"net")==0) {
+					interfaceName = (*env)->NewStringUTF(env, udev_device_get_sysname(dev));
+				} else if(strcmp(subsystem,"tty")==0) {
+					ttyDeviceNode = (*env)->NewStringUTF(env, udev_device_get_devnode(dev));
+				}
+
+/*
+				printf("Got Device\n");
+				printf("   Node: %s\n", udev_device_get_devnode(dev));
+				printf("   Subsystem: %s\n", udev_device_get_subsystem(dev));
+				printf("   Devtype: %s\n", udev_device_get_devtype(dev));
+
+				printf("   Action: %s\n",udev_device_get_action(dev));
+*/
+
+				//get the event type
+				char *action = udev_device_get_action(dev);
+				if(strcmp("add",action)==0) {
+					eventType = (*env)->NewStringUTF(env, "ATTACHED");
+				} else if(strcmp("remove",action)==0) {
+					eventType = (*env)->NewStringUTF(env, "DETACHED");
+				}
+
+				dev = udev_device_get_parent_with_subsystem_devtype(
+						       dev,
+						       "usb",
+						       "usb_device");
+				if (dev) {
+					if(strcmp(subsystem,"block")==0) {
+						UsbDeviceClass = (*env)->FindClass(env, "org/eclipse/kura/usb/UsbBlockDevice");
+						UsbDeviceConstructor = (*env)->GetMethodID(env, UsbDeviceClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+
+						UsbDeviceObject = (*env)->NewObject(env, UsbDeviceClass, UsbDeviceConstructor,
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idVendor")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idProduct")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "manufacturer")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "product")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "busnum")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "devpath")),
+										blockDeviceNode);
+
+						jmethodID LinuxUdevNativeCallback = (*env)->GetMethodID(env, LinuxUdevNative, "callback", "(Ljava/lang/String;Lorg/eclipse/kura/usb/UsbDevice;)V");
+						(*env)->CallVoidMethod(env, linuxUdevNative, LinuxUdevNativeCallback, eventType, UsbDeviceObject);
+					} else if(strcmp(subsystem,"net")==0) {
+						UsbDeviceClass = (*env)->FindClass(env, "org/eclipse/kura/usb/UsbNetDevice");
+						UsbDeviceConstructor = (*env)->GetMethodID(env, UsbDeviceClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+
+						UsbDeviceObject = (*env)->NewObject(env, UsbDeviceClass, UsbDeviceConstructor,
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idVendor")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idProduct")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "manufacturer")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "product")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "busnum")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "devpath")),
+										interfaceName);
+
+						jmethodID LinuxUdevNativeCallback = (*env)->GetMethodID(env, LinuxUdevNative, "callback", "(Ljava/lang/String;Lorg/eclipse/kura/usb/UsbDevice;)V");
+						(*env)->CallVoidMethod(env, linuxUdevNative, LinuxUdevNativeCallback, eventType, UsbDeviceObject);
+					} else if(strcmp(subsystem,"tty")==0) {
+						UsbDeviceClass = (*env)->FindClass(env, "org/eclipse/kura/usb/UsbTtyDevice");
+						UsbDeviceConstructor = (*env)->GetMethodID(env, UsbDeviceClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+
+						UsbDeviceObject = (*env)->NewObject(env, UsbDeviceClass, UsbDeviceConstructor,
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idVendor")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "idProduct")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "manufacturer")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "product")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "busnum")),
+										(*env)->NewStringUTF(env, udev_device_get_sysattr_value(dev, "devpath")),
+										ttyDeviceNode);
+
+						jmethodID LinuxUdevNativeCallback = (*env)->GetMethodID(env, LinuxUdevNative, "callback", "(Ljava/lang/String;Lorg/eclipse/kura/usb/UsbDevice;)V");
+						(*env)->CallVoidMethod(env, linuxUdevNative, LinuxUdevNativeCallback, eventType, UsbDeviceObject);
+					}
+
+					udev_device_unref(dev);
+				}
+			}
+			else {
+				printf("No Device from receive_device(). An error occured.\n");
+			}
+		}
+		usleep(250*1000);
+		//printf(".");
+		fflush(stdout);
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/LinuxUdev.h b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/LinuxUdev.h
new file mode 100644
index 0000000000000000000000000000000000000000..2ce6e0134da3fb606dca61ad313273d028f5ccf0
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/LinuxUdev.h
@@ -0,0 +1,9 @@
+#include "org_eclipse_kura_linux_usb_LinuxUdevNative.h"
+
+#include <libudev.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <unistd.h>
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..a2eabfd9b73084650efd9e5f39d61880b0277abb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile
@@ -0,0 +1,50 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Ext Java Usb
+#
+# Dan Streetman
+#
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	LinuxUdev.o
+HEADER = org_eclipse_kura_linux_usb_LinuxUdevNative.h
+
+CC = gcc
+CCLD = $(CC)
+
+#INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux $(CINCLUDES)
+INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I../java_home/include/ $(CINCLUDES)
+
+CFLAGS = -Wall -fPIC $(JUSB_FLAGS)
+SOFLAGS = -shared
+
+COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
+LINK = $(CCLD) $(CFLAGS) -ludev -o $@
+
+# This is the final shared library
+all: libEurotechLinuxUdev.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(COMPILE) -c $<
+
+# Build the shared library
+libEurotechLinuxUdev.so: $(OBJECTS)
+	@[ -n "${JAVA_HOME}" ] || (echo "";echo "*** Please set your JAVA_HOME variable (I need the JNI headers!) ***";echo "";exit 1)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libEurotechLinuxUdev.so
+	$(LINK) $(SOFLAGS) $(OBJECTS) -ludev
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libEurotechLinuxUdev.so $(OBJECTS) *.o *.so
+#	rm -f libEurotechLinuxUdev.so $(OBJECTS) $(HEADER) *.o *.so
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.arm_sf b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.arm_sf
new file mode 100644
index 0000000000000000000000000000000000000000..4118749f7c501d6ac9cab41fa2fd496e1d908284
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.arm_sf
@@ -0,0 +1,49 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Ext Java Usb
+#
+# Dan Streetman
+#
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	LinuxUdev.o
+HEADER = org_eclipse_kura_linux_usb_LinuxUdevNative.h
+
+#CC = gcc
+CCLD = $(CC)
+
+INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux $(CINCLUDES)
+
+CFLAGS += -msoft-float -Wall -fPIC $(JUSB_FLAGS)
+SOFLAGS = -shared
+
+COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
+LINK = $(CCLD) $(CFLAGS) -ludev -o $@
+
+# This is the final shared library
+all: libEurotechLinuxUdev.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(COMPILE) -c $<
+
+# Build the shared library
+libEurotechLinuxUdev.so: $(OBJECTS)
+	@[ -n "${JAVA_HOME}" ] || (echo "";echo "*** Please set your JAVA_HOME variable (I need the JNI headers!) ***";echo "";exit 1)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libEurotechLinuxUdev.so
+	$(LINK) $(SOFLAGS) $(OBJECTS) -ludev
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libEurotechLinuxUdev.so $(OBJECTS) *.o *.so
+#	rm -f libEurotechLinuxUdev.so $(OBJECTS) $(HEADER) *.o *.so
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.i586 b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.i586
new file mode 100644
index 0000000000000000000000000000000000000000..5668ff8b781cde4da978c64c3c6b16fd6f46ec09
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.i586
@@ -0,0 +1,49 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Ext Java Usb
+#
+# Dan Streetman
+#
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	LinuxUdev.o
+HEADER = org_eclipse_kura_linux_usb_LinuxUdevNative.h
+
+#CC = gcc
+CCLD = $(CC)
+
+INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux $(CINCLUDES)
+
+CFLAGS += -Wall -fPIC $(JUSB_FLAGS)
+SOFLAGS = -shared
+
+COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
+LINK = $(CCLD) $(CFLAGS) -ludev -o $@
+
+# This is the final shared library
+all: libEurotechLinuxUdev.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(COMPILE) -c $<
+
+# Build the shared library
+libEurotechLinuxUdev.so: $(OBJECTS)
+	@[ -n "${JAVA_HOME}" ] || (echo "";echo "*** Please set your JAVA_HOME variable (I need the JNI headers!) ***";echo "";exit 1)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libEurotechLinuxUdev.so
+	$(LINK) $(SOFLAGS) $(OBJECTS) -ludev
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libEurotechLinuxUdev.so $(OBJECTS) *.o *.so
+#	rm -f libEurotechLinuxUdev.so $(OBJECTS) $(HEADER) *.o *.so
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.x86_64 b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.x86_64
new file mode 100644
index 0000000000000000000000000000000000000000..5668ff8b781cde4da978c64c3c6b16fd6f46ec09
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/Makefile.poky.x86_64
@@ -0,0 +1,49 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Ext Java Usb
+#
+# Dan Streetman
+#
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	LinuxUdev.o
+HEADER = org_eclipse_kura_linux_usb_LinuxUdevNative.h
+
+#CC = gcc
+CCLD = $(CC)
+
+INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux $(CINCLUDES)
+
+CFLAGS += -Wall -fPIC $(JUSB_FLAGS)
+SOFLAGS = -shared
+
+COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
+LINK = $(CCLD) $(CFLAGS) -ludev -o $@
+
+# This is the final shared library
+all: libEurotechLinuxUdev.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(COMPILE) -c $<
+
+# Build the shared library
+libEurotechLinuxUdev.so: $(OBJECTS)
+	@[ -n "${JAVA_HOME}" ] || (echo "";echo "*** Please set your JAVA_HOME variable (I need the JNI headers!) ***";echo "";exit 1)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libEurotechLinuxUdev.so
+	$(LINK) $(SOFLAGS) $(OBJECTS) -ludev
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libEurotechLinuxUdev.so $(OBJECTS) *.o *.so
+#	rm -f libEurotechLinuxUdev.so $(OBJECTS) $(HEADER) *.o *.so
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/c/udev/org_eclipse_kura_linux_usb_LinuxUdevNative.h b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/org_eclipse_kura_linux_usb_LinuxUdevNative.h
new file mode 100644
index 0000000000000000000000000000000000000000..7b6a198e4ac95c9e94552f0a3277699d36f6c0bb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/c/udev/org_eclipse_kura_linux_usb_LinuxUdevNative.h
@@ -0,0 +1,29 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_eclipse_kura_linux_usb_LinuxUdevNative */
+
+#ifndef _Included_org_eclipse_kura_linux_usb_LinuxUdevNative
+#define _Included_org_eclipse_kura_linux_usb_LinuxUdevNative
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_eclipse_kura_linux_usb_LinuxUdevNative
+ * Method:    nativeHotplugThread
+ * Signature: (Lorg/eclipse/kura/linux/usb/LinuxUdevNative;)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_kura_linux_usb_LinuxUdevNative_nativeHotplugThread
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     org_eclipse_kura_linux_usb_LinuxUdevNative
+ * Method:    getUsbDevices
+ * Signature: (Ljava/lang/String;)Ljava/util/ArrayList;
+ */
+JNIEXPORT jobject JNICALL Java_org_eclipse_kura_linux_usb_LinuxUdevNative_getUsbDevices
+  (JNIEnv *, jclass, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/JavaxUsb.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/JavaxUsb.java
new file mode 100644
index 0000000000000000000000000000000000000000..b272a3c3233aa8ab1b4b60ba73870af0c7611d6c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/JavaxUsb.java
@@ -0,0 +1,366 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+import javax.usb.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * Interface to/from JNI.
+ * @author Dan Streetman
+ */
+class JavaxUsb
+{
+	//*************************************************************************
+	// Public methods
+
+	/** Load native library */
+	public static void loadLibrary() throws UsbException
+	{
+		try { System.loadLibrary( LIBRARY_NAME ); }
+		catch ( Exception e ) { throw new UsbException( EXCEPTION_WHILE_LOADING_SHARED_LIBRARY + " " + System.mapLibraryName( LIBRARY_NAME ) + " : " + e.getMessage() ); }
+		catch ( Error e ) { throw new UsbException( ERROR_WHILE_LOADING_SHARED_LIBRARY + " " + System.mapLibraryName( LIBRARY_NAME ) + " : " + e.getMessage() ); }
+	}
+
+	/**
+	 * Convert the error code to a UsbException.
+	 * @param error The error code.
+	 * @return A UsbException.
+	 */
+	public static UsbException errorToUsbException(int error) { return errorToUsbException(error, ""); }
+
+	/**
+	 * Convert the error code to a UsbException using the specified text.
+	 * <p>
+	 * The string is prepended to the detail message with a colon separating
+	 * the specified text from the error message.
+	 * @param error The error code.
+	 * @param string The string to use in the UsbException.
+	 * @return A UsbException.
+	 */
+	public static UsbException errorToUsbException(int error, String string)
+	{
+		error = Math.abs(error);
+
+		if (0 < string.length())
+			string += " : ";
+
+		switch (error) {
+		case 32:
+			return new UsbStallException(string + "UsbStallException");
+		case 71:
+			return new UsbBitStuffException(string + "UsbBitStuffException");
+		case 75:
+			return new UsbBabbleException(string + "UsbBabbleException");
+		case 84:
+			return new UsbCRCException(string + "UsbCRCException");
+		case 121:
+			return new UsbShortPacketException(string + "UsbShortPacketException");
+		default:
+			return new UsbPlatformException(string + nativeGetErrorMessage(error));
+		}
+	}
+
+	//*************************************************************************
+	// Native methods
+
+		//*********************************
+		// Tracing/Logging methods
+
+	/**
+	 * Enable (or disable) tracing.
+	 * @param enable If tracing of data should be enabled.
+	 */
+	static native void nativeSetTracing(boolean enable);
+
+	/**
+	 * Enable (or disable) tracing of a certain type of data.
+	 * @param enable If tracing of data should be enabled.
+	 * @param type The type of data.
+	 */
+	static native void nativeSetTraceType(boolean enable, String type);
+
+	/**
+	 * Set the level of tracing.
+	 * @param level The level of tracing.
+	 */
+	static native void nativeSetTraceLevel(int level);
+
+	/**
+	 * Set the trace output.
+	 * @param output Where to output; 1=stdout, 2=stderr, 3=file.
+	 * @param filename The filename (ignored if output != 3).
+	 */
+	static native void nativeSetTraceOutput(int output, String filename);
+
+		//*********************************
+		// JavaxUsbTopologyUpdater methods
+
+	/**
+	 * Call the native function that updates the topology.
+	 * @param services The LinuxUsbServices instance.
+	 * @param list The List to fill with newly connected devices.
+	 * @param list The List of currently connected devices, which still connected devices will be removed from.
+	 * @return The error number if one occurred.
+	 */
+	static native int nativeTopologyUpdater( LinuxUsbServices services, List connected, List disconnected );
+
+	/**
+	 * Get the current active configuration number.
+	 * @param device The LinuxDeviceOsImp.
+	 * @return The active configuration number.
+	 */
+	static native int nativeGetActiveConfigurationNumber( LinuxDeviceOsImp device );
+
+	/**
+	 * Get the current active interface setting for the specified interface.
+	 * @param device The LinuxDeviceOsImp.
+	 * @param interfaceNumber The interface number to check.
+	 * @return The active interface number.
+	 */
+	static native int nativeGetActiveInterfaceSettingNumber( LinuxDeviceOsImp device, int interfaceNumber );
+
+		//*********************************
+		// JavaxUsbTopologyListener methods
+
+	/**
+	 * Call the native function that listens for topology changes
+	 * @param services The LinuxUsbServices instance.
+	 * @return The error that caused the listener to exit.
+	 */
+	static native int nativeTopologyListener( LinuxUsbServices services );
+
+		//*********************************
+		// JavaxUsbDeviceProxy methods
+
+	/**
+	 * Start a LinuxDeviceProxy
+	 * @param io A LinuxInterfaceIO object
+	 */
+	static native void nativeDeviceProxy( LinuxDeviceProxy proxy );
+
+		//*********************************
+		// JavaxUsbError methods
+
+	/**
+	 * @param error the error number
+	 * @return the message associated with the specified error number
+	 */
+	static private native String nativeGetErrorMessage( int error );
+
+	//*************************************************************************
+	// Creation methods
+
+	/** @return A new UsbHubImp with max ports */
+	private static UsbHubImp createUsbHubImp( String key, int maxPorts )
+	{
+		UsbHubImp hub = new UsbHubImp( maxPorts, null, null );
+
+		LinuxDeviceOsImp linuxDeviceOsImp = new LinuxDeviceOsImp( hub, new LinuxDeviceProxy(key) );
+		hub.setUsbDeviceOsImp( linuxDeviceOsImp );
+
+		return hub;
+	}
+
+	/** @return A new UsbDeviceImp */
+	private static UsbDeviceImp createUsbDeviceImp( String key )
+	{
+		UsbDeviceImp device = new UsbDeviceImp( null, null );
+
+		LinuxDeviceOsImp linuxDeviceOsImp = new LinuxDeviceOsImp( device, new LinuxDeviceProxy(key) );
+		device.setUsbDeviceOsImp( linuxDeviceOsImp );
+
+		return device;
+	}
+
+	/** @return A new UsbConfigurationImp */
+	private static UsbConfigurationImp createUsbConfigurationImp( UsbDeviceImp device,
+		byte length, byte type, short totalLen,
+		byte numInterfaces, byte configValue, byte configIndex, byte attributes,
+		byte maxPowerNeeded )
+	{
+		/* BUG - Java (IBM JVM at least) does not handle certain JNI byte -> Java byte (or shorts) */
+		/* Email ddstreet@ieee.org for more info */
+		length += 0;
+		type += 0;
+		numInterfaces += 0;
+		configValue += 0;
+		configIndex += 0;
+		attributes += 0;
+		maxPowerNeeded += 0;
+
+		UsbConfigurationDescriptorImp desc = new UsbConfigurationDescriptorImp( length, type, totalLen,
+			numInterfaces, configValue, configIndex, attributes, maxPowerNeeded );
+
+		UsbConfigurationImp config = new UsbConfigurationImp( device, desc );
+
+		return config;
+	}
+
+	/** @return A new UsbInterfaceImp */
+	private static UsbInterfaceImp createUsbInterfaceImp( UsbConfigurationImp config,
+		byte length, byte type,
+		byte interfaceNumber, byte alternateNumber, byte numEndpoints,
+		byte interfaceClass, byte interfaceSubClass, byte interfaceProtocol, byte interfaceIndex )
+	{
+		/* BUG - Java (IBM JVM at least) does not handle certain JNI byte -> Java byte (or shorts) */
+		/* Email ddstreet@ieee.org for more info */
+		length += 0;
+		type += 0;
+		interfaceNumber += 0;
+		alternateNumber += 0;
+		numEndpoints += 0;
+		interfaceClass += 0;
+		interfaceSubClass += 0;
+		interfaceProtocol += 0;
+		interfaceIndex += 0;
+
+		UsbInterfaceDescriptorImp desc = new UsbInterfaceDescriptorImp( length, type,
+			interfaceNumber, alternateNumber, numEndpoints, interfaceClass, interfaceSubClass,
+			interfaceProtocol, interfaceIndex );
+
+		UsbInterfaceImp iface = new UsbInterfaceImp( config, desc );
+
+		LinuxDeviceOsImp linuxDeviceOsImp = (LinuxDeviceOsImp)iface.getUsbConfigurationImp().getUsbDeviceImp().getUsbDeviceOsImp();
+		LinuxInterfaceOsImp linuxInterfaceOsImp = new LinuxInterfaceOsImp( iface, linuxDeviceOsImp );
+		iface.setUsbInterfaceOsImp( linuxInterfaceOsImp );
+
+		return iface;
+	}
+
+	/** @return A new UsbEndpointImp */
+	private static UsbEndpointImp createUsbEndpointImp( UsbInterfaceImp iface,
+		byte length, byte type,
+		byte endpointAddress, byte attributes, byte interval, short maxPacketSize )
+	{
+		/* BUG - Java (IBM JVM at least) does not handle certain JNI byte -> Java byte (or shorts) */
+		/* Email ddstreet@ieee.org for more info */
+		length += 0;
+		type += 0;
+		endpointAddress += 0;
+		attributes += 0;
+		interval += 0;
+		maxPacketSize += 0;
+
+		UsbEndpointDescriptorImp desc = new UsbEndpointDescriptorImp( length, type,
+			endpointAddress, attributes, interval, maxPacketSize );
+
+		UsbEndpointImp ep = new UsbEndpointImp( iface, desc );
+		UsbPipeImp pipe = null;
+
+		LinuxInterfaceOsImp linuxInterfaceOsImp = (LinuxInterfaceOsImp)iface.getUsbInterfaceOsImp();
+		switch (ep.getType()) {
+		case UsbConst.ENDPOINT_TYPE_CONTROL:
+			pipe = new UsbControlPipeImp( ep, null );
+			pipe.setUsbPipeOsImp( new LinuxControlPipeImp( (UsbControlPipeImp)pipe, linuxInterfaceOsImp ) );
+			break;
+		case UsbConst.ENDPOINT_TYPE_BULK:
+			pipe = new UsbPipeImp( ep, null );
+			pipe.setUsbPipeOsImp( new LinuxPipeOsImp( pipe, linuxInterfaceOsImp ) );
+			break;
+		case UsbConst.ENDPOINT_TYPE_INTERRUPT:
+			pipe = new UsbPipeImp( ep, null );
+			pipe.setUsbPipeOsImp( new LinuxPipeOsImp( pipe, linuxInterfaceOsImp ) );
+			break;
+		case UsbConst.ENDPOINT_TYPE_ISOCHRONOUS:
+			pipe = new UsbPipeImp( ep, null );
+			pipe.setUsbPipeOsImp( new LinuxIsochronousPipeImp( pipe, linuxInterfaceOsImp ) );
+			break;
+		default:
+//FIXME - log?
+			throw new RuntimeException("Invalid UsbEndpoint type " + ep.getType());
+		}
+
+		return ep;
+	}
+
+	//*************************************************************************
+	// Setup methods
+
+	private static void configureUsbDeviceImp( UsbDeviceImp targetDevice,
+		byte length, byte type,
+		byte deviceClass, byte deviceSubClass, byte deviceProtocol, byte maxDefaultEndpointSize,
+		byte manufacturerIndex, byte productIndex, byte serialNumberIndex, byte numConfigs, short vendorId,
+		short productId, short bcdDevice, short bcdUsb, int speed )
+	{
+		/* BUG - Java (IBM JVM at least) does not handle certain JNI byte -> Java byte (or shorts) */
+		/* Email ddstreet@ieee.org for more info */
+		length += 0;
+		type += 0;
+		deviceClass += 0;
+		deviceSubClass += 0;
+		deviceProtocol += 0;
+		maxDefaultEndpointSize += 0;
+		manufacturerIndex += 0;
+		productIndex += 0;
+		serialNumberIndex += 0;
+		numConfigs += 0;
+		vendorId += 0;
+		productId += 0;
+		bcdDevice += 0;
+		bcdUsb += 0;
+
+		UsbDeviceDescriptorImp desc = new UsbDeviceDescriptorImp( length, type,
+			bcdUsb, deviceClass, deviceSubClass, deviceProtocol, maxDefaultEndpointSize, vendorId, productId,
+			bcdDevice, manufacturerIndex, productIndex, serialNumberIndex, numConfigs );
+
+		targetDevice.setUsbDeviceDescriptor(desc);
+
+		switch (speed) {
+		case SPEED_LOW:
+			targetDevice.setSpeed(UsbConst.DEVICE_SPEED_LOW);
+			break;
+		case SPEED_FULL:
+			targetDevice.setSpeed(UsbConst.DEVICE_SPEED_FULL);
+			break;
+		case SPEED_UNKNOWN:
+			targetDevice.setSpeed(UsbConst.DEVICE_SPEED_UNKNOWN);
+			break;
+		default:
+			/* log */
+			targetDevice.setSpeed(UsbConst.DEVICE_SPEED_UNKNOWN);
+			break;
+		}
+	}
+
+	//*************************************************************************
+	// Class variables
+
+	private static Hashtable msgLevelTable = new Hashtable();
+
+	//*************************************************************************
+	// Class constants
+
+	public static final String LIBRARY_NAME = "JavaxUsb";
+
+    public static final String ERROR_WHILE_LOADING_SHARED_LIBRARY = "Error while loading shared library";
+    public static final String EXCEPTION_WHILE_LOADING_SHARED_LIBRARY = "Exception while loading shared library";
+
+	private static final int SPEED_UNKNOWN = 0;
+	private static final int SPEED_LOW = 1;
+	private static final int SPEED_FULL = 2;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxControlPipeImp.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxControlPipeImp.java
new file mode 100644
index 0000000000000000000000000000000000000000..9041663cf0db07691610d19d970a0e1fedb89016
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxControlPipeImp.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+
+/**
+ * Control parameters to pass to native code
+ * <p>
+ * This must be set up before use.  See {@link com.ibm.jusb.os.linux.LinuxPipeOsImp LinuxPipeOsImp} for details.
+ * @author Dan Streetman
+ */
+class LinuxControlPipeImp extends LinuxPipeOsImp
+{
+	/** Constructor */
+	public LinuxControlPipeImp( UsbPipeImp pipe, LinuxInterfaceOsImp iface ) { super(pipe,iface); }
+
+	/**
+	 * Create a LinuxPipeRequest to wrap a UsbIrpImp.
+	 * @param usbIrpImp The UsbIrpImp.
+	 * @return A LinuxPipeRequest for a UsbIrpImp.
+	 * @exception UsbException If there is an error.
+	 */
+	protected LinuxPipeRequest usbIrpImpToLinuxPipeRequest(UsbIrpImp usbIrpImp) throws UsbException
+	{
+		try { return usbIrpImpToLinuxPipeRequest((UsbControlIrpImp)usbIrpImp); }
+		catch ( ClassCastException ccE ) { throw new UsbException("Cannot submit a UsbIrp on a Control-type pipe."); }
+	}
+
+	/**
+	 * Create a LinuxPipeRequest to wrap a UsbControlIrpImp.
+	 * @param usbControlIrpImp The UsbControlIrpImp.
+	 * @return A LinuxPipeRequest for a UsbControlIrpImp.
+	 * @exception UsbException If there is an error.
+	 */
+	protected LinuxPipeRequest usbIrpImpToLinuxPipeRequest(UsbControlIrpImp usbControlIrpImp) throws UsbException
+	{
+		LinuxControlRequest request = null;
+
+		/* FIXME - a set-config or set-interface on a non-DCP isn't possible using Linux's calls!
+		 * Should this do a 'normal' set-config or set-interface call on the non-DCP?
+		 * That would most likely drop the Linux kernel out of sync with the actual device config/setting.
+		 * The LinuxSetConfigurationRequest and LinuxSetInterfaceRequest both use the provided
+		 * mechanisms, which use the DCP.  Which isn't what's being requested here (since we're not the DCP).
+		 * Note that non-setters (simple LinuxControlRequests on non-DCP pipe) are ok and what we want to do,
+		 * since we're setting the endpoint address to non-0 (the DCP is ep0).
+		 */
+		if (usbControlIrpImp.isSetConfiguration())
+			request = new LinuxSetConfigurationRequest();
+		else if (usbControlIrpImp.isSetInterface())
+			request = new LinuxSetInterfaceRequest();
+		else
+			request = new LinuxControlRequest();
+
+		request.setEndpointAddress(getEndpointAddress());
+		request.setUsbIrpImp(usbControlIrpImp);
+		request.setCompletion(this);
+		return request;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxControlRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxControlRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..84e601b49a7463e0d87c44f1485e4dc0896ca00a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxControlRequest.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * LinuxRequest for use on control pipes.
+ * @author Dan Streetman
+ */
+class LinuxControlRequest extends LinuxPipeRequest
+{
+	public LinuxControlRequest() { super(UsbConst.ENDPOINT_TYPE_CONTROL,(byte)0x00); }
+
+	/** @param irp The (Control)UsbIrpImp */
+	public void setUsbIrpImp( UsbIrpImp irp ) { setUsbIrpImp((UsbControlIrpImp)irp); }
+
+	/** @param irp The UsbControlIrpImp */
+	public void setUsbIrpImp( UsbControlIrpImp irp )
+	{
+		super.setUsbIrpImp(irp);
+
+		bmRequestType = irp.bmRequestType();
+		bRequest = irp.bRequest();
+		wValue = irp.wValue();
+		wIndex = irp.wIndex();
+		setupPacket = irp.getSetupPacket();
+	}
+
+	/** @return The bmRequestType */
+	public byte bmRequestType() { return bmRequestType; }
+
+	/** @return The bRequest */
+	public byte bRequest() { return bRequest; }
+
+	/** @return The wValue */
+	public short wValue() { return wValue; }
+
+	/** @return The wIndex */
+	public short wIndex() { return wIndex; }
+
+	/** @return The setup packet */
+	public byte[] getSetupPacket() { return setupPacket; }
+
+	private byte bmRequestType = 0;
+	private byte bRequest = 0;
+	private short wValue = 0;
+	private short wIndex = 0;
+	private byte[] setupPacket = null;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxDeviceOsImp.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxDeviceOsImp.java
new file mode 100644
index 0000000000000000000000000000000000000000..31c37a16aa54dda885140e59359750447febd91c
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxDeviceOsImp.java
@@ -0,0 +1,191 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/*
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+import javax.usb.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+
+/**
+ * UsbDeviceOsImp implemenation for Linux platform.
+ * <p>
+ * This must be set up before use.
+ * <ul>
+ * <li>The {@link #getUsbDeviceImp() UsbDeviceImp} must be set
+ *     either in the constructor or by its {@link #setUsbDeviceImp(UsbDeviceImp) setter}.</li>
+ * <li>The {@link #getLinuxDeviceProxy() LinuxDeviceProxy} must be set
+ *     either in the constructor or by its {@link #setLinuxDeviceProxy(LinuxDeviceProxy) setter}.</li>
+ * </ul>
+ * @author Dan Streetman
+ */
+class LinuxDeviceOsImp extends DefaultUsbDeviceOsImp implements UsbDeviceOsImp
+{
+	/** Constructor */
+	public LinuxDeviceOsImp( UsbDeviceImp device, LinuxDeviceProxy proxy )
+	{
+		setUsbDeviceImp(device);
+		setLinuxDeviceProxy(proxy);
+	}
+
+	/** @return The UsbDeviceImp for this */
+	public UsbDeviceImp getUsbDeviceImp() { return usbDeviceImp; }
+
+	/** @param device The UsbDeviceImp for this */
+	public void setUsbDeviceImp( UsbDeviceImp device ) { usbDeviceImp = device; }
+
+	/**
+	 * Get the LinuxDeviceProxy.
+	 * <p>
+	 * This will start up the LinuxDeviceProxy if not running.
+	 * @return The LinuxDeviceProxy.
+	 * @exception UsbException If an UsbException occurred while starting the LinuxDeviceProxy.
+	 */
+	public LinuxDeviceProxy getLinuxDeviceProxy() throws UsbException
+	{
+		synchronized(linuxDeviceProxy) {
+			if (!linuxDeviceProxy.isRunning()) {
+ 				linuxDeviceProxy.start();
+			}
+		}
+
+		return linuxDeviceProxy;
+	}
+
+	/** @param proxy The LinuxDeviceProxy */
+	public void setLinuxDeviceProxy(LinuxDeviceProxy proxy)
+	{
+		linuxDeviceProxy = proxy;
+		key = linuxDeviceProxy.getKey();
+	}
+
+	/** AsyncSubmit a UsbControlIrpImp */
+	public void asyncSubmit( UsbControlIrpImp usbControlIrpImp ) throws UsbException
+	{
+		LinuxControlRequest request = null;
+
+		try {
+			checkUnclaimedInterface(usbControlIrpImp);
+		} catch ( UsbPlatformException upE ) {
+			usbControlIrpImp.setUsbException(upE);
+			usbControlIrpImp.complete();
+			throw upE;
+		}
+
+		if (usbControlIrpImp.isSetConfiguration())
+			request = new LinuxSetConfigurationRequest();
+		else if (usbControlIrpImp.isSetInterface())
+			request = new LinuxSetInterfaceRequest();
+		else
+			request = new LinuxControlRequest();
+
+		request.setUsbIrpImp(usbControlIrpImp);
+
+		submit(request);
+	}
+
+	/**
+	 * This is used by LinuxUsbServices to compare devices.
+	 * @return The key.
+	 */
+	public String getKey() { return key; }
+
+	/** Submit a Request. */
+	void submit(LinuxRequest request) throws UsbException { getLinuxDeviceProxy().submit(request); }
+
+	/** Cancel a Request. */
+	void cancel(LinuxRequest request)
+	{
+		/* Ignore proxy-starting exception, it should already be started */
+		try { getLinuxDeviceProxy().cancel(request); }
+		catch ( UsbException uE ) { }
+	}
+
+	/**
+	 * If this is a request to an unclaimed/invalid interface, throw an exception.
+	 * @param irp The UsbControlIrpImp.
+	 * @exception UsbPlatformException If the recipient interface is unclaimed or the interface/endpoint number is invalid.
+	 */
+	protected void checkUnclaimedInterface(UsbControlIrpImp irp) throws UsbPlatformException
+	{
+		/* Ignore "recipient" of Vendor requests */
+		if (UsbConst.REQUESTTYPE_TYPE_VENDOR == (byte)(UsbConst.REQUESTTYPE_TYPE_MASK & irp.bmRequestType()))
+			return;
+
+		if (UsbConst.REQUESTTYPE_RECIPIENT_INTERFACE == (byte)(UsbConst.REQUESTTYPE_RECIPIENT_MASK & irp.bmRequestType())) {
+			byte ifacenum = (byte)irp.wIndex();
+			UsbInterfaceImp iface = interfaceNumberToUsbInterfaceImp(ifacenum);
+			String iStr = "0x" + UsbUtil.toHexString(ifacenum);
+			if (null == iface) {
+				IllegalArgumentException iaE = new IllegalArgumentException("No active interface with number " + iStr);
+				throw new UsbPlatformException("Request with recipient interface " + iStr + ", but no such interface in current active configuration", iaE);
+			} else if (!iface.isJavaClaimed()) {
+				UsbNotClaimedException uncE = new UsbNotClaimedException("Interface " + iStr + " is not claimed");
+				throw new UsbPlatformException("Request with recipient interface " + iStr + ", but interface is not claimed", uncE);
+			}
+		}
+
+		if (UsbConst.REQUESTTYPE_RECIPIENT_ENDPOINT == (byte)(UsbConst.REQUESTTYPE_RECIPIENT_MASK & irp.bmRequestType())) {
+			byte epNum = (byte)irp.wIndex();
+			if (0 == epNum)
+				return;
+			UsbInterfaceImp iface = endpointAddressToUsbInterfaceImp(epNum);
+			String eStr = "0x" + UsbUtil.toHexString(epNum);
+			if (null == iface) {
+				IllegalArgumentException iaE = new IllegalArgumentException("No active enpoint with address " + eStr);
+				throw new UsbPlatformException("Request with recipient endpoint " + eStr + ", but no such endpoint in current active configuration and interfaces", iaE);
+			} else if (!iface.isJavaClaimed()) {
+				String iStr = "0x" + UsbUtil.toHexString(iface.getUsbInterfaceDescriptor().bInterfaceNumber());
+				UsbNotClaimedException uncE = new UsbNotClaimedException("Interface " + iStr + ", which owns endpoint " + eStr + ", is not claimed");
+				throw new UsbPlatformException("Request with recipient endpoint " + eStr + " which belongs to interface " + iStr + ", but interface is not claimed", uncE);
+			}
+		}
+	}
+
+	protected UsbInterfaceImp interfaceNumberToUsbInterfaceImp(byte num)
+	{
+		return getUsbDeviceImp().getActiveUsbConfigurationImp().getUsbInterfaceImp(num);
+	}
+
+	protected UsbInterfaceImp endpointAddressToUsbInterfaceImp(byte addr)
+	{
+		List ifaces = getUsbDeviceImp().getActiveUsbConfigurationImp().getUsbInterfaces();
+		for (int i=0; i<ifaces.size(); i++) {
+			UsbInterfaceImp iface = (UsbInterfaceImp)ifaces.get(i);
+			List eps = iface.getUsbEndpoints();
+			for (int e=0; e<eps.size(); e++) {
+				UsbEndpointImp ep = (UsbEndpointImp)eps.get(e);
+				if (ep.getUsbEndpointDescriptor().bEndpointAddress() == addr)
+					return iface;
+			}
+		}
+		return null;
+	}
+
+	private UsbDeviceImp usbDeviceImp = null;
+
+	private LinuxDeviceProxy linuxDeviceProxy = null;
+	private String key = "";
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxDeviceProxy.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxDeviceProxy.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1641fd2f6242679606870aaa4ccb9834282c154
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxDeviceProxy.java
@@ -0,0 +1,108 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.*;
+
+/**
+ * Proxy implementation for Linux's device-based access.
+ * @author Dan Streetman
+ */
+class LinuxDeviceProxy extends LinuxRequestProxy
+{
+	/**
+	 * Constructor.
+	 * @param k The native key.  The key cannot be changed.
+	 */
+	public LinuxDeviceProxy(String k)
+	{
+		super();
+		key = k;
+	}
+
+	//*************************************************************************
+	// Public methods
+
+	/** If this is running */
+	public boolean isRunning()
+	{
+		try { return thread.isAlive(); }
+		catch ( NullPointerException npE ) { return false; }
+	}
+
+	/** Start this proxy. */
+	public void start() throws UsbException
+	{
+		Thread t = new Thread(proxyRunnable);
+
+		t.setDaemon(true);
+		t.setName("LinuxDeviceProxy " + getKey());
+
+		synchronized (startLock) {
+			t.start();
+
+			try { startLock.wait(); }
+			catch ( InterruptedException iE ) { }
+		}
+
+		if (0 != startError)
+			throw JavaxUsb.errorToUsbException(startError, "Could not connect to USB device");
+		else
+			thread = t;
+	}
+
+	/**
+	 * This is used in LinuxUsbServices to compare UsbDevicesImps.
+	 * @return The native device key.
+	 */
+	public String getKey() { return key; }
+
+	//*************************************************************************
+	// JNI methods
+
+	/**
+	 * Signal startup completed.
+	 * @param error The error number if startup failed, or 0 if startup succeeded.
+	 */
+	private void startCompleted( int error )
+	{
+		synchronized (startLock) {
+			startError = error;
+
+			startLock.notifyAll();
+		}
+	}
+
+	//*************************************************************************
+	// Instance variables
+
+	private Thread thread = null;
+	private String key = null;
+
+	private Runnable proxyRunnable = new Runnable() {
+		public void run()
+		{ JavaxUsb.nativeDeviceProxy( LinuxDeviceProxy.this ); }
+	};
+
+	private Object startLock = new Object();
+	private int startError = -1;
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxInterfaceOsImp.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxInterfaceOsImp.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ff0776b41d30a00fcfd10567f288fb60d5bfe84
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxInterfaceOsImp.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+
+/**
+ * UsbInterfaceOsImp implementation for Linux platform.
+ * <p>
+ * This must be set up before use.
+ * <ul>
+ * <li>The {@link #getUsbInterfaceImp() UsbInterfaceImp} must be set
+ *     either in the constructor or by its {@link #setUsbInterfaceImp(UsbInterfaceImp) setter}.</li>
+ * <li>The {@link #getLinuxDeviceOsImp() LinuxDeviceOsImp} must be set
+ *     either in the constructor or by its {@link #setLinuxDeviceOsImp(LinuxDeviceOsImp) setter}.</li>
+ * </ul>
+ * @author Dan Streetman
+ */
+class LinuxInterfaceOsImp implements UsbInterfaceOsImp
+{
+	/** Constructor */
+	public LinuxInterfaceOsImp( UsbInterfaceImp iface, LinuxDeviceOsImp device )
+	{
+		setUsbInterfaceImp(iface);
+		setLinuxDeviceOsImp(device);
+	}
+
+	//*************************************************************************
+	// Public methods
+
+	/** @return The UsbInterfaceImp for this */
+	public UsbInterfaceImp getUsbInterfaceImp() { return usbInterfaceImp; }
+
+	/** @param iface The UsbInterfaceImp for this */
+	public void setUsbInterfaceImp( UsbInterfaceImp iface )
+	{
+		usbInterfaceImp = iface;
+
+		try {
+			interfaceNumber = usbInterfaceImp.getUsbInterfaceDescriptor().bInterfaceNumber();
+		} catch ( NullPointerException npE ) {
+			/* wait 'til usbInterfaceImp is non-null */
+		}
+	}
+
+	/** @return The LinuxDeviceOsImp for this */
+	public LinuxDeviceOsImp getLinuxDeviceOsImp() { return linuxDeviceOsImp; }
+
+	/** @param device The LinuxDeviceOsImp for this */
+	public void setLinuxDeviceOsImp( LinuxDeviceOsImp device ) { linuxDeviceOsImp = device; }
+
+	/** Claim this interface. */
+	public void claim() throws UsbException
+	{
+		LinuxInterfaceRequest request = new LinuxInterfaceRequest.LinuxClaimInterfaceRequest(getInterfaceNumber());
+		submit(request);
+
+		request.waitUntilCompleted();
+
+		if (0 != request.getError())
+			throw JavaxUsb.errorToUsbException(request.getError(), "Could not claim interface");
+	}
+
+	/**
+	 * Claim this interface using the specified policy.
+	 * @param policy The UsbInterfacePolicy to use.
+	 */
+	public void claim(UsbInterfacePolicy policy) throws UsbException
+	{
+		boolean forceClaim = policy.forceClaim(getUsbInterfaceImp());
+		LinuxInterfaceRequest request = new LinuxInterfaceRequest.LinuxClaimInterfaceRequest(getInterfaceNumber(), forceClaim);
+		submit(request);
+
+		request.waitUntilCompleted();
+
+		if (0 != request.getError())
+			throw JavaxUsb.errorToUsbException(request.getError(), "Could not claim interface");
+	}
+
+	/** Release this interface. */
+	public void release() throws UsbException
+	{
+		LinuxInterfaceRequest request = new LinuxInterfaceRequest.LinuxReleaseInterfaceRequest(getInterfaceNumber());
+
+		submit(request);
+
+		request.waitUntilCompleted();
+
+		if (0 != request.getError())
+			throw new UsbNativeClaimException(JavaxUsb.errorToUsbException(request.getError()).getMessage());
+	}
+
+	/** @return if this interface is claimed. */
+	public boolean isClaimed()
+	{
+		LinuxInterfaceRequest request = new LinuxInterfaceRequest.LinuxIsClaimedInterfaceRequest(getInterfaceNumber());
+
+		try {
+			submit(request);
+		} catch ( UsbException uE ) {
+//FIXME - log this
+			return false;
+		}
+
+		request.waitUntilCompleted();
+
+		if (0 != request.getError()) {
+//FIXME - log
+				return false;
+		}
+
+		return request.isClaimed();
+	}
+
+	public byte getInterfaceNumber() { return interfaceNumber; }
+
+	/**
+	 * Submit a Request.
+	 * @param request The LinuxRequest.
+	 */
+	void submit(LinuxRequest request) throws UsbException { getLinuxDeviceOsImp().submit(request); }
+
+	/**
+	 * Cancel a Request.
+	 * @param request The LinuxRequest.
+	 */
+	void cancel(LinuxRequest request) { getLinuxDeviceOsImp().cancel(request); }
+
+	protected UsbInterfaceImp usbInterfaceImp = null;
+	protected LinuxDeviceOsImp linuxDeviceOsImp = null;
+
+	private byte interfaceNumber = 0;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxInterfaceRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxInterfaceRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f17124d8c0d7aa68a2ec1252b777c29fa2a9c0b
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxInterfaceRequest.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+/**
+ * Request to claim or release an interface.
+ * @author Dan Streetman
+ */
+abstract class LinuxInterfaceRequest extends LinuxRequest
+{
+	/** Constructor */
+	public LinuxInterfaceRequest(int ifnum) { setInterfaceNumber(ifnum); }
+
+	/** @return The interface number */
+	public int getInterfaceNumber() { return interfaceNumber; }
+
+	/** @param number The interface number */
+	public void setInterfaceNumber( int number ) { interfaceNumber = number; }
+
+	/** @return If the interface is claimed */
+	public boolean isClaimed() { return claimed; }
+
+	/** @param c If the interface is claimed */
+	public void setClaimed(boolean c) { claimed = c; }
+
+	/** @return If claiming an interface, if the claim should be forced. */
+	public boolean getForceClaim() { return forceClaim; }
+
+	private int interfaceNumber = 0;
+
+	private boolean claimed = false;
+	protected boolean forceClaim = false;
+
+	public static class LinuxClaimInterfaceRequest extends LinuxInterfaceRequest
+	{
+		public LinuxClaimInterfaceRequest(int ifnum) { super(ifnum); }
+		public LinuxClaimInterfaceRequest(int ifnum, boolean force)
+		{
+			this(ifnum);
+			forceClaim = force;
+		}
+		public int getType() { return LinuxRequest.LINUX_CLAIM_INTERFACE_REQUEST; }
+	}
+
+	public static class LinuxIsClaimedInterfaceRequest extends LinuxInterfaceRequest
+	{
+		public LinuxIsClaimedInterfaceRequest(int ifnum) { super(ifnum); }
+		public int getType() { return LinuxRequest.LINUX_IS_CLAIMED_INTERFACE_REQUEST; }
+	}
+
+	public static class LinuxReleaseInterfaceRequest extends LinuxInterfaceRequest
+	{
+		public LinuxReleaseInterfaceRequest(int ifnum) { super(ifnum); }
+		public int getType() { return LinuxRequest.LINUX_RELEASE_INTERFACE_REQUEST; }
+	}
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxIsochronousPipeImp.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxIsochronousPipeImp.java
new file mode 100644
index 0000000000000000000000000000000000000000..af61b65eb94ecc2d2c73f8410c163d02714a61ed
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxIsochronousPipeImp.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+import javax.usb.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+
+/**
+ * LinuxPipeOsImp implementation for Isochronous pipe.
+ * <p>
+ * This must be set up before use.  See {@link com.ibm.jusb.os.linux.LinuxPipeOsImp LinuxPipeOsImp} for details.
+ * @author Dan Streetman
+ */
+class LinuxIsochronousPipeImp extends LinuxPipeOsImp
+{
+	/** Constructor */
+    public LinuxIsochronousPipeImp( UsbPipeImp pipe, LinuxInterfaceOsImp iface ) { super(pipe,iface); }
+
+	/**
+	 * Asynchronously submit a List of UsbIrpImps.
+	 * @param list The List of UsbIrpImps.
+	 * @exception UsbException If one of the UsbIrpImps is invalid.
+	 */
+	public void asyncSubmit(List list) throws UsbException
+	{
+		LinuxIsochronousRequest request = listToLinuxIsochronousRequest(list);
+
+		getLinuxInterfaceOsImp().submit(request);
+
+		synchronized (inProgressList) {
+			inProgressList.add(request);
+		}
+	}
+
+	/**
+	 * Convert a List of UsbIrpImps to a LinuxIsochronousRequest.
+	 * @param list The List.
+	 * @return A LinuxIsochronousRequest.
+	 */
+	protected LinuxIsochronousRequest listToLinuxIsochronousRequest(List list)
+	{
+		LinuxIsochronousRequest request = new LinuxIsochronousRequest(getEndpointAddress());
+		request.setUsbIrpImps(list);
+		request.setCompletion(this);
+		return request;
+	}
+
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxIsochronousRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxIsochronousRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf57f89c432fdc23ba79cd3650499edf7ee3fa9e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxIsochronousRequest.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+import javax.usb.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * Special request for use on Isochronous pipes.
+ * @author Dan Streetman
+ */
+class LinuxIsochronousRequest extends LinuxPipeRequest
+{
+	/** Constructor */
+	public LinuxIsochronousRequest(byte addr) { super(UsbConst.ENDPOINT_TYPE_ISOCHRONOUS,addr); }
+
+	/** @return This request's type. */
+	public int getType() { return LinuxRequest.LINUX_ISOCHRONOUS_REQUEST; }
+
+	/**
+	 * Get the data from the specified UsbIrpImp.
+	 * @param index The index of the UsbIrpImp.
+	 * @return The data from the specified UsbIrpImp.
+	 */
+	public byte[] getData( int index ) { return getUsbIrpImp(index).getData(); }
+
+	/**
+	 * Get the offset from the specified UsbIrpImp.
+	 * @param index The index of the UsbIrpImp.
+	 * @return The offset from the specified UsbIrpImp.
+	 */
+	public int getOffset( int index ) { return getUsbIrpImp(index).getOffset(); }
+
+	/**
+	 * Get the length from the specified UsbIrpImp.
+	 * @param index The index of the UsbIrpImp.
+	 * @return The length from the specified UsbIrpImp.
+	 */
+	public int getLength( int index ) { return getUsbIrpImp(index).getLength(); }
+
+	/**
+	 * Set the actual length of the specified UsbIrpImp.
+	 * @param index The index of the UsbIrpImp.
+	 * @param length The actual length of the specified UsbIrpImp.
+	 */
+	public void setActualLength( int index, int length ) { getUsbIrpImp(index).setActualLength(length); }
+
+	/**
+	 * Set the error of the specified UsbIrpImp.
+	 * @param index The index of the UsbIrpImp.
+	 * @param error The error of the specified UsbIrpImp.
+	 */
+	public void setError( int index, int error ) { getUsbIrpImp(index).setUsbException(JavaxUsb.errorToUsbException(error)); }
+
+	/**
+	 * Get the number of UsbIrpImps.
+	 * @return The number of UsbIrpImps.
+	 */
+	public int size() { return usbIrpImps.size(); }
+
+	/**
+	 * Get the aggregated length of all UsbIrpImps.
+	 * @return The length of all UsbIrpImps.
+	 */
+	public int getTotalLength()
+	{
+		int totalLength = 0;
+
+		for (int i=0; i<size(); i++)
+			totalLength += getUsbIrpImp(i).getLength();
+
+		return totalLength;
+	}
+
+	/**
+	 * Get the specified UsbIrpImp.
+	 * @param index The index of the UsbIrpImp.
+	 * @return The specified UsbIrpImp.
+	 */
+	public UsbIrpImp getUsbIrpImp( int index ) { return (UsbIrpImp)usbIrpImps.get(index); }
+
+	/**
+	 * Set the List of UsbIrpImps.
+	 * @param list The List of UsbIrpImps.
+	 */
+	public void setUsbIrpImps( List list ) { usbIrpImps = list; }
+
+	/**
+	 * Complete all the UsbIrps.
+	 */
+	public void completeUsbIrp()
+	{
+		for (int i=0; i<size(); i++)
+			getUsbIrpImp(i).complete();
+	}
+
+	private List usbIrpImps = null;
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxPipeOsImp.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxPipeOsImp.java
new file mode 100644
index 0000000000000000000000000000000000000000..656f26725fad4036358b45663ef06a088318517a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxPipeOsImp.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+import javax.usb.*;
+import javax.usb.event.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * UsbPipeOsImp implementation for Linux platform.
+ * <p>
+ * This must be set up before use.
+ * <ul>
+ * <li>The {@link #getUsbPipeImp() UsbPipeImp} must be set
+ *     either in the constructor or by its {@link #setUsbPipeImp(UsbPipeImp) setter}.</li>
+ * <li>The {@link #getLinuxInterfaceOsImp() LinuxInterfaceOsImp} must be set
+ *     either in the constructor or by its {@link #setLinuxInterfaceOsImp(LinuxInterfaceOsImp) setter}.</li>
+ * </ul>
+ * @author Dan Streetman
+ */
+public class LinuxPipeOsImp extends DefaultUsbPipeOsImp implements UsbPipeOsImp,LinuxRequest.Completion
+{
+	/** Constructor */
+	public LinuxPipeOsImp( UsbPipeImp pipe, LinuxInterfaceOsImp iface )
+	{
+		setUsbPipeImp(pipe);
+		setLinuxInterfaceOsImp(iface);
+	}
+
+	/** @return The UsbPipeImp for this */
+	public UsbPipeImp getUsbPipeImp() { return usbPipeImp; }
+
+	/** @param pipe The UsbPipeImp for this */
+	public void setUsbPipeImp( UsbPipeImp pipe ) { usbPipeImp = pipe; }
+
+	/** @return The LinuxInterfaceOsImp */
+	public LinuxInterfaceOsImp getLinuxInterfaceOsImp() { return linuxInterfaceOsImp; }
+
+	/** @param iface The LinuxInterfaceOsImp */
+	public void setLinuxInterfaceOsImp(LinuxInterfaceOsImp iface) { linuxInterfaceOsImp = iface; }
+
+	/**
+	 * Asynchronous submission using a UsbIrpImp.
+	 * @param irp the UsbIrpImp to use for this submission
+	 * @exception javax.usb.UsbException if error occurs
+	 */
+	public void asyncSubmit( UsbIrpImp irp ) throws UsbException
+	{
+		LinuxPipeRequest request = usbIrpImpToLinuxPipeRequest(irp);
+
+		getLinuxInterfaceOsImp().submit(request);
+
+		synchronized(inProgressList) {
+			inProgressList.add(request);
+		}
+	}
+
+	/**
+	 * Stop all submissions in progress
+	 */
+	public void abortAllSubmissions()
+	{
+		Object[] requests = null;
+
+		synchronized(inProgressList) {
+			requests = inProgressList.toArray();
+			inProgressList.clear();
+		}
+
+		for (int i=0; i<requests.length; i++)
+			getLinuxInterfaceOsImp().cancel((LinuxPipeRequest)requests[i]);
+
+		for (int i=0; i<requests.length; i++) {
+			LinuxPipeRequest lpR = (LinuxPipeRequest)requests[i];
+			lpR.waitUntilCompleted(ABORT_COMPLETION_TIMEOUT);
+			if (!lpR.isCompleted()) {
+				lpR.setError(ABORT_TIMEOUT_ERROR);
+				lpR.setCompleted(true);
+			}
+		}
+	}
+
+	/** @param request The LinuxRequest that completed. */
+	public void linuxRequestComplete(LinuxRequest request)
+	{
+		synchronized (inProgressList) {
+			inProgressList.remove(request);
+		}
+	}
+
+	/**
+	 * Create a LinuxPipeRequest to wrap a UsbIrpImp.
+	 * @param usbIrpImp The UsbIrpImp.
+	 * @return A LinuxPipeRequest for a UsbIrpImp.
+	 * @exception If there is an error while converting.
+	 */
+	protected LinuxPipeRequest usbIrpImpToLinuxPipeRequest(UsbIrpImp usbIrpImp) throws UsbException
+	{
+		LinuxPipeRequest request = new LinuxPipeRequest(getPipeType(),getEndpointAddress());
+		request.setUsbIrpImp(usbIrpImp);
+		request.setCompletion(this);
+		return request;
+	}
+
+	/** @return The endpoint address */
+	protected byte getEndpointAddress()
+	{
+		if (0 == endpointAddress)
+			endpointAddress = usbPipeImp.getUsbEndpointImp().getUsbEndpointDescriptor().bEndpointAddress();
+
+		return endpointAddress;
+	}
+
+	/** @return The pipe type */
+	protected byte getPipeType()
+	{
+		if (0 == pipeType)
+			pipeType = usbPipeImp.getUsbEndpointImp().getType();
+
+		return pipeType;
+	}
+
+	private UsbPipeImp usbPipeImp = null;
+	private LinuxInterfaceOsImp linuxInterfaceOsImp = null;
+
+	protected byte pipeType = 0;
+	protected byte endpointAddress = 0;
+
+	protected List inProgressList = new LinkedList();
+
+	protected static final int ABORT_TIMEOUT_ERROR = -2; /* -ENOENT in UNIX /usr/include/asm/errno.h */
+	protected static final long ABORT_COMPLETION_TIMEOUT = 500; /* half second */
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxPipeRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxPipeRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9643102dfc24615a52f8b92cafc08e7bd8772f0
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxPipeRequest.java
@@ -0,0 +1,141 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * LinuxRequest for use on pipes.
+ * @author Dan Streetman
+ */
+class LinuxPipeRequest extends LinuxRequest
+{
+	/** Constructor. */
+	public LinuxPipeRequest(byte type, byte addr)
+	{
+		setPipeType(type);
+		setEndpointAddress(addr);
+	}
+
+	/** @return This request's type. */
+	public int getType() { return LinuxRequest.LINUX_PIPE_REQUEST; }
+
+	/** @return The direction of this request */
+	public byte getDirection() { return (byte)(UsbConst.ENDPOINT_DIRECTION_MASK & getEndpointAddress()); }
+
+	/** @return this request's data buffer */
+	public byte[] getData() { return data; }
+
+	/** @return The offset of the data */
+	public int getOffset() { return offset; }
+
+	/** @return The length of the data */
+	public int getLength() { return length; }
+
+	/** @return if Short Packet Detection should be enabled */
+	public boolean getAcceptShortPacket() { return shortPacket; }
+
+	/** @param len The actual length. */
+	public void setActualLength(int len) { actualLength = len; }
+
+	/** @return the assocaited UsbIrpImp */
+	public UsbIrpImp getUsbIrpImp() { return usbIrpImp; }
+
+	/** @param irp the assocaited UsbIrpImp */
+	public void setUsbIrpImp( UsbIrpImp irp )
+	{
+		usbIrpImp = irp;
+		data = irp.getData();
+		offset = irp.getOffset();
+		length = irp.getLength();
+		shortPacket = irp.getAcceptShortPacket();
+	}
+
+	/** @return the address of the assocaited URB */
+	public long getUrbAddress() { return urbAddress; }
+
+	/** @param address the address of the assocaited URB */
+	public void setUrbAddress( long address ) { urbAddress = address; }
+
+	/** @param c If this is completed or not */
+	public void setCompleted(boolean c)
+	{
+		if (c)
+			completeUsbIrp();
+
+		super.setCompleted(c);
+	}
+
+	/** Complete the UsbIrp */
+	public void completeUsbIrp()
+	{
+//FIXME - do this here?  in other Thread?  Also, handle errors better.
+		if (0 != getError())
+			getUsbIrpImp().setUsbException( JavaxUsb.errorToUsbException(getError(), "Error submitting IRP") );
+		getUsbIrpImp().setActualLength(actualLength);
+		getUsbIrpImp().complete();
+	}
+
+
+	/** @param type The pipe type. */
+	public void setPipeType(byte type)
+	{
+		switch (type) {
+		case UsbConst.ENDPOINT_TYPE_CONTROL: pipeType = PIPE_CONTROL; break;
+		case UsbConst.ENDPOINT_TYPE_BULK: pipeType = PIPE_BULK; break;
+		case UsbConst.ENDPOINT_TYPE_INTERRUPT: pipeType = PIPE_INTERRUPT; break;
+		case UsbConst.ENDPOINT_TYPE_ISOCHRONOUS: pipeType = PIPE_ISOCHRONOUS; break;
+		default: /* log */
+		}
+	}
+
+	/** @param addr The endpoint address */
+	public void setEndpointAddress(byte addr) { epAddress = addr; }
+
+	/** @return The type of pipe */
+	public int getPipeType() { return pipeType; }
+
+	/** @return the endpoint address */
+	public byte getEndpointAddress() { return epAddress; }
+
+	private UsbIrpImp usbIrpImp = null;
+	private int pipeType = 0;
+	private byte epAddress = 0;
+
+	private byte[] data = null;
+	private int offset = 0;
+	private int length = 0;
+	private int actualLength = 0;
+	private boolean shortPacket = true;
+
+	private LinuxPipeOsImp linuxPipeImp = null;
+
+	private long urbAddress = 0;
+
+	/* These MUST match those defined in jni/linux/JavaxUsbRequest.c */
+	private static final int PIPE_CONTROL = 1;
+	private static final int PIPE_BULK = 2;
+	private static final int PIPE_INTERRUPT = 3;
+	private static final int PIPE_ISOCHRONOUS = 4;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..51313d842cf2344897b01486b9aae03576320c4a
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxRequest.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+/**
+ * Abstract class for Linux requests.
+ * @author Dan Streetman
+ */
+abstract class LinuxRequest
+{
+	/**
+	 * Get the type of this request.
+	 * @return The type of this request.
+	 */
+	public abstract int getType();
+
+	/** @return The error that occured, or 0 if none occurred. */
+	public int getError() { return errorNumber; }
+
+	/** @param error The number of the error that occurred. */
+	public void setError(int error) { errorNumber = error; }
+
+	/** Wait forever until completed. */
+	public void waitUntilCompleted() { waitUntilCompleted(0); }
+
+	/** Wait until completed. */
+	public void waitUntilCompleted(long timeout)
+	{
+		long start = System.currentTimeMillis();
+		boolean use_timeout = 0 < timeout;
+
+		synchronized ( waitLock ) {
+			waitCount++;
+			while (!isCompleted()) {
+				long elapsed = System.currentTimeMillis() - start;
+				if (use_timeout && (elapsed > timeout))
+					break;
+				try { waitLock.wait(1000); }
+				catch ( InterruptedException iE ) { }
+			}
+			waitCount--;
+		}
+	}
+
+	/** @return If this is completed. */
+	public boolean isCompleted() { return completed; }
+
+	/**
+	 * Set completed.
+	 * @param c If this is completed or not.
+	 */
+	public void setCompleted(boolean c)
+	{
+		completed = c;
+
+		if (completed) {
+			notifyCompleted();
+			executeCompletion();
+		}
+	}
+
+	/** Notify waiteers of completion. */
+	public void notifyCompleted()
+	{
+		synchronized ( waitLock ) {
+			if (0 < waitCount) {
+				waitLock.notifyAll();
+			}
+		}		
+	}
+
+	/** Run the Completion. */
+	protected void executeCompletion()
+	{
+		try { getCompletion().linuxRequestComplete(this); }
+		catch ( NullPointerException npE ) { /* no Completion */ }
+		catch ( Exception e ) { /* log? */ }
+	}
+
+	/** @param c The Completion. */
+	public void setCompletion(LinuxRequest.Completion c) { completion = c; }
+
+	/** @return The Completion */
+	public LinuxRequest.Completion getCompletion() { return completion; }
+
+	private LinuxRequestProxy linuxRequestProxy = null;
+
+	private Object waitLock = new Object();
+	private int waitCount = 0;
+	private boolean completed = false;
+	private int errorNumber = 0;
+
+	private LinuxRequest.Completion completion = null;
+
+	/* These MUST be the same as those defined in jni/linux/JavaxUsbDeviceProxy.c */
+	public static final int LINUX_PIPE_REQUEST = 1;
+	public static final int LINUX_SET_INTERFACE_REQUEST = 2;
+	public static final int LINUX_SET_CONFIGURATION_REQUEST = 3;
+	public static final int LINUX_CLAIM_INTERFACE_REQUEST = 4;
+	public static final int LINUX_IS_CLAIMED_INTERFACE_REQUEST = 5;
+	public static final int LINUX_RELEASE_INTERFACE_REQUEST = 6;
+	public static final int LINUX_ISOCHRONOUS_REQUEST = 7;
+
+	public static interface Completion
+	{ public void linuxRequestComplete(LinuxRequest request); }
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxRequestProxy.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxRequestProxy.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa29092ec1f011660ad0def843fcf0845b789bf6
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxRequestProxy.java
@@ -0,0 +1,108 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+/**
+ * Abstract proxy which manages requests to JNI.
+ * @author Dan Streetman
+ */
+abstract class LinuxRequestProxy
+{
+	//**************************************************************************
+	// Public methods
+
+	/**
+	 * Submit the Request.
+	 * <p>
+	 * No checking of the Request is done.
+	 * @param request The LinuxRequest.
+	 */
+	public void submit( LinuxRequest request )
+	{
+		synchronized(readyList) {
+			readyList.add(request);
+		}
+	}
+
+	/**
+	 * Cancel the Request.
+	 * @param request The LinuxRequest.
+	 */
+	public void cancel( LinuxRequest request )
+	{
+		synchronized(readyList) {
+			if (readyList.contains(request)) {
+				readyList.remove(request);
+				request.setError(-1);
+				request.setCompleted(true);
+				return;
+			}
+		}
+
+		synchronized(cancelList) {
+			cancelList.add(request);
+		}
+	}
+
+	//**************************************************************************
+	// JNI methods
+
+	/**
+	 * If there are any requests waiting.
+	 * @return If there are any requests waiting.
+	 */
+	private boolean isRequestWaiting()
+	{
+		return !readyList.isEmpty() || !cancelList.isEmpty();
+	}
+
+	/**
+	 * Get the next ready Request.
+	 * @return The next ready Request.
+	 */
+	private LinuxRequest getReadyRequest()
+	{
+		synchronized(readyList) {
+			try { return (LinuxRequest)readyList.remove(0); }
+			catch ( IndexOutOfBoundsException ioobE ) { return null; }
+		}
+	}
+
+	/**
+	 * Get the next cancel Request.
+	 * @return The next cancel Request.
+	 */
+	private LinuxRequest getCancelRequest()
+	{
+		synchronized(cancelList) {
+			try { return (LinuxRequest)cancelList.remove(0); }
+			catch ( IndexOutOfBoundsException ioobE ) { return null; }
+		}
+	}
+
+	//**************************************************************************
+	// Instance variables
+
+	private List readyList = new LinkedList();
+	private List cancelList = new LinkedList();
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxSetConfigurationRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxSetConfigurationRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..45510d1291347154218648c35204db3f48f2c3fc
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxSetConfigurationRequest.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.util.UsbUtil;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * Interface for configuration-changing Requests.
+ * @author Dan Streetman
+ */
+public class LinuxSetConfigurationRequest extends LinuxControlRequest
+{
+	/** @return This request's type. */
+	public int getType() { return LinuxRequest.LINUX_SET_CONFIGURATION_REQUEST; }
+
+	/** @return The configuration number */
+	public int getConfiguration() { return configuration; }
+
+	/** @param irp The UsbControlIrpImp */
+	public void setUsbIrpImp(UsbControlIrpImp irp)
+	{
+		super.setUsbIrpImp(irp);
+		configuration = UsbUtil.unsignedInt((byte)irp.wValue());
+	}
+
+	private int configuration = 0;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxSetInterfaceRequest.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxSetInterfaceRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..041476b2cd399613d8394c2bdcea9219dd91b3bb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxSetInterfaceRequest.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import javax.usb.util.UsbUtil;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * Interface for interface-changing Requests.
+ * @author Dan Streetman
+ */
+public class LinuxSetInterfaceRequest extends LinuxControlRequest
+{
+	/** @return This request's type. */
+	public int getType() { return LinuxRequest.LINUX_SET_INTERFACE_REQUEST; }
+
+	/** @return The interface number */
+	public int getInterface() { return interfaceNumber; }
+
+	/** @return The interface setting */
+	public int getSetting() { return interfaceSetting; }
+
+	/** @param irp The UsbControlIrpImp */
+	public void setUsbIrpImp(UsbControlIrpImp irp)
+	{
+		super.setUsbIrpImp(irp);
+		interfaceNumber = UsbUtil.unsignedInt(irp.wIndex());
+		interfaceSetting = UsbUtil.unsignedInt(irp.wValue());
+	}
+
+	private int interfaceNumber = 0;
+	private int interfaceSetting = 0;
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxUsbServices.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxUsbServices.java
new file mode 100644
index 0000000000000000000000000000000000000000..0fc7400548e24ae43714ed705bff9d8b5e5de8e6
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/LinuxUsbServices.java
@@ -0,0 +1,437 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+import java.util.*;
+
+import javax.usb.*;
+import javax.usb.event.*;
+import javax.usb.util.*;
+
+import com.ibm.jusb.*;
+import com.ibm.jusb.os.*;
+import com.ibm.jusb.util.*;
+
+/**
+ * UsbServices implementation for Linux platform.
+ * @author Dan Streetman
+ */
+public class LinuxUsbServices extends AbstractUsbServices implements UsbServices
+{
+	public LinuxUsbServices() throws UsbException
+	{
+		JavaxUsb.loadLibrary();
+
+		topologyUpdateManager.setMaxSize(Long.MAX_VALUE);
+
+		checkProperties();
+
+		startTopologyListener();
+	}
+
+    //*************************************************************************
+    // Public methods
+
+    /** @return The virtual USB root hub */
+    public synchronized UsbHub getRootUsbHub() throws UsbException
+	{
+		synchronized (topologyLock) {
+			if (!firstUpdateDone) {
+				try { topologyLock.wait(MAX_FIRST_UPDATE_DELAY); }
+				catch ( InterruptedException iE ) { }
+			}
+		}
+
+		return getRootUsbHubImp();
+	}
+
+	/** @return The minimum API version this supports. */
+	public String getApiVersion() { return com.ibm.jusb.os.linux.Version.LINUX_API_VERSION; }
+
+	/** @return The version number of this implementation. */
+	public String getImpVersion() { return com.ibm.jusb.os.linux.Version.LINUX_IMP_VERSION; }
+
+	/** @return Get a description of this UsbServices implementation. */
+	public String getImpDescription() { return com.ibm.jusb.os.linux.Version.LINUX_IMP_DESCRIPTION; }
+
+    //*************************************************************************
+    // Private methods
+
+	/** Set variables from user-specified properties */
+	private void checkProperties()
+	{
+		Properties p = null;
+
+		try { p = UsbHostManager.getProperties(); } catch ( Exception e ) { return; }
+
+		try {
+			if (p.containsKey(TOPOLOGY_UPDATE_DELAY_KEY))
+				topologyUpdateDelay = Integer.decode(p.getProperty(TOPOLOGY_UPDATE_DELAY_KEY)).intValue();
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TOPOLOGY_UPDATE_NEW_DEVICE_DELAY_KEY))
+				topologyUpdateNewDeviceDelay = Integer.decode(p.getProperty(TOPOLOGY_UPDATE_NEW_DEVICE_DELAY_KEY)).intValue();
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TOPOLOGY_UPDATE_USE_POLLING_KEY))
+				topologyUpdateUsePolling = Boolean.valueOf(p.getProperty(TOPOLOGY_UPDATE_USE_POLLING_KEY)).booleanValue();
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TRACING))
+				JavaxUsb.nativeSetTracing(Boolean.valueOf(p.getProperty(TRACING)).booleanValue());
+		} catch ( Exception e ) { }
+
+		/* The JNI library can't default to stderr (it isn't a portable reference) so we pre-set it here. */
+		JavaxUsb.nativeSetTraceOutput(2, "");
+
+		try {
+			if (p.containsKey(TRACE_OUTPUT)) {
+				int output = Integer.decode(p.getProperty(TRACE_OUTPUT)).intValue();
+				String traceFilename = "";
+				if ((3 == output || 4 == output)) {
+					traceFilename = p.getProperty(TRACE_FILENAME);
+					if ((null == traceFilename) || ("".equals(traceFilename))) {
+						traceFilename = "";
+						output = 2;
+					}
+				}
+				JavaxUsb.nativeSetTraceOutput(output, traceFilename);
+			}
+		} catch ( Exception e ) { }
+
+//FIXME - the names of the tracers should be more generically processed
+		try {
+			if (p.containsKey(TRACE_DEFAULT))
+				JavaxUsb.nativeSetTraceType(Boolean.valueOf(p.getProperty(TRACE_DEFAULT)).booleanValue(), "default");
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TRACE_HOTPLUG))
+				JavaxUsb.nativeSetTraceType(Boolean.valueOf(p.getProperty(TRACE_HOTPLUG)).booleanValue(), "hotplug");
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TRACE_XFER))
+				JavaxUsb.nativeSetTraceType(Boolean.valueOf(p.getProperty(TRACE_XFER)).booleanValue(), "xfer");
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TRACE_URB))
+				JavaxUsb.nativeSetTraceType(Boolean.valueOf(p.getProperty(TRACE_URB)).booleanValue(), "urb");
+		} catch ( Exception e ) { }
+
+		try {
+			if (p.containsKey(TRACE_LEVEL))
+				JavaxUsb.nativeSetTraceLevel(Integer.decode(p.getProperty(TRACE_LEVEL)).intValue());
+		} catch ( Exception e ) { }
+	}
+
+	/** @return If the topology listener is listening */
+	private boolean isListening()
+	{
+		try { return topologyListener.isAlive(); }
+		catch ( NullPointerException npE ) { return false; }
+	}
+
+	/** Start Topology Change Listener Thread */
+	private void startTopologyListener()
+	{
+		Runnable r = null;
+		String threadName = null;
+
+		if (topologyUpdateUsePolling) {
+			threadName = "javax.usb Linux implementation Topology Poller";
+			r = new Runnable() {
+					public void run()
+					{
+						while (true) {
+							try { Thread.sleep(topologyUpdateDelay); } catch ( InterruptedException iE ) { }
+							updateTopology();
+						}
+					}
+				};
+		} else {
+			threadName = "javax.usb Linux implementation Topology Listener";
+			r = new Runnable() {
+					public void run()
+					{ topologyListenerExit(JavaxUsb.nativeTopologyListener(LinuxUsbServices.this)); }
+				};
+		}
+
+		topologyListener = new Thread(r);
+
+		topologyListener.setDaemon(true);
+		topologyListener.setName(threadName);
+
+		topologyListenerError = 0;
+		topologyListener.start();
+	}
+
+	/**
+	 * Called when the topology listener exits.
+	 * @param error The return code of the topology listener.
+	 */
+	private void topologyListenerExit(int error)
+	{
+//FIXME - disconnet all devices
+
+		topologyListenerError = error;
+
+		synchronized (topologyLock) {
+			topologyLock.notifyAll();
+		}
+	}
+
+	/** Enqueue an update topology request */
+	private void topologyChange()
+	{
+		try { Thread.sleep(topologyUpdateDelay); } catch ( InterruptedException iE ) { }
+
+		Runnable r = new Runnable() {
+				public void run()
+				{ updateTopology(); }
+			};
+
+		topologyUpdateManager.add(r);
+	}
+
+	/**
+	 * Fill the List with all devices.
+	 * @param device The device to add.
+	 * @param list The list to add to.
+	 */
+	private void fillDeviceList( UsbDeviceImp device, List list )
+	{
+		list.add(device);
+
+		if (device.isUsbHub()) {
+			UsbHubImp hub = (UsbHubImp)device;
+
+//FIXME - Iterators can throw ConcurrentModificationException!
+			Iterator iterator = hub.getAttachedUsbDevices().iterator();
+			while (iterator.hasNext())
+				fillDeviceList( (UsbDeviceImp)iterator.next(), list );
+		}
+	}
+
+	/** Update the topology and fire connect/disconnect events */
+	private void updateTopology()
+	{
+		List connectedDevices = new ArrayList();
+		List disconnectedDevices = new ArrayList();
+
+		fillDeviceList(getRootUsbHubImp(), disconnectedDevices);
+		disconnectedDevices.remove(getRootUsbHubImp());
+
+		topologyUpdateResult = JavaxUsb.nativeTopologyUpdater( this, connectedDevices, disconnectedDevices );
+
+		for (int i=0; i<disconnectedDevices.size(); i++)
+			((UsbDeviceImp)disconnectedDevices.get(i)).disconnect();
+
+		for (int i=0; i<connectedDevices.size(); i++) {
+			UsbDeviceImp device = (UsbDeviceImp)connectedDevices.get(i);
+			setActiveConfigAndInterfaceSettings(device);
+			device.getParentUsbPortImp().attachUsbDeviceImp(device);
+		}
+
+		for (int i=0; i<disconnectedDevices.size(); i++)
+			listenerImp.usbDeviceDetached(new UsbServicesEvent(this, (UsbDevice)disconnectedDevices.get(i)));
+
+		for (int i=0; i<connectedDevices.size(); i++) {
+			/* Let's wait a bit before each new device's event, so its driver can have some time to
+			 * talk to it without interruptions.
+			 */
+			try { Thread.sleep(topologyUpdateNewDeviceDelay); } catch ( InterruptedException iE ) { }
+			listenerImp.usbDeviceAttached(new UsbServicesEvent(this, (UsbDevice)connectedDevices.get(i)));
+		}
+
+		synchronized (topologyLock) {
+			firstUpdateDone = true;
+			topologyLock.notifyAll();
+		}
+	}
+
+	/**
+	 * Check a device.
+	 * <p>
+	 * If the device exists, the existing device is removed from the disconnected list and returned.
+	 * If the device is new, it is added to the connected list and returned.  If the new device replaces
+	 * an existing device, the old device is retained in the disconnected list, and the new device is returned.
+	 * @param hub The parent UsbHubImp.
+	 * @param p The parent port number.
+	 * @param device The UsbDeviceImp to add.
+	 * @param disconnected The List of disconnected devices.
+	 * @param connected The List of connected devices.
+	 * @return The new UsbDeviceImp or existing UsbDeviceImp.
+	 */
+	private UsbDeviceImp checkUsbDeviceImp( UsbHubImp hub, int p, UsbDeviceImp device, List connected, List disconnected )
+	{
+		byte port = (byte)p;
+		UsbPortImp usbPortImp = hub.getUsbPortImp(port);
+
+		if (null == usbPortImp) {
+			hub.resize(port);
+			usbPortImp = hub.getUsbPortImp(port);
+		}
+
+		if (!usbPortImp.isUsbDeviceAttached()) {
+			connected.add(device);
+			device.setParentUsbPortImp(usbPortImp);
+			return device;
+		}
+
+		UsbDeviceImp existingDevice = usbPortImp.getUsbDeviceImp();
+
+		if (isUsbDevicesEqual(existingDevice, device)) {
+			disconnected.remove(existingDevice);
+			return existingDevice;
+		} else {
+			connected.add(device);
+			device.setParentUsbPortImp(usbPortImp);
+			return device;
+		}
+	}
+
+	/**
+	 * Return if the specified devices appear to be equal.
+	 * <p>
+	 * If either of the device's descriptors are null, this returns false.
+	 * @param dev1 The first device.
+	 * @param dev2 The second device.
+	 * @return If the devices appear to be equal.
+	 */
+	protected boolean isUsbDevicesEqual(UsbDeviceImp dev1, UsbDeviceImp dev2)
+	{
+		try {
+			UsbDeviceDescriptor desc1 = dev1.getUsbDeviceDescriptor();
+			UsbDeviceDescriptor desc2 = dev2.getUsbDeviceDescriptor();
+
+			String key1 = ((LinuxDeviceOsImp)dev1.getUsbDeviceOsImp()).getKey();
+			String key2 = ((LinuxDeviceOsImp)dev2.getUsbDeviceOsImp()).getKey();
+
+			return
+				(key1.equals(key2)) &&
+				(dev1.isUsbHub() == dev1.isUsbHub()) &&
+				dev1.getSpeed() == dev2.getSpeed() &&
+				desc1.equals(desc2);
+		} catch ( NullPointerException npE ) {
+//FIXME - log/trace!!
+			return false;
+		} catch ( ClassCastException ccE ) {
+			//FIXME - log/trace!!
+			return false;
+		}
+	}
+
+	/**
+	 * Find and set the active config and interface settings for this device.
+	 * @param device The UsbDeviceImp.
+	 */
+	protected void setActiveConfigAndInterfaceSettings(UsbDeviceImp device)
+	{
+		LinuxDeviceOsImp linuxDeviceOsImp = (LinuxDeviceOsImp)device.getUsbDeviceOsImp();
+		int config = JavaxUsb.nativeGetActiveConfigurationNumber(linuxDeviceOsImp);
+
+		/* The device isn't configured. */
+		if (0 == config)
+			device.setActiveUsbConfigurationNumber((byte)config);
+
+		/* There was an error getting the active configuration, can't continue */
+//FIXME - log/trace
+		if (0 > config)
+			return;
+
+		/* Got the active configuration number, make sure it's valid, then set it */
+		if (device.containsUsbConfiguration((byte)config))
+			device.setActiveUsbConfigurationNumber((byte)config);
+		else if (1 == device.getUsbConfigurations().size()) /* the device told us a non-existent configuration was active, but it's only got one configuration, so we'll pick that */
+			device.setActiveUsbConfigurationNumber(((UsbConfiguration)device.getUsbConfigurations().get(0)).getUsbConfigurationDescriptor().bConfigurationValue());
+		else
+			return; /* the device told us a non-existent configuration was active, and it has more than one to pick from, so we can't do anything. */
+
+		Iterator interfaces = device.getActiveUsbConfiguration().getUsbInterfaces().iterator();
+		while (interfaces.hasNext()) {
+			UsbInterfaceImp usbInterfaceImp = (UsbInterfaceImp)interfaces.next();
+			int setting = 0;
+			if (1 < usbInterfaceImp.getNumSettings()) {
+				byte interfaceNumber = usbInterfaceImp.getUsbInterfaceDescriptor().bInterfaceNumber();
+				setting = JavaxUsb.nativeGetActiveInterfaceSettingNumber(linuxDeviceOsImp, UsbUtil.unsignedInt(interfaceNumber));
+				if (0 <= setting)
+					usbInterfaceImp.setActiveSettingNumber( (byte)setting );
+			} else {
+				/* If there is only one setting, just set it to the active setting. */
+				usbInterfaceImp.setActiveSettingNumber( usbInterfaceImp.getUsbInterfaceDescriptor().bAlternateSetting() );
+			}
+		}
+	}
+
+    //*************************************************************************
+    // Instance variables
+
+	private RunnableManager topologyUpdateManager = new RunnableManager();
+
+	private Thread topologyListener = null;
+	private Object topologyLock = new Object();
+
+	private boolean firstUpdateDone = false;
+
+    private int topologyListenerError = 0;
+	private int topologyUpdateResult = 0;
+
+	protected boolean topologyUpdateUsePolling = TOPOLOGY_UPDATE_USE_POLLING;
+	protected int topologyUpdateDelay = TOPOLOGY_UPDATE_DELAY;
+	protected int topologyUpdateNewDeviceDelay = TOPOLOGY_UPDATE_NEW_DEVICE_DELAY;
+
+	//*************************************************************************
+	// Class constants
+
+	public static final int MAX_FIRST_UPDATE_DELAY = 10000; /* 10 seconds */
+
+	/* If not polling, this is the delay in ms after getting a connect/disconnect notification
+	 * before checking for device updates.  If polling, this is the number of ms between polls.
+	 */
+	public static final int TOPOLOGY_UPDATE_DELAY = 5000; /* 5 seconds */
+	public static final String TOPOLOGY_UPDATE_DELAY_KEY = "com.ibm.jusb.os.linux.LinuxUsbServices.topologyUpdateDelay";
+
+	/* This is a delay when new devices are found, before sending the notification event that there is a new device.
+	 * This delay is per-device.
+	 */
+	public static final int TOPOLOGY_UPDATE_NEW_DEVICE_DELAY = 500; /* 1/2 second per device */
+	public static final String TOPOLOGY_UPDATE_NEW_DEVICE_DELAY_KEY = "com.ibm.jusb.os.linux.LinuxUsbServices.topologyUpdateNewDeviceDelay";
+
+	/* Whether to use polling to wait for connect/disconnect notification */
+	public static final boolean TOPOLOGY_UPDATE_USE_POLLING = true;
+	public static final String TOPOLOGY_UPDATE_USE_POLLING_KEY = "com.ibm.jusb.os.linux.LinuxUsbServices.topologyUpdateUsePolling";
+
+	/* These enables (or disables) JNI tracing of data. */
+	public static final String TRACING = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.tracing";
+	public static final String TRACE_OUTPUT = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_output";
+	public static final String TRACE_FILENAME = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_filename";
+	public static final String TRACE_LEVEL = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_level";
+	public static final String TRACE_DEFAULT = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_default";
+	public static final String TRACE_HOTPLUG = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_hotplug";
+	public static final String TRACE_XFER = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_xfer";
+	public static final String TRACE_URB = "com.ibm.jusb.os.linux.LinuxUsbServices.JNI.trace_urb";
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/Version.java b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/Version.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebc2a4678b62402633934b6833fefae6a119c104
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/com/ibm/jusb/os/linux/Version.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package com.ibm.jusb.os.linux;
+
+/**
+ * Copyright (c) 1999 - 2001,2008 International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+/**
+ * Class to display Version info.
+ * @author Dan Streetman
+ */
+public class Version
+{
+	/** Main method to print out version information */
+	public static void main(String[] argv)
+	{
+		System.out.println("javax.usb Linux implementation version " + LINUX_IMP_VERSION);
+		System.out.println("javax.usb Required Platform-Implementation version " + LINUX_API_VERSION + " (or later)");
+		System.out.println(LINUX_IMP_DESCRIPTION);
+	}
+
+	public static final String LINUX_API_VERSION = "1.0.0";
+	public static final String LINUX_IMP_VERSION = "1.0.3";
+	public static final String LINUX_IMP_DESCRIPTION =
+		 "JSR80 : javax.usb"
+		+"\n"
+		+"\n"+"Implementation for the Linux kernel (2.4/2.6/3.0).\n"
+		+"\n"
+		+"\n"+"*"
+		+"\n"+"* Copyright (c) 1999 - 2001,2008 International Business Machines Corporation."
+		+"\n"+"* All Rights Reserved."
+		+"\n"+"*"
+		+"\n"+"* This software is provided and licensed under the terms and conditions"
+		+"\n"+"* of the Common Public License:"
+		+"\n"+"* http://oss.software.ibm.com/developerworks/opensource/license-cpl.html"
+		+"\n"
+		+"\n"+"http://javax-usb.org/"
+		;
+
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/LinuxUdevNative.java b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/LinuxUdevNative.java
new file mode 100644
index 0000000000000000000000000000000000000000..935e60b993e0624abfee346e3679f50bed35e9b2
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/LinuxUdevNative.java
@@ -0,0 +1,194 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.usb;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.eclipse.kura.linux.udev.LinuxUdevListener;
+import org.eclipse.kura.linux.udev.UdevEventType;
+import org.eclipse.kura.usb.UsbBlockDevice;
+import org.eclipse.kura.usb.UsbDevice;
+import org.eclipse.kura.usb.UsbNetDevice;
+import org.eclipse.kura.usb.UsbTtyDevice;
+
+public class LinuxUdevNative {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(LinuxUdevNative.class);
+	
+	private static final String LIBRARY_NAME = "EurotechLinuxUdev";
+	
+	 private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+	
+	static {
+		System.loadLibrary( LIBRARY_NAME );
+	}
+	
+	private static List<UsbBlockDevice> blockDevices;
+	private static List<UsbNetDevice> netDevices;
+	private static List<UsbTtyDevice> ttyDevices;
+
+	private static boolean started;
+	private static Future<?> s_task;
+	private ScheduledExecutorService m_executor;
+	
+	private LinuxUdevListener m_linuxUdevListener;
+	private LinuxUdevNative m_linuxUdevNative;
+	
+	public LinuxUdevNative(LinuxUdevListener linuxUdevListener) {
+		if(!started) {
+			m_linuxUdevNative = this;
+			m_linuxUdevListener = linuxUdevListener;
+			
+			blockDevices = (List<UsbBlockDevice>) LinuxUdevNative.getUsbDevices("block");
+			netDevices = (List<UsbNetDevice>) LinuxUdevNative.getUsbDevices("net");
+			ttyDevices = (List<UsbTtyDevice>) LinuxUdevNative.getUsbDevices("tty");
+			
+			start();
+			started = true;	
+		}
+	}
+	
+	public void unbind() {
+		if ((s_task != null) && (!s_task.isDone())) {
+			s_logger.debug("Cancelling LinuxUdevNative task ...");
+    		s_task.cancel(true);
+    		s_logger.info("LinuxUdevNative task cancelled? = {}", s_task.isDone());
+			s_task = null;
+		}
+		if (m_executor != null) {
+			s_logger.debug("Terminating LinuxUdevNative Thread ...");
+    		m_executor.shutdownNow();
+    		try {
+				m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("LinuxUdevNative Thread terminated? - {}", m_executor.isTerminated());
+			m_executor = null;
+		}
+		started = false;
+	}
+	
+	public static List<UsbBlockDevice> getUsbBlockDevices() {
+		return new ArrayList<UsbBlockDevice>(blockDevices);
+	}
+	
+	public static List<UsbNetDevice> getUsbNetDevices() {
+		return new ArrayList<UsbNetDevice>(netDevices);
+	}
+	
+	public static List<UsbTtyDevice> getUsbTtyDevices() {
+		return new ArrayList<UsbTtyDevice>(ttyDevices);
+	}
+
+	private native static void nativeHotplugThread(LinuxUdevNative linuxUdevNative);
+
+	private native static ArrayList<? extends UsbDevice> getUsbDevices(String deviceClass);
+
+	private void callback(String type, UsbDevice usbDevice) {
+		
+		s_logger.debug("TYPE: " + usbDevice.getClass().toString());
+		s_logger.debug("\tmanfufacturer name: " + usbDevice.getManufacturerName());
+		s_logger.debug("\tproduct name: " + usbDevice.getProductName());
+		s_logger.debug("\tvendor ID: " + usbDevice.getVendorId());
+		s_logger.debug("\tproduct ID: " + usbDevice.getProductId());
+		s_logger.debug("\tUSB Bus Number: " + usbDevice.getUsbBusNumber());
+		
+		if(type.compareTo(UdevEventType.ATTACHED.name()) == 0) {			
+			if(usbDevice instanceof UsbBlockDevice) {
+				s_logger.debug("Adding block device: " + usbDevice.getUsbPort() + " - " + ((UsbBlockDevice) usbDevice).getDeviceNode());
+				blockDevices.add((UsbBlockDevice) usbDevice);
+			} else if(usbDevice instanceof UsbNetDevice) {
+				s_logger.debug("Adding new device: " + usbDevice.getUsbPort() + " - " + ((UsbNetDevice) usbDevice).getInterfaceName());
+				netDevices.add((UsbNetDevice) usbDevice);
+			} else if(usbDevice instanceof UsbTtyDevice) {
+				s_logger.debug("Adding tty device: " + usbDevice.getUsbPort() + " - " + ((UsbTtyDevice) usbDevice).getDeviceNode());
+				ttyDevices.add((UsbTtyDevice) usbDevice);
+			}
+			
+			m_linuxUdevListener.attached(usbDevice);
+		} else if(type.compareTo(UdevEventType.DETACHED.name()) == 0) {
+			if(usbDevice instanceof UsbBlockDevice) {
+				s_logger.debug("Removing block device: " + usbDevice.getUsbPort() + " - " + ((UsbBlockDevice) usbDevice).getDeviceNode());
+				if(blockDevices != null && blockDevices.size() > 0) {
+					for(int i=0; i<blockDevices.size(); i++) {
+						UsbBlockDevice device = blockDevices.get(i);
+						if(device.getDeviceNode().equals(((UsbBlockDevice) usbDevice).getDeviceNode())) {
+							blockDevices.remove(i);
+							break;
+						}
+					}
+				}
+			} else if(usbDevice instanceof UsbNetDevice) {
+				s_logger.debug("Removing net device: " + usbDevice.getUsbPort() + " - " + ((UsbNetDevice) usbDevice).getInterfaceName());
+				if(netDevices != null && netDevices.size() > 0) {
+					for(int i=0; i<netDevices.size(); i++) {
+						UsbNetDevice device = netDevices.get(i);
+						if(device.getInterfaceName().equals(((UsbNetDevice) usbDevice).getInterfaceName())) {
+							netDevices.remove(i);
+							break;
+						}
+					}
+				}
+			} else if(usbDevice instanceof UsbTtyDevice) {
+				s_logger.debug("Removing tty device: " + usbDevice.getUsbPort() + " - " + ((UsbTtyDevice) usbDevice).getDeviceNode());
+				if(ttyDevices != null && ttyDevices.size() > 0) {
+					for(int i=0; i<ttyDevices.size(); i++) {
+						UsbTtyDevice device = ttyDevices.get(i);
+						if(device.getDeviceNode().equals(((UsbTtyDevice) usbDevice).getDeviceNode())) {
+							ttyDevices.remove(i);
+							break;
+						}
+					}
+				}
+			}
+			
+			m_linuxUdevListener.detached(usbDevice);
+		} else {
+			s_logger.debug("Unknown udev event: " + type);
+		}
+	}
+
+	/** Start this Hotplug Thread. */
+	private void start() {
+		
+		m_executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+			public Thread newThread(Runnable r) {
+				Thread thread = new Thread(r, "UdevHotplugThread");
+				thread.setDaemon(true);
+				return thread;
+			}
+			});
+		
+		s_task = m_executor.submit(new Runnable() {
+    		@Override
+    		public void run() {
+    				s_logger.info("Starting LinuxUdevNative Thread ...");
+    				Thread.currentThread().setName("LinuxUdevNative");
+    				try {
+    					LinuxUdevNative.nativeHotplugThread(m_linuxUdevNative);
+    				} catch(Exception e) {
+    					e.printStackTrace();
+    				}
+    			}
+    	});
+	}
+}
+
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbSerial.java b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbSerial.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0f072afc2088e2b6fb6f1aa8e7fe1b7fbf0198d
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbSerial.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.usb;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class UsbSerial {
+	
+	private static final String FILENAME = "/proc/tty/driver/usbserial";
+	
+	private static ArrayList<UsbSerialEntry> s_entries = null;
+	
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.device.usb.usbmanager.usbserial.service.IUsbSerialService#getInfo()
+	 */
+	private static void getInfo () throws Exception {
+			
+		BufferedReader in = new BufferedReader(new FileReader(FILENAME));
+		s_entries = new ArrayList<UsbSerialEntry> ();
+		
+		int ttyUsbNo = 0;
+		String vendor = null;
+		String product = null;
+		int numPorts = 0;
+		int portEnum = 0;
+		String path = null;
+		
+		String line = in.readLine(); // read first line (do not need to parse it)
+		while ((line = in.readLine()) != null) {
+			
+			ttyUsbNo = Integer.parseInt(line.substring(0, line.indexOf(':')));
+			line = line.substring(line.indexOf("vendor:"));
+			StringTokenizer st = new StringTokenizer (line, " ");
+			while (st.hasMoreTokens()) {
+				String token = st.nextToken();
+				if (token.startsWith("vendor:")) {
+					vendor = token.substring(token.indexOf(":")+1).trim();
+				}
+				if (token.startsWith("product:")) {
+					product = token.substring(token.indexOf(":")+1).trim();
+				}
+				if (token.startsWith("num_ports:")) {
+					numPorts = Integer.parseInt(token.substring(token.indexOf(":")+1).trim());
+				}
+				if (token.startsWith("port:")) {
+					portEnum = Integer.parseInt(token.substring(token.indexOf(":")+1).trim());
+				}
+				if (token.startsWith("path:")) {
+					path = token.substring(token.indexOf(":")+1).trim();
+				}
+			}
+			s_entries.add(new UsbSerialEntry(ttyUsbNo, vendor, product, numPorts, portEnum, path));
+		}
+		in.close();
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.kura.device.usb.usbmanager.usbserial.service.IUsbSerialService#getUsbSerialEntries(java.lang.String, java.lang.String)
+	 */
+	public static ArrayList<UsbSerialEntry> getUsbSerialEntries(String vendor, String product) throws Exception {
+
+		getInfo();
+		
+		UsbSerialEntry entry = null;
+		ArrayList<UsbSerialEntry> matches = new ArrayList<UsbSerialEntry>();
+
+		for (int i = 0; i < s_entries.size(); i++) {
+			entry = (UsbSerialEntry) s_entries.get(i);
+			if ((entry.getVendorID().compareTo(vendor) == 0)
+					&& (entry.getProductID().compareTo(product) == 0)) {
+				matches.add(entry);
+			}
+		}
+
+		return matches;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbSerialEntry.java b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbSerialEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..38a502a239f1b115945d5eef181dd70a1b38f5cd
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbSerialEntry.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.usb;
+
+/* 
+ * Copyright (c) 2013 Eurotech Inc. All rights reserved.
+ */
+
+public class UsbSerialEntry {
+
+	private int ttyUsbPortNo = 0;
+	private String vendorID = null;
+	private String productID = null;
+	private int numberOfPorts = 0;
+	private int portEnumeration = 0;
+	private String path2usbDevice = null;
+	
+	/**
+	 * UsbSerialEntry constructor 
+	 * @param ttyUsbPortNo - ttyUSB port number
+	 * @param vendor - vendor ID
+	 * @param product - product ID
+	 * @param portEnum - port enumeration 
+	 * @param path - path to USB device
+	 */
+	public UsbSerialEntry(int ttyUsbPortNo, String vendor, String product,
+			int numPorts, int portEnum, String path) {
+
+		this.ttyUsbPortNo = ttyUsbPortNo;
+		this.vendorID = vendor;
+		this.productID = product;
+		this.numberOfPorts = numPorts;
+		this.portEnumeration = portEnum;
+		this.path2usbDevice = path;
+	}
+
+	/**
+	 * Reports ttyUSB port number
+	 * 
+	 * @return ttyUSB port number as <code>int</code>
+	 */
+	public int getTtyUsbPortNo() {
+		return ttyUsbPortNo;
+	}
+
+	/**
+	 * Reports vendor ID
+	 * 
+	 * @return vendor ID as <code>String</code>
+	 */
+	public String getVendorID() {
+		return vendorID;
+	}
+
+	/**
+	 * Reports product ID
+	 * 
+	 * @return product ID as <code>String</code>
+	 */
+	public String getProductID() {
+		return productID;
+	}
+	
+	
+	/**
+	 * Reports total number of ports.
+	 * 
+	 * @return number of ports as <code>int</code> 
+	 */
+	public int getNumberOfPorts() {
+		return numberOfPorts;
+	}
+
+	/**
+	 * Reports port enumeration
+	 * 
+	 * @return port enumeration as <code>int</code>
+	 */
+	public int getPortEnumeration() {
+		return portEnumeration;
+	}
+
+	/**
+	 * Reports path to USB device
+	 * 
+	 * @return path to USB device as <code>String</code>
+	 */
+	public String getPath2usbDevice() {
+		return path2usbDevice;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbServiceImpl.java b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..33d287dce0ba0c57cdc91a426f9626d6e939168b
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.usb/src/main/java/org/eclipse/kura/linux/usb/UsbServiceImpl.java
@@ -0,0 +1,266 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.usb;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.usb.UsbException;
+import javax.usb.UsbHostManager;
+import javax.usb.UsbServices;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.linux.udev.LinuxUdevListener;
+import org.eclipse.kura.usb.UsbBlockDevice;
+import org.eclipse.kura.usb.UsbDevice;
+import org.eclipse.kura.usb.UsbDeviceAddedEvent;
+import org.eclipse.kura.usb.UsbDeviceRemovedEvent;
+import org.eclipse.kura.usb.UsbNetDevice;
+import org.eclipse.kura.usb.UsbService;
+import org.eclipse.kura.usb.UsbTtyDevice;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.ComponentException;
+import org.osgi.service.event.EventAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UsbServiceImpl implements UsbService, LinuxUdevListener {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(UsbServiceImpl.class);
+
+	@SuppressWarnings("unused")
+	private LinuxUdevNative m_linuxUdevNative;
+	private EventAdmin m_eventAdmin;
+
+	private List m_usbDevices;		//udev doesn't properly track devices (particularly for removal events) - so we have to do it.
+	
+	protected void activate(ComponentContext componentContext) {
+		//only support Linux
+		Properties props = System.getProperties();
+		if(((String)props.getProperty("os.name")).equals("Linux")) {
+			m_linuxUdevNative = new LinuxUdevNative(this);
+			
+			//initialize our list
+			m_usbDevices = getUsbDevices();
+		} else {
+			s_logger.error("This is not Linux! - can not start the USB service.  This is " + ((String)props.getProperty("os.version")));
+			throw new ComponentException("This is not Linux! - can not start the USB service.  This is " + ((String)props.getProperty("os.version")));
+		}
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+		m_linuxUdevNative.unbind();
+		m_linuxUdevNative = null;
+		m_usbDevices = null;
+	}
+
+	public void setEventAdmin(EventAdmin eventAdmin) {
+		m_eventAdmin = eventAdmin;
+	}
+
+	public void unsetEventAdmin(EventAdmin eventAdmin) {
+		m_eventAdmin = null;
+	}
+	
+	@Override
+	public UsbServices getUsbServices() throws KuraException {
+		try {
+			return UsbHostManager.getUsbServices( );
+		} catch (SecurityException e) {
+			throw new KuraException(KuraErrorCode.SECURITY_EXCEPTION, e, (Object[]) null);
+		} catch (UsbException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e, (Object[]) null);
+		}
+	}
+
+	@Override
+	public synchronized List<? extends UsbDevice> getUsbDevices() {
+		List usbDevices = new ArrayList(); 
+		usbDevices.addAll(getUsbBlockDevices());
+		usbDevices.addAll(getUsbNetDevices());
+		usbDevices.addAll(getUsbTtyDevices());
+		
+		return usbDevices;
+	}
+
+	public synchronized List<UsbBlockDevice> getUsbBlockDevices() {
+		return (List<UsbBlockDevice>) LinuxUdevNative.getUsbBlockDevices();
+	}
+
+	public synchronized List<UsbNetDevice> getUsbNetDevices() {
+		return (List<UsbNetDevice>) LinuxUdevNative.getUsbNetDevices();
+	}
+	
+	public synchronized List<UsbTtyDevice> getUsbTtyDevices() {
+		return (List<UsbTtyDevice>) LinuxUdevNative.getUsbTtyDevices();
+	}
+
+	@Override
+	public synchronized void attached(UsbDevice device) {
+		//Udev doesn't properly track removal events - so we do it
+		List newlyAttachedDevices = getNewlyAttachedDevices();
+		
+		if(newlyAttachedDevices != null && !newlyAttachedDevices.isEmpty()) {
+			for(Object newDevice : newlyAttachedDevices) {
+				s_logger.debug("firing UsbDeviceAddedEvent");
+				Map<String, String> map = new HashMap<String, String>();
+				map.put(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY, ((UsbDevice)newDevice).getUsbPort());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_VENDOR_ID_PROPERTY, ((UsbDevice)newDevice).getVendorId());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_ID_PROPERTY, ((UsbDevice)newDevice).getProductId());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY, ((UsbDevice)newDevice).getManufacturerName());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_NAME_PROPERTY, ((UsbDevice)newDevice).getProductName());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_BUS_NUMBER_PROPERTY, ((UsbDevice)newDevice).getUsbBusNumber());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_DEVICE_PATH_PROPERTY, ((UsbDevice)newDevice).getUsbDevicePath());
+
+				if(newDevice instanceof UsbBlockDevice) {
+					map.put(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY, ((UsbBlockDevice) newDevice).getDeviceNode());
+				} else if(newDevice instanceof UsbNetDevice) {
+					map.put(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY, ((UsbNetDevice)newDevice).getInterfaceName());
+				} else if(newDevice instanceof UsbTtyDevice) {
+					map.put(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY, ((UsbTtyDevice)newDevice).getDeviceNode());
+				}
+
+				m_eventAdmin.postEvent(new UsbDeviceAddedEvent(map));
+			}
+		}
+	}
+
+	@Override
+	public synchronized void detached(UsbDevice device) {
+		//Udev doesn't properly track removal events - so we do it
+		List newlyRemovedDevices = getNewlyRemovedDevices();
+		
+		if(newlyRemovedDevices != null && !newlyRemovedDevices.isEmpty()) {
+			for(Object removedDevice : newlyRemovedDevices) {
+				s_logger.debug("firing UsbDeviceAddedEvent");
+				Map<String, String> map = new HashMap<String, String>();
+				map.put(UsbDeviceAddedEvent.USB_EVENT_USB_PORT_PROPERTY, ((UsbDevice)removedDevice).getUsbPort());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_VENDOR_ID_PROPERTY, ((UsbDevice)removedDevice).getVendorId());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_ID_PROPERTY, ((UsbDevice)removedDevice).getProductId());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_MANUFACTURER_NAME_PROPERTY, ((UsbDevice)removedDevice).getManufacturerName());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_PRODUCT_NAME_PROPERTY, ((UsbDevice)removedDevice).getProductName());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_BUS_NUMBER_PROPERTY, ((UsbDevice)removedDevice).getUsbBusNumber());
+				map.put(UsbDeviceAddedEvent.USB_EVENT_DEVICE_PATH_PROPERTY, ((UsbDevice)removedDevice).getUsbDevicePath());
+
+				if(removedDevice instanceof UsbBlockDevice) {
+					map.put(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY, ((UsbBlockDevice) removedDevice).getDeviceNode());
+				} else if(removedDevice instanceof UsbNetDevice) {
+					map.put(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY, ((UsbNetDevice)removedDevice).getInterfaceName());
+				} else if(removedDevice instanceof UsbTtyDevice) {
+					map.put(UsbDeviceAddedEvent.USB_EVENT_RESOURCE_PROPERTY, ((UsbTtyDevice)removedDevice).getDeviceNode());
+				}
+
+				m_eventAdmin.postEvent(new UsbDeviceRemovedEvent(map));
+			}
+		}
+	}
+	
+	private List getNewlyAttachedDevices() {
+		List newlyAttachedDevices = new ArrayList();
+		List currentDevices = getUsbDevices();
+		
+		if((m_usbDevices != null && !m_usbDevices.isEmpty()) && (currentDevices != null && !currentDevices.isEmpty())) {
+			if(m_usbDevices.size() > currentDevices.size()) {
+				s_logger.error("Got an USB attached event but current USB device size list is smaller than new list");
+				m_usbDevices = currentDevices;
+				return null;
+			} else if(m_usbDevices.size() == currentDevices.size()) {
+				s_logger.error("Got an USB attached event but current USB device size list is equal to old list");
+				m_usbDevices = currentDevices;
+				return null;				
+			} else {
+				for(Object potentialNewDevice : currentDevices) {
+					boolean foundMatch = false;
+					for(Object oldDevice : m_usbDevices) {
+						if(potentialNewDevice.equals(oldDevice)) {
+							//this is not the device you are looking for
+							foundMatch = true;
+							break;
+						}
+					}
+					
+					if(!foundMatch) {
+						newlyAttachedDevices.add(potentialNewDevice);
+					}
+				}
+				
+				m_usbDevices = currentDevices;
+				return newlyAttachedDevices;
+			}
+		} else if((m_usbDevices == null || m_usbDevices.isEmpty()) && (currentDevices != null && !currentDevices.isEmpty())) {
+			//this is ok
+			m_usbDevices = currentDevices;
+			return currentDevices;
+		} else if((m_usbDevices != null && !m_usbDevices.isEmpty()) && (currentDevices == null || currentDevices.isEmpty())) {
+			s_logger.error("Got an USB attached event but current devices is null and the previous list of devices is not!");
+			m_usbDevices = currentDevices;
+			return null;
+		} else {
+			s_logger.error("Got an USB attached event but current devices is null and the previous list of devices is also null!");
+			m_usbDevices = currentDevices;
+			return null;
+		}
+	}
+	
+	private List getNewlyRemovedDevices() {
+		List newlyRemovedDevices = new ArrayList();
+		List currentDevices = getUsbDevices();
+		
+		if((m_usbDevices != null && !m_usbDevices.isEmpty()) && (currentDevices != null && !currentDevices.isEmpty())) {
+			if(m_usbDevices.size() < currentDevices.size()) {
+				s_logger.error("Got an USB removed event but current USB device size list is bigger than new list");
+				m_usbDevices = currentDevices;
+				return null;
+			} else if(m_usbDevices.size() == currentDevices.size()) {
+				s_logger.error("Got an USB removed event but current USB device size list is equal to old list");
+				m_usbDevices = currentDevices;
+				return null;				
+			} else {
+				for(Object potentialRemovedDevice : m_usbDevices) {
+					boolean foundMatch = false;
+					for(Object currentDevice : currentDevices) {
+						if(potentialRemovedDevice.equals(currentDevice)) {
+							//this is not the device you are looking for
+							foundMatch = true;
+							break;
+						}
+					}
+					
+					if(!foundMatch) {
+						newlyRemovedDevices.add(potentialRemovedDevice);
+					}
+				}
+				
+				m_usbDevices = currentDevices;
+				return newlyRemovedDevices;
+			}
+		} else if((m_usbDevices == null || m_usbDevices.isEmpty()) && (currentDevices != null && !currentDevices.isEmpty())) {
+			s_logger.error("Got an USB removed event but current devices is not null and the previous list of devices is!");			
+			m_usbDevices = currentDevices;
+			return null;
+		} else if((m_usbDevices != null && !m_usbDevices.isEmpty()) && (currentDevices == null || currentDevices.isEmpty())) {
+			//this is ok
+			List retList = new ArrayList();
+			retList.addAll(m_usbDevices);
+			m_usbDevices = null;
+			return retList;
+		} else {
+			s_logger.error("Got an USB removed event but current devices is null and the previous list of devices is also null!");
+			m_usbDevices = currentDevices;
+			return null;
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.watchdog/.gitignore b/kura/org.eclipse.kura.linux.watchdog/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.linux.watchdog/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.watchdog/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..c94b88eb254d5aa03cbc38edc9e9fb3f87800d80
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.linux.watchdog
+Bundle-SymbolicName: org.eclipse.kura.linux.watchdog;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.watchdog; version="[0.2,0.3)",
+ org.osgi.service.component;version="1.2.0",
+ org.slf4j;version="1.6.4"
+
diff --git a/kura/org.eclipse.kura.linux.watchdog/OSGI-INF/metatype/org.eclipse.kura.watchdog.WatchdogService.xml b/kura/org.eclipse.kura.linux.watchdog/OSGI-INF/metatype/org.eclipse.kura.watchdog.WatchdogService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ef8c1117c386c8d09c5f38dafbf7c2e3f822ba8e
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/OSGI-INF/metatype/org.eclipse.kura.watchdog.WatchdogService.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.watchdog.WatchdogService"
+         name="WatchdogService" 
+         description="The WatchdogService handles the hardware watchdog of the platform.  The parameter define the ping periodicity of the hardware watchdog to ensure it doesn't reboot.">
+        
+        <Icon resource="WatchdogService" size="32"/>
+        
+        <AD id="enabled"  
+            name="enabled"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="If set to false the watchdog will be disabled"/>
+        
+        <AD id="pingInterval"
+            name="pingInterval"
+            type="Integer"
+            cardinality="0"
+            required="true"
+            default="10000"
+            description="Ping periodicity in ms."/>
+            
+    </OCD>
+    <Designate pid="org.eclipse.kura.watchdog.WatchdogService">
+        <Object ocdref="org.eclipse.kura.watchdog.WatchdogService"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.linux.watchdog/OSGI-INF/watchdog.xml b/kura/org.eclipse.kura.linux.watchdog/OSGI-INF/watchdog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..39179c68b29d9647221881e79ce852f9384cea49
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/OSGI-INF/watchdog.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" enabled="true" immediate="true" modified="updated" name="org.eclipse.kura.watchdog.WatchdogService">
+   <implementation class="org.eclipse.kura.linux.watchdog.WatchdogServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.watchdog.WatchdogService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.watchdog.WatchdogService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.linux.watchdog/about.html b/kura/org.eclipse.kura.linux.watchdog/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.watchdog/about_files/epl-v10.html b/kura/org.eclipse.kura.linux.watchdog/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.linux.watchdog/build.properties b/kura/org.eclipse.kura.linux.watchdog/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a02ca933de33ddded73141bdefb6239944d112e5
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+source.. = src/main/java/
+additional.bundles = org.eclipse.kura.api,\
+                     slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.linux.watchdog/pom.xml b/kura/org.eclipse.kura.linux.watchdog/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f4843c640f59108c75c5a7d4adac41a2910a39cb
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.linux.watchdog</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20090211</version>
+		</dependency>
+	</dependencies>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.linux.watchdog/src/main/java/org/eclipse/kura/linux/watchdog/CriticalComponentImpl.java b/kura/org.eclipse.kura.linux.watchdog/src/main/java/org/eclipse/kura/linux/watchdog/CriticalComponentImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..3eb29f71d87fd46f9efe1266fb27df0267b34407
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/src/main/java/org/eclipse/kura/linux/watchdog/CriticalComponentImpl.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.linux.watchdog;
+
+public class CriticalComponentImpl {
+
+	private String name;
+	private long timeout;
+	private long updated;
+	
+	/**
+	 * 
+	 * @param name
+	 * @param timeout		timeout for reporting interval in seconds
+	 */
+	public CriticalComponentImpl(String name, long timeout) {
+		this.name = name;
+		this.timeout = timeout;
+		this.updated = System.currentTimeMillis();
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public long getTimeout() {
+		return timeout;
+	}
+	
+	public boolean isTimedOut() {
+		long current = System.currentTimeMillis();
+		return timeout < (current - updated);
+	}
+	
+	public void update() {
+		updated = System.currentTimeMillis();
+	}
+	
+	public String toString() {
+		return "Service Name:  " + name + ", Timeout(ms):  " + timeout;
+	}
+}
diff --git a/kura/org.eclipse.kura.linux.watchdog/src/main/java/org/eclipse/kura/linux/watchdog/WatchdogServiceImpl.java b/kura/org.eclipse.kura.linux.watchdog/src/main/java/org/eclipse/kura/linux/watchdog/WatchdogServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f9b28f59f640bb76e22bb8be2dc4ef2f9f1ba74
--- /dev/null
+++ b/kura/org.eclipse.kura.linux.watchdog/src/main/java/org/eclipse/kura/linux/watchdog/WatchdogServiceImpl.java
@@ -0,0 +1,289 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.linux.watchdog;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.watchdog.CriticalComponent;
+import org.eclipse.kura.watchdog.WatchdogService;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WatchdogServiceImpl implements WatchdogService, ConfigurableComponent {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(WatchdogServiceImpl.class);
+	
+	private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+	
+	private static ScheduledFuture<?>  		s_pollThreadTask;
+	private ScheduledExecutorService     	m_pollThreadExecutor;
+	
+	private Map<String,Object>				m_properties;	
+	
+	private int 							pingInterval = 2000;	//milliseconds
+	private static ArrayList<CriticalComponentImpl>	s_criticalServiceList;
+	private boolean 						m_configEnabled = false;	// initialized in properties, if false -> no watchdog
+	private boolean 						m_enabled; 
+	private boolean 						m_watchdogToStop = false;
+	private boolean							m_serviceToStop = false;
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) {
+		m_properties=properties;
+		if(properties == null) {
+			s_logger.debug("activating WatchdogService with null props");
+		} else {
+			if(m_properties.get("enabled") != null){
+				m_configEnabled = (Boolean) m_properties.get("enabled");
+				if(m_configEnabled)
+					s_logger.debug("activating WatchdogService with watchdog enabled");
+				else
+					s_logger.debug("activating WatchdogService with watchdog disabled");
+			}
+			if(m_properties.get("pingInterval") != null){
+				pingInterval = (Integer) m_properties.get("pingInterval");
+			}
+		}
+		s_criticalServiceList = new ArrayList<CriticalComponentImpl>();
+		m_enabled=false;
+		m_serviceToStop=false;
+		
+		m_pollThreadExecutor = Executors.newSingleThreadScheduledExecutor();
+		
+		updated(properties);
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		
+		if ((s_pollThreadTask != null) && (!s_pollThreadTask.isDone())) {
+			s_logger.debug("Cancelling WatchdogServiceImpl task ...");
+			s_pollThreadTask.cancel(true);
+    		s_logger.info("WatchdogServiceImpl task cancelled? = {}", s_pollThreadTask.isDone());
+			s_pollThreadTask = null;
+		}
+		
+		if(m_enabled){
+			try {
+				File f = new File("/dev/watchdog");
+				FileWriter bw = new FileWriter(f);
+				bw.write('V');
+				bw.close();
+				m_enabled=false;
+				m_serviceToStop=true;
+				s_logger.info("watchdog stopped");
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}		
+		
+		if (m_pollThreadExecutor != null) {
+			s_logger.debug("Terminating WatchdogServiceImpl Thread ...");
+			m_pollThreadExecutor.shutdownNow();
+    		try {
+    			m_pollThreadExecutor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("WatchdogServiceImpl Thread terminated? - {}", m_pollThreadExecutor.isTerminated());	
+			m_pollThreadExecutor = null;
+		}
+		
+		s_criticalServiceList = null;
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.debug("updated...");		
+		m_properties = properties;
+		if(m_properties!=null) {
+			
+			//clean up if this is not our first run
+			if ((s_pollThreadTask != null) && (!s_pollThreadTask.isCancelled())) {
+				s_pollThreadTask.cancel(true);
+			}
+			
+			if(m_properties.get("enabled") != null) {
+				m_configEnabled = (Boolean) m_properties.get("enabled");
+			}
+			if(!m_configEnabled) {
+				if(m_enabled)
+					m_watchdogToStop=true;
+				return;
+			}
+			if(m_properties.get("pingInterval") != null) {
+				pingInterval = (Integer) m_properties.get("pingInterval");
+			}
+			
+			s_pollThreadTask = m_pollThreadExecutor.scheduleAtFixedRate(new Runnable() {
+	    		@Override
+	    		public void run() {
+	    			Thread.currentThread().setName("WatchdogServiceImpl");
+		    		doWatchdogLoop();	
+	    		}
+	    	}, 0, pingInterval, TimeUnit.MILLISECONDS);
+			
+		}
+	}
+	
+	@Override
+    @Deprecated
+	public void startWatchdog() {
+	}
+
+	@Override
+    @Deprecated
+	public void stopWatchdog() {
+	}
+
+	@Override
+	public int getHardwareTimeout() {
+		return 0;
+	}
+
+	@Override
+	public void registerCriticalComponent(CriticalComponent criticalComponent) {
+		final CriticalComponentImpl service = new CriticalComponentImpl(criticalComponent.getCriticalComponentName(), criticalComponent.getCriticalComponentTimeout());
+		synchronized(s_criticalServiceList) {
+			// avoid to add same component twice (eg in case of a package updating) 
+			boolean existing=false;
+			for(CriticalComponentImpl csi:s_criticalServiceList){
+				if(criticalComponent.getCriticalComponentName().compareTo(csi.getName())==0) {
+					existing=true;
+				}
+			}
+			if(!existing)
+				s_criticalServiceList.add(service);
+		}
+		
+		s_logger.debug("Added " + criticalComponent.getCriticalComponentName() + ", with timeout = " + criticalComponent.getCriticalComponentTimeout() +
+		", list contains " + s_criticalServiceList.size() + " critical services");
+	}
+	
+    @Override
+    @Deprecated
+    public void registerCriticalService(CriticalComponent criticalComponent) {
+        registerCriticalComponent(criticalComponent);
+    }
+
+
+	@Override
+	public void unregisterCriticalComponent(CriticalComponent criticalComponent) {
+		synchronized(s_criticalServiceList) {
+			for(int i=0; i<s_criticalServiceList.size(); i++) {
+				if(criticalComponent.getCriticalComponentName().compareTo(((CriticalComponentImpl)s_criticalServiceList.get(i)).getName())==0) {
+					s_criticalServiceList.remove(i);
+					s_logger.debug("Critical service " + criticalComponent.getCriticalComponentName() + " removed, " + System.currentTimeMillis());
+				}
+			}
+		}
+	}
+
+    @Override
+    @Deprecated
+    public void unregisterCriticalService(CriticalComponent criticalComponent) {
+        unregisterCriticalComponent(criticalComponent);
+    }
+
+    @Override
+	public List<CriticalComponent> getCriticalComponents() {
+		return null;
+	}
+
+	@Override
+	public void checkin(CriticalComponent criticalService) {
+		synchronized(s_criticalServiceList) {
+			for(CriticalComponentImpl csi:s_criticalServiceList){
+				if(criticalService.getCriticalComponentName().compareTo(csi.getName())==0) {
+					csi.update();
+				}
+			}
+		}
+	}
+
+	private void doWatchdogLoop() {
+		if (m_enabled) {
+			if (m_watchdogToStop) {
+				try {
+					File f = new File("/dev/watchdog");
+					FileWriter bw = new FileWriter(f);
+					bw.write('V');
+					bw.close();
+					s_logger.info("watchdog stopped");
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+				m_watchdogToStop = false;
+				m_enabled = false;
+			} else {
+				boolean failure = false;
+				// Critical Services
+				synchronized (s_criticalServiceList) {
+					if (s_criticalServiceList.size() > 0) {
+						for (CriticalComponentImpl csi : s_criticalServiceList) {
+							if (csi.isTimedOut()) {
+								failure = true;
+								s_logger.warn("Critical service {} failed -> SYSTEM REBOOT", csi.getName());
+							}
+						}
+					}
+				}
+
+				if (!failure) { // refresh watchdog
+					try {
+						File f = new File("/dev/watchdog");
+						FileWriter bw = new FileWriter(f);
+						bw.write('w');
+						bw.flush();
+						bw.close();
+						s_logger.debug("watchdog refreshed");
+					} catch (IOException e) {
+						s_logger.info("IOException : " + e.getMessage());
+						e.printStackTrace();
+					}
+				}
+			}
+		} else { // ! m_enabled
+			if (m_configEnabled) {
+				try {
+					File f = new File("/dev/watchdog");
+					FileWriter bw = new FileWriter(f);
+					bw.write('w');
+					bw.flush();
+					bw.close();
+					// m_watchdogToStart=false;
+					m_enabled = true;
+					s_logger.info("watchdog started");
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	public boolean isConfigEnabled() {
+		return m_configEnabled;
+	}
+
+	public void setConfigEnabled(boolean configEnabled) {
+		this.m_configEnabled = configEnabled;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.net.admin/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..f2266c2f4a92c786acbb592b563a237434735053
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/META-INF/MANIFEST.MF
@@ -0,0 +1,49 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.net.admin
+Bundle-SymbolicName: org.eclipse.kura.net.admin;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.microedition.io,
+ org.apache.commons.io;version="2.4.0",
+ org.eclipse.kura;version="[0.2,1.0)",
+ org.eclipse.kura.comm;version="[0.2,1.0)",
+ org.eclipse.kura.configuration;version="[0.2,0.3)",
+ org.eclipse.kura.core.configuration;version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration.metatype;version="[0.2,1.0)",
+ org.eclipse.kura.core.linux.util;version="[0.2,1.0)",
+ org.eclipse.kura.core.net;version="[0.2,1.0)",
+ org.eclipse.kura.core.net.modem;version="[0.2,1.0)",
+ org.eclipse.kura.core.net.util;version="[0.2,1.0)",
+ org.eclipse.kura.core.util;version="[0.2,1.0)",
+ org.eclipse.kura.deployment.agent;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.dhcp;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.dns;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.iptables;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.modem;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.ppp;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.route;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.util;version="[0.2,1.0)",
+ org.eclipse.kura.linux.net.wifi;version="[0.2,1.0)",
+ org.eclipse.kura.net;version="[0.2,0.3)",
+ org.eclipse.kura.net.dhcp;version="[0.2,0.3)",
+ org.eclipse.kura.net.dns;version="[0.2,0.3)",
+ org.eclipse.kura.net.firewall;version="[0.2,0.3)",
+ org.eclipse.kura.net.modem;version="[0.2,0.3)",
+ org.eclipse.kura.net.route;version="[0.2,0.3)",
+ org.eclipse.kura.net.wifi;version="[0.2,0.3)",
+ org.eclipse.kura.system;version="[0.2,1.0)",
+ org.eclipse.kura.usb;version="[0.2,1.0)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.osgi.util.tracker;version="1.5.1",
+ org.slf4j;version="1.6.4"
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.kura.net.admin; version="0.2.0",org.eclips
+ e.kura.net.admin.modem; version="0.2.0"
diff --git a/kura/org.eclipse.kura.net.admin/OSGI-INF/dnsMonitor.xml b/kura/org.eclipse.kura.net.admin/OSGI-INF/dnsMonitor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..984afc8901382e394307de78b5b4068ba7db3f69
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/OSGI-INF/dnsMonitor.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.kura.net.dns.DnsMonitorService">
+   <implementation class="org.eclipse.kura.net.admin.monitor.DnsMonitorServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.dns.DnsMonitorService"/>
+   </service>
+   <reference bind="setNetworkConfigurationService" cardinality="1..1" interface="org.eclipse.kura.net.admin.NetworkConfigurationService" name="NetworkConfigurationService" policy="static" unbind="unsetNetworkConfigurationService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.net.admin/OSGI-INF/ethernetMonitor.xml b/kura/org.eclipse.kura.net.admin/OSGI-INF/ethernetMonitor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..22278813f67b85a7ad6f7b80b2471ba2ecc5965f
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/OSGI-INF/ethernetMonitor.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.kura.net.EthernetMonitorService">
+   <implementation class="org.eclipse.kura.net.admin.monitor.EthernetMonitorServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.EthernetMonitorService"/>
+   </service>
+   <reference name="EventAdmin" 
+              cardinality="1..1" 
+              policy="static"
+              bind="setEventAdmin"
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/>
+   <reference bind="setNetworkService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkService" name="NetworkService" policy="static" unbind="unsetNetworkService"/>
+   <reference bind="setNetworkAdminService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkAdminService" name="NetworkAdminService" policy="static" unbind="unsetNetworkAdminService"/>
+   <reference bind="setNetworkConfigurationService" cardinality="1..1" interface="org.eclipse.kura.net.admin.NetworkConfigurationService" name="NetworkConfigurationService" policy="static" unbind="unsetNetworkConfigurationService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.net.admin/OSGI-INF/modemMonitor.xml b/kura/org.eclipse.kura.net.admin/OSGI-INF/modemMonitor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..08efde8371a5626abaeafff38692996ff32aa7a7
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/OSGI-INF/modemMonitor.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.kura.net.CellularMonitorService">
+   <implementation class="org.eclipse.kura.net.admin.monitor.ModemMonitorServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.modem.ModemMonitorService"/>
+      <provide interface="org.eclipse.kura.net.admin.modem.ModemManagerService"/>
+   </service>
+   <reference bind="setNetworkService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkService" name="NetworkService" policy="static" unbind="unsetNetworkService"/>
+   <reference bind="setSystemService" cardinality="1..1" interface="org.eclipse.kura.system.SystemService" name="SystemService" policy="static" unbind="unsetSystemService"/>
+   <reference bind="setNetworkAdminService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkAdminService" name="NetworkAdminService" policy="static" unbind="unsetNetworkAdminService"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unsetEventAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.net.admin/OSGI-INF/networkAdmin.xml b/kura/org.eclipse.kura.net.admin/OSGI-INF/networkAdmin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0f10b6b69e14234b8958d70d801020722af7990f
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/OSGI-INF/networkAdmin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
+			name="org.eclipse.kura.net.admin.NetworkAdminService"
+	        enabled="true" 
+            immediate="true">
+   <implementation class="org.eclipse.kura.net.admin.NetworkAdminServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.NetworkAdminService"/>
+   </service>
+   <reference bind="setConfigurationService" cardinality="1..1" interface="org.eclipse.kura.configuration.ConfigurationService" name="ConfigurationService" policy="static" unbind="unsetConfigurationService"/>
+   <reference bind="setNetworkConfigurationService" cardinality="1..1" interface="org.eclipse.kura.net.admin.NetworkConfigurationService" name="NetworkConfigurationService" policy="static" unbind="unsetNetworkConfigurationService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.net.admin/OSGI-INF/networkConfigurationService.xml b/kura/org.eclipse.kura.net.admin/OSGI-INF/networkConfigurationService.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c84658b8d553c2b20fd9e5e6eb971f656aa660b4
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/OSGI-INF/networkConfigurationService.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" configuration-policy="require" deactivate="deactivate" immediate="true" modified="updated" name="org.eclipse.kura.net.admin.NetworkConfigurationService">
+   <implementation class="org.eclipse.kura.net.admin.NetworkConfigurationServiceImpl"/>
+   <property name="service.pid" value="org.eclipse.kura.net.admin.NetworkConfigurationService"/>
+   <reference bind="setNetworkService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkService" name="NetworkService" policy="static" unbind="unsetNetworkService"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.admin.NetworkConfigurationService"/>
+   </service>
+   <reference bind="setUsbService" cardinality="1..1" interface="org.eclipse.kura.usb.UsbService" name="UsbService" policy="static" unbind="unsetUsbService"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unsetEventAdmin"/>
+   <reference bind="setModemManagerService" cardinality="0..1" interface="org.eclipse.kura.net.admin.modem.ModemManagerService" name="ModemManagerService" policy="dynamic" unbind="unsetModemManagerService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.net.admin/OSGI-INF/wifiMonitor.xml b/kura/org.eclipse.kura.net.admin/OSGI-INF/wifiMonitor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5da9c8f7b1035653ee371b61df78f3964a69977f
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/OSGI-INF/wifiMonitor.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.kura.net.WifiMonitorService">
+   <implementation class="org.eclipse.kura.net.admin.monitor.WifiMonitorServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.net.wifi.WifiClientMonitorService"/>
+   </service>
+   <reference name="EventAdmin" 
+              cardinality="1..1" 
+              policy="static"
+              bind="setEventAdmin"
+              unbind="unsetEventAdmin"
+              interface="org.osgi.service.event.EventAdmin"/>
+   <reference bind="setNetworkService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkService" name="NetworkService" policy="static" unbind="unsetNetworkService"/>
+   <reference bind="setNetworkAdminService" cardinality="1..1" interface="org.eclipse.kura.net.NetworkAdminService" name="NetworkAdminService" policy="static" unbind="unsetNetworkAdminService"/>
+   <reference bind="setNetworkConfigurationService" cardinality="1..1" interface="org.eclipse.kura.net.admin.NetworkConfigurationService" name="NetworkConfigurationService" policy="static" unbind="unsetNetworkConfigurationService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.net.admin/about.html b/kura/org.eclipse.kura.net.admin/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.net.admin/about_files/epl-v10.html b/kura/org.eclipse.kura.net.admin/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.net.admin/build.properties b/kura/org.eclipse.kura.net.admin/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5a0d9b7cfd3c0babdb756f9c0ecfd92e5630c81b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/build.properties
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/,\
+           src/main/resources/
+output.. = target/classes/
+bin.includes = .,\
+               META-INF/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/,\
+               src/main/resources/
+additional.bundles = slf4j.api,\
+                     org.eclipse.kura.api,\
+                     org.eclipse.kura.core,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util,\
+                     org.eclipse.kura.deployment.agent,\
+                     org.eclipse.equinox.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.net.admin/pom.xml b/kura/org.eclipse.kura.net.admin/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c1dff7472d92d86196adf4c3b52291f286220cb5
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.net.admin</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+	
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminConfiguration.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca7e62bdb38d40c0ec4b20d3b1cf4783b6aeac88
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminConfiguration.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin;
+
+public enum NetworkAdminConfiguration {
+	PLATFORM_INTERFACES,
+	CONFIG_MTU,
+	CONFIG_AUTOCONNECT,
+	CONFIG_DRIVER,
+	CONFIG_IPV4_DHCP_CLIENT_ENABLED,
+	CONFIG_IPV4_ADDRESS,
+	CONFIG_IPV4_PREFIX,
+	CONFIG_IPV4_GATEWAY,
+	CONFIG_DNS_SERVERS,
+	CONFIG_WINS_SERVERS,
+	CONFIG_IPV4_DHCP_SERVER_ENABLED,
+	CONFIG_IPV4_DHCP_SERVER_DEFAULT_LEASE_TIME,
+	CONFIG_IPV4_DHCP_SERVER_MAX_LEASE_TIME,
+	CONFIG_IPV4_DHCP_SERVER_PREFIX,
+	CONFIG_IPV4_DHCP_SERVER_RANGE_START,
+	CONFIG_IPV4_DHCP_SERVER_RANGE_END,
+	CONFIG_IPV4_DHCP_SERVER_PASS_DNS,
+	CONFIG_IPV4_DHCP_SERVER_NAT_ENABLED,
+    CONFIG_WIFI_MODE,
+    CONFIG_WIFI_ADHOC_SSID,
+    CONFIG_WIFI_ADHOC_HARDWARE_MODE,
+    CONFIG_WIFI_ADHOC_RADIO_MODE,
+    CONFIG_WIFI_ADHOC_SECURITY_TYPE,
+    CONFIG_WIFI_ADHOC_PASSPHRASE,
+    CONFIG_WIFI_ADHOC_CHANNEL,
+    CONFIG_WIFI_ADHOC_BGSCAN,
+    CONFIG_WIFI_INFRA_SSID,
+    CONFIG_WIFI_INFRA_HARDWARE_MODE,
+    CONFIG_WIFI_INFRA_RADIO_MODE,
+    CONFIG_WIFI_INFRA_SECURITY_TYPE,
+    CONFIG_WIFI_INFRA_PASSPHRASE,
+    CONFIG_WIFI_INFRA_PAIRWISE_CIPHERS,
+    CONFIG_WIFI_INFRA_GROUP_CIPHERS,
+    CONFIG_WIFI_INFRA_CHANNEL,
+    CONFIG_WIFI_INFRA_BGSCAN,
+    CONFIG_WIFI_MASTER_SSID,
+    CONFIG_WIFI_MASTER_BROADCAST_ENABLED,
+    CONFIG_WIFI_MASTER_HARDWARE_MODE,
+    CONFIG_WIFI_MASTER_RADIO_MODE,
+    CONFIG_WIFI_MASTER_SECURITY_TYPE,
+    CONFIG_WIFI_MASTER_PASSPHRASE,
+    CONFIG_WIFI_MASTER_CHANNEL,
+    CONFIG_WIFI_MASTER_BGSCAN,
+	USB_PORT,
+	USB_MANUFACTURER,
+	USB_PRODUCT,
+	USB_MANUFACTURER_ID,
+	USB_PRODUCT_ID,
+	WIFI_CAPABILITIES
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminConfigurationMessages.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminConfigurationMessages.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c78a262f9620bd9cea64de78ab17386e65bd54e
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminConfigurationMessages.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin;
+
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class NetworkAdminConfigurationMessages {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(NetworkAdminConfigurationMessages.class);
+	
+	private static final String NETWORK_ADMIN_CONFIGURATION_MESSAGES_BUNDLE = "org.eclipse.kura.net.admin.messages.NetworkAdminConfigurationMessagesBundle";
+	
+	public static String getMessage(NetworkAdminConfiguration code) {
+		return getLocalizedMessage(Locale.getDefault(), code);
+	}
+	
+    private static String getLocalizedMessage(Locale locale, NetworkAdminConfiguration code) {
+
+        //
+        // Load the message pattern from the bundle
+        String message = null;
+        ResourceBundle resourceBundle = null;
+        try {
+                resourceBundle = ResourceBundle.getBundle(NETWORK_ADMIN_CONFIGURATION_MESSAGES_BUNDLE, locale);
+                message = resourceBundle.getString(code.name());
+                if (message == null) {
+                        s_logger.warn("Could not find Configuration Message for Locale {} and code {}", locale, code);
+                }
+        } catch (MissingResourceException mre) {
+                // log the failure to load a message bundle
+                s_logger.warn("Could not find Messages Bundle for Locale {}", locale);
+                mre.printStackTrace();
+        }
+
+        return message;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminServiceImpl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d6a36206b1435068b1ef0313a7423f48b516661
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkAdminServiceImpl.java
@@ -0,0 +1,1368 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin;
+
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.configuration.SelfConfiguringComponent;
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.eclipse.kura.core.net.AbstractNetInterface;
+import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.linux.net.dhcp.DhcpServerManager;
+import org.eclipse.kura.linux.net.dns.LinuxNamed;
+import org.eclipse.kura.linux.net.iptables.LinuxFirewall;
+import org.eclipse.kura.linux.net.iptables.LocalRule;
+import org.eclipse.kura.linux.net.iptables.NATRule;
+import org.eclipse.kura.linux.net.iptables.PortForwardRule;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.linux.net.wifi.HostapdManager;
+import org.eclipse.kura.linux.net.wifi.WpaSupplicant;
+import org.eclipse.kura.linux.net.wifi.WpaSupplicantManager;
+import org.eclipse.kura.linux.net.wifi.WpaSupplicantStatus;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfig6;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetConfigIP6;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkAdminService;
+import org.eclipse.kura.net.NetworkPair;
+import org.eclipse.kura.net.admin.event.NetworkConfigurationChangeEvent;
+import org.eclipse.kura.net.admin.visitor.linux.WpaSupplicantConfigWriter;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.dhcp.DhcpServerConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.eclipse.kura.net.firewall.FirewallOpenPortConfigIP;
+import org.eclipse.kura.net.firewall.FirewallOpenPortConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallPortForwardConfigIP;
+import org.eclipse.kura.net.firewall.FirewallPortForwardConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallReverseNatConfig;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiHotspotInfo;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetworkAdminServiceImpl implements NetworkAdminService, EventHandler {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(NetworkAdminServiceImpl.class);
+	
+    private ComponentContext                   m_ctx;
+	private ConfigurationService               m_configurationService;
+	private NetworkConfigurationService		   m_networkConfigurationService;
+	
+	private boolean m_pendingChange = false;
+	
+    private final static String[] EVENT_TOPICS = new String[] {
+        NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC,
+    };
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+    public void setConfigurationService(ConfigurationService configurationService) {
+        m_configurationService = configurationService;
+    }
+    
+    public void unsetConfigurationService(ConfigurationService configurationService) {
+        m_configurationService = null;
+    }
+    
+    public void setNetworkConfigurationService(NetworkConfigurationService networkConfigurationService) {
+        m_networkConfigurationService = networkConfigurationService;
+    }
+    
+    public void unsetNetworkConfigurationService(NetworkConfigurationService networkConfigurationService) {
+        m_networkConfigurationService = null;
+    }
+    
+    
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext) {
+		
+		s_logger.debug("Activating NetworkAdmin Service...");
+        // save the bundle context
+        m_ctx = componentContext;
+
+		//since we are just starting up, start named if needed
+		LinuxNamed linuxNamed;
+		try {
+			linuxNamed = LinuxNamed.getInstance();
+			if(linuxNamed.isConfigured()) {
+				linuxNamed.disable();
+				linuxNamed.enable();
+			}
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+		
+        Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+        d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+        m_ctx.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+        s_logger.debug("Done Activating NetworkAdmin Service...");
+	}
+	
+	
+	protected void deactivate(ComponentContext componentContext) 
+	{
+	}
+
+	@Override
+	public List<? extends NetInterfaceConfig<? extends NetInterfaceAddressConfig>> getNetworkInterfaceConfigs() throws KuraException {
+	    
+		try {
+			s_logger.debug("Getting all networkInterfaceConfigs");
+			return m_networkConfigurationService.getNetworkConfiguration().getNetInterfaceConfigs();
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	@Override
+	public List<NetConfig> getNetworkInterfaceConfigs(String interfaceName)
+			throws KuraException {
+	    
+	    ArrayList<NetConfig> netConfigs = new ArrayList<NetConfig>();
+	    ComponentConfiguration componentConfiguration = ((SelfConfiguringComponent)m_networkConfigurationService).getConfiguration();
+	    if ((interfaceName != null) && (componentConfiguration != null)) {
+	    	try {
+	    		s_logger.debug("Getting networkInterfaceConfigs for " + interfaceName);
+				NetworkConfiguration networkConfig = new NetworkConfiguration(componentConfiguration.getConfigurationProperties());
+				if(networkConfig != null && networkConfig.getNetInterfaceConfigs() != null && networkConfig.getNetInterfaceConfigs().size() > 0) {
+		    	    for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : networkConfig.getNetInterfaceConfigs()) {
+		    	        if(interfaceName.equals(netInterfaceConfig.getName())) {
+		    	            List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+		    	            if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+		        	            for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+		        	                netConfigs.addAll(netInterfaceAddressConfig.getConfigs());
+		        	            }
+		    	            }
+		    	            
+		    	            break;
+		    	        }
+		    	    }
+				}
+	    	} catch (Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+	    }
+	    
+		return netConfigs;
+	}
+
+	@Override
+	public void updateEthernetInterfaceConfig(String interfaceName,
+			boolean autoConnect, int mtu, List<NetConfig> netConfigs)
+			throws KuraException {
+		
+		NetConfigIP4 netConfig4 = null;
+		NetConfigIP6 netConfig6 = null;
+		DhcpServerConfigIP4 dhcpServerConfigIP4 = null;
+		FirewallNatConfig natConfig = null;
+		boolean hadNetConfig4 = false, hadNetConfig6 = false, hadDhcpServerConfigIP4 = false, hadNatConfig = false;
+		
+		if(netConfigs != null && netConfigs.size() > 0) {
+			for(NetConfig netConfig : netConfigs) {
+				if(!netConfig.isValid()) {
+					throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "NetConfig Configuration is invalid: " + netConfig.toString());
+				}
+				if(netConfig instanceof NetConfigIP4) {
+					netConfig4 = (NetConfigIP4)netConfig;
+				} else if(netConfig instanceof NetConfigIP6) {
+					netConfig6 = (NetConfigIP6)netConfig;
+				} else if(netConfig instanceof DhcpServerConfigIP4) {
+					dhcpServerConfigIP4 = (DhcpServerConfigIP4) netConfig;
+				} else if(netConfig instanceof FirewallNatConfig) {
+					natConfig = (FirewallNatConfig) netConfig;
+				}
+			}
+		}
+		
+		//validation
+		if ((netConfig4 == null) && (netConfig6 == null)){
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, "Either IPv4 or IPv6 configuration must be defined");
+		}
+		
+		List<String> modifiedInterfaceNames = new ArrayList<String>();
+		boolean configurationChanged = false;
+	
+		ComponentConfiguration originalNetworkComponentConfiguration = ((SelfConfiguringComponent)m_networkConfigurationService).getConfiguration();
+		if (originalNetworkComponentConfiguration == null) {
+			s_logger.debug("Returning for some unknown reason - no existing config???");
+			return;
+		}
+		try {
+			NetworkConfiguration newNetworkConfiguration = new NetworkConfiguration(originalNetworkComponentConfiguration.getConfigurationProperties());
+			List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = newNetworkConfiguration.getNetInterfaceConfigs();
+			for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+				if (netInterfaceConfig.getName().equals(interfaceName)) {
+					//handle MTU
+					if(mtu != netInterfaceConfig.getMTU()) {
+						AbstractNetInterface<?> absNetInterfaceConfig = (AbstractNetInterface<?>)netInterfaceConfig;
+						s_logger.debug("updating MTU for " + interfaceName);
+						absNetInterfaceConfig.setMTU(mtu);
+						configurationChanged = true;
+						if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+					}
+					
+					//handle autoconnect
+					if(autoConnect != netInterfaceConfig.isAutoConnect()) {
+						AbstractNetInterface<?> absNetInterfaceConfig = (AbstractNetInterface<?>)netInterfaceConfig;
+						s_logger.debug("updating autoConnect for " + interfaceName + " to be " + autoConnect);
+						absNetInterfaceConfig.setAutoConnect(autoConnect);
+						configurationChanged = true;
+						if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+					}
+					
+					//replace existing configs
+					List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+					if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+						for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+							List<NetConfig> existingNetConfigs = netInterfaceAddressConfig.getConfigs();
+							List<NetConfig> newNetConfigs = new ArrayList<NetConfig>();
+							for(NetConfig netConfig : existingNetConfigs) {
+								s_logger.debug("looking at existing NetConfig for " + interfaceName + " with value: " + netConfig.toString());			
+								if(netConfig instanceof NetConfigIP4) {
+									if(netConfig4 == null) {
+										s_logger.debug("removing NetConfig4 for " + interfaceName);
+									} else {
+										hadNetConfig4 = true;
+                                        newNetConfigs.add(netConfig4);
+										if(!netConfig.equals(netConfig4)) {									
+											s_logger.debug("updating NetConfig4 for " + interfaceName);
+											s_logger.debug("Is new State DHCP? " + ((NetConfigIP4)netConfig4).isDhcp());
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating NetConfig4 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof NetConfig6) {
+									if(netConfig6 == null) {
+										s_logger.debug("removing NetConfig6 for " + interfaceName);
+									} else {
+										hadNetConfig6 = true;
+                                        newNetConfigs.add(netConfig6);
+										if(!netConfig.equals(netConfig6)) {
+											s_logger.debug("updating NetConfig6 for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating NetConfig6 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof DhcpServerConfigIP4) {
+									if(dhcpServerConfigIP4 == null) {
+										s_logger.debug("removing DhcpServerConfigIP4 for " + interfaceName);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									} else {
+										hadDhcpServerConfigIP4 = true;
+                                        newNetConfigs.add(dhcpServerConfigIP4);
+										if(!netConfig.equals(dhcpServerConfigIP4)) {
+											s_logger.debug("updating DhcpServerConfigIP4 for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating DhcpServerConfigIP4 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof FirewallNatConfig) {
+									if(natConfig == null) {
+										s_logger.debug("removing FirewallNatConfig for " + interfaceName);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									} else {
+										hadNatConfig = true;
+                                        newNetConfigs.add(natConfig);
+										if(!netConfig.equals(natConfig)) {
+											s_logger.debug("updating FirewallNatConfig for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating FirewallNatConfig for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else {
+									s_logger.debug("Found unsupported configuration: " + netConfig.toString());
+								}
+							}
+							
+							// add configs that did not match any in the current configuration
+							if(netConfigs != null && netConfigs.size() > 0) {
+								for(NetConfig netConfig : netConfigs) {
+									if(netConfig instanceof NetConfigIP4 && !hadNetConfig4) {
+										s_logger.debug("adding new NetConfig4 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof NetConfigIP6 && !hadNetConfig6) {
+										s_logger.debug("adding new NetConfig6 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof DhcpServerConfigIP4 && !hadDhcpServerConfigIP4) {
+										s_logger.debug("adding new DhcpServerConfigIP4 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof FirewallNatConfig && !hadNatConfig) {
+										s_logger.debug("adding new FirewallNatConfig to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+								}
+							}
+							
+							for(NetConfig netConfig : newNetConfigs) {
+								s_logger.debug("New NetConfig: " + netConfig.getClass().toString() + " :: " + netConfig.toString());
+							}
+								
+							// replace with new list
+							((NetInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(newNetConfigs);
+						}
+				    }
+				}
+			}
+			
+			if (configurationChanged) {
+			    submitConfiguration(modifiedInterfaceNames, newNetworkConfiguration);
+			}
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void updateWifiInterfaceConfig(String interfaceName,
+			boolean autoConnect, WifiAccessPoint accessPoint,
+			List<NetConfig> netConfigs) throws KuraException {
+		
+		NetConfigIP4 netConfig4 = null;
+		NetConfigIP6 netConfig6 = null;
+		WifiConfig wifiConfig = null;
+		DhcpServerConfigIP4 dhcpServerConfigIP4 = null;
+		FirewallNatConfig natConfig = null;
+		boolean hadNetConfig4 = false, hadNetConfig6 = false, hadWifiConfig = false, hadDhcpServerConfigIP4 = false, hadNatConfig = false;
+		
+		if(netConfigs != null && netConfigs.size() > 0) {
+			for(NetConfig netConfig : netConfigs) {
+				if(!netConfig.isValid()) {
+					throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "NetConfig Configuration is invalid: " + netConfig.toString());
+				}
+
+				if(netConfig instanceof NetConfigIP4) {
+					s_logger.debug("got new NetConfigIP4");
+					netConfig4 = (NetConfigIP4)netConfig;
+				} else if(netConfig instanceof NetConfigIP6) {
+					s_logger.debug("got new NetConfigIP6");
+					netConfig6 = (NetConfigIP6)netConfig;
+				} else if(netConfig instanceof WifiConfig) {
+					s_logger.debug("got new WifiConfig");
+					wifiConfig = (WifiConfig)netConfig;
+				} else if(netConfig instanceof DhcpServerConfigIP4) {
+					s_logger.debug("got new DhcpServerConfigIP4");
+					dhcpServerConfigIP4 = (DhcpServerConfigIP4) netConfig;
+				} else if(netConfig instanceof FirewallNatConfig) {
+					s_logger.debug("got new NatConfig");
+					natConfig = (FirewallNatConfig) netConfig;
+				}
+			}
+		}
+		
+		//validation
+		if(netConfig4 == null && netConfig6 == null) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, "Either IPv4 or IPv6 configuration must be defined");
+		}
+		if (wifiConfig == null) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, "WiFi configuration must be defined");
+		}
+		
+		List<String> modifiedInterfaceNames = new ArrayList<String>();
+		boolean configurationChanged = false;
+		
+		ComponentConfiguration originalNetworkComponentConfiguration = ((SelfConfiguringComponent)m_networkConfigurationService).getConfiguration();
+		if (originalNetworkComponentConfiguration == null) {
+			return;
+		}
+		try {
+			NetworkConfiguration newNetworkConfiguration = new NetworkConfiguration(originalNetworkComponentConfiguration.getConfigurationProperties());
+			List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = newNetworkConfiguration.getNetInterfaceConfigs();
+			for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+				if (netInterfaceConfig.getName().equals(interfaceName)) {
+					
+					//replace existing configs
+					List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+					if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+						for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+							List<NetConfig> existingNetConfigs = netInterfaceAddressConfig.getConfigs();
+							List<NetConfig> newNetConfigs = new ArrayList<NetConfig>();
+							WifiMode newWifiMode = (wifiConfig != null) ? wifiConfig.getMode() : null;
+							for(NetConfig netConfig : existingNetConfigs) {
+								s_logger.debug("looking at existing NetConfig for " + interfaceName + " with value: " + netConfig.toString());			
+								if(netConfig instanceof NetConfigIP4) {
+									if(netConfig4 == null) {
+										s_logger.debug("removing NetConfig4 for " + interfaceName);
+									} else {
+										hadNetConfig4 = true;
+										newNetConfigs.add(netConfig4);
+										if(!netConfig.equals(netConfig4)) {									
+											s_logger.debug("updating NetConfig4 for " + interfaceName);
+											s_logger.debug("Is new State DHCP? " + ((NetConfigIP4)netConfig4).isDhcp());
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating NetConfig4 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof NetConfig6) {
+									if(netConfig6 == null) {
+										s_logger.debug("removing NetConfig6 for " + interfaceName);
+									} else {
+										hadNetConfig6 = true;
+                                        newNetConfigs.add(netConfig6);
+										if(!netConfig.equals(netConfig6)) {
+											s_logger.debug("updating NetConfig6 for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating NetConfig6 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof WifiConfig) {
+									if(wifiConfig == null) {
+										s_logger.debug("removing wifiConfig for " + interfaceName);
+									} else {
+                                        // There should be one new WifiConfig, which indicates the selected mode
+										// but there may be multiple current wifi configs, one for each mode (infra, master, adhoc)
+										// Check the one corresponding to the newly selected mode, and automatically the others
+										if(newWifiMode.equals(((WifiConfig) netConfig).getMode())) {
+											hadWifiConfig = true;
+                                            newNetConfigs.add(wifiConfig);
+										    s_logger.debug("checking WifiConfig for " + wifiConfig.getMode() + " mode");
+		    								if(!netConfig.equals(wifiConfig)) {	
+		    									s_logger.debug("updating WifiConfig for " + interfaceName);
+		    									configurationChanged = true;
+												if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+		    								} else {
+		    									s_logger.debug("not updating WifiConfig for " + interfaceName + " because it is unchanged");
+		    								}
+		    							} else {
+		    								// Keep the old WifiConfig for the non-selected wifi modes
+		    								s_logger.debug("adding other WifiConfig: " + netConfig);
+		    								newNetConfigs.add(netConfig);
+		    							}
+									}
+								} else if(netConfig instanceof DhcpServerConfigIP4) {
+									if(dhcpServerConfigIP4 == null) {
+										s_logger.debug("removing DhcpServerConfigIP4 for " + interfaceName);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									} else {
+										hadDhcpServerConfigIP4 = true;
+                                        newNetConfigs.add(dhcpServerConfigIP4);
+										if(!netConfig.equals(dhcpServerConfigIP4)) {
+											s_logger.debug("updating DhcpServerConfigIP4 for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating DhcpServerConfigIP4 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof FirewallNatConfig) {
+									if(natConfig == null) {
+										s_logger.debug("removing FirewallNatConfig for " + interfaceName);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									} else {
+										hadNatConfig = true;
+                                        newNetConfigs.add(natConfig);
+										if(!netConfig.equals(natConfig)) {
+											s_logger.debug("updating FirewallNatConfig for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating FirewallNatConfig for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else {
+									s_logger.debug("Found unsupported configuration: " + netConfig.toString());
+								}
+							}
+	
+							// add configs that did not match any in the current configuration
+							if(netConfigs != null && netConfigs.size() > 0) {
+								for(NetConfig netConfig : netConfigs) {
+									if(netConfig instanceof NetConfigIP4 && !hadNetConfig4) {
+										s_logger.debug("adding new NetConfig4 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof NetConfigIP6 && !hadNetConfig6) {
+										s_logger.debug("adding new NetConfig6 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof WifiConfig && !hadWifiConfig) {
+										s_logger.debug("adding new WifiConfig to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof DhcpServerConfigIP4 && !hadDhcpServerConfigIP4) {
+										s_logger.debug("adding new DhcpServerConfigIP4 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof FirewallNatConfig && !hadNatConfig) {
+										s_logger.debug("adding new FirewallNatConfig to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+								}
+							}
+							
+							// Update the wifi mode
+							if(newWifiMode != null) {
+	    						s_logger.debug("setting address config wifiMode to: " + newWifiMode);
+	    						((WifiInterfaceAddressConfigImpl)netInterfaceAddressConfig).setMode(newWifiMode);
+							}
+	
+	                        // replace with new list                        
+	                        for(NetConfig netConfig : newNetConfigs) {
+	                            s_logger.debug("Current NetConfig: " + netConfig.getClass().toString() + " :: " + netConfig.toString());
+	                        }
+							((WifiInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(newNetConfigs);
+						}
+				    }
+				}
+			}
+			
+			if (configurationChanged) {
+			    submitConfiguration(modifiedInterfaceNames, newNetworkConfiguration);
+			}
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void updateModemInterfaceConfig(String interfaceName,
+			String serialNum, String modemId, int pppNumber,
+			boolean autoConnect, int mtu, List<NetConfig> netConfigs)
+			throws KuraException {
+		
+	    NetConfigIP4 netConfig4 = null;
+		NetConfigIP6 netConfig6 = null;
+		ModemConfig modemConfig = null;
+		boolean hadNetConfig4 = false,  hadNetConfig6 = false, hadModemConfig = false;
+		
+		if(netConfigs != null && netConfigs.size() > 0) {
+			for(NetConfig netConfig : netConfigs) {
+				if(!netConfig.isValid()) {
+					throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "NetConfig Configuration is invalid: " + netConfig.toString());
+				}
+				if(netConfig instanceof NetConfigIP4) {
+					netConfig4 = (NetConfigIP4)netConfig;
+				} else if(netConfig instanceof NetConfigIP6) {
+					netConfig6 = (NetConfigIP6)netConfig;
+				} else if(netConfig instanceof ModemConfig) {
+					modemConfig = (ModemConfig)netConfig;
+				}
+			}
+		}
+		
+		//validation
+		if ((netConfig4 == null) && (netConfig6 == null)){
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, "Either IPv4 or IPv6 configuration must be defined");
+		}
+		if (modemConfig == null) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_REQUIRED_ATTRIBUTE_MISSING, "Modem configuration must be defined");
+		}
+		
+		List<String> modifiedInterfaceNames = new ArrayList<String>();
+		boolean configurationChanged = false;
+		
+		ComponentConfiguration originalNetworkComponentConfiguration = ((SelfConfiguringComponent)m_networkConfigurationService).getConfiguration();
+		if (originalNetworkComponentConfiguration == null) {
+			return;
+		}
+		try {
+			NetworkConfiguration newNetworkConfiguration = new NetworkConfiguration(originalNetworkComponentConfiguration.getConfigurationProperties());
+			List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = newNetworkConfiguration.getNetInterfaceConfigs();
+			for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+				if (netInterfaceConfig.getName().equals(interfaceName)) {
+					//handle MTU
+					if(mtu != netInterfaceConfig.getMTU()) {
+						AbstractNetInterface<?> absNetInterfaceConfig = (AbstractNetInterface<?>)netInterfaceConfig;
+						s_logger.debug("updating MTU for " + interfaceName);
+						absNetInterfaceConfig.setMTU(mtu);
+						configurationChanged = true;
+						if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+					}
+					
+					if(netInterfaceConfig instanceof ModemInterfaceConfigImpl) {
+					    ModemInterfaceConfigImpl modemInterfaceConfig = (ModemInterfaceConfigImpl)netInterfaceConfig;
+					    if(modemId == null)
+					        modemId = "";
+					    				    
+					    // handle modem id
+					    if(!modemId.equals(modemInterfaceConfig.getModemIdentifier())) {
+					        s_logger.debug("updating Modem identifier: " + modemId );
+					        modemInterfaceConfig.setModemIdentifier(modemId);
+		                    configurationChanged = true;
+							if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+		                }
+					    
+	                    // handle ppp num
+	                    if(pppNumber != modemInterfaceConfig.getPppNum()) {
+	                        s_logger.debug("updating PPP number: " + pppNumber);
+	                        modemInterfaceConfig.setPppNum(pppNumber);
+	                        configurationChanged = true;
+							if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+	                    }			    
+					}
+					
+					//replace existing configs
+					List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+					if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+						for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+							List<NetConfig> existingNetConfigs = netInterfaceAddressConfig.getConfigs();
+							List<NetConfig> newNetConfigs = new ArrayList<NetConfig>();
+							for(NetConfig netConfig : existingNetConfigs) {
+								s_logger.debug("looking at existing NetConfig for " + interfaceName + " with value: " + netConfig.toString());			
+								if(netConfig instanceof NetConfigIP4) {
+									if(netConfig4 == null) {
+										s_logger.debug("removing NetConfig4 for " + interfaceName);
+									} else {
+										hadNetConfig4 = true;
+                                        newNetConfigs.add(netConfig4);
+										if(!netConfig.equals(netConfig4)) {									
+											s_logger.debug("updating NetConfig4 for " + interfaceName);
+											s_logger.debug("Is new State DHCP? " + ((NetConfigIP4)netConfig4).isDhcp());
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating NetConfig4 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof NetConfig6) {
+									if(netConfig6 == null) {
+										s_logger.debug("removing NetConfig6 for " + interfaceName);
+									} else {
+										hadNetConfig6 = true;
+                                        newNetConfigs.add(netConfig6);
+										if(!netConfig.equals(netConfig6)) {
+											s_logger.debug("updating NetConfig6 for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating NetConfig6 for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else if(netConfig instanceof ModemConfig) {
+									if(modemConfig == null) {
+										s_logger.debug("removing ModemConfig for " + interfaceName);
+									} else {
+										hadModemConfig = true;
+                                        newNetConfigs.add(modemConfig);
+										if(!netConfig.equals(modemConfig)) {	
+											s_logger.debug("updating ModemConfig for " + interfaceName);
+											configurationChanged = true;
+											if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+										} else {
+											s_logger.debug("not updating ModemConfig for " + interfaceName + " because it is unchanged");
+										}
+									}
+								} else {
+									s_logger.debug("Found unsupported configuration: " + netConfig.toString());
+								}
+							}
+	
+							// add configs that did not match any in the current configuration
+							if(netConfigs != null && netConfigs.size() > 0) {
+								for(NetConfig netConfig : netConfigs) {
+									if(netConfig instanceof NetConfigIP4 && !hadNetConfig4) {
+										s_logger.debug("adding new NetConfig4 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof NetConfigIP6 && !hadNetConfig6) {
+										s_logger.debug("adding new NetConfig6 to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+									if(netConfig instanceof ModemConfig && !hadModemConfig) {
+										s_logger.debug("adding new ModemConfig to existing config for " + interfaceName);
+										newNetConfigs.add(netConfig);
+										configurationChanged = true;
+										if(!modifiedInterfaceNames.contains(interfaceName)) {modifiedInterfaceNames.add(interfaceName);}
+									}
+								}
+							}
+							
+							for(NetConfig netConfig : newNetConfigs) {
+								s_logger.debug("Current NetConfig: " + netConfig.getClass().toString() + " :: " + netConfig.toString());
+							}
+							
+							// replace with new list
+							((ModemInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(newNetConfigs);
+						}
+				    }
+				}
+				
+				newNetworkConfiguration.addNetInterfaceConfig(netInterfaceConfig);
+			}
+			
+			if (configurationChanged) {
+			    submitConfiguration(modifiedInterfaceNames, newNetworkConfiguration);
+			}
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void enableInterface(String interfaceName, boolean dhcp) throws KuraException {
+		try {
+			NetInterfaceType type = LinuxNetworkUtil.getType(interfaceName);
+
+			if(!LinuxNetworkUtil.isUp(interfaceName) ||
+					(type == NetInterfaceType.WIFI && !LinuxNetworkUtil.isLinkUp(interfaceName))) {
+
+				s_logger.info("bringing interface " + interfaceName + " up");
+				
+				if (type == NetInterfaceType.WIFI) {
+					enableWifiInterface(interfaceName);
+				}
+				if (dhcp) {
+					renewDhcpLease(interfaceName);
+				} else {
+					LinuxNetworkUtil.enableInterface(interfaceName);
+				}
+				
+				//if it isn't up - at least make sure the Ethernet controller is powered on
+				if(!LinuxNetworkUtil.isUp(interfaceName)) {
+					LinuxNetworkUtil.powerOnEthernetController(interfaceName);
+				}
+			} else {
+				s_logger.info("not bringing interface " + interfaceName + " up because it is already up");
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	@Override
+	public void disableInterface(String interfaceName) throws KuraException {
+		try {
+			if(LinuxNetworkUtil.isUp(interfaceName)) {
+				if(!interfaceName.equals("lo")) {
+					s_logger.info("bringing interface " + interfaceName + " down");
+				
+					manageDhcpServer(interfaceName, false, null);
+					
+					NetInterfaceType type = LinuxNetworkUtil.getType(interfaceName);
+				
+					if (type == NetInterfaceType.WIFI) {
+						disableWifiInterface(interfaceName);
+					}
+					
+					LinuxNetworkUtil.disableInterface(interfaceName);
+				}
+			} else {
+				s_logger.info("not bringing interface " + interfaceName + " down because it is already down");
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void manageDhcpServer(String interfaceName, boolean enable, NetworkPair<IP4Address> allowedNetwork) throws KuraException {
+		DhcpServerManager.disable(interfaceName);
+		
+		/*
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		
+		Set<LocalRule> localRules = firewall.getLocalRules();
+		if (localRules != null) {
+			LocalRule[] rules = localRules.toArray(new LocalRule[localRules.size()]);
+			for(int i=0; i<rules.length; i++) {
+				LocalRule rule = rules[i];
+				if(rule.getPermittedInterfaceName() != null) {
+					if(rule.getPermittedInterfaceName().equals(interfaceName) && rule.getPort() == 53) {
+						firewall.deleteLocalRule(rule);
+					} else if(rule.getPermittedInterfaceName().equals(interfaceName) && rule.getPort() == 67) {
+						firewall.deleteLocalRule(rule);
+					}
+				}
+			}
+		}*/
+		
+		if (enable) {
+			DhcpServerManager.enable(interfaceName);			
+			/*
+			firewall.addLocalRule(53, "udp", allowedNetwork.getIpAddress().getHostAddress(), Short.toString(allowedNetwork.getPrefix()), interfaceName, null, null, null);
+			firewall.addLocalRule(67, "udp", allowedNetwork.getIpAddress().getHostAddress(), Short.toString(allowedNetwork.getPrefix()), interfaceName, null, null, null);
+			*/
+		}
+	}
+	
+	public void renewDhcpLease(String interfaceName) throws KuraException {
+		try {
+			LinuxProcessUtil.start("dhclient -r " + interfaceName + "\n", true);
+			LinuxProcessUtil.start("dhclient " + interfaceName + "\n", true);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void manageFirewall (String gatewayIface) throws KuraException {
+		
+		// get desired NAT rules interfaces
+		LinkedHashSet<NATRule> desiredNatRules = null; 
+		ComponentConfiguration networkComponentConfiguration = ((SelfConfiguringComponent)m_networkConfigurationService).getConfiguration();
+		if ((gatewayIface != null) && (networkComponentConfiguration != null)) {
+			try {
+				NetworkConfiguration netConfiguration = new NetworkConfiguration(networkComponentConfiguration.getConfigurationProperties());
+				List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = netConfiguration.getNetInterfaceConfigs();
+				for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+					String ifaceName = netInterfaceConfig.getName();
+					List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+					if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+						for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+							List<NetConfig> existingNetConfigs = netInterfaceAddressConfig.getConfigs();
+							if(existingNetConfigs != null && existingNetConfigs.size() > 0) {
+								for(NetConfig netConfig : existingNetConfigs) {
+									if (netConfig instanceof FirewallNatConfig) {
+										if (desiredNatRules == null) {
+											desiredNatRules = new LinkedHashSet<NATRule>();
+										}
+										desiredNatRules.add(new NATRule(ifaceName, gatewayIface, true));
+									}
+								}
+							}
+						}
+					}
+				}
+			} catch (UnknownHostException e) {
+				e.printStackTrace();
+			}
+		}
+		
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		if (desiredNatRules != null) {
+			firewall.replaceAllNatRules(desiredNatRules); 
+		} else {
+			firewall.deleteAllNatRules();
+		}
+		firewall.enable();
+	}
+
+	@Override
+	public List<NetConfig> getFirewallConfiguration() throws KuraException {
+		
+		s_logger.debug("getting the firewall configuration");
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+
+		//convert the objects
+		//FIXME - should change the firewall implementation so we use the API config objects rather than local ones
+		Iterator<LocalRule> localRules = firewall.getLocalRules().iterator();
+		while(localRules.hasNext()) {
+		    LocalRule localRule = localRules.next();
+			s_logger.debug("Adding local rule " + localRule.getPort());
+			netConfigs.add(new FirewallOpenPortConfigIP4(localRule.getPort(), 
+					NetProtocol.valueOf(localRule.getProtocol()), 
+					localRule.getPermittedNetwork(),
+					localRule.getPermittedInterfaceName(),
+					localRule.getUnpermittedInterfaceName(),
+					localRule.getPermittedMAC(), 
+					localRule.getSourcePortRange()));
+		}
+		Iterator<PortForwardRule> portForwardRules = firewall.getPortForwardRules().iterator();
+		while(portForwardRules.hasNext()) {
+		    PortForwardRule portForwardRule = portForwardRules.next();
+			try {
+				s_logger.debug("Adding port forwarding " + portForwardRule.getIface());
+				netConfigs.add(new FirewallPortForwardConfigIP4(portForwardRule.getIface(),
+						(IP4Address) IPAddress.parseHostAddress(portForwardRule.getAddress()),
+						NetProtocol.valueOf(portForwardRule.getProtocol()),
+						portForwardRule.getInPort(),
+						portForwardRule.getOutPort(),
+						new NetworkPair<IP4Address>((IP4Address) IPAddress.parseHostAddress(portForwardRule.getPermittedNetwork()), (short)portForwardRule.getPermittedNetworkMask()),
+								portForwardRule.getPermittedMAC(),
+								portForwardRule.getSourcePortRange()
+								));
+			} catch (UnknownHostException e) {
+				e.printStackTrace();
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+		Iterator<NATRule> natRules = firewall.getNatRules().iterator();
+		while(natRules.hasNext()) {
+		    NATRule natRule = natRules.next();
+			s_logger.debug("Adding NAT rules " + natRule.getSourceInterface() );
+			netConfigs.add(new FirewallNatConfig(natRule.getSourceInterface(),
+					natRule.getDestinationInterface(),
+					natRule.isMasquerade()));
+		}
+
+		return netConfigs;
+	}
+
+	@Override
+	public void setFirewallOpenPortConfiguration(
+			List<FirewallOpenPortConfigIP<? extends IPAddress>> firewallConfiguration)
+			throws KuraException {
+		
+		s_logger.debug("Deleting local rules");
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		firewall.deleteAllLocalRules();
+		
+		for(FirewallOpenPortConfigIP<? extends IPAddress> openPortEntry : firewallConfiguration) {
+			s_logger.debug("Adding local rule for: " + openPortEntry.getPort());
+			
+			if(openPortEntry.getPermittedNetwork() == null || openPortEntry.getPermittedNetwork().getIpAddress() == null) {
+				try {
+					openPortEntry.setPermittedNetwork(new NetworkPair(IPAddress.parseHostAddress("0.0.0.0"), (short) 0));
+				} catch (UnknownHostException e) {
+					e.printStackTrace();
+				}
+			}
+			
+			firewall.addLocalRule(openPortEntry.getPort(), 
+					openPortEntry.getProtocol().name(), 
+					openPortEntry.getPermittedNetwork().getIpAddress().getHostAddress(), 
+					Short.toString(openPortEntry.getPermittedNetwork().getPrefix()), 
+					openPortEntry.getPermittedInterfaceName(),
+					openPortEntry.getUnpermittedInterfaceName(),
+					openPortEntry.getPermittedMac(), 
+					openPortEntry.getSourcePortRange());
+		}
+	}
+
+	@Override
+	public void setFirewallPortForwardingConfiguration(
+			List<FirewallPortForwardConfigIP<? extends IPAddress>> firewallConfiguration)
+			throws KuraException {
+		s_logger.debug("Deleting port forward rules");
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		firewall.deleteAllPortForwardRules();
+		
+		for(FirewallPortForwardConfigIP<? extends IPAddress> portForwardEntry : firewallConfiguration) {
+			s_logger.debug("Adding port forward rule for: " + portForwardEntry.getInPort());
+			
+			if(portForwardEntry.getPermittedNetwork() == null || portForwardEntry.getPermittedNetwork().getIpAddress() == null) {
+				try {
+					portForwardEntry.setPermittedNetwork(new NetworkPair(IPAddress.parseHostAddress("0.0.0.0"), (short) 0));
+				} catch (UnknownHostException e) {
+					e.printStackTrace();
+				}
+			}
+			
+			firewall.addPortForwardRule(portForwardEntry.getInterfaceName(), 
+					portForwardEntry.getAddress().getHostAddress(), 
+					portForwardEntry.getProtocol().name(), 
+					portForwardEntry.getInPort(), 
+					portForwardEntry.getOutPort(), 
+					portForwardEntry.getPermittedNetwork().getIpAddress().getHostAddress(), 
+					Short.toString(portForwardEntry.getPermittedNetwork().getPrefix()), 
+					portForwardEntry.getPermittedMac(), 
+					portForwardEntry.getSourcePortRange());
+		}
+	}
+	
+	public List<FirewallReverseNatConfig> getFirewallReverseNatConfiguration(
+			String sourceIface) throws KuraException {
+		
+		List<FirewallReverseNatConfig> reverseNatConfigs = new ArrayList<FirewallReverseNatConfig>();
+
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		Set<NATRule> reverseNatRules = firewall.getReverseNatRules();
+		Iterator<NATRule> it = reverseNatRules.iterator();
+		while (it.hasNext()) {
+			NATRule reverseNatRule = it.next();
+			if ((sourceIface != null) && sourceIface.equals(reverseNatRule.getSourceInterface())) {
+				
+				FirewallReverseNatConfig firewallReverseNatConfig = new FirewallReverseNatConfig(
+						reverseNatRule.getSourceInterface(),
+						reverseNatRule.getDestinationInterface(),
+						reverseNatRule.getProtocol(),
+						reverseNatRule.getSource(),
+						reverseNatRule.getDestination());
+				
+				reverseNatConfigs.add(firewallReverseNatConfig);
+			}
+		}
+		
+		return reverseNatConfigs;
+	}
+	
+	@Override
+	public void setFirewallReverseNatConfiguration(String inIface,
+			List<FirewallReverseNatConfig> reverseNatConfigs) throws KuraException {
+		
+		LinuxFirewall firewall = LinuxFirewall.getInstance();
+		firewall.deleteAllReverseNatRules(inIface);
+		for (FirewallReverseNatConfig revNatConfig : reverseNatConfigs) {
+			firewall.addNatRule(inIface,
+					revNatConfig.getDestinationInterface(),
+					revNatConfig.getProtocol(), revNatConfig.getSource(),
+					revNatConfig.getDestination(), true);
+		}
+	}
+	
+	public Map<String, WifiHotspotInfo> getWifiHotspots(String ifaceName) throws KuraException {
+		
+		Map<String, WifiHotspotInfo> mWifiHotspotInfo = new HashMap<String, WifiHotspotInfo>();
+		WifiMode wifiMode = WifiMode.UNKNOWN;
+		List<? extends NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = getNetworkInterfaceConfigs();
+	    for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+	        if(netInterfaceConfig.getName().equals(ifaceName)) {
+	            List<? extends NetInterfaceAddressConfig> netInterfaceAddresses = netInterfaceConfig.getNetInterfaceAddresses();
+	            if(netInterfaceAddresses != null) {
+	                for(NetInterfaceAddressConfig netInterfaceAddress : netInterfaceAddresses) {
+	                    if(netInterfaceAddress instanceof WifiInterfaceAddressConfig) {
+	                        wifiMode = ((WifiInterfaceAddressConfig) netInterfaceAddress).getMode();
+	                    }
+	                }
+	            }
+	            break;
+	        }
+	    }
+	    
+	    try {
+		    //NL80211 nl80211 = NL80211.getInstance(ifaceName);
+		    if (wifiMode == WifiMode.MASTER) {
+		    	WpaSupplicantConfigWriter wpaSupplicantConfigWriter = WpaSupplicantConfigWriter.getInstance();
+		    	wpaSupplicantConfigWriter.generateTempWpaSupplicantConf();
+		    	
+		    	s_logger.debug("getWifiHotspots() :: Starting temporary instance of wpa_supplicant");
+		    	StringBuilder key = new StringBuilder("net.interface." +  ifaceName + ".config.wifi.infra.driver");
+		    	String driver = KuranetConfig.getProperty(key.toString());
+		    	WpaSupplicantManager.startTemp(ifaceName, WifiMode.INFRA, driver);
+		    	//nl80211.setMode(WifiMode.INFRA, 3);
+		    }
+		    
+		    s_logger.info("getWifiHotspots() :: scanning for available access points ...");
+		    List<WifiAccessPoint> wifiAccessPoints = LinuxNetworkUtil.getAvailableAccessPoints(ifaceName, 3);
+		    for(WifiAccessPoint wap : wifiAccessPoints) {
+		    	
+		    	if ((wap.getSSID() == null) || (wap.getSSID().length() == 0)) {
+		    		s_logger.debug("Skipping hidden SSID");
+		    		continue;
+		    	}
+		    	
+		    	s_logger.trace("getWifiHotspots() :: SSID={}", wap.getSSID());
+		    	s_logger.trace("getWifiHotspots() :: Signal={}", wap.getStrength());
+		    	s_logger.trace("getWifiHotspots() :: Frequency={}", wap.getFrequency());
+		    	
+		    	byte [] baMacAddress = wap.getHardwareAddress();
+		    	StringBuffer sbMacAddress = new StringBuffer();
+		    	for (int i = 0; i < baMacAddress.length; i++) {
+		    		sbMacAddress.append(String.format("%02x", baMacAddress[i]&0x0ff).toUpperCase());
+		    		if (i < baMacAddress.length-1) {
+		    			sbMacAddress.append(':');
+		    		}
+		    	}
+		    	
+		    	WifiSecurity wifiSecurity = WifiSecurity.NONE;
+		    	
+		    	EnumSet<WifiSecurity> esWpaSecurity = wap.getWpaSecurity();
+		    	if ((esWpaSecurity != null) && (esWpaSecurity.size() > 0)) {
+		    		
+		    		wifiSecurity = WifiSecurity.SECURITY_WPA;
+		    		
+		    		Iterator<WifiSecurity> itWpaSecurity = esWpaSecurity.iterator();	
+			    	while (itWpaSecurity.hasNext()) {
+			    		s_logger.trace("getWifiHotspots() :: WPA Security={}", itWpaSecurity.next());
+			    	}
+		    	}
+		    	
+		    	EnumSet<WifiSecurity> esRsnSecurity = wap.getRsnSecurity();
+		    	if ((esRsnSecurity != null) && (esRsnSecurity.size() > 0)) {
+		    		if (wifiSecurity == WifiSecurity.SECURITY_WPA) {
+		    			wifiSecurity = WifiSecurity.SECURITY_WPA_WPA2;
+		    		} else {
+		    			wifiSecurity = WifiSecurity.SECURITY_WPA2;
+		    		}
+		    		Iterator<WifiSecurity> itRsnSecurity = esRsnSecurity.iterator();
+		    		while (itRsnSecurity.hasNext()) {
+			    		s_logger.trace("getWifiHotspots() :: RSN Security={}", itRsnSecurity.next());
+			    	}
+		    	}
+		    	
+		    	if (wifiSecurity == WifiSecurity.NONE) {
+		    		List<String> capabilities = wap.getCapabilities();
+		    		for (String capab : capabilities) {
+		    			if (capab.equals("Privacy")) {
+		    				wifiSecurity = WifiSecurity.SECURITY_WEP;
+		    				break;
+		    			}
+		    		}
+		    	}
+		    	
+		    	int frequency = (int)wap.getFrequency();
+		    	int channel = frequencyMhz2Channel(frequency);
+		    	
+		    	WifiHotspotInfo wifiHotspotInfo = new WifiHotspotInfo(wap.getSSID(), sbMacAddress.toString(), 0-wap.getStrength(), channel, frequency, wifiSecurity);
+		    	mWifiHotspotInfo.put(wap.getSSID(), wifiHotspotInfo);
+		    }
+		    /*
+		    if (nl80211.triggerScan()) {
+		    	wifiHotspotInfo = nl80211.getScanResults(3, 2);
+		    }
+		    */
+		    if (wifiMode == WifiMode.MASTER) {
+		    	if (WpaSupplicantManager.isTempRunning()) {
+					s_logger.debug("getWifiHotspots() :: stoping temporary instance of wpa_supplicant");
+					WpaSupplicantManager.stop();
+				}
+		    	//nl80211.setMode(WifiMode.MASTER);
+		    }
+	    } catch(Throwable t) {
+	    	t.printStackTrace();
+	    	throw new KuraException(KuraErrorCode.OPERATION_NOT_SUPPORTED, "Could not initialize NL80211");
+	    }
+	    
+	    return mWifiHotspotInfo;
+	}
+	
+	@Override
+	public boolean verifyWifiCredentials(String ifaceName, WifiConfig wifiConfig, int tout) {
+		
+		boolean ret = false;
+		boolean restartSupplicant = false;
+		WpaSupplicantConfigWriter wpaSupplicantConfigWriter = WpaSupplicantConfigWriter.getInstance();
+		try {
+			wpaSupplicantConfigWriter.generateTempWpaSupplicantConf(wifiConfig, ifaceName);
+
+			if (WpaSupplicantManager.isRunning()) {
+				s_logger.debug("verifyWifiCredentials() :: stoping wpa_supplicant");
+				WpaSupplicantManager.stop();
+				restartSupplicant = true;
+			}
+			s_logger.debug("verifyWifiCredentials() :: Restarting temporary instance of wpa_supplicant");
+			WpaSupplicantManager.startTemp(ifaceName, WifiMode.INFRA, wifiConfig.getDriver());
+			ret = isWifiConnectionCompleted(ifaceName, tout);
+			
+			if (WpaSupplicantManager.isTempRunning()) {
+				s_logger.debug("verifyWifiCredentials() :: stoping temporary instance of wpa_supplicant");
+				WpaSupplicantManager.stop();
+			}
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+		
+		if (restartSupplicant) {
+			try {
+				s_logger.debug("verifyWifiCredentials() :: Restarting wpa_supplicant");
+				WpaSupplicant wpaSupplicant = WpaSupplicant.getWpaSupplicant(ifaceName);
+				WpaSupplicantManager.start(ifaceName, wpaSupplicant.getMode(), wpaSupplicant.getDriver());
+				if (isWifiConnectionCompleted(ifaceName, tout)) {
+					this.renewDhcpLease(ifaceName);
+				}
+			} catch (KuraException e) {
+				e.printStackTrace();
+			}
+		}
+		
+		return ret;
+	}
+	
+    @Override
+    public void handleEvent(Event event) {
+        s_logger.debug("handleEvent - topic: " + event.getTopic());
+        String topic = event.getTopic();
+        if(topic.equals(NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC)) {
+            m_pendingChange = false;
+        }
+    }
+    
+    private boolean isWifiConnectionCompleted (String ifaceName, int tout) throws KuraException {
+    	
+    	boolean ret = false;
+    	long start = System.currentTimeMillis();
+		do {
+			try {
+				Thread.sleep(2000);
+			} catch (InterruptedException e) {
+			}
+			WpaSupplicantStatus wpaSupplicantStatus = new WpaSupplicantStatus(ifaceName);
+			String wpaState = wpaSupplicantStatus.getWpaState();
+			if ((wpaState != null) && (wpaState.equals("COMPLETED"))) {
+				ret = true;
+				break;
+			}
+		} while (System.currentTimeMillis()-start < tout*1000);
+		
+		return ret;
+    }
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------	
+	private void enableWifiInterface (String ifaceName) throws KuraException {
+		
+	    // ignore mon.* interface
+	    if(ifaceName.startsWith("mon.")) {
+	        return;
+	    }
+	    
+        NetInterfaceStatus status = NetInterfaceStatus.netIPv4StatusUnknown;
+	    WifiMode wifiMode = WifiMode.UNKNOWN;
+	    WifiConfig wifiConfig = null;
+	    
+	    List<? extends NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = getNetworkInterfaceConfigs();
+	    for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+	        if(netInterfaceConfig.getName().equals(ifaceName)) {
+	            List<? extends NetInterfaceAddressConfig> netInterfaceAddresses = netInterfaceConfig.getNetInterfaceAddresses();
+	            if(netInterfaceAddresses != null) {
+	                for(NetInterfaceAddressConfig netInterfaceAddress : netInterfaceAddresses) {
+	                    if(netInterfaceAddress instanceof WifiInterfaceAddressConfig) {
+	                        wifiMode = ((WifiInterfaceAddressConfig) netInterfaceAddress).getMode();
+	                        
+	                        for(NetConfig netConfig : netInterfaceAddress.getConfigs()) {
+	                            if(netConfig instanceof NetConfigIP4) {
+	                                status = ((NetConfigIP4) netConfig).getStatus();
+	                                s_logger.debug("Interface status is set to " + status);
+	                            } else if (netConfig instanceof WifiConfig) {
+	                                if(((WifiConfig)netConfig).getMode() == wifiMode) {
+	                                    wifiConfig = (WifiConfig) netConfig;
+	                                }
+	                            }
+	                        }
+	                    }
+	                }
+	            }
+	            break;
+	        }
+	    }
+	    
+        s_logger.debug("Configuring " + ifaceName + " for " + wifiMode + " mode");
+        
+        s_logger.debug("Stopping hostapd and wpa_supplicant");
+        HostapdManager.stop();
+        WpaSupplicantManager.stop();
+        
+        if (status == NetInterfaceStatus.netIPv4StatusEnabledLAN
+                && wifiMode.equals(WifiMode.MASTER)) {
+            
+            s_logger.debug("Starting hostapd");
+            HostapdManager.start();
+            
+        } else if((status == NetInterfaceStatus.netIPv4StatusEnabledLAN || status == NetInterfaceStatus.netIPv4StatusEnabledWAN)
+                && (wifiMode.equals(WifiMode.INFRA) || wifiMode.equals(WifiMode.ADHOC))) {
+
+            if(wifiConfig != null) {
+                s_logger.debug("Starting wpa_supplicant");
+                WpaSupplicantManager.start(ifaceName, wifiMode, wifiConfig.getDriver());
+            } else {
+                s_logger.warn("No WifiConfig configured for mode " + wifiMode);
+            }
+        } else {
+            s_logger.debug("Invalid wifi configuration - NetInterfaceStatus:" + status + ", WifiMode:" + wifiMode);
+        }
+	}
+	
+	private void disableWifiInterface (String ifaceName) throws KuraException {
+	    s_logger.debug("Stopping hostapd and wpa_supplicant");
+		HostapdManager.stop();
+		WpaSupplicantManager.stop();
+	}
+	
+	
+	// Submit new configuration, waiting for network configuration change event before returning
+	private void submitConfiguration(List<String> modifiedInterfaceNames, NetworkConfiguration networkConfiguration) throws KuraException {
+		short timeout = 30;		// in seconds
+	    
+	    m_pendingChange = true;
+	    if(modifiedInterfaceNames != null && !modifiedInterfaceNames.isEmpty()) {
+	    	networkConfiguration.setModifiedInterfaceNames(modifiedInterfaceNames);
+	    	s_logger.debug("Set modified interface names: " + modifiedInterfaceNames.toString());
+	    }
+	    m_networkConfigurationService.setNetworkConfiguration(networkConfiguration);
+	    m_configurationService.snapshot();
+	    
+        while(m_pendingChange && timeout > 0) {
+            timeout -= 0.5;
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+                // ignore
+            }
+        }
+        
+        if(m_pendingChange) {
+            s_logger.warn("Did not receive a network configuration change event");
+            m_pendingChange = false;
+        }
+	}
+	
+	private int frequencyMhz2Channel(int frequency) {
+		
+		int channel = (frequency - 2407)/5;
+		return channel;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkConfigurationService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkConfigurationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..52a1005226054e6b90359d81f835e30d2f02f19d
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkConfigurationService.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+
+
+public interface NetworkConfigurationService {
+    
+    public static final String PID = "org.eclipse.kura.net.admin.NetworkConfigurationService";
+    
+    public void setNetworkConfiguration(NetworkConfiguration networkConfiguration) throws KuraException;
+    
+    public NetworkConfiguration getNetworkConfiguration() throws KuraException;
+    
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkConfigurationServiceImpl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkConfigurationServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..790bae510a85f87b05b13875c6d60cfa22e6cedc
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/NetworkConfigurationServiceImpl.java
@@ -0,0 +1,1210 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.configuration.SelfConfiguringComponent;
+import org.eclipse.kura.core.configuration.ComponentConfigurationImpl;
+import org.eclipse.kura.core.configuration.metatype.ObjectFactory;
+import org.eclipse.kura.core.configuration.metatype.Tad;
+import org.eclipse.kura.core.configuration.metatype.Tocd;
+import org.eclipse.kura.core.configuration.metatype.Tscalar;
+import org.eclipse.kura.core.net.EthernetInterfaceConfigImpl;
+import org.eclipse.kura.core.net.EthernetInterfaceImpl;
+import org.eclipse.kura.core.net.LoopbackInterfaceConfigImpl;
+import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.core.net.WifiInterfaceImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceImpl;
+import org.eclipse.kura.deployment.agent.DeploymentAgentService;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.linux.net.modem.UsbModemDriver;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.LoopbackInterface;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceState;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.admin.event.NetworkConfigurationChangeEvent;
+import org.eclipse.kura.net.admin.modem.CellularModem;
+import org.eclipse.kura.net.admin.modem.ModemManagerService;
+import org.eclipse.kura.net.admin.modem.SupportedUsbModemsFactoryInfo;
+import org.eclipse.kura.net.admin.visitor.linux.LinuxReadVisitor;
+import org.eclipse.kura.net.admin.visitor.linux.LinuxWriteVisitor;
+import org.eclipse.kura.net.modem.ModemConnectionStatus;
+import org.eclipse.kura.net.modem.ModemConnectionType;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.usb.UsbModemDevice;
+import org.eclipse.kura.usb.UsbNetDevice;
+import org.eclipse.kura.usb.UsbService;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetworkConfigurationServiceImpl implements NetworkConfigurationService, SelfConfiguringComponent, EventHandler {
+    
+    public static final String UNCONFIGURED_MODEM_REGEX = "^\\d+-\\d+(\\.\\d+)?$";
+
+    private static final Logger s_logger = LoggerFactory.getLogger(NetworkConfigurationServiceImpl.class);
+        
+    private static Object lock = new Object();
+    
+	private final static String[] EVENT_TOPICS = {
+			DeploymentAgentService.EVENT_INSTALLED_TOPIC,
+			DeploymentAgentService.EVENT_UNINSTALLED_TOPIC };
+    
+    private NetworkService m_networkService;
+    private EventAdmin m_eventAdmin;
+    private UsbService m_usbService;
+    private ModemManagerService m_modemManagerService;
+    
+    private List<NetworkConfigurationVisitor> m_readVisitors;
+    private List<NetworkConfigurationVisitor> m_writeVisitors;
+    
+    private ScheduledExecutorService m_executorUtil;
+    private boolean m_firstConfig = true;
+    
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+    public void setNetworkService(NetworkService networkService) {
+        m_networkService = networkService;
+    }
+    
+    public void unsetNetworkService(NetworkService networkService) {
+        m_networkService = null;
+    }
+    
+    public void setEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = eventAdmin;
+    }
+
+    public void unsetEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = null;
+    }
+    
+    public void setUsbService(UsbService usbService) {
+        m_usbService = usbService;
+    }
+    
+    public void unsetUsbService(UsbService usbService) {
+        m_usbService = null;
+    }
+    
+    public void setModemManagerService(ModemManagerService modemManagerService) {
+    	s_logger.debug("Set the modem manager service");
+		m_modemManagerService = modemManagerService;
+	}
+	
+	public void unsetModemManagerService(ModemManagerService modemManagerService) {
+    	s_logger.debug("Unset the modem manager service");
+		modemManagerService = null;
+	}
+    
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	/* Do not have a default activate for this self configuring component because we are not using it at startup
+    protected void activate(ComponentContext componentContext) {}
+    */
+    
+    protected void activate(ComponentContext componentContext, Map<String,Object> properties) 
+    {
+        s_logger.debug("activate(componentContext, properties)...");
+        
+        m_readVisitors = new ArrayList<NetworkConfigurationVisitor>();
+        m_readVisitors.add(LinuxReadVisitor.getInstance());
+
+        m_writeVisitors = new ArrayList<NetworkConfigurationVisitor>();
+        m_writeVisitors.add(LinuxWriteVisitor.getInstance());
+        
+        // we are intentionally ignoring the properties from ConfigAdmin at startup
+        if(properties == null) {
+        	s_logger.debug("Got null properties...");
+        } else {
+        	s_logger.debug("Props..." + properties);
+        }
+        
+        Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+        d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+        componentContext.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+        
+        m_executorUtil = Executors.newSingleThreadScheduledExecutor();
+        m_executorUtil.schedule(new Runnable() {
+    		@Override
+    		public void run() {
+    			//make sure we don't miss the setting of firstConfig
+    			m_firstConfig = false;
+    		}
+    	}, /*5*/3, TimeUnit.MINUTES);
+    }
+    
+    protected void deactivate(ComponentContext componentContext) {
+        s_logger.debug("deactivate()");
+        m_writeVisitors = null;
+        m_readVisitors = null;
+        m_executorUtil.shutdownNow();
+    }
+    
+    @Override
+	public void handleEvent(Event event) {
+		s_logger.debug("handleEvent - topic: " + event.getTopic());
+        String topic = event.getTopic();
+        if (topic.equals(DeploymentAgentService.EVENT_INSTALLED_TOPIC)) {
+        	m_firstConfig = false;
+        }
+	}
+    
+    @Override
+    public void setNetworkConfiguration(NetworkConfiguration networkConfiguration) throws KuraException {
+    	updated(networkConfiguration.getConfigurationProperties());
+    }
+    
+    public void updated(Map<String,Object> properties) {
+    	synchronized (lock) {    	
+    		//skip the first config
+    		if(m_firstConfig) {
+    			s_logger.debug("Ignoring first configuration");
+    			m_firstConfig = false;
+    			return;
+    		}
+    		
+	        try {
+	        	if(properties != null) {
+	        		s_logger.debug("new properties - updating");
+	        		s_logger.debug("modified.interface.names: " + properties.get("modified.interface.names"));
+	        		
+	        		//dynamically insert the type properties..
+	        		Map<String,Object> modifiedProps = new HashMap<String, Object>();
+	        		modifiedProps.putAll(properties);
+	        		String interfaces = (String) properties.get("net.interfaces");
+	    			StringTokenizer st = new StringTokenizer(interfaces, ",");
+	    			while(st.hasMoreTokens()) {
+	    				String interfaceName = st.nextToken();
+	    				StringBuilder sb = new StringBuilder();
+	    				sb.append("net.interface.")
+	    				.append(interfaceName)
+	    				.append(".type");
+	    				
+	    				NetInterfaceType type = LinuxNetworkUtil.getType(interfaceName);
+	                    if(type == NetInterfaceType.UNKNOWN) {
+	                        if (interfaceName.matches(UNCONFIGURED_MODEM_REGEX)) {
+	                        	// If the interface name is in a form such as "1-3.4" (USB address), assume it is a modem
+	                    		type = NetInterfaceType.MODEM;
+	                    	} else {
+	                    		SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+	                    		if ((serialModemInfo != null) && (serialModemInfo.getModemName().equals(interfaceName))) {
+	                    			type = NetInterfaceType.MODEM;
+	                    		}
+	                    	}
+	                    }
+	    				modifiedProps.put(sb.toString(), type.toString());
+	    			}
+	        		
+	        		NetworkConfiguration networkConfig = new NetworkConfiguration(modifiedProps);
+	        	
+	        		for(NetworkConfigurationVisitor visitor : m_writeVisitors) {
+	        			networkConfig.accept(visitor);
+	        		}
+	    
+	        		//raise the event because there was a change
+					m_eventAdmin.postEvent(new NetworkConfigurationChangeEvent(modifiedProps));
+	            } else {
+	            	s_logger.debug("properties are null");
+	            }
+	        } catch (Exception e) {
+	            // TODO - would still want an event if partially successful?
+	        	s_logger.error("Error updating the configuration", e);
+	        }
+    	}
+    }
+    
+    @Override
+    public ComponentConfiguration getConfiguration() throws KuraException {
+    	synchronized (lock) {
+	        s_logger.debug("getConfiguration()");
+	        try {
+	            NetworkConfiguration networkConfiguration = getNetworkConfiguration();
+	            return new ComponentConfigurationImpl(PID, getDefinition(), networkConfiguration.getConfigurationProperties());
+	        } catch (Exception e) {
+	            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+	        }
+    	}
+    }
+    
+    //@Override
+    public NetworkConfiguration getNetworkConfiguration() throws KuraException 
+    {	
+        try {
+        	synchronized (lock) {
+	            NetworkConfiguration networkConfiguration = new NetworkConfiguration();
+	            
+	            // Get the current values
+	            List<NetInterface<? extends NetInterfaceAddress>> allNetworkInterfaces = m_networkService.getNetworkInterfaces();
+	            Map<String, NetInterface<? extends NetInterfaceAddress>> allNetworkInterfacesMap = new HashMap<String, NetInterface<? extends NetInterfaceAddress>>();
+	            for(NetInterface<? extends NetInterfaceAddress> netInterface : allNetworkInterfaces) {
+	                allNetworkInterfacesMap.put(netInterface.getName(), netInterface);
+	            }
+	            
+	            List<NetInterface<? extends NetInterfaceAddress>> activeNetworkInterfaces = m_networkService.getActiveNetworkInterfaces();
+	            Map<String, NetInterface<? extends NetInterfaceAddress>> activeNetworkInterfacesMap = new HashMap<String, NetInterface<? extends NetInterfaceAddress>>();
+	            for(NetInterface<? extends NetInterfaceAddress> netInterface : activeNetworkInterfaces) {
+	                activeNetworkInterfacesMap.put(netInterface.getName(), netInterface);
+	            }
+	            
+	            // Create the NetInterfaceConfig objects
+	            List<String> interfaceNames = m_networkService.getAllNetworkInterfaceNames();        // TODO - include non-active modem interfaces
+	            s_logger.debug("Getting configs for " + interfaceNames.size() + " interfaces");
+	    
+	            if(interfaceNames != null) {
+	                for(String interfaceName : interfaceNames) {
+	                    // ignore mon interface
+	                    if(interfaceName.startsWith("mon.")) {
+	                        continue;
+	                    }
+	                    
+	                    NetInterfaceType type = LinuxNetworkUtil.getType(interfaceName);
+	                    if(type == NetInterfaceType.UNKNOWN) {
+	                    	if (interfaceName.matches(UNCONFIGURED_MODEM_REGEX)) {
+	                    		// If the interface name is in a form such as "1-3.4", assume it is a modem
+	                    		type = NetInterfaceType.MODEM;
+	                    	} else {
+	                    		SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+	                    		if ((serialModemInfo != null) && (serialModemInfo.getModemName().equals(interfaceName))) {
+	                    			type = NetInterfaceType.MODEM;
+	                    		}
+	                    	}
+	                    }
+	                    s_logger.debug("Getting config for " + interfaceName + ", type: " + type);
+	                    
+	                    NetInterface<? extends NetInterfaceAddress> activeNetInterface = activeNetworkInterfacesMap.get(interfaceName);                    
+	                    switch(type) {
+	                    case LOOPBACK:                    	
+	                        try {
+	                            LoopbackInterfaceConfigImpl loopbackInterfaceConfig = null;
+	                        	loopbackInterfaceConfig = buildLoopbackInterfaceConfig(interfaceName, activeNetInterface);
+	                        	networkConfiguration.addNetInterfaceConfig(loopbackInterfaceConfig);
+	                        }
+	                        catch (KuraException e) {
+	                        	s_logger.error("Error building LoopbackInterfaceConfig "+interfaceName+". Ignoring it.", e);
+	                        }                        
+	                        break;
+	                        
+	                    case ETHERNET:
+	                    	try {
+	                    		EthernetInterfaceConfigImpl ethernetInterfaceConfig = null;                        
+	                    		ethernetInterfaceConfig = buildEthernetInterfaceConfig(interfaceName, activeNetInterface);
+	                    		networkConfiguration.addNetInterfaceConfig(ethernetInterfaceConfig);
+	                        }
+	                        catch (KuraException e) {
+	                        	s_logger.error("Error building EthernetInterfaceConfig "+interfaceName+". Ignoring it.", e);
+	                        }                        
+	                        break;
+	                        
+	                    case WIFI:
+	                    	try {
+	                    		WifiInterfaceConfigImpl wifiInterfaceConfig = null;                        
+	                    		wifiInterfaceConfig = buildWifiInterfaceConfig(interfaceName, activeNetInterface);                        
+	                    		networkConfiguration.addNetInterfaceConfig(wifiInterfaceConfig);
+	                        }
+	                        catch (KuraException e) {
+	                        	s_logger.error("Error building WifiInterfaceConfig "+interfaceName+". Ignoring it.", e);
+	                        }                                            		
+	                        break;
+	                        
+	                    case MODEM:
+	                    	try {
+		                        ModemInterfaceConfigImpl modemInterfaceConfig = null;                        
+		                        modemInterfaceConfig = buildModemInterfaceConfig(allNetworkInterfacesMap, 
+		                        											     interfaceName, activeNetInterface);
+		                        networkConfiguration.addNetInterfaceConfig(modemInterfaceConfig);
+	                        }
+	                        catch (KuraException e) {
+	                        	s_logger.error("Error building ModemInterfaceConfig "+interfaceName+". Ignoring it.", e);
+	                        }                                            			                        
+	                        break;
+	                        
+	                    case UNKNOWN:
+	                        s_logger.info("Found interface of unknown type in current configuration: {}. Ignoring it.", interfaceName);
+	                        break;
+	                        
+	                    default:
+	                        s_logger.info("Unsupported type : " + type + " - not adding to configuration. Ignoring it.");
+	                    }
+	                }
+	            }
+	            
+	            // populate the NetInterfaceConfigs
+	            for(NetworkConfigurationVisitor visitor : m_readVisitors) {
+	                networkConfiguration.accept(visitor);
+	            }
+	  
+	/*
+	// DEBUG
+	s_logger.debug("*************** networkConfiguration.getConfigurationProperties()");
+	Map<String, Object> props = networkConfiguration.getConfigurationProperties();
+	for(String key : props.keySet()) {
+	    System.out.println("*** key: " + key + " === " + props.get(key));
+	}
+	*/
+	            return networkConfiguration;
+        	}
+        } catch (Exception e) {
+            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e, e.getMessage());
+        }
+    }
+
+    
+    
+	private ModemInterfaceConfigImpl buildModemInterfaceConfig(Map<String, NetInterface<? extends NetInterfaceAddress>> allNetworkInterfacesMap,
+														       String interfaceName,
+														       NetInterface<? extends NetInterfaceAddress> activeNetInterface)
+		throws KuraException 
+	{
+		ModemInterfaceConfigImpl modemInterfaceConfig;
+		if(activeNetInterface != null && activeNetInterface instanceof ModemInterfaceImpl) {
+		    // Copy current values
+		    modemInterfaceConfig = new ModemInterfaceConfigImpl((ModemInterfaceImpl<? extends NetInterfaceAddress>)activeNetInterface);
+		    s_logger.debug("getNetworkConfiguration() - new ModemInterfaceConfigImpl() - copying activeNetInterface");
+		} else {
+		    //modemInterfaceConfig = new ModemInterfaceConfigImpl(interfaceName);
+		    NetInterface<?> netInterface = allNetworkInterfacesMap.get(interfaceName);
+		    if(netInterface != null) {
+		        modemInterfaceConfig = new ModemInterfaceConfigImpl((ModemInterfaceImpl<? extends NetInterfaceAddress>)netInterface);
+		        s_logger.debug("getNetworkConfiguration() - new ModemInterfaceConfigImpl() - copying (inactive) netInterface");
+		    } else {
+		        modemInterfaceConfig = new ModemInterfaceConfigImpl(interfaceName);
+		        s_logger.debug("getNetworkConfiguration() - new ModemInterfaceConfigImpl() - new instance");
+		    }
+		}
+		
+		boolean isIfaceUp = LinuxNetworkUtil.isUp(interfaceName);
+		
+		if (modemInterfaceConfig.getNetInterfaceAddresses() == null
+				|| modemInterfaceConfig.getNetInterfaceAddresses().size() == 0) {
+
+			List<ModemInterfaceAddressConfig> modemInterfaceAddressConfigs = new ArrayList<ModemInterfaceAddressConfig>();
+			ModemInterfaceAddressConfigImpl modemInterfaceAddressConfig = new ModemInterfaceAddressConfigImpl();
+			modemInterfaceAddressConfigs.add(modemInterfaceAddressConfig);
+			modemInterfaceAddressConfig.setConnectionType(ModemConnectionType.PPP);
+			if (isIfaceUp) {
+				modemInterfaceAddressConfig.setConnectionStatus(ModemConnectionStatus.CONNECTED);
+			} else {
+				modemInterfaceAddressConfig.setConnectionStatus(ModemConnectionStatus.DISCONNECTED);
+			}
+			modemInterfaceConfig.setNetInterfaceAddresses(modemInterfaceAddressConfigs);
+		}
+		    
+		int mtu = -1;
+		NetInterfaceState netIfaceState = NetInterfaceState.DISCONNECTED;
+		if (isIfaceUp) {
+			try {
+				mtu = LinuxNetworkUtil.getCurrentMtu(interfaceName);
+				netIfaceState = NetInterfaceState.ACTIVATED;
+			} catch (Exception e) {
+				s_logger.warn("Could not get mtu for interface " + interfaceName);
+			}
+		}
+		
+		modemInterfaceConfig.setState(netIfaceState);
+		
+		modemInterfaceConfig.setMTU(mtu);
+		modemInterfaceConfig.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+		modemInterfaceConfig.setLoopback(false);
+		modemInterfaceConfig.setPointToPoint(true);
+		modemInterfaceConfig.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+		modemInterfaceConfig.setUp(LinuxNetworkUtil.isUp(interfaceName));
+
+		String modemUsbPort = m_networkService.getModemUsbPort(interfaceName);
+		if (modemUsbPort == null) {
+			modemUsbPort = interfaceName;
+		}
+		
+		if(m_modemManagerService != null) {
+			CellularModem modem = m_modemManagerService.getModemService(modemUsbPort);
+			if (modem != null) {
+				/*
+				s_logger.warn("<DEBUG> Manufacturer: " + modem.getManufacturer());
+				s_logger.warn("<DEBUG> Model: " + modem.getModel());
+				s_logger.warn("<DEBUG> Service Type: " + modem.getServiceType());
+				s_logger.warn("<DEBUG> isReachable? " + modem.isReachable());
+				s_logger.warn("<DEBUG> isRoaming? " + modem.isRoaming());
+				s_logger.warn("<DEBUG> Signal Strength = " + modem.getSignalStrength());
+				s_logger.warn("<DEBUG> Tx Counter = " + modem.getCallTxCounter());
+				s_logger.warn("<DEBUG> Rx Counter = "+ modem.getCallRxCounter());
+				*/
+				List<? extends UsbModemDriver> drivers = null;
+				ModemDevice modemDevice = modem.getModemDevice();
+				if (modemDevice instanceof UsbModemDevice) {
+					UsbModemDevice usbModemDevice = (UsbModemDevice)modemDevice;
+					modemInterfaceConfig.setUsbDevice(usbModemDevice);
+					drivers = SupportedUsbModemsFactoryInfo.getDeviceDrivers(usbModemDevice.getVendorId(), usbModemDevice.getProductId());
+				}
+				
+				String modemSerialNo = "";
+				String modemModel = "";
+				String modemRevisionID = "";
+				boolean gpsSupported = false; 
+				try {
+					modemSerialNo = modem.getSerialNumber();
+					modemModel = modem.getModel();
+					modemRevisionID = modem.getRevisionID();
+					gpsSupported = modem.isGpsSupported();
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+				
+				modemInterfaceConfig.setSerialNumber(modemSerialNo);
+				modemInterfaceConfig.setModel(modemModel);
+				modemInterfaceConfig.setFirmwareVersion(modemRevisionID);
+				modemInterfaceConfig.setGpsSupported(gpsSupported);
+				
+				if ((drivers != null) && (drivers.size() > 0)) {
+					UsbModemDriver driver = drivers.get(0);
+					modemInterfaceConfig.setDriver(driver.getName());
+				}
+				modemInterfaceConfig.setDriverVersion("unknown");
+			}
+		}
+
+		modemInterfaceConfig.setVirtual(false);
+		return modemInterfaceConfig;
+	}
+
+	
+	
+	private WifiInterfaceConfigImpl buildWifiInterfaceConfig(String interfaceName,
+															 NetInterface<? extends NetInterfaceAddress> activeNetInterface)
+		throws KuraException 
+	{
+		WifiInterfaceConfigImpl wifiInterfaceConfig;
+		if(activeNetInterface != null && activeNetInterface instanceof WifiInterfaceImpl) {
+		    // Copy current values
+		    wifiInterfaceConfig = new WifiInterfaceConfigImpl((WifiInterfaceImpl<? extends NetInterfaceAddress>)activeNetInterface);
+		} else {
+		    wifiInterfaceConfig = new WifiInterfaceConfigImpl(interfaceName);
+		}
+		
+		if(wifiInterfaceConfig.getNetInterfaceAddresses() == null 
+		        || wifiInterfaceConfig.getNetInterfaceAddresses().size() == 0) {
+
+		    List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = new ArrayList<WifiInterfaceAddressConfig>();
+		    wifiInterfaceAddressConfigs.add(new WifiInterfaceAddressConfigImpl());
+		    wifiInterfaceConfig.setAutoConnect(LinuxNetworkUtil.isAutoConnect(interfaceName));
+		    wifiInterfaceConfig.setNetInterfaceAddresses(wifiInterfaceAddressConfigs);
+		    s_logger.debug("MAC for " + interfaceName + ": " + LinuxNetworkUtil.getMacAddress(interfaceName));
+		    wifiInterfaceConfig.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+		    wifiInterfaceConfig.setLoopback(false);
+		    wifiInterfaceConfig.setMTU(LinuxNetworkUtil.getCurrentMtu(interfaceName));
+		    wifiInterfaceConfig.setPointToPoint(false);
+		    wifiInterfaceConfig.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+		    wifiInterfaceConfig.setUp(LinuxNetworkUtil.isUp(interfaceName));
+		    wifiInterfaceConfig.setCapabilities(LinuxNetworkUtil.getWifiCapabilities(interfaceName));
+		    
+		    //FIXME
+		    wifiInterfaceConfig.setDriver("unknown");
+		    wifiInterfaceConfig.setDriverVersion("unknown");
+		    wifiInterfaceConfig.setFirmwareVersion("unknown");
+		    wifiInterfaceConfig.setVirtual(false);
+		    /*
+		    wifiInterfaceConfig.setAutoConnect();
+		    wifiInterfaceConfig.setState(???);
+		    wifiInterfaceConfig.setUsbDevice(???);
+		    */
+		}
+		return wifiInterfaceConfig;
+	}
+
+	
+	
+	private EthernetInterfaceConfigImpl buildEthernetInterfaceConfig(String interfaceName,
+																	 NetInterface<? extends NetInterfaceAddress> activeNetInterface)
+		throws KuraException 
+	{
+		EthernetInterfaceConfigImpl ethernetInterfaceConfig;
+		if(activeNetInterface != null && activeNetInterface instanceof EthernetInterfaceImpl) {
+		    // Copy current values
+		    ethernetInterfaceConfig = new EthernetInterfaceConfigImpl((EthernetInterfaceImpl<? extends NetInterfaceAddress>)activeNetInterface);
+		    s_logger.debug("Active something? " + interfaceName + " with " + activeNetInterface);
+		} else {
+		    ethernetInterfaceConfig = new EthernetInterfaceConfigImpl(interfaceName);
+		}
+		
+		if(ethernetInterfaceConfig.getNetInterfaceAddresses() == null 
+		        || ethernetInterfaceConfig.getNetInterfaceAddresses().size() == 0) {
+
+		    List<NetInterfaceAddressConfig> ethernetInterfaceAddressConfigs = new ArrayList<NetInterfaceAddressConfig>();
+		    ethernetInterfaceAddressConfigs.add(new NetInterfaceAddressConfigImpl());
+		    ethernetInterfaceConfig.setAutoConnect(LinuxNetworkUtil.isAutoConnect(interfaceName));
+		    ethernetInterfaceConfig.setNetInterfaceAddresses(ethernetInterfaceAddressConfigs);
+		    s_logger.debug("MAC for " + interfaceName + ": " + LinuxNetworkUtil.getMacAddress(interfaceName));
+		    ethernetInterfaceConfig.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+		    ethernetInterfaceConfig.setLinkUp(LinuxNetworkUtil.isLinkUp(NetInterfaceType.ETHERNET, interfaceName));
+		    ethernetInterfaceConfig.setLoopback(false);
+		    ethernetInterfaceConfig.setMTU(LinuxNetworkUtil.getCurrentMtu(interfaceName));
+		    ethernetInterfaceConfig.setPointToPoint(false);
+		    ethernetInterfaceConfig.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+		    ethernetInterfaceConfig.setUp(LinuxNetworkUtil.isUp(interfaceName));
+
+		    //FIXME
+		    
+		    ethernetInterfaceConfig.setVirtual(false);
+		    /*
+		    ethernetInterfaceConfig.setAutoConnect();
+		    ethernetInterfaceConfig.setState(???);
+		    ethernetInterfaceConfig.setUsbDevice(???);
+		    */
+		}
+		Map<String, String> driver = LinuxNetworkUtil.getEthernetDriver(interfaceName);
+	    ethernetInterfaceConfig.setDriver(driver.get("name"));
+	    ethernetInterfaceConfig.setDriverVersion(driver.get("version"));
+	    ethernetInterfaceConfig.setFirmwareVersion(driver.get("firmware"));
+	    
+	    if (LinuxNetworkUtil.isUp(interfaceName)) {
+	    	ethernetInterfaceConfig.setState(NetInterfaceState.ACTIVATED);
+	    }
+	    else {
+	    	ethernetInterfaceConfig.setState(NetInterfaceState.DISCONNECTED);
+	    }
+	    
+	    s_logger.debug("Interface State: " + ethernetInterfaceConfig.getState());
+	    
+		return ethernetInterfaceConfig;
+	}
+
+	
+	
+	private LoopbackInterfaceConfigImpl buildLoopbackInterfaceConfig(String interfaceName,
+																	 NetInterface<? extends NetInterfaceAddress> activeNetInterface)
+		throws KuraException 
+	{
+		LoopbackInterfaceConfigImpl loopbackInterfaceConfig;
+		if(activeNetInterface != null && activeNetInterface instanceof LoopbackInterface) {
+		    // Copy current values
+		    loopbackInterfaceConfig = new LoopbackInterfaceConfigImpl((LoopbackInterface<? extends NetInterfaceAddress>)activeNetInterface);
+		} else {
+		    loopbackInterfaceConfig = new LoopbackInterfaceConfigImpl(interfaceName);
+		}
+		
+		if(loopbackInterfaceConfig.getNetInterfaceAddresses() == null 
+		        || loopbackInterfaceConfig.getNetInterfaceAddresses().size() == 0) {
+
+		    List<NetInterfaceAddressConfig> loopbackInterfaceAddressConfigs = new ArrayList<NetInterfaceAddressConfig>();                            
+		    loopbackInterfaceAddressConfigs.add(new NetInterfaceAddressConfigImpl());
+		    loopbackInterfaceConfig.setAutoConnect(LinuxNetworkUtil.isAutoConnect(interfaceName));
+		    loopbackInterfaceConfig.setNetInterfaceAddresses(loopbackInterfaceAddressConfigs);
+		    s_logger.debug("MAC for " + interfaceName + ": " + LinuxNetworkUtil.getMacAddress(interfaceName));
+		    loopbackInterfaceConfig.setHardwareAddress(LinuxNetworkUtil.getMacAddressBytes(interfaceName));
+		    loopbackInterfaceConfig.setLoopback(true);
+		    loopbackInterfaceConfig.setMTU(LinuxNetworkUtil.getCurrentMtu(interfaceName));
+		    loopbackInterfaceConfig.setPointToPoint(false);
+		    loopbackInterfaceConfig.setSupportsMulticast(LinuxNetworkUtil.isSupportsMulticast(interfaceName));
+		    loopbackInterfaceConfig.setUp(LinuxNetworkUtil.isUp(interfaceName));
+
+		    //FIXME
+		    loopbackInterfaceConfig.setDriver("unknown");
+		    loopbackInterfaceConfig.setDriverVersion("unknown");
+		    loopbackInterfaceConfig.setFirmwareVersion("unknown");
+		    loopbackInterfaceConfig.setVirtual(false);
+		    /*
+		    loopbackInterfaceConfig.setAutoConnect();
+		    loopbackInterfaceConfig.setState(???);
+		    loopbackInterfaceConfig.setUsbDevice(???);
+		    */
+		    
+		}
+		return loopbackInterfaceConfig;
+	}
+    
+    
+	private Tocd getDefinition() throws KuraException {
+		ObjectFactory objectFactory = new ObjectFactory();
+		Tocd tocd = objectFactory.createTocd();
+		
+		tocd.setName("NetworkConfigurationService");
+		tocd.setId("org.eclipse.kura.net.admin.NetworkConfigurationService");
+		tocd.setDescription("Network Configuration Service");
+		
+		//get the USB network interfaces (if any)
+		List<UsbNetDevice> usbNetDevices = m_usbService.getUsbNetDevices();
+		
+		Tad tad = objectFactory.createTad();
+		tad.setId("net.interfaces");
+		tad.setName("net.interfaces");
+		tad.setType(Tscalar.STRING);
+		tad.setCardinality(10000);
+		tad.setRequired(true);
+		tad.setDefault("");
+		tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.PLATFORM_INTERFACES));
+		tocd.addAD(tad);
+
+		//Get the network interfaces on the platform
+		try {
+			List<String> networkInterfaceNames = LinuxNetworkUtil.getAllInterfaceNames();
+			for(String ifaceName : networkInterfaceNames) {
+				//get the current configuration for this interface
+				NetInterfaceType type = LinuxNetworkUtil.getType(ifaceName);
+
+				String prefix = "net.interface.";
+				
+				if(type == NetInterfaceType.LOOPBACK) {
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.mtu")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.mtu")).toString());
+					tad.setType(Tscalar.INTEGER);
+					tad.setCardinality(0);
+					tad.setRequired(true);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_MTU));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.autoconnect")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.autoconnect")).toString());
+					tad.setType(Tscalar.BOOLEAN);
+					tad.setCardinality(0);
+					tad.setRequired(true);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_AUTOCONNECT));
+					tocd.addAD(tad);
+                    
+                    tad = objectFactory.createTad();
+                    tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.driver")).toString());
+                    tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.driver")).toString());
+                    tad.setType(Tscalar.STRING);
+                    tad.setCardinality(0);
+                    tad.setRequired(false);
+                    tad.setDefault("");
+                    tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_DRIVER));
+                    tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.address")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.address")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_ADDRESS));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.prefix")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.prefix")).toString());
+					tad.setType(Tscalar.SHORT);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_PREFIX));
+					tocd.addAD(tad);
+				} else if(type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI) {
+					if(usbNetDevices != null) {
+						for(UsbNetDevice usbNetDevice : usbNetDevices) {
+							if(usbNetDevice.getInterfaceName().equals(ifaceName)) {
+								//found a match - add the read only fields?
+								tad = objectFactory.createTad();
+								tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".usb.port")).toString());
+								tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".usb.port")).toString());
+								tad.setType(Tscalar.STRING);
+								tad.setCardinality(0);
+								tad.setRequired(false);
+								tad.setDefault("");
+								tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.USB_PORT));
+								tocd.addAD(tad);
+								
+								tad = objectFactory.createTad();
+								tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".usb.manufacturer")).toString());
+								tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".usb.manfacturer")).toString());
+								tad.setType(Tscalar.STRING);
+								tad.setCardinality(0);
+								tad.setRequired(false);
+								tad.setDefault("");
+								tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.USB_MANUFACTURER));
+								tocd.addAD(tad);
+								
+								tad = objectFactory.createTad();
+								tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".usb.product")).toString());
+								tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".usb.product")).toString());
+								tad.setType(Tscalar.STRING);
+								tad.setCardinality(0);
+								tad.setRequired(false);
+								tad.setDefault("");
+								tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.USB_PRODUCT));
+								tocd.addAD(tad);
+								
+								tad = objectFactory.createTad();
+								tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".usb.manufacturer.id")).toString());
+								tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".usb.manfacturer.id")).toString());
+								tad.setType(Tscalar.STRING);
+								tad.setCardinality(0);
+								tad.setRequired(false);
+								tad.setDefault("");
+								tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.USB_MANUFACTURER_ID));
+								tocd.addAD(tad);
+								
+								tad = objectFactory.createTad();
+								tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".usb.product.id")).toString());
+								tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".usb.product.id")).toString());
+								tad.setType(Tscalar.STRING);
+								tad.setCardinality(0);
+								tad.setRequired(false);
+								tad.setDefault("");
+								tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.USB_PRODUCT_ID));
+								tocd.addAD(tad);
+								
+								//no need to continue
+								break;
+							}
+						}
+					}
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.mtu")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.mtu")).toString());
+					tad.setType(Tscalar.INTEGER);
+					tad.setCardinality(0);
+					tad.setRequired(true);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_MTU));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.autoconnect")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.autoconnect")).toString());
+					tad.setType(Tscalar.BOOLEAN);
+					tad.setCardinality(0);
+					tad.setRequired(true);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_AUTOCONNECT));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpClient4.enabled")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpClient4.enabled")).toString());
+					tad.setType(Tscalar.BOOLEAN);
+					tad.setCardinality(0);
+					tad.setRequired(true);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_CLIENT_ENABLED));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.address")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.address")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_ADDRESS));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.prefix")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.prefix")).toString());
+					tad.setType(Tscalar.SHORT);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_PREFIX));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.gateway")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.ip4.gateway")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_GATEWAY));
+					tocd.addAD(tad);
+					
+					//DNS and WINS
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dnsServers")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dnsServers")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(10000);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_DNS_SERVERS));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.winsServers")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.winsServers")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(10000);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WINS_SERVERS));
+					tocd.addAD(tad);					
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.enabled")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.enabled")).toString());
+					tad.setType(Tscalar.BOOLEAN);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_ENABLED));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.defaultLeaseTime")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.defaultLeaseTime")).toString());
+					tad.setType(Tscalar.INTEGER);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_DEFAULT_LEASE_TIME));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.maxLeaseTime")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.maxLeaseTime")).toString());
+					tad.setType(Tscalar.INTEGER);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_MAX_LEASE_TIME));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.prefix")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.prefix")).toString());
+					tad.setType(Tscalar.SHORT);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_PREFIX));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.rangeStart")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.rangeStart")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_RANGE_START));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.rangeEnd")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.rangeEnd")).toString());
+					tad.setType(Tscalar.STRING);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_RANGE_END));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.passDns")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.dhcpServer4.passDns")).toString());
+					tad.setType(Tscalar.BOOLEAN);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_PASS_DNS));
+					tocd.addAD(tad);
+					
+					tad = objectFactory.createTad();
+					tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.nat.enabled")).toString());
+					tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.nat.enabled")).toString());
+					tad.setType(Tscalar.BOOLEAN);
+					tad.setCardinality(0);
+					tad.setRequired(false);
+					tad.setDefault("");
+					tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_IPV4_DHCP_SERVER_NAT_ENABLED));
+					tocd.addAD(tad);
+					
+					if(type == NetInterfaceType.WIFI) {
+					    // Common
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".wifi.capabilities")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".wifi.capabilities")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.WIFI_CAPABILITIES));
+                        tocd.addAD(tad);
+
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.mode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.mode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MODE));
+                        tocd.addAD(tad);
+
+                        // INFRA
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.ssid")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.ssid")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_SSID));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.hardwareMode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.hardwareMode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_HARDWARE_MODE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.radioMode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.radioMode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_HARDWARE_MODE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.securityType")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.securityType")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_SECURITY_TYPE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.passphrase")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.passphrase")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_PASSPHRASE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.pairwiseCiphers")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.pairwiseCiphers")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_PAIRWISE_CIPHERS));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.groupCiphers")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.groupCiphers")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_GROUP_CIPHERS));
+                        tocd.addAD(tad);
+                        
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.channel")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.infra.channel")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_INFRA_CHANNEL));
+                        tocd.addAD(tad);
+                        
+                        // MASTER
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.ssid")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.ssid")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_SSID));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.broadcast")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.broadcast")).toString());
+                        tad.setType(Tscalar.BOOLEAN);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_BROADCAST_ENABLED));
+                        tocd.addAD(tad);
+                          
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.hardwareMode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.hardwareMode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_HARDWARE_MODE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.radioMode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.radioMode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_HARDWARE_MODE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.securityType")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.securityType")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_SECURITY_TYPE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.passphrase")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.passphrase")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_PASSPHRASE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.channel")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.master.channel")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_MASTER_CHANNEL));
+                        tocd.addAD(tad);
+                        
+                        /*
+                        // ADHOC
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.ssid")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.ssid")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_ADHOC_SSID));
+                        tocd.addAD(tad);
+                                                  
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.hardwareMode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.hardwareMode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_ADHOC_HARDWARE_MODE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.radioMode")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.radioMode")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_ADHOC_HARDWARE_MODE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.securityType")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.securityType")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_ADHOC_SECURITY_TYPE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.passphrase")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.passphrase")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_ADHOC_PASSPHRASE));
+                        tocd.addAD(tad);
+                        
+                        tad = objectFactory.createTad();
+                        tad.setId((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.channel")).toString());
+                        tad.setName((new StringBuffer().append(prefix).append(ifaceName).append(".config.wifi.adhoc.channel")).toString());
+                        tad.setType(Tscalar.STRING);
+                        tad.setCardinality(0);
+                        tad.setRequired(false);
+                        tad.setDefault("");
+                        tad.setDescription(NetworkAdminConfigurationMessages.getMessage(NetworkAdminConfiguration.CONFIG_WIFI_ADHOC_CHANNEL));
+                        tocd.addAD(tad);
+                        */
+					}
+					
+					//TODO - deal with USB devices (READ ONLY)
+				}
+			}
+		} catch(Exception e) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+		}
+				
+		return tocd;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/event/NetworkConfigurationChangeEvent.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/event/NetworkConfigurationChangeEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd33f63212b3411d3fb85b48cfcd2b206e652b7f
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/event/NetworkConfigurationChangeEvent.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.event;
+
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+
+public class NetworkConfigurationChangeEvent extends Event {
+
+	 /** Topic of the NetworkConfigurationChangeEvent */
+    public static final String NETWORK_EVENT_CONFIG_CHANGE_TOPIC = "com/eurotech/framework/net/admin/event/NETWORK_EVENT_CONFIG_CHANGE_TOPIC";
+
+	public NetworkConfigurationChangeEvent(Map<String, ?> properties) {
+		 super(NETWORK_EVENT_CONFIG_CHANGE_TOPIC, properties);
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/event/NetworkStatusChangeEvent.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/event/NetworkStatusChangeEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a8468c4c52ccf7a58713e01080c7bcf52dee308
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/event/NetworkStatusChangeEvent.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.event;
+
+import java.util.Map;
+
+import org.eclipse.kura.net.admin.monitor.InterfaceState;
+import org.osgi.service.event.Event;
+
+public class NetworkStatusChangeEvent extends Event {
+	
+    /** Topic of the NetworkStatusChangeEvent */
+    public static final String NETWORK_EVENT_STATUS_CHANGE_TOPIC = "com/eurotech/framework/net/admin/event/NETWORK_EVENT_STATUS_CHANGE_TOPIC";
+
+    InterfaceState m_interfaceState;
+    
+    public NetworkStatusChangeEvent(String interfaceName, InterfaceState ifaceState, Map<String, ?> properties) {
+            super(NETWORK_EVENT_STATUS_CHANGE_TOPIC, properties);
+            
+            m_interfaceState = ifaceState;
+    }
+    
+    /**
+     * Returns interface state
+     * 
+     * @return
+     */
+	public InterfaceState getInterfaceState() {
+		return m_interfaceState;
+	}
+}
+
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/CellularModem.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/CellularModem.java
new file mode 100644
index 0000000000000000000000000000000000000000..82c418187291ba4b14edacc368a18e05ad74db27
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/CellularModem.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemRegistrationStatus;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+public interface CellularModem {
+	
+    /**
+     * Reports modem's model
+     * 
+     * @return model, null if not known
+     */
+    public String getModel() throws KuraException;
+    
+    /**
+     * Returns modem's manufacturer identification
+     * 
+     * @return manufacturer, null if not known
+     */
+    public String getManufacturer() throws KuraException;
+    
+    /**
+     * Answers modem's serial number
+     * 
+     * @return ESN, null if not known
+     */
+    public String getSerialNumber() throws KuraException;
+    
+    /**
+     * Reports modem's revision identification
+     * 
+     * @return revision ID, null if not known
+     */
+    public String getRevisionID() throws KuraException;
+    
+    
+    public boolean isReachable() throws KuraException;
+     
+    /**
+     * resets the modem and tries to restore the state 
+     * of the modem driver. (e.g. PPP connection, status thread) 
+     * 
+     * @throws Exception
+     */
+    public void reset() throws KuraException;
+     
+    /**
+     * Reports signal strength in dBm
+     * 
+     * @throws Exception
+     * @return signal strength
+     */
+    public int getSignalStrength() throws KuraException;
+    
+    /**
+     * Reports modem registration status
+     * 
+     * @throws Exception
+     * @return modem registration status as {@link ModemRegistrationStatus}
+     */ 
+    public ModemRegistrationStatus getRegistrationStatus() throws KuraException;
+    
+    /**
+     * Reports number of bytes tarnsmitted during a call
+     * 
+     * @return number of bytes transmitted
+     * @throws Exception
+     */
+    public long getCallTxCounter() throws KuraException;
+    
+    /**
+     * Reports number of bytes received during a call
+     * 
+     * @return number of bytes received
+     * @throws Exception
+     */
+    public long getCallRxCounter() throws KuraException;
+    
+    /**
+     * Reports Service Type 
+     * 
+     * @throws Exception
+     * @return service indication
+     */
+    public String getServiceType() throws KuraException;
+    
+    
+    /**
+     * Returns the associated UsbModemDevice
+     * 
+     * @return <code>UsbModemDevice</code>
+     */
+    public ModemDevice getModemDevice();    
+    
+    public String getDataPort() throws KuraException;
+    
+    public String getAtPort() throws KuraException;
+    
+    public String getGpsPort() throws KuraException;
+    
+    public boolean isGpsSupported() throws KuraException;
+    
+    public void enableGps() throws KuraException;
+    
+    public void disableGps() throws KuraException;
+    
+    public List<NetConfig> getConfiguration();
+    
+    public void setConfiguration(List<NetConfig> netConfigs);
+    
+    public ModemTechnologyType getTechnologyType ();
+    /*
+    public NetInterfaceConfig<? extends NetInterfaceAddressConfig> getConfiguration ();
+    
+    public void setConfiguration (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig);
+    */
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/CellularModemFactory.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/CellularModemFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..8bc0da371554332b4597c0beeef02a2645793504
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/CellularModemFactory.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.modem;
+
+import java.util.Hashtable;
+
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+
+public interface CellularModemFactory {
+	/**
+	 * Obtains generic modem service
+	 * 
+	 * @param modemDevice - modem device as <code>ModemDevice</code>
+	 * @param platform - hardware platform as {@link String}
+	 * @return generic modem service as <code>CellularModemService</code>
+	 * @throws Exception
+	 */
+	public CellularModem obtainCellularModemService(ModemDevice modemDevice, String platform) throws Exception;
+
+	/**
+	 * Reports modem services available
+	 * 
+	 * @return list of modem services as <code>Hashtable<String, CellularModemService></code>
+	 * with the usb port as the key
+	 */
+	public Hashtable<String, ? extends CellularModem> getModemServices();
+
+	/**
+	 * Releases modem service specified by its USB address
+	 * @param usbPortAddress
+	 */
+	public void releaseModemService(String usbPortAddress);
+
+	/**
+	 * Reports type of modem service
+	 * 
+	 * @return type of modem service as <code>ModemTechnologyType</code> 
+	 */
+	public ModemTechnologyType getType();
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/EvdoCellularModem.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/EvdoCellularModem.java
new file mode 100644
index 0000000000000000000000000000000000000000..1893ccb12a956d57807d7d0d04548229afc316eb
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/EvdoCellularModem.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.net.modem.ModemCdmaServiceProvider;
+
+public interface EvdoCellularModem extends CellularModem {
+
+	public String getMobileDirectoryNumber() throws KuraException;
+	
+	public String getMobileIdentificationNumber() throws KuraException;
+	
+	public boolean isProvisioned() throws KuraException;
+	
+	public void provision() throws KuraException; 
+	
+	public ModemCdmaServiceProvider getServiceProvider() throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/HspaCellularModem.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/HspaCellularModem.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6d9bc671c64ce9d4f7d3114b20c0dae76b72810
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/HspaCellularModem.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import org.eclipse.kura.KuraException;
+
+public interface HspaCellularModem extends CellularModem {
+
+	 public boolean isSimCardReady() throws KuraException;
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/IModemLinkService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/IModemLinkService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f022a485bee7d072cbd6b3bfb06fae0496ee43bd
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/IModemLinkService.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import org.eclipse.kura.KuraException;
+
+public interface IModemLinkService {
+
+	public static final String SERVICE_NAME = IModemLinkService.class.getName();
+
+	/**
+	* Connect request with default timeout 
+	* 
+	* @throws KuraException
+	*/
+	public void connect() throws KuraException;
+	
+	/**
+	* Connect request
+	* @param tout - timeout in seconds as {@link int}
+	* 
+	* @throws KuraException
+	*/
+	public void connect(int tout) throws KuraException;
+
+	/**
+	* Disconnect request
+	*
+	* @throws KuraException
+	*/
+	public void disconnect () throws KuraException;
+	
+	public void release();
+	
+	public PppState getPppState () throws KuraException;
+	
+	public PppState getPppState (int tout) throws KuraException;
+	
+	/**
+	* Reports IP address of cellular interface
+	*
+	* @return IP address as <code>String</code>
+	* @throws KuraException
+	*/
+	public String getIPaddress() throws KuraException;
+	
+	/**
+	* Reports gateway IP address (IP address of the peer)
+	*
+	* @return gateway IP address as <code>String</code>
+	*/
+	public String getGatewayIpAddress();
+	
+	/**
+	* Reports name of network interface
+	*
+	* @return network interface name as <code>String</code>
+	*/
+	public String getIfaceName();
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemConfiguration.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..d868d4e07da90d493eae4bb6feebf82c953ab5ba
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemConfiguration.java
@@ -0,0 +1,363 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import java.util.Properties;
+
+
+/**
+ * Defines modem configuration object that each modem will return in the 
+ * provideConfiguration() method. This object will be piked up by the 
+ * CellularConnectionManager.
+ * 
+ * Copyright (c) 2011 Eurotech Inc. All rights reserved.
+ *
+ */
+public class ModemConfiguration {
+
+	/**
+	 * whether or not the modem is enabled
+	 */
+	public static final String ENABLED = "enabled";
+	
+	/**
+	 * type of cellular service (i.e. CDMA, HSPA, WiMAX)
+	 */
+	public static final String SERVICE_MODE = "service_mode";
+	
+	/**
+	 * Carrier image ID on MC8355
+	 */
+	public static final String CARRIER_IMAGE_ID = "carrier_image_id";
+	
+	/**
+	 * UMTS profile ID
+	 */
+	public static final String UMTS_PROFILE_ID = "umts_profile_id";
+		
+	/**
+	 * number of modems on this system
+	 */
+	public static final String NUMBER_OF_MODEMS = "number_of_modems";
+	
+	/**
+	 * ppp unit number (e.g. ppp0 would be 0, ppp1 would be 1)
+	 */
+	public static final String PPP_UNIT_NUMBER = "ppp_unit_number";
+	
+	/**
+	 * USB port address of this modem
+	 */
+	public static final String USB_PORT_ADDRESS = "usb_port_address";
+	
+	/**
+	 * type of serial modem
+	 */
+	public static final String SERIAL_MODEM_TYPE = "modem_type";
+	
+	/**
+	 * modem vendor id
+	 */
+	public static final String VENDOR_ID = "vendor";
+	
+	/**
+	 * modem product id
+	 */
+	public static final String PRODUCT_ID = "product";
+	
+	/**
+	 * whether or not to use the default ppp peer parameters
+	 */
+	public static final String USE_DEFAULT_PEER_PARAM = "use_default_peer_param";
+		
+	/**
+	 * dialstring to use for this modem
+	 */
+	public static final String DIALSTRING = "dialstring";
+	
+	/**
+	 * whether or not the configuration should be persisted in non-volatile RAM
+	 */
+	public static final String PERSISTENCE = "persistence";
+	
+	/**
+	 * the profile name
+	 */
+	public static final String PROFILE_NAME = "profile_name";
+	
+	/**
+	 * PDP type
+	 */
+	public static final String PDP_TYPE = "pdptype";
+	
+	/**
+	 * Frequency band
+	 */
+	public static final String FREQ_BAND = "freq_band";
+	
+	/**
+	 * Allowed frequency bands
+	 */
+	public static final String ALLOWED_FREQ_BANDS = "allowed_freq_bands";
+	
+	/**
+	 * PDP Profiles
+	 */
+	public static final String PDP_PROFILES = "pdp_profiles";
+	
+	/**
+	 * ID of selected PDP profile
+	 */
+	public static final String PDP_PROFILE_ID = "pdp_profile_id";
+	
+	/**
+	 * the APN to use with this provider/carrier
+	 */
+	public static final String APN = "apn";
+	
+	/**
+	 * the authentication type to use (e.g. pap or chap)
+	 */
+	public static final String AUTH_TYPE = "authtype";
+	
+	/**
+	 * the username to use if authentication is required
+	 */
+	public static final String USERNAME = "username";
+	
+	/**
+	 * the password to use if authentication is required
+	 */
+	public static final String PASSWORD = "password";
+	
+	/**
+	 * the modem model number
+	 */
+	public static final String MODEL = "model";
+	
+	/**
+	 * the modem serial number
+	 */
+	public static final String SERIAL_NUMBER = "serial_number";
+	
+	/**
+	 * the network technology
+	 */
+	public static final String NETWORK_TECHNOLOGY = "network_technology";
+	
+	public static final String LOGFILE = "logfile";
+	public static final String BAUDRATE = "baudrate";
+	public static final String DEBUG_ENABLE = "debug_enable";
+	
+	public static final String USE_RTS_CTS_FLOWCTRL = "use_rtscts_flowctrl";
+	public static final String LOCK_SERIAL_DEVICE = "lock_serial_device";
+	public static final String PEER_MUST_AUTHENTICATE_ITSELF = "peer_must_authenticate_itself";
+	public static final String ADD_DEFAULT_ROUTE = "add_default_route";
+	public static final String USE_PEER_DNS = "use_peer_dns";
+	public static final String ALLOW_PROXY_ARPS = "allow_proxy_arps";
+	public static final String ALLOW_VJ_TCPIP_HDR_COMP = "allow_vj_tcpip_hdr_comp";
+	public static final String ALLOW_VJ_CONNID_COMP = "allow_vj_connid_comp";
+	public static final String ALLOW_BSD_COMP = "allow_bsd_comp";
+	public static final String ALLOW_DEFLATE_COMP = "allow_deflate_comp";
+	public static final String ALLOW_MAGIC = "allow_magic";
+	public static final String CONNECT_DELAY = "connect_delay";
+	public static final String LCP_ECHO_FAILURE = "lcp_echo_failure";
+	public static final String LCP_ECHO_INTERVAL = "lcp_echo_interval";
+	public static final String USE_MODEM_CTRL_LINES = "use_modem_ctrl_lines";
+	public static final String PEER_SUPPLIES_LOCAL_IP = "peer_supplies_local_ip";
+	public static final String IPCP_ACCEPT_LOCAL = "ipcp_accept_local";
+	public static final String IPCP_ACCEPT_REMOTE = "ipcp_accept_remote";
+	
+	private boolean enabled = false;
+	private int serviceMode = 0;
+	private int carrierImageID = 1;
+	private int umtsProfileID = 1;
+
+	private int pppUnitNumber = 0; 
+	private String dialstring = null;
+		
+	private String profileName = null;
+	private String pdpType = null;
+	private String apn = null;
+	private String authType = null;
+	private String username = null;
+	private String password = null;
+	private String freqBand = null;
+	private int pdpProfileID = 0;
+
+	/*
+	 * modem configuration properties obtained from the most suitable 
+	 * configuration file
+	 */
+	private Properties configProps = null;
+	
+	/**
+	 * ModemConfiguration constructor
+	 */
+	public ModemConfiguration () {
+		
+		this.enabled = false;
+		this.serviceMode = 0;
+		this.carrierImageID = 1;
+		this.umtsProfileID = 1;
+		this.pppUnitNumber = 0; 
+		this.dialstring = "";
+		
+		this.profileName = "";
+		this.pdpType = "";
+		this.freqBand = "";
+		this.apn = "";
+		this.authType = "";
+		this.username = "";
+		this.password = "";
+		this.pdpProfileID = 1;
+		
+		this.configProps = new Properties ();
+		this.configProps.put(ENABLED, Boolean.toString(this.enabled));
+		this.configProps.put(SERVICE_MODE, Integer.toString(this.serviceMode));
+		this.configProps.put(CARRIER_IMAGE_ID, Integer.toString(this.carrierImageID));
+		this.configProps.put(UMTS_PROFILE_ID, Integer.toString(this.umtsProfileID));
+		this.configProps.put(PPP_UNIT_NUMBER, Integer.toString(this.pppUnitNumber));
+		this.configProps.put(DIALSTRING, this.dialstring);
+		this.configProps.put(PDP_TYPE, this.pdpType);
+		this.configProps.put(FREQ_BAND, this.freqBand);
+		this.configProps.put(PROFILE_NAME, this.profileName);
+		this.configProps.put(APN, this.apn);
+		this.configProps.put(AUTH_TYPE, this.authType);
+		this.configProps.put(USERNAME, this.username);
+		this.configProps.put(PASSWORD, this.password);
+		this.configProps.put(PDP_PROFILE_ID, Integer.toString(this.pdpProfileID));
+	}
+	
+	/**
+	 * ModemConfiguration constructor
+	 * 
+	 * @param configProps - configuration properties as <code>Properties</code>
+	 */
+	public ModemConfiguration (Properties configProps) {
+		
+		this.configProps = configProps;
+		this.enabled = new Boolean((String)this.configProps.getProperty(ENABLED, "false")).booleanValue();
+		this.serviceMode =  new Integer((String)this.configProps.getProperty(SERVICE_MODE, "0")).intValue();
+		this.carrierImageID = new Integer((String)this.configProps.getProperty(CARRIER_IMAGE_ID, "1")).intValue();		
+		this.umtsProfileID = new Integer((String)this.configProps.getProperty(UMTS_PROFILE_ID, "1")).intValue();
+		this.pppUnitNumber = new Integer ((String)this.configProps.getProperty(PPP_UNIT_NUMBER, "0")).intValue();
+		this.dialstring = (String)this.configProps.getProperty(DIALSTRING);
+		this.profileName = (String) this.configProps.getProperty(PROFILE_NAME);
+		this.pdpType = (String) this.configProps.getProperty(PDP_TYPE);
+		this.freqBand = (String) this.configProps.getProperty(FREQ_BAND);
+		this.apn = (String) this.configProps.getProperty(APN);
+		this.authType = (String) this.configProps.getProperty(AUTH_TYPE);
+		this.username = (String) this.configProps.getProperty(USERNAME);
+		this.password = (String) this.configProps.getProperty(PASSWORD);
+		this.pdpProfileID = new Integer((String)this.configProps.getProperty(PDP_PROFILE_ID, "1")).intValue();
+	}
+
+	/**
+	 * Reports configuration properties attached
+	 * 
+	 * @return configuration properties as <code>Properties</code>
+	 */
+	public Properties getConfigProps() {
+		return this.configProps;
+	}
+
+	/**
+	 * Reports  if modem is enabled in configuration
+	 * 
+	 * @return <code>boolean</code><br>
+	 * 		true - modem is enables<br>
+	 * 		false - modem is disabled
+	 */
+	public boolean isEnabled () {
+		return this.enabled;
+	}
+	
+	/**
+	 * Reports cellular service mode.
+	 * 
+	 * @return cellular service mode as <code>int</code>
+	 */
+	public int getServiceMode() {
+		return this.serviceMode;
+	}
+	
+	/**
+	 * Reports PPP unit number (e.g. number of ppp interface)
+	 * 
+	 * @return PPP unit number as <code>int</code>
+	 */
+	public int getPppUnitNumber () {
+		return this.pppUnitNumber;
+	}
+	
+	/**
+	 * Reports dialstring
+	 * 
+	 * @return dialstring as <code>String</code> 
+	 */
+	public String getDialString () {
+		return this.dialstring;
+	}
+	
+	/**
+	 * Reports APN
+	 * 
+	 * @return APN as <code>String</code>
+	 */
+	public String getApn() {
+		return this.apn;
+	}
+	
+	/**
+	 * Reports authentication type
+	 * 
+	 * @return authentication type as <code>String</code>
+	 */
+	public String getAuthenticationType () {
+		return this.authType;
+	}
+	
+	/**
+	 * Reports username
+	 * 
+	 * @return username as <code>String</code>
+	 */
+	public String getUsername () {
+		return this.username;
+	}
+	
+	/**
+	 * Reports password
+	 * 
+	 * @return password as <code>String</code>
+	 */
+	public String getPassword () {
+		return this.password;
+	}
+
+	public String getProfileName() {
+		return this.profileName;
+	}
+
+	public String getPdpType() {
+		return this.pdpType;
+	}
+
+	public String getFreqBand() {
+		return this.freqBand;
+	}
+
+	public int getPdpProfileID() {
+		return this.pdpProfileID;
+	}	
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemManagerService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemManagerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..350c1d75cddea6b3099efb3de8b8b8e9d3471249
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemManagerService.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+
+package org.eclipse.kura.net.admin.modem;
+
+public interface ModemManagerService {
+
+	public CellularModem getModemService (String ifaceName);
+	//public void setModemService (String usbPort, UsbCellularModem modem);
+	//public void removeModemService(String usbPort);
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemPppConfigGenerator.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemPppConfigGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..1df02343f27c72b76a426de94593e71854d774a5
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/ModemPppConfigGenerator.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.modem.ModemConfig;
+
+public interface ModemPppConfigGenerator {
+    
+    public PppPeer getPppPeer(
+    		String deviceId,
+            ModemConfig modemConfig,
+            String logFile,
+            String connectScript,
+            String disconnectScript);
+    
+    public ModemXchangeScript getConnectScript(ModemConfig modemConfig);
+    
+    public ModemXchangeScript getDisconnectScript(ModemConfig modemConfig);
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/Ppp.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/Ppp.java
new file mode 100644
index 0000000000000000000000000000000000000000..6cd29a68fb5ec13b9cd245d155f365526a88e1c6
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/Ppp.java
@@ -0,0 +1,270 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.linux.net.dns.LinuxDns;
+import org.eclipse.kura.linux.net.ppp.PppLinux;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.ConnectionInfo;
+import org.eclipse.kura.net.IPAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Ppp implements IModemLinkService {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(Ppp.class);
+	
+	private final static long THREAD_TERMINATION_TOUT = 3000;
+	
+	private static Object s_lock = new Object();
+	private String m_iface;
+	private String m_port;
+	private ScheduledFuture<?> m_pppScheduledFuture = null;
+	private ScheduledExecutorService m_executor;
+	ConnectionInfo m_coninfo = null;
+	
+	private long m_tout = 0;
+	private long m_startTime = 0;
+		
+	public Ppp(String iface, String port) {
+		m_iface = iface;
+		m_port = port;
+		m_executor = Executors.newSingleThreadScheduledExecutor();
+	}
+
+	@Override
+	public void connect() throws KuraException {
+		connect(60);
+	}
+	
+	@Override
+	public void connect(int tout) throws KuraException {
+
+		s_logger.info("connecting ...");
+		m_tout = tout * 1000; // convert to milliseconds
+		try {
+			if (m_pppScheduledFuture != null) {
+				m_pppScheduledFuture.cancel(true);
+			}
+			m_pppScheduledFuture = m_executor.scheduleAtFixedRate(
+					new Runnable() {
+						@Override
+						public void run() {
+							Thread.currentThread().setName("Ppp:Connect");
+							if (!monitor()) {
+								m_pppScheduledFuture.cancel(true);
+							}
+						}
+					}, 0, 5, TimeUnit.SECONDS);
+		} catch (Exception e) {
+			m_startTime = 0;
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	@Override
+	public void disconnect() throws KuraException {
+		
+		s_logger.info("disconnecting :: stopping PPP monitor ...");
+		PppLinux.disconnect(m_iface, m_port);
+		
+		try {
+			release();
+			LinuxDns linuxDns = LinuxDns.getInstance();
+			if (linuxDns.isPppDnsSet()) {
+				linuxDns.unsetPppDns();
+			}
+		} catch (Exception e) {
+			throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		
+		m_coninfo = null;
+	}
+	
+	@Override
+	public void release() {
+		if(m_pppScheduledFuture != null) {
+			long timer = System.currentTimeMillis();
+			while(!m_pppScheduledFuture.isDone()) {
+				m_pppScheduledFuture.cancel(true);
+				try {
+					Thread.sleep(200);
+				} catch (InterruptedException e) {}
+        		s_logger.debug("Ppp:Connect task done?- {}", m_pppScheduledFuture.isDone());
+        		if ((System.currentTimeMillis()-timer) > THREAD_TERMINATION_TOUT) {
+					s_logger.error("Failed to cancel Ppp:Connect task");
+					break;
+				}
+			}
+			m_pppScheduledFuture = null;
+		}
+		
+		if (m_executor != null) {
+			long timer = System.currentTimeMillis();
+			while (!m_executor.isTerminated()) {
+				s_logger.debug("Shutting down Ppp:Connect Thread ...");
+				m_executor.shutdownNow();
+				try {
+					Thread.sleep(200);
+				} catch (InterruptedException e) {}
+				s_logger.debug("Ppp:Connect Thread terminated? - {}", m_executor.isTerminated());
+				if ((System.currentTimeMillis()-timer) > THREAD_TERMINATION_TOUT) {
+					s_logger.error("Failed to terminate Ppp:Connect Thread");
+					break;
+				}
+			}
+			m_executor = null;
+		}
+	}
+	
+	@Override
+	public String getIPaddress() throws KuraException {
+		String ipAddress = null;
+		if (LinuxNetworkUtil.isUp(m_iface)) {
+			ipAddress = LinuxNetworkUtil.getCurrentIpAddress(m_iface);
+		}
+		return ipAddress;
+	}
+
+	@Override
+	public String getGatewayIpAddress() {
+		String ipAddress = null;
+		
+		if (m_coninfo != null) {
+			ipAddress = m_coninfo.getGateway().getHostAddress();
+		}
+		
+		return ipAddress;
+	}
+
+	@Override
+	public String getIfaceName() {
+		return m_iface;
+	}
+	
+	@Override
+	public PppState getPppState () throws KuraException {
+		
+		PppState pppState = PppState.NOT_CONNECTED;
+		synchronized (s_lock) {
+			boolean pppdRunning = PppLinux.isPppProcessRunning(m_iface, m_port);
+			String ip = this.getIPaddress();
+			
+			//PppState pppState = PppState.NOT_CONNECTED;
+			if (pppdRunning && (ip != null)) {
+				pppState = PppState.CONNECTED;
+			} else if (pppdRunning && (ip == null)) {
+				pppState = PppState.IN_PROGRESS;
+			} else {
+				pppState = PppState.NOT_CONNECTED;
+			}
+		}
+		return pppState;
+	}
+	
+	@Override
+	public PppState getPppState (int tout) throws KuraException {
+		
+		PppState pppState = PppState.NOT_CONNECTED;
+		synchronized (s_lock) {
+			boolean pppdRunning = PppLinux.isPppProcessRunning(m_iface, m_port, tout);
+			String gatewayIP = this.getGatewayIpAddress();
+			
+			//PppState pppState = PppState.NOT_CONNECTED;
+			if (pppdRunning && (gatewayIP != null)) {
+				pppState = PppState.CONNECTED;
+			} else if (pppdRunning && (gatewayIP == null)) {
+				pppState = PppState.IN_PROGRESS;
+			} else {
+				pppState = PppState.NOT_CONNECTED;
+			}
+		}
+		return pppState;
+	}
+	
+	private boolean monitor() {
+		try {
+			PppState pppState = getPppState();
+			
+		    if(pppState == PppState.NOT_CONNECTED) {
+		    	
+		    	PppLinux.connect(m_iface, m_port);
+		    	m_startTime = System.currentTimeMillis();
+		    	
+		    } else if (pppState == PppState.CONNECTED) {
+
+		    	LinuxDns linuxDns = LinuxDns.getInstance();
+		    	List<IPAddress> pppDnsServers = linuxDns.getPppDnServers();
+		    	if (pppDnsServers != null) {
+		    		s_logger.info("!!! PPP connection established -- " + m_iface + " inteface is up !!!");
+					s_logger.info("IP ADDRESS: " + LinuxNetworkUtil.getCurrentIpAddress(m_iface));
+					for (IPAddress dnsServer : pppDnsServers) {
+						s_logger.info("DNS Server: " + dnsServer.getHostAddress());
+					}
+					m_startTime = 0;
+					return false;
+		    	}
+		    	/*
+				StringBuffer sbConInfoFilename = new StringBuffer();
+				sbConInfoFilename.append("/tmp/.kura/coninfo-");
+				sbConInfoFilename.append(m_iface);
+
+				File fConInfoFile = new File(sbConInfoFilename.toString());
+				if (fConInfoFile.exists()) {
+					ConnectionInfo m_coninfo = new ConnectionInfoImpl(m_iface);
+					if (m_coninfo != null) {	
+						LinuxDns linuxDns = LinuxDns.getInstance();
+						if (!linuxDns.isPppDnsSet()) {
+							s_logger.info("Setting PPP DNS ...");
+							linuxDns.setPppDns();
+						}
+						s_logger.info("!!! PPP connection established -- " + m_iface + " inteface is up !!!");
+						s_logger.info("IFACE: " + m_coninfo.getIfaceName());
+						s_logger.info("IP ADDRESS: " + m_coninfo.getIpAddress().getHostAddress());
+						s_logger.info("GATEWAY: " + m_coninfo.getGateway().getHostAddress());
+					}
+			
+					List<IP4Address> dnsServers = m_coninfo.getDnsServers();
+					if ((dnsServers != null) && (dnsServers.size() > 0)) {
+						for (IP4Address dnsServer : dnsServers) {
+							s_logger.info("DNS Server: " + dnsServer.getHostAddress());
+						}
+						m_startTime = 0;
+						return false;
+					}
+				}
+				sbConInfoFilename = null;
+				*/
+			} else if (pppState == PppState.IN_PROGRESS) {
+				if ((System.currentTimeMillis() - m_startTime) > m_tout) {
+					s_logger.warn("ppp connection timed out on the " + m_iface + " will retry ...");
+					PppLinux.disconnect(m_iface, m_port);
+					m_startTime = 0;
+					try {Thread.sleep(5000);} catch (InterruptedException e) {}
+					return true;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return true;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppFactory.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cdd311310b46cb6f4c9f7aa755622645f25c0a0
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppFactory.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PppFactory {
+	
+    private static final Logger s_logger = LoggerFactory.getLogger(PppFactory.class);
+    
+	private static Map<String, IModemLinkService> s_pppServices = new HashMap<String, IModemLinkService>();
+	
+	public static IModemLinkService obtainPppService(int pppNo, String port) {
+		
+		IModemLinkService modemLinkService = null;
+		if (pppNo >= 0) {
+			modemLinkService = obtainPppService("ppp"+pppNo, port);
+		}
+		return modemLinkService;
+	}
+	
+	public static IModemLinkService obtainPppService(String iface, String port) {
+		
+		IModemLinkService modemLinkService = null;
+		
+		if (s_pppServices.containsKey(iface)) {
+			modemLinkService = s_pppServices.get(iface);
+		} else {
+		    s_logger.debug("Creating new modemLinkService for " + iface);
+			modemLinkService = new Ppp(iface, port);
+			s_pppServices.put(iface, modemLinkService);
+		}
+		return modemLinkService;
+	}
+	
+	public static IModemLinkService releasePppService (String iface) {
+		
+	    IModemLinkService modemLinkService = null;
+	    
+		if (s_pppServices.containsKey(iface)) {
+		    s_logger.debug("Removing modemLinkService for " + iface);
+		    modemLinkService = s_pppServices.remove(iface);
+		}
+		
+		return modemLinkService;
+	}
+	
+	public static void releaseAllPppServices() {
+		
+		Set<String> set = s_pppServices.keySet();
+		Iterator<String> it = set.iterator();
+		while (it.hasNext()) {
+			String iface = it.next();
+			s_logger.debug("releasing modm link for {} interface", iface);
+			IModemLinkService modemLinkService = s_pppServices.get(iface);
+			modemLinkService = s_pppServices.remove(iface);
+			modemLinkService.release();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppPeer.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppPeer.java
new file mode 100644
index 0000000000000000000000000000000000000000..a502710bff2527a9eee3a887ffdaf45f72f96fb8
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppPeer.java
@@ -0,0 +1,945 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+
+import org.eclipse.kura.net.admin.visitor.linux.util.ChapLinux;
+import org.eclipse.kura.net.admin.visitor.linux.util.PapLinux;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.ModemConfig.AuthType;
+
+/* 
+ * Copyright 2013 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Defines settings per service provider
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class PppPeer {
+	
+    private static final String CHAT_PROGRAM = "chat";
+    
+	private boolean enabled = false;
+	
+	//private int persistence = 0; 
+	
+	/* for a ppp0 or ppp1 etc interface name */
+	private int pppUnitNumber = 0;
+	
+	/* name of the provider */
+	private String provider = null;
+	
+	/* network technology (e.g. EVDO, 3G) */
+	private ModemTechnologyType networkTechnology = null;
+	
+	/* access point name */
+	private String apn = null;
+	
+	/* dial string */
+	private String dialString = null;
+	
+	/* Enables connection debugging facilities */
+	private boolean enableDebug = false;
+	
+	/* authentication type (e.g. PAP, CHAP) */
+	private AuthType authType = AuthType.NONE;
+	
+	/* username */
+	private String username = null;
+	
+	/* password */
+	private String password = null;
+	
+	/* baud rate */
+	private int baudRate = -1;
+	
+	/* PPP log file */
+	private String logfile = null;
+	
+	/* Use RTS/CTS hardware flow control */
+	private boolean useRtsCtsFlowControl = false;
+	
+	/* use modem control lines? */
+	private boolean useModemControlLines = false;
+	
+	/* lock serial port? */
+	private boolean lockSerialDevice = false;
+	
+	/* require the peer to authenticate itself */
+	private boolean peerMustAuthenticateItself = false;
+	
+	/*
+	 * Add a default route to the system routing tables, 
+	 * using the peer as the gateway.
+	 */
+	private boolean addDefaultRoute = false;
+	
+	/*
+	 * Disables the default behavior when no local IP address is specified, 
+	 * which is to determine (if possible) the local IP address from the hostname. 
+	 * With this option, the peer will have to supply the local IP address during 
+	 * IPCP negotiation (unless it specified explicitly on the command line 
+	 * or in an options file). 
+	 */
+	private boolean peerToSupplyLocalIP = false;
+	
+	/* Ask the peer for DNS server addresses */
+	private boolean usePeerDns = false;
+	
+	/* Allow Proxy-ARPs */
+	private boolean allowProxyArps = false;
+	
+
+	/*
+	 * Allow Van Jacobson style TCP/IP header compression in both the 
+	 * transmit and the receive direction. 
+	 */
+	private boolean allowVanJacobsonTcpIpHdrCompression = false;
+	
+	/*
+	 * Allow the connection-ID compression option in Van Jacobson style TCP/IP header 
+	 * compression. With this option, pppd will not omit the connection-ID byte from 
+	 * Van Jacobson compressed TCP/IP headers, nor ask the peer to do so. 
+	 */
+	private boolean allowVanJacobsonConnectionIDCompression = false;
+	
+	/*
+	 * Allow BSD-Compress compression
+	 */
+	private boolean allowBsdCompression = false;
+	
+	/*
+	 * Allow Deflate compression
+	 */
+	private boolean allowDeflateCompression = false;
+	
+	/*
+	 * Allow magic number negotiation
+	 */
+	private boolean allowMagic = false;
+	
+	/*
+	 * If this option is given, ppp daemon will presume the peer to be dead 
+	 * if n LCP echo-requests are sent without receiving a valid LCP echo-reply. 
+	 * If this happens, ppp daemon will terminate the connection. 
+	 * Use of this option requires a non-zero value for the 
+	 * lcp-echo-interval parameter. 
+	 * This option can be used to enable ppp daemon to terminate after the 
+	 * physical connection has been broken (e.g., the modem has hung up) 
+	 * in situations where no hardware modem control lines are available. 
+	 */
+	private int lcp_echo_failure = -1;
+	
+	/*
+	 * If this option is given, ppp daemon will send an LCP echo-request frame 
+	 * to the peer every n seconds. Normally the peer should respond to 
+	 * the echo-request by sending an echo-reply. 
+	 * This option can be used with the lcp-echo-failure option to detect 
+	 * that the peer is no longer connected. 
+	 */
+	private int lcp_echo_interval = -1;
+	
+	/*
+	 * Wait for up to n milliseconds after the connect script finishes for a 
+	 * valid PPP packet from the peer.
+	 */
+	private int connect_delay = -1;
+		   
+    /* Modem Exchange script */
+    private String connectScriptFilename = null;
+    private String disconnectScriptFilename = null;
+
+    
+	/**
+	 * Reports PPP unit number
+	 * 
+	 * @return PPP unit number as <code>int</code>
+	 */
+	public int getPppUnitNumber() {
+		return pppUnitNumber;
+	}
+
+	/**
+	 * Sets PPP unit number
+	 * 
+	 * @param pppUnitNumber as <code>int</code>
+	 */
+	public void setPppUnitNumber(int pppUnitNumber) {
+		this.pppUnitNumber = pppUnitNumber;
+	}
+
+
+
+	/**
+	 * Reports if PPP is enabled in configuration
+	 * 
+	 * @return boolean <br>
+	 * 		true - PPP is enabled
+	 * 		false - PPP is disabled
+	 */
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+	/**
+	 * Enables/disables PPP
+	 * 
+	 * @param enabled <br>
+	 * 		true - PPP is enabled
+	 * 		false - PPP is disabled
+
+	 */
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+	}
+
+	/**
+	 * Reports service provider
+	 * 
+	 * @return - service provider
+	 */
+	public String getProvider() {
+		return provider;
+	}
+
+	/**
+	 * Sets service provider
+	 * 
+	 * @param provider as String
+	 */
+	public void setProvider(String provider) {
+		this.provider = provider;
+	}
+	
+	/**
+	 * Reports network technology. (e.g. evdo, 3G)
+	 * 
+	 * @return - network technology
+	 */
+	public ModemTechnologyType getNetworkTechnology() {
+		return networkTechnology;
+	}
+
+	/**
+	 * Sets network technology
+	 * 
+	 * @param networkTechnology as ModemServiceType 
+	 */
+	public void setNetworkTechnology(ModemTechnologyType networkTechnology) {
+		this.networkTechnology = networkTechnology;
+	}
+	
+	/**
+	 * Reports APN (Access Point Name) of cellular data connection.
+	 * 
+	 * @return APN
+	 */
+	public String getApn() {
+		return apn;
+	}
+
+	/**
+	 * Sets APN (Access Point Name) for cellular data connection.
+	 * 
+	 * @param apn as String
+	 */
+	public void setApn(String apn) {
+		this.apn = apn;
+	}
+
+	/**
+	 * Reports dial string
+	 * 
+	 * @return dial string
+	 */
+	public String getDialString() {
+		return dialString;
+	}
+
+	/**
+	 * Sets dial string
+	 * 
+	 * @param dialString such as "atdt555-1212"
+	 */
+	public void setDialString(String dialString) {
+		this.dialString = dialString;
+	}
+
+	/**
+	 * Reports authentication type. (e.g. NONE, PAP, CHAP)
+	 * 
+	 * @return authentication type
+	 */
+	public AuthType getAuthType() {
+		return authType;
+	}
+
+	/**
+	 * Sets authentication type
+	 * 
+	 * @param authType int (NONE, PAP, CHAP) as defined in {@link org.eclipe.kura.net.ppp.service.PppAuthentication}
+	 */
+	public void setAuthType(AuthType authType) {
+		this.authType = authType;
+	}
+
+	/**
+	 * Reports user name for authentication
+	 * 
+	 * @return user name
+	 */
+	public String getUsername() {
+		return username;
+	}
+
+	/**
+	 * Sets user name used for authentication
+	 * 
+	 * @param username as String
+	 */
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	/**
+	 * Reports password for authentication
+	 * 
+	 * @return password
+	 */ 
+	public String getPassword() {
+		return password;
+	}
+
+	/**
+	 * Sets password used for authentication
+	 * 
+	 * @param password as String
+	 */
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	/**
+	 * Reports baud rate used for PPP
+	 * 
+	 * @return baud rate
+	 */
+	public int getBaudRate() {
+		return baudRate;
+	}
+
+	/**
+	 * Sets baud rate used for PPP
+	 * 
+	 * @param baudRate on serial port, as int
+	 */
+	public void setBaudRate(int baudRate) {
+		this.baudRate = baudRate;
+	}
+
+    /**
+     * Reports name of the log file
+     * 
+     * @return name of the log file
+     */
+    public String getLogfile() {
+        return logfile;
+    }
+
+    /**
+     * Sets the name of the log file
+     * 
+     * @param logfile as String
+     */
+    public void setLogfile(String logfile) {
+        this.logfile = logfile;
+    }
+
+    /**
+     * Reports connect script
+     * 
+     * @return connect script filename as String
+     */
+    public String getConnectScript() {
+        return connectScriptFilename;
+    }
+
+    /**
+     * Sets connect script filename
+     * 
+     * @param connectScript as <code>String</code>
+     */
+    public void setConnectScript(String connectScript) {
+        this.connectScriptFilename = connectScript;
+    }
+
+    /**
+     * Reports disconnect script
+     * 
+     * @return disconnect script filename as String
+     */
+    public String getDisconnectScript() {
+        return disconnectScriptFilename;
+    }
+
+    /**
+     * Sets disconnect script filename
+     * 
+     * @param disconnectScript as <code>String</code>
+     */
+    public void setDisconnectScript(String disconnectScript) {
+        this.disconnectScriptFilename = disconnectScript;
+    }
+
+	/**
+	 * Reports 'defaultroute' option
+	 * 
+	 * @return boolean <br>
+	 * 		true - add default route to the system routing table <br>
+	 * 		false - do not add default route
+	 */
+	public boolean isAddDefaultRoute() {
+		return addDefaultRoute;
+	}
+
+	/**
+	 * Sets 'defaultroute' option
+	 * 
+	 * @param addDefaultRoute <br>
+	 * 		true - add default route to the system routing table <br>
+	 * 		false - do not add default route
+	 */
+	public void setAddDefaultRoute(boolean addDefaultRoute) {
+		this.addDefaultRoute = addDefaultRoute;
+	}
+
+	/**
+	 * Reports if peer is expected to supply local IP address using IPCP negotiation.
+	 * 
+	 * @return boolean <br>
+	 * 		true - peer is expected to supply local IP address 
+	 * 		false - peer is not supplying local IP address
+	 */
+	public boolean isPeerToSupplyLocalIP() {
+		return peerToSupplyLocalIP;
+	}
+
+	/**
+	 * Sets whether peer is to supply local IP address or not
+	 *  
+	 * @param peerToSupplyLocalIP <br>
+	 * 		true - peer is expected to supply local IP address 
+	 * 		false - peer is not supplying local IP address
+	 */
+	public void setPeerToSupplyLocalIP(boolean peerToSupplyLocalIP) {
+		this.peerToSupplyLocalIP = peerToSupplyLocalIP;
+	}
+
+	/**
+	 * Reports if peer supplied DNS should be used
+	 * 
+	 * @return boolean <br>
+	 * 		true - use peer DNS <br>
+	 * 		false - do not use peer DNS
+	 */
+	public boolean isUsePeerDns() {
+		return usePeerDns;
+	}
+
+	/**
+	 * Sets whether to use peer supplied DNS.
+	 * 
+	 * @param usePeerDns <br>
+	 * 		true - use peer DNS <br>
+	 * 		false - do not use peer DNS
+	 */
+	public void setUsePeerDns(boolean usePeerDns) {
+		this.usePeerDns = usePeerDns;
+	}
+
+	/**
+	 * Reports if 'proxyarp' option is enabled
+	 * 
+	 * @return boolean <br>
+	 * 		true - 'proxyarp' is enabled <br>
+	 * 		false - 'proxyarp' is disabled
+	 */
+	public boolean isAllowProxyArps() {
+		return allowProxyArps;
+	}
+
+	/**
+	 * Enable/disable 'proxyarp' option
+	 * 
+	 * @param allowProxyArps <br>
+	 * 		true - 'proxyarp' is enabled <br>
+	 * 		false - 'proxyarp' is disabled
+	 */
+	public void setAllowProxyArps(boolean allowProxyArps) {
+		this.allowProxyArps = allowProxyArps;
+	}
+
+	/**
+	 * Reports if Van Jacobson TCP/IP header compression is allowed
+	 * 
+	 * @return boolean <br>
+	 * 		true - Van Jacobson TCP/IP header compression is allowed <br>
+	 * 		false - Van Jacobson TCP/IP header compression is not allowed
+	 */
+	public boolean isAllowVanJacobsonTcpIpHdrCompression() {
+		return allowVanJacobsonTcpIpHdrCompression;
+	}
+
+	/**
+	 * Enable/disable Van Jacobson TCP/IP header compression
+	 * 
+	 * @param allowVanJacobsonTcpIpHdrCompression <br>
+	 * 		true - Van Jacobson TCP/IP header compression is allowed <br>
+	 * 		false - Van Jacobson TCP/IP header compression is not allowed
+
+	 */
+	public void setAllowVanJacobsonTcpIpHdrCompression(
+			boolean allowVanJacobsonTcpIpHdrCompression) {
+		this.allowVanJacobsonTcpIpHdrCompression = allowVanJacobsonTcpIpHdrCompression;
+	}
+
+	
+	/**
+	 * Reports if Van Jacobson Connection ID compression is allowed
+	 * 
+	 * @return boolean <br>
+	 * 		true - Van Jacobson Connection ID compression is allowed <br>
+	 * 		false - Van Jacobson Connection ID compression is not allowed
+	 */
+	public boolean isAllowVanJacobsonConnectionIDCompression() {
+		return allowVanJacobsonConnectionIDCompression;
+	}
+
+	/**
+	 * Enable/disable Van Jacobson Connection ID compression
+	 * 
+	 * @param allowVanJacobsonConnectionIDCompression <br>
+	 * 		true - Van Jacobson Connection ID compression is allowed <br>
+	 * 		false - Van Jacobson Connection ID compression is not allowed
+	 */
+	public void setAllowVanJacobsonConnectionIDCompression(
+			boolean allowVanJacobsonConnectionIDCompression) {
+		this.allowVanJacobsonConnectionIDCompression = allowVanJacobsonConnectionIDCompression;
+	}
+
+	/**
+	 * Reports if BSD compression is allowed
+	 * 
+	 * @return boolean <br> 
+	 * 		true - BSD compression is allowed <br>
+	 * 		false - BSD compression is not allowed
+	 */
+	public boolean isAllowBsdCompression() {
+		return allowBsdCompression;
+	}
+
+	/**
+	 * Enable/disable BSD compression
+	 * 
+	 * @param allowBsdCompression <br> 
+	 * 		true - BSD compression is allowed <br>
+	 * 		false - BSD compression is not allowed
+	 */
+	public void setAllowBsdCompression(boolean allowBsdCompression) {
+		this.allowBsdCompression = allowBsdCompression;
+	}
+
+	/**
+	 * Reports if 'Deflate' compression is allowed
+	 * 
+	 * @return boolean <br> 
+	 * 		true - 'Deflate' compression is allowed <br>
+	 * 		false - 'Deflate' compression is not allowed
+	 */
+	public boolean isAllowDeflateCompression() {
+		return allowDeflateCompression;
+	}
+
+	/**
+	 * Enable/disable 'Deflate' compression
+	 * 
+	 * @param allowDeflateCompression <br> 
+	 * 		true - 'Deflate' compression is allowed <br>
+	 * 		false - 'Deflate' compression is not allowed
+	 */
+	public void setAllowDeflateCompression(boolean allowDeflateCompression) {
+		this.allowDeflateCompression = allowDeflateCompression;
+	}
+
+	/**
+	 * Reports is magic number negotiation is enabled
+	 * 
+	 * @return boolean <br>
+	 * 		true - magic number negotiation is enabled <br>
+	 * 		false - magic number negotiation is disabled
+	 */
+	public boolean isAllowMagic() {
+		return allowMagic;
+	}
+
+	/**
+	 * Enable/disable magic number negotiation
+	 * 
+	 * @param allowMagic <br>
+	 * 		true - magic number negotiation is enabled <br>
+	 * 		false - magic number negotiation is disabled
+	 */
+	public void setAllowMagic(boolean allowMagic) {
+		this.allowMagic = allowMagic;
+	}
+
+	/**
+	 * Reports number 'lcp-echo-failure' parameter that is number of 
+	 * unanswered LCP echo requests to presume the peer to be
+	 * dead.  
+	 * 
+	 * @return LCP echo failure
+	 */
+	public int getLcp_echo_failure() {
+		return lcp_echo_failure;
+	}
+
+	/**
+	 * Sets 'lcp-echo-faillure' parameter
+	 * 
+	 * @param lcp_echo_failure number of unanswered LCP echo requests before peer is assumed dead
+	 */
+	public void setLcp_echo_failure(int lcp_echo_failure) {
+		this.lcp_echo_failure = lcp_echo_failure;
+	}
+
+	/**
+	 * Reports LCP echo interval in seconds
+	 * 
+	 * @return LCP echo interval
+	 */
+	public int getLcp_echo_interval() {
+		return lcp_echo_interval;
+	}
+
+	/**
+	 * Sets LCP echo interval
+	 *  
+	 * @param lcp_echo_interval in seconds
+	 */
+	public void setLcp_echo_interval(int lcp_echo_interval) {
+		this.lcp_echo_interval = lcp_echo_interval;
+	}
+
+	/**
+	 * Reports if RTS/CTS hardware flow control is to be used
+	 * 
+	 * @return boolean <br>
+	 * 		true - use RTS/CTS flow control <br>
+	 * 		false - do not use RTS/CTS flow control
+	 */
+	public boolean isUseRtsCtsFlowControl() {
+		return useRtsCtsFlowControl;
+	}
+
+	/**
+	 * Enable/disable RTS/CTS flow control
+	 * 
+	 * @param useRtsCtsFlowControl <br>
+	 * 		true - use RTS/CTS flow control <br>
+	 * 		false - do not use RTS/CTS flow control
+	 */
+	public void setUseRtsCtsFlowControl(boolean useRtsCtsFlowControl) {
+		this.useRtsCtsFlowControl = useRtsCtsFlowControl;
+	}
+
+	/**
+	 * Reports if PPP daemon is setup to create a lock file
+	 *  
+	 * @return boolean <br>
+	 * 		true - create lock file <br>
+	 * 		false - do not create lock file
+	 */
+	public boolean isLockSerialDevice() {
+		return lockSerialDevice;
+	}
+
+	/**
+	 * Enable/disable lock file
+	 * 
+	 * @param lockSerialDevice <br>
+	 * 		true - create lock file <br>
+	 * 		false - do not create lock file
+	 */
+	public void setLockSerialDevice(boolean lockSerialDevice) {
+		this.lockSerialDevice = lockSerialDevice;
+	}
+
+	/**
+	 * Reports if modem control lines are to be used. 
+	 * 
+	 * @return boolean <br>
+	 * 		true - use modem control lines
+	 * 		false - do not use modem control lines
+	 */
+	public boolean isUseModemControlLines() {
+		return useModemControlLines;
+	}
+
+	/**
+	 * Sets 'use modem control lines' flag
+	 * 
+	 * @param useModemControlLines <br>
+	 * 		true - use modem control lines
+	 * 		false - do not use modem control lines
+	 */
+	public void setUseModemControlLines(boolean useModemControlLines) {
+		this.useModemControlLines = useModemControlLines;
+	}
+
+	/**
+	 * Reports if peer is expected to authenticate itself
+	 * 
+	 * @return boolean <br>
+	 * 		true - peer must authenticate itself
+	 * 		false - peer is not required to authenticate itself
+	 */
+	public boolean isPeerMustAuthenticateItself() {
+		return peerMustAuthenticateItself;
+	}
+
+	/**
+	 * Sets 'peer must authenticate itself' flag
+	 * 
+	 * @param peerMustAuthenticateItself <br>
+	 * 		true - peer must authenticate itself
+	 * 		false - peer is not required to authenticate itself
+
+	 */
+	public void setPeerMustAuthenticateItself(boolean peerMustAuthenticateItself) {
+		this.peerMustAuthenticateItself = peerMustAuthenticateItself;
+	}
+
+	/**
+	 * Reports connect delay in milliseconds 
+	 * 
+	 * @return - connect delay
+	 */
+	public int getConnect_delay() {
+		return connect_delay;
+	}
+
+	/**
+	 * Sets connect delay 
+	 * 
+	 * @param connect_delay in milliseconds
+	 */
+	public void setConnect_delay(int connect_delay) {
+		this.connect_delay = connect_delay;
+	}
+
+	/**
+	 * Reports if connection debugging is enabled
+	 * 
+	 * @return boolean
+	 * 		true - connection debugging is enabled <br>
+	 * 		false - connection debugging is not enabled 
+	 */
+	public boolean isEnableDebug() {
+		return enableDebug;
+	}
+
+	/**
+	 * Sets 'enable connection debugging' flag
+	 * 
+	 * @param enableDebug - enable connection debugging
+	 */
+	public void setEnableDebug(boolean enableDebug) {
+		this.enableDebug = enableDebug;
+	}	
+	
+	/**
+	 * Write the current parameters to the specified peer file
+	 */
+	public void write(String filename) throws Exception {
+
+	    // open output stream
+		FileOutputStream fos = new FileOutputStream(filename);
+	    PrintWriter writer = new PrintWriter(fos);
+
+        // set baud rate
+        if (this.getBaudRate() != -1) {
+            writer.println(this.getBaudRate());
+        }
+
+        if (this.getPppUnitNumber() != -1) {
+            writer.print("unit ");
+            writer.println(this.getPppUnitNumber());
+        }
+
+        // set logfile
+        if (this.getLogfile() != null) {
+            writer.print("logfile ");
+            writer.println(this.getLogfile());
+        }
+
+        if (this.isEnableDebug()) {
+            writer.println("debug");
+        }
+
+        if (this.getConnectScript() != null) {
+            StringBuffer connectLine = new StringBuffer("connect '");
+            connectLine.append(CHAT_PROGRAM);
+            connectLine.append(" -v -f ");
+            connectLine.append(this.getConnectScript());
+            connectLine.append("'");
+            writer.println(connectLine.toString());
+        }
+
+        if (this.getDisconnectScript() != null) {
+            StringBuffer disconnectLine = new StringBuffer("disconnect '");
+            disconnectLine.append(CHAT_PROGRAM);
+            disconnectLine.append(" -v -f ");
+            disconnectLine.append(this.getDisconnectScript());
+            disconnectLine.append("'");
+            writer.println(disconnectLine.toString());
+        }
+
+        if (this.isUseModemControlLines()) {
+            writer.println("modem");
+        }
+
+        if (this.isUseRtsCtsFlowControl()) {
+            writer.println("crtscts");
+        }
+
+        if (this.isLockSerialDevice()) {
+            writer.println("lock");
+        }
+
+        if (!this.isPeerMustAuthenticateItself()) {
+            writer.println("noauth");
+        }
+
+        ChapLinux chapLinux = ChapLinux.getInstance();
+        PapLinux papLinux = PapLinux.getInstance();
+        
+        if (this.getAuthType() != AuthType.NONE) {
+            writer.print("user \"");
+            writer.print(this.getUsername());
+            writer.println("\"");
+            
+            writer.println("hide-password");
+            
+            switch (this.getAuthType()) {
+            case AUTO:
+				if (!papLinux.checkForEntry(this.getProvider(),
+						this.getUsername(), "*", this.getPassword(), "*")) {
+					papLinux.addEntry(this.getProvider(), this.getUsername(),
+							"*", this.getPassword(), "*");
+				}
+				if (!chapLinux.checkForEntry(this.getProvider(),
+						this.getUsername(), "*", this.getPassword(), "*")) {
+					chapLinux.addEntry(this.getProvider(), this.getUsername(),
+							"*", this.getPassword(), "*");
+				}
+            	break;
+            case PAP:
+				// remove CHAP entry if exists
+				chapLinux.removeEntry("provider", this.getProvider());
+				            	
+                if (!papLinux.checkForEntry(this.getProvider(), this.getUsername(),
+                        "*", this.getPassword(), "*")) {
+                    papLinux.addEntry(this.getProvider(), this.getUsername(), "*",
+                            this.getPassword(), "*");
+                }
+                break;
+            case CHAP:
+            	// remove PAP entry if exists
+				papLinux.removeEntry("provider", this.getProvider());
+				
+                if (!chapLinux.checkForEntry(this.getProvider(), this.getUsername(),
+                        "*", this.getPassword(), "*")) {
+                    chapLinux.addEntry(this.getProvider(), this.getUsername(), "*",
+                            this.getPassword(), "*");
+                }
+                break;
+            case NONE:
+				break;
+            }
+        } else {
+        	// remove CHAP/PAP entries if exist
+			chapLinux.removeEntry("provider", this.getProvider());
+			papLinux.removeEntry("provider", this.getProvider());
+        }
+
+        if (this.isPeerToSupplyLocalIP()) {
+            writer.println("noipdefault");
+        }
+
+        if (this.isAddDefaultRoute()) {
+            writer.println("defaultroute");
+        } else {
+            writer.println("nodefaultroute");
+        }
+
+        if (this.isUsePeerDns()) {
+            writer.println("usepeerdns");
+        }
+
+        if (!this.isAllowProxyArps()) {
+            writer.println("noproxyarp");
+        }
+
+        if (!this.isAllowVanJacobsonTcpIpHdrCompression()) {
+            writer.println("novj");
+        }
+
+        if (!this.isAllowVanJacobsonConnectionIDCompression()) {
+            writer.println("novjccomp");
+        }
+
+        if (!this.isAllowBsdCompression()) {
+            writer.println("nobsdcomp");
+        }
+
+        if (!this.isAllowDeflateCompression()) {
+            writer.println("nodeflate");
+        }
+
+        if (!this.isAllowMagic()) {
+            writer.println("nomagic");
+        }
+
+        if (this.getConnect_delay() != -1) {
+            writer.println("connect-delay " + this.getConnect_delay());
+        }
+
+        if (this.getLcp_echo_failure() > 0) {
+            writer.println("lcp-echo-failure " + this.getLcp_echo_failure());
+        }
+
+        if (this.getLcp_echo_interval() > 0) {
+            writer.println("lcp-echo-interval " + this.getLcp_echo_interval());
+        }
+	    
+		writer.flush();
+		fos.getFD().sync();
+		writer.close();
+		fos.close();
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppState.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppState.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf65408bcb2bef29030e69aa436d9e9dc8b69751
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/PppState.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+public enum PppState {
+
+	NOT_CONNECTED(0),
+	IN_PROGRESS(1),
+	CONNECTED(2);
+	
+	private int m_state = 0;
+	
+	private PppState (int state) {
+		m_state = state;
+	}
+	
+	public int getState () {
+		return m_state;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/SupportedSerialModemsFactoryInfo.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/SupportedSerialModemsFactoryInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..bed8f8036c2709f995525db86cd134e9d9513ee2
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/SupportedSerialModemsFactoryInfo.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910ConfigGenerator;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910ModemFactory;
+
+public class SupportedSerialModemsFactoryInfo {
+
+	public enum SerialModemFactoryInfo {
+		
+		Telit_HE910_NAD	(SupportedSerialModemsInfo.getModem(), TelitHe910ModemFactory.class, TelitHe910ConfigGenerator.class);
+		
+		private SupportedSerialModemInfo m_serialModemInfo;
+		private Class<? extends CellularModemFactory> m_factoryClass;
+		private Class<? extends ModemPppConfigGenerator> m_configClass;
+		
+		private SerialModemFactoryInfo(SupportedSerialModemInfo modemInfo,
+		        Class<? extends CellularModemFactory> factoryClass,
+		        Class<? extends ModemPppConfigGenerator> configClass) {
+		    this.m_serialModemInfo = modemInfo;
+		    this.m_factoryClass = factoryClass;
+		    this.m_configClass = configClass;
+		}
+		
+		public SupportedSerialModemInfo getSerialModemInfo() {
+		    return m_serialModemInfo;
+		}
+        
+        public Class<? extends CellularModemFactory> getModemFactoryClass() {
+            return m_factoryClass;
+        }
+		
+		public Class<? extends ModemPppConfigGenerator> getConfigGeneratorClass() {
+			return m_configClass;
+		}
+	}
+	
+	public static SerialModemFactoryInfo getModem(SupportedSerialModemInfo modemInfo) {
+        if (modemInfo == null)
+            return null;
+        
+        for (SerialModemFactoryInfo modem : SerialModemFactoryInfo.values()) {
+            if (modemInfo.equals(modem.getSerialModemInfo())) {
+                return modem;
+            }
+        }
+        
+        return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/SupportedUsbModemsFactoryInfo.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/SupportedUsbModemsFactoryInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea93ce711e795fe7ca56b9cdcf8f3cdac6f3eede
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/SupportedUsbModemsFactoryInfo.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem;
+
+import java.util.List;
+
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.UsbModemDriver;
+import org.eclipse.kura.net.admin.modem.sierra.mc87xx.SierraMc87xxConfigGenerator;
+import org.eclipse.kura.net.admin.modem.sierra.mc87xx.SierraMc87xxModemFactory;
+import org.eclipse.kura.net.admin.modem.sierra.usb598.SierraUsb598ConfigGenerator;
+import org.eclipse.kura.net.admin.modem.sierra.usb598.SierraUsb598ModemFactory;
+import org.eclipse.kura.net.admin.modem.telit.de910.TelitDe910ConfigGenerator;
+import org.eclipse.kura.net.admin.modem.telit.de910.TelitDe910ModemFactory;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910ConfigGenerator;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910ModemFactory;
+
+public class SupportedUsbModemsFactoryInfo {
+	
+	public enum UsbModemFactoryInfo {
+		
+	                    // modem info, implementation factory, config reader/writer class
+		Telit_HE910_D		(SupportedUsbModemInfo.Telit_HE910_D, TelitHe910ModemFactory.class, TelitHe910ConfigGenerator.class),
+		Telit_DE910_DUAL    (SupportedUsbModemInfo.Telit_DE910_DUAL, TelitDe910ModemFactory.class, TelitDe910ConfigGenerator.class),
+		Telit_LE910			(SupportedUsbModemInfo.Telit_LE910, TelitHe910ModemFactory.class, TelitHe910ConfigGenerator.class),
+		Sierra_MC8775	(SupportedUsbModemInfo.Sierra_MC8775, SierraMc87xxModemFactory.class, SierraMc87xxConfigGenerator.class),
+		Sierra_MC8790	(SupportedUsbModemInfo.Sierra_MC8790, SierraMc87xxModemFactory.class, SierraMc87xxConfigGenerator.class),
+		Sierra_USB598	(SupportedUsbModemInfo.Sierra_USB598, SierraUsb598ModemFactory.class, SierraUsb598ConfigGenerator.class);
+	
+		private SupportedUsbModemInfo m_usbModemInfo;
+		private Class<? extends CellularModemFactory> m_factoryClass;
+		private Class<? extends ModemPppConfigGenerator> m_configClass;
+		
+		private UsbModemFactoryInfo(SupportedUsbModemInfo modemInfo,
+		        Class<? extends CellularModemFactory> factoryClass,
+		        Class<? extends ModemPppConfigGenerator> configClass) {
+		    this.m_usbModemInfo = modemInfo;
+		    this.m_factoryClass = factoryClass;
+		    this.m_configClass = configClass;
+		}
+		
+		public SupportedUsbModemInfo getUsbModemInfo() {
+		    return this.m_usbModemInfo;
+		}
+        
+        public Class<? extends CellularModemFactory> getModemFactoryClass() {
+            return this.m_factoryClass;
+        }
+		
+		public Class<? extends ModemPppConfigGenerator> getConfigGeneratorClass() {
+			return this.m_configClass;
+		}
+	}
+	
+	
+	public static UsbModemFactoryInfo getModem(SupportedUsbModemInfo modemInfo) {
+        if (modemInfo == null)
+            return null;
+        
+        for (UsbModemFactoryInfo modem : UsbModemFactoryInfo.values()) {
+            if (modemInfo.equals(modem.getUsbModemInfo())) {
+                return modem;
+            }
+        }
+        
+        return null;
+	}
+	
+	public static UsbModemFactoryInfo getModem(String vendor, String product) {
+
+		UsbModemFactoryInfo modemFactoryInfo = null;
+		for (UsbModemFactoryInfo modem : UsbModemFactoryInfo.values()) {
+			if (modem.getUsbModemInfo().getVendorId().equals(vendor)
+					&& modem.getUsbModemInfo().getVendorId().equals(vendor)) {
+				modemFactoryInfo = modem;
+				break;
+			}
+		}
+		return modemFactoryInfo;
+	}
+	
+	public static List<? extends UsbModemDriver> getDeviceDrivers (String vendor, String product) {
+
+		List<? extends UsbModemDriver>drivers = null;
+		for (UsbModemFactoryInfo modem : UsbModemFactoryInfo.values()) {
+			if (modem.getUsbModemInfo().getVendorId().equals(vendor)
+					&& modem.getUsbModemInfo().getProductId().equals(product)) {
+				drivers =  modem.getUsbModemInfo().getDeviceDrivers();
+				break;
+			}
+		}
+		return drivers;
+	}
+}
+
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnS.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnS.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d9d99013d661bf77352c04ca74c4e57ec957620
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnS.java
@@ -0,0 +1,315 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** 
+ * Describes CnS object.
+ * <p>
+ * CnS format:
+ * <table border="1">
+ * <th>Byte offset</th>
+ * <th>Content</th>
+ * <tr><td>0-1</td><td>Object ID</td></tr>
+ * <tr><td>2</td><td>Operation Type</td></tr>
+ * <tr><td>3</td><td>Reserved</td></tr>
+ * <tr><td>4-7</td><td>Application ID</td></tr>
+ * <tr><td>8-9</td><td>Length of payload (0�246)</td></tr>
+ * <tr><td>[10-255]</td><td>Parameter (if needed for the object)</td></tr>
+ * </table>
+ * <p>
+ * The maximum length of a CnS message is 255 bytes. The minimum length is 10.
+ * <p>
+ * 
+ *
+ * Copyright (c) 2009 Eurotech Inc. All rights reserved.
+ *
+ */
+public class CnS {
+	
+	// CnS offset number of bytes into the payload
+	public static final int PAYLOAD_OFFSET = 10;
+	
+		
+	private int objectId = 0;
+	private int operationType  = 0;
+	private int reserved = 0;
+	private long applicationId = 0L;
+	private int payloadLength = 0;
+	
+	private byte [] request = null; // CnS request array
+	private byte [] payload = null; // CnS payload array
+	
+	
+	/**
+	 * CnS message constructor.
+	 * 
+	 * <p>
+	 * CnS request constructor
+	 * <p>
+	 * @param objectID - object ID
+	 * @param opType - operation type
+	 * @param appID - application ID
+	 */
+	public CnS (int objectID, byte opType, int appID) {
+		
+		this.objectId = objectID;
+		this.operationType = opType;
+		
+		List<Byte> alMsg = new ArrayList<Byte> ();
+		
+		// form "Object ID" field
+		alMsg.add (new Byte ((byte)((objectID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte) (objectID & 0xff)));
+		
+		// form "Operation Type" field
+		alMsg.add (new Byte (opType));
+		alMsg.add (new Byte ((byte)0x00)); // reserved 
+		
+		// form "Application ID" field 
+		alMsg.add (new Byte ((byte)((appID >> 24) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 16) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte)(appID & 0xff)));
+		
+		// form "Payload Length" field
+		alMsg.add (new Byte ((byte)0x00));
+		alMsg.add (new Byte ((byte)0x00));
+		
+		// form CnS request array
+		this.request = new byte [alMsg.size()];
+		for (int i = 0; i < alMsg.size(); i++) {
+			this.request [i] = ((Byte)alMsg.get(i)).byteValue();
+		}
+	}
+	
+	/**
+	 * CnS message constructor
+	 * 
+	 * @param objectID - object ID
+	 * @param opType - operation type
+	 * @param appID - application ID
+	 * @param pload CnS payload
+	 */
+	public CnS (int objectID, byte opType, int appID, byte [] pload) {
+		
+		this.objectId = objectID;
+		this.operationType = opType;
+		
+		List<Byte> alMsg = new ArrayList<Byte>();
+		
+		// form "Object ID" field
+		alMsg.add (new Byte ((byte)((objectID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte) (objectID & 0xff)));
+		
+		// form "Operation Type" field
+		alMsg.add (new Byte (opType));
+		alMsg.add (new Byte ((byte)0x00)); // reserved 
+		
+		// form "Application ID" field 
+		alMsg.add (new Byte ((byte)((appID >> 24) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 16) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte)(appID & 0xff)));
+		
+		// form "Payload Length" field
+		int ploadlen = pload.length;
+		alMsg.add (new Byte ((byte)((ploadlen >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte) (ploadlen & 0xff)));
+		
+		for (int i = 0; i < ploadlen; i++) {
+			alMsg.add (new Byte (pload[i]));
+		}
+		
+		// form CnS request array
+		this.request = new byte [alMsg.size()];
+		for (int i = 0; i < alMsg.size(); i++) {
+			this.request [i] = (byte)(((Byte)alMsg.get(i)).byteValue() & 0x0ff);
+		}
+	}
+	
+	/**
+	 * CnS message constructor
+	 * @param objectID - object ID 
+	 * @param opType - operation type
+	 * @param appID - application ID
+	 * @param param - payload
+	 */
+	public CnS (int objectID, byte opType, int appID, int param) {
+		
+		this.objectId = objectID;
+		this.operationType = opType;
+		
+		List<Byte> alMsg = new ArrayList<Byte> ();
+		
+		// form "Object ID" field
+		alMsg.add (new Byte ((byte)((objectID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte) (objectID & 0xff)));
+		
+		// form "Operation Type" field
+		alMsg.add (new Byte (opType));
+		alMsg.add (new Byte ((byte)0x00)); // reserved 
+		
+		// form "Application ID" field 
+		alMsg.add (new Byte ((byte)((appID >> 24) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 16) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte)(appID & 0xff)));
+		
+		// form "Payload Length" field
+		alMsg.add (new Byte ((byte)0x00));
+		alMsg.add (new Byte ((byte)0x02));
+		
+		alMsg.add (new Byte ((byte)((param >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte)(param & 0xff)));
+		
+		// form CnS request array
+		this.request = new byte [alMsg.size()];
+		for (int i = 0; i < alMsg.size(); i++) {
+			this.request [i] = ((Byte)alMsg.get(i)).byteValue();
+		}
+	}
+	
+	
+	/**
+	 * CnS message constructor
+	 * @param objectID - object ID 
+	 * @param opType - operation type
+	 * @param appID - application ID
+	 * @param param - payload
+	 */
+	public CnS (int objectID, byte opType, int appID, long param) {
+		
+		this.objectId = objectID;
+		this.operationType = opType;
+		
+		List<Byte> alMsg = new ArrayList<Byte> ();
+		
+		// form "Object ID" field
+		alMsg.add (new Byte ((byte)((objectID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte) (objectID & 0xff)));
+		
+		// form "Operation Type" field
+		alMsg.add (new Byte (opType));
+		alMsg.add (new Byte ((byte)0x00)); // reserved 
+		
+		// form "Application ID" field 
+		alMsg.add (new Byte ((byte)((appID >> 24) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 16) & 0xff)));
+		alMsg.add (new Byte ((byte)((appID >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte)(appID & 0xff)));
+		
+		// form "Payload Length" field
+		alMsg.add (new Byte ((byte)0x00));
+		alMsg.add (new Byte ((byte)0x04));
+		
+		alMsg.add (new Byte ((byte)((param >> 24) & 0xff)));
+		alMsg.add (new Byte ((byte)((param >> 16) & 0xff)));
+		alMsg.add (new Byte ((byte)((param >> 8) & 0xff)));
+		alMsg.add (new Byte ((byte)(param & 0x0ff)));
+		
+		// form CnS request array
+		this.request = new byte [alMsg.size()];
+		for (int i = 0; i < alMsg.size(); i++) {
+			this.request [i] = ((Byte)alMsg.get(i)).byteValue();
+		}
+	}
+	
+	
+	/**
+	 * CnS reply constructor.
+	 * 
+	 * @param msg byte array to hold CnS reply from modem
+	 */
+	public CnS(byte[] msg) {
+
+		this.objectId = ((msg[0] << 8) & 0x0ffff) | (msg[1] & 0x0ff);
+
+		this.operationType = msg[2] & 0x0ff;
+		this.reserved = msg[3] & 0x0ff;
+
+		this.applicationId = (((msg[4] << 24) & 0x0ffffffff) | ((msg[5] << 16) & 0x0ffffff)
+				| ((msg[6] << 8) & 0x0ffff) | (msg[7] & 0x0ff)) & 0x0ffffffffL;
+		
+		this.payloadLength = ((msg[8] << 8) & 0x0ffff) | (msg[9] & 0x0ff);
+		
+		this.payload = new byte [this.payloadLength];
+		for (int i = 0; i < this.payloadLength; i++) {
+			this.payload [i] = msg [PAYLOAD_OFFSET+i];
+		}
+	}
+	
+	/**
+	 * Reports CnS request
+	 * 
+	 * @return CnS request as byte array
+	 */
+	public byte[] getRequest() {
+		return request;
+	}
+	
+	/**
+	 * Reports payload of CnS message
+	 * 
+	 * @return payload as byte array
+	 */
+	public byte [] getPayload () {
+		return this.payload;
+	}
+
+	/**
+	 * Reports CnS Application ID
+	 * 
+	 * @return application ID 
+	 */
+	public long getApplicationId() {
+		return applicationId;
+	}
+
+	/**
+	 * Reports CnS object ID
+	 * 
+	 * @return object ID
+	 */
+	public int getObjectId() {
+		return objectId;
+	}
+
+	/**
+	 * Reports CnS operation type
+	 * 
+	 * @return operation type
+	 */
+	public int getOperationType() {
+		return operationType;
+	}
+
+	/**
+	 * Reports the length of Cns payload
+	 * 
+	 * @return payload length
+	 */
+	public int getPayloadLength() {
+		return payloadLength;
+	}
+
+	/**
+	 * Reports reserved word
+	 * 
+	 * @return - reserved word
+	 */
+	public int getReserved() {
+		return reserved;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsAppIDs.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsAppIDs.java
new file mode 100644
index 0000000000000000000000000000000000000000..047207247dc5aacb48570ff680a3c1e63fe88b2e
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsAppIDs.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra;
+
+public enum CnsAppIDs {
+
+	/**
+	 * CnS 'MC572x Application' ID
+	 */
+	MC572x_APPLICATION_ID(0x10000001),
+	
+	/**
+	 * CnS 'MC87xx Application' ID
+	 */
+	MC87xx_APPLICATION_ID(0x10000002),
+	
+	/**
+	 * CnS 'C8xx Application' ID
+	 */
+	C8xx_APPLICATION_ID(0x10000003),
+	
+	/**
+	 * CnS 'USB 598 Application' ID
+	 */
+	USB598_APPLICATION_ID(0x10000004);
+	
+	private int m_appID = 0;
+	
+	private CnsAppIDs(int appID) {
+		m_appID = appID;
+	}
+	
+	public int getID() {
+		return m_appID;
+	}
+	
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsObjectIDs.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsObjectIDs.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a7149f9c14f07e085b9575837ecf726563a2786
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsObjectIDs.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra;
+
+public enum CnsObjectIDs {
+	
+	// Radio Information
+	OBJID_RSSI(0x1001),
+	OBJID_CHANNEL_NUMBER(0x1004),
+	OBJID_CHANNEL_STATE(0x1005),
+	OBJID_CURRENT_BAND_CLASS(0x4008),
+	
+	// Network information
+	OBJID_SID_VALUE(0x4001),
+	OBJID_NID_VALUE(0x4002),
+	OBJID_SRVC_INDICATION(0x1006),
+	OBJID_ROAMING_STATUS(0x1007),
+	
+	// Hardware information
+	OBJID_ESN(0x1000),
+	OBJID_PRLVER(0x1008),
+	OBJID_FIRMWARE_VERSION(0x0001),
+	OBJID_FIRMWARE_DATE(0x0002),
+	OBJID_BOOT_VERSION(0x0004),
+
+	// Data summary
+	OBJID_CALL_BYTE_CNT(0x3001),
+
+	// Account Reference
+	OBJID_ACTIVATION_STATUS(0x1009),
+	OBJID_ACTIVATION_DATE(0x1037),
+	OBJID_ACTIVE_NAM(0x101f),
+	OBJID_PHONE_NO(0x1002),
+	OBJID_MDN(0x1038),
+	OBJID_MIN(0x1039),
+
+	// Call status
+	OBJID_CALL_NOTIFICATION(0x3000), // Call Notification Status (Get)
+	OBJID_CALL_DISCONNECTED(0x300C),	// call disconnected
+	OBJID_CALL_CONNECTING(0x3011),	// connecting
+	OBJID_CALL_CONNECTED(0x300A),	// call connected
+	OBJID_CALL_DORMANT(0x3012), // call dormant
+	OBJID_CALL_ERROR(0x300E),	// call error
+
+	// OMA-DM
+	OBJID_DMCONFIG(0x0E00), // DM Configuration
+	OBJID_DMSTART(0x0E01), // Start DM Session
+	OBJID_DMSTATE(0x0E03), // DM session state
+
+	OBJID_RADIO_PWR(0x0007); // Radio Power (Set|Get|Notify)
+
+
+	private int m_objID = 0;
+	
+	private CnsObjectIDs(int objID) {
+		m_objID = objID;
+	}
+
+	public int getObjectID () {
+		return m_objID;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsOpTypes.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsOpTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad74b7fe19ba3014d684493f2f7273394bdde677
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/CnsOpTypes.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra;
+
+public enum CnsOpTypes {
+	
+	/**
+	 * CnS Operation Type - 'GetRequest'
+	 */
+	OPTYPE_GET((byte)0x01), 
+	
+	/**
+	 * CnS Operation Type - reply to 'GetRequest'
+	 */
+	OPTYPE_GETREP((byte)0x02), 
+	
+	/**
+	 * CnS Operation Type - 'Set' (CnS command)
+	 */
+	OPTYPE_SET((byte)0x03),
+	
+	/**
+	 * CnS Operation Type - 'SetAck' (acknowledge to Set) 
+	 */
+	OPTYPE_SETACK((byte)0x04), 
+	
+	/**
+	 * CnS Operation Type - 'NotificationEnable'
+	 */
+	OPTYPE_NOTIF_ENB((byte)0x05),
+	
+	/**
+	 * CnS Operation Type - reply to 'NotificationEnable'
+	 */
+	OPTYPE_NOTIF_ENB_REP((byte)0x06),
+	
+	/**
+	 * CnS Operation Type - 'Notification'
+	 */
+	OPTYPE_NOTIFICATION((byte)0x07),
+	
+	/**
+	 * CnS Operation Type - 'Notification Disable'
+	 */
+	OPTYPE_NOTIF_DISABLE((byte)0x08),
+	
+	/**
+	 * CnS Operation Type - acknowledge to 'Notification Disable'
+	 */
+	OPTYPE_NOTIF_DISABLE_ACK((byte)0x09),
+
+	/**
+	 * CnS Operation Type - 'Error'
+	 */
+	OPTYPE_ERROR((byte)0x80);
+	
+	private byte m_opType = 0;
+	private CnsOpTypes(byte opType) {
+		m_opType = opType;
+	}
+	
+	public byte getOpType () {
+		return m_opType;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/Hip.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/Hip.java
new file mode 100644
index 0000000000000000000000000000000000000000..19e392484ead623e39876bfe041d8512fe53f779
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/Hip.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra;
+
+/* 
+ * 
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Describes HIP (Host Interface Protocol) object.
+ * <p>
+ * The Host Interface Protocol is a multiplexing layer designed to allow
+ * several types of message streams to share the same physical link layer. CnS is
+ * one of the supported streams.
+ * HIP is used to carry control and status data between the modem and the host to
+ * provide management of the modem device. This management consists of: 
+ * <p> � Non-volatile configuration of the device
+ * <p> � Run-time configuration of the device
+ * <p> � Status reporting and monitoring of the device
+ * <p> This protocol does not include checksums. It relies on a high-reliability physical
+ * interface between the host and the modem to reduce the processing burden on the
+ * microprocessor.
+ * <p>HIP format:
+ * <table border="1">
+ * <th>Byte offset</th>
+ * <th>Content</th>
+ * <tr><td>0</td><td>Framing character (0x7E)</td></tr>
+ * <tr><td>1-2</td><td>Length of ooptional payload</td></tr>
+ * <tr><td>3</td><td>Message ID</td></tr>
+ * <tr><td>4</td><td>Parameter</td></tr>
+ * <tr><td>5-n</td><td>Optional payload</td></tr>
+ * <tr><td>n+1</td><td>Framing character (0x7E)</td></tr>
+ * </table>
+ * <p>
+ * The minimum length of a HIP packet is six bytes, for a packet without the
+ * optional payload. Note that such a packet would have the first field set 
+ * to 0x0000�no payload.
+ * <p>
+ *
+ * Copyright (c) 2009 Eurotech Inc. All rights reserved.
+ *
+ */
+public class Hip {
+	
+	/**
+	 * Indicates host to modem message direction.
+	 */
+	public static final byte MSGID_CNS_HOST2MODEM = (byte)0x2B;
+	
+	/**
+	 * Indicates modem to host message direction.
+	 */
+	public static final byte MSGID_CNS_MODEM2HOST = (byte)0x6B;
+	
+	/**
+	 * Minimum message size.
+	 */
+	public static final int MIN_MSG_SIZE = 6;
+
+	/**
+	 * Frame byte delimiter.
+	 */
+	public static final byte FRAME_BYTE = (byte)0x7e;
+	
+	private static final byte ESCAPE_BYTE = (byte)0x7d;
+	private static final byte MASK_BYTE = (byte)0x20;
+	
+	private static final int MESSAGE_ID_OFFSET = 2;
+	private static final int PARAMETER_OFFSET = 3;
+	private static final int PAYLOAD_OFFSET = 4;
+	
+	private int payloadlength = 0;
+	private byte message_id = 0;
+	private byte parameter = 0;
+	
+	private byte [] hipmsg = null;
+	private byte [] payload = null;
+	
+	private boolean is_error = false;
+	
+	/**
+	 * HIP request constructor
+	 * 
+	 * @param payload - HIP payload
+	 */
+	public Hip (byte [] payload) {
+		
+		this.message_id = MSGID_CNS_HOST2MODEM;
+		this.payloadlength = payload.length;
+		
+		List<Byte> alMsg = new ArrayList<Byte> ();
+		
+		// form HIP message
+		alMsg.add (new Byte ((byte)((this.payloadlength>>8) & 0xff)));
+		alMsg.add (new Byte ((byte) (this.payloadlength & 0xff)));
+		alMsg.add(new Byte (this.message_id));
+		alMsg.add(new Byte (this.parameter));
+		for (int i = 0; i < this.payloadlength; i++) {
+			alMsg.add(new Byte (payload[i]));
+		}
+		
+		// perform escape character processing
+		for (int i = 0; i < alMsg.size(); i++) {
+			byte b = ((Byte)alMsg.get(i)).byteValue();
+			if ((b == FRAME_BYTE) || (b == ESCAPE_BYTE)) {
+				alMsg.remove(i);
+				alMsg.add(i++, new Byte (ESCAPE_BYTE));
+				alMsg.add(i, new Byte ((byte)(b^MASK_BYTE)));
+			}
+		}
+		
+		// add start and end framing bytes
+		alMsg.add(0, new Byte (FRAME_BYTE));
+		alMsg.add(new Byte (FRAME_BYTE));
+		
+		// convert message to array of bytes
+		this.hipmsg = new byte [alMsg.size()];
+		for (int i = 0; i < this.hipmsg.length; i++) {
+			this.hipmsg[i] = ((Byte)alMsg.get(i)).byteValue();
+		}
+	}
+	
+	
+	/**
+	 * HIP reply constructor
+	 * 
+	 * @param alMsg - HIP reply 
+ 	 */
+	public Hip(List<Byte> alMsg) {
+		
+		// convert supplied message to array of bytes
+		this.hipmsg = new byte [alMsg.size()];
+		for (int i = 0; i < this.hipmsg.length; i++) {
+			this.hipmsg[i] = ((Byte)alMsg.get(i)).byteValue();
+		}
+		
+		// remove starting and ending flags
+		try {
+			if (((Byte) alMsg.get(alMsg.size() - 1)).byteValue() == FRAME_BYTE) {
+				alMsg.remove(alMsg.size() - 1);
+			}
+			if (((Byte) alMsg.get(0)).byteValue() == FRAME_BYTE) {
+				alMsg.remove(0);
+			}
+	
+			// perform escape character processing
+			for (int i = 0; i < alMsg.size(); i++) {
+				byte b = ((Byte) alMsg.get(i)).byteValue();
+				if (b == ESCAPE_BYTE) {
+					alMsg.remove(i);
+					b = ((Byte) alMsg.get(i)).byteValue();
+					alMsg.remove(i);
+					alMsg.add(i, new Byte((byte) (b ^ MASK_BYTE)));
+				}
+			}
+		
+			// get HIP header fields		
+		
+			this.payloadlength = ((((Byte) alMsg.get(0)).byteValue() << 8) & 0x0ffff)
+					| (((Byte) alMsg.get(1)).byteValue() & 0x0ff);
+			
+			this.message_id = ((Byte)alMsg.get(MESSAGE_ID_OFFSET)).byteValue();
+			this.parameter = ((Byte)alMsg.get(PARAMETER_OFFSET)).byteValue();
+		
+			// get HIP payload 
+		
+			this.payload = new byte[this.payloadlength];
+			for (int i = 0; i < this.payloadlength; i++) {
+				this.payload[i] = ((Byte)alMsg.get(PAYLOAD_OFFSET+i)).byteValue();
+			}
+		} catch (Exception e) {
+			this.is_error = true;
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Reports HIP message
+	 * 
+	 * @return byte [] - message
+	 */
+	public byte [] getHIPmessage () {
+		return this.hipmsg;
+	}
+	
+	/**
+	 * Reports HIP payload
+	 * 
+	 * @return HIP payload
+	 */
+	public byte [] getPayload () {
+		return this.payload;
+	}
+	
+	/**
+	 * Reports message ID 
+	 * 
+	 * @return Message ID
+	 */
+	public byte getMessageID () {
+		return this.message_id;
+	}
+	
+	/**
+	 * Reports if there is an error in processing HIP reply
+	 * 
+	 * @return boolean <br>
+	 * 		true - error <br>
+	 * 		false - no error
+	 */
+	public boolean isError () {
+		return this.is_error;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xx.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xx.java
new file mode 100644
index 0000000000000000000000000000000000000000..63b7bc0847177b3e4ba699025afe173e26208ed2
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xx.java
@@ -0,0 +1,521 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.mc87xx;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.admin.modem.HspaCellularModem;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemRegistrationStatus;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.usb.UsbModemDevice;
+import org.osgi.service.io.ConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SierraMc87xx implements HspaCellularModem {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(SierraMc87xx.class);
+	
+	private ConnectionFactory m_connectionFactory = null;
+	 
+	private ModemTechnologyType m_technologyType = null;
+	private String m_model = null;
+	private String m_manufacturer = null;
+	private String m_serialNumber = null;
+	private String m_revisionId = null;
+	
+	private Object m_atLock = null; 
+	
+	private ModemDevice m_device = null;
+	private List<NetConfig> m_netConfigs = null;
+	
+	public SierraMc87xx(ModemDevice device, ConnectionFactory connectionFactory,
+			ModemTechnologyType technologyType) {
+        
+        m_device = device;
+        m_connectionFactory = connectionFactory;
+        m_technologyType = technologyType;
+        m_atLock = new Object();
+	}
+	
+	@Override
+	public String getModel() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_model == null) {
+	    		s_logger.debug("sendCommand getModelNumber :: " + SierraMc87xxAtCommands.getModelNumber.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getModelNumber.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_model = getResponseString(reply);
+					reply = null;
+				}
+	    	}
+    	}
+        return m_model;
+	}
+
+	@Override
+	public String getManufacturer() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_manufacturer == null) {
+		    	s_logger.debug("sendCommand getManufacturer :: " + SierraMc87xxAtCommands.getManufacturer.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+		    	try {
+					reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getManufacturer.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+		    	closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    m_manufacturer = getResponseString(reply); 
+					reply = null;
+				}
+	    	}
+    	}
+        return m_manufacturer;
+	}
+
+	@Override
+	public String getSerialNumber() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_serialNumber == null) {
+	    		s_logger.debug("sendCommand getSerialNumber :: " + SierraMc87xxAtCommands.getSerialNumber.getCommand());
+	    		byte[] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getSerialNumber.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_serialNumber = getResponseString(reply);
+				}
+	    	}
+    	}
+        return m_serialNumber;
+	}
+
+	@Override
+	public String getRevisionID() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_revisionId == null) {
+	    		s_logger.debug("sendCommand getRevision :: " + SierraMc87xxAtCommands.getFirmwareVersion.getCommand());
+	    		byte [] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+	    		try {
+					reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getFirmwareVersion.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+	    		closeSerialPort(commAtConnection);
+				if (reply != null) {
+					String firmwareVersion = getResponseString(reply);
+					if (firmwareVersion.startsWith("!GVER:")) {
+						firmwareVersion = firmwareVersion.substring("!GVER:".length()).trim();
+						String [] aFirmwareVersion = firmwareVersion.split(" ");
+						m_revisionId = aFirmwareVersion[0];
+					}
+				}
+	    	}
+    	}
+        return m_revisionId;
+	}
+
+	@Override
+	public boolean isReachable() throws KuraException {
+		boolean ret = false;
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getAtPort());
+    		ret = isAtReachable(commAtConnection);
+    		closeSerialPort(commAtConnection);
+    	}
+		return ret;
+	}
+
+	@Override
+	public void reset() throws KuraException {
+		// TODO
+		// not supported
+	}
+
+	@Override
+	public int getSignalStrength() throws KuraException {
+		
+		int rssi = -113;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getSignalStrength :: " + SierraMc87xxAtCommands.getSignalStrength.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getSignalStrength.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] asCsq = null;
+				String sCsq = this.getResponseString(reply);
+				if (sCsq.startsWith("+CSQ:")) {
+					sCsq = sCsq.substring("+CSQ:".length()).trim();
+					asCsq = sCsq.split(",");
+					if (asCsq.length == 2) {
+						rssi = -113 + 2 * Integer.parseInt(asCsq[0]);
+						
+					}
+				}
+				reply = null;
+			}
+    	}
+        return rssi;
+	}
+
+	@Override
+	public ModemRegistrationStatus getRegistrationStatus() throws KuraException {
+		
+		ModemRegistrationStatus modemRegistrationStatus = ModemRegistrationStatus.UNKNOWN;
+		synchronized (m_atLock) {
+			s_logger.debug("sendCommand getSystemInfo :: " + SierraMc87xxAtCommands.getSystemInfo.getCommand());
+    		byte[] reply = null;
+    		CommConnection commAtConnection = openSerialPort(getAtPort());
+    		if (!isAtReachable(commAtConnection)) {
+    			closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getSystemInfo.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String sSysInfo = getResponseString(reply);
+				if ((sSysInfo != null) && (sSysInfo.length() > 0)) { 
+					String [] aSysInfo = sSysInfo.split(",");
+					if (aSysInfo.length == 5) {
+						int srvStatus = Integer.parseInt(aSysInfo[0]);
+						int roamingStatus = Integer.parseInt(aSysInfo[2]);
+						switch (srvStatus) {
+						case 0:
+							modemRegistrationStatus = ModemRegistrationStatus.NOT_REGISTERED;
+							break;
+						case 2:
+							switch (roamingStatus) {
+							case 0:
+								modemRegistrationStatus = ModemRegistrationStatus.REGISTERED_HOME;
+								break;
+							case 1:
+								modemRegistrationStatus = ModemRegistrationStatus.REGISTERED_ROAMING;
+								break;
+							}
+							break;
+						}
+					}
+				}
+			}
+		}
+		return modemRegistrationStatus;
+	}
+
+	@Override
+	public long getCallTxCounter() throws KuraException {
+		// TODO 
+		// Not supported via AT interface need to use HIP/CnS
+		return 0;
+	}
+
+	@Override
+	public long getCallRxCounter() throws KuraException {
+		// TODO
+		// Not supported via AT interface need to use HIP/CnS
+		return 0;
+	}
+
+	@Override
+	public String getServiceType() throws KuraException {
+		
+		String serviceType = null;
+    	synchronized (m_atLock) {
+    		s_logger.debug("sendCommand getMobileStationClass :: " + SierraMc87xxAtCommands.getMobileStationClass.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getMobileStationClass.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String sCgclass = this.getResponseString(reply);
+				if (sCgclass.startsWith("+CGCLASS:")) {
+					sCgclass = sCgclass.substring("+CGCLASS:".length()).trim();
+					if (sCgclass.equals("\"A\"")) {
+						serviceType = "UMTS";
+					} else if (sCgclass.equals("\"B\"")) {
+						serviceType = "GSM/GPRS";
+					} else if (sCgclass.equals("\"CG\"")) {
+						serviceType = "GPRS";
+					} else if (sCgclass.equals("\"CC\"")) {
+						serviceType = "GSM";
+					}
+				}
+				reply = null;
+			}
+    	}
+		
+		return serviceType;
+	}
+
+	@Override
+	public ModemDevice getModemDevice() {
+		return m_device;
+	}
+
+	@Override
+	public String getDataPort() throws KuraException {
+		String port = null;
+		List <String> ports = m_device.getSerialPorts();
+		if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getDataPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No PPP serial port available");
+	    		}
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+		}
+		
+    	return port;
+	}
+
+	@Override
+	public String getAtPort() throws KuraException {
+		String port = null;
+		List <String> ports = m_device.getSerialPorts();
+			if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getAtPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No AT serial port available");
+	    		}
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+		}
+    	
+    	return port;
+	}
+	
+	@Override
+	public String getGpsPort() throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean isGpsSupported() throws KuraException {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void enableGps() throws KuraException {
+		// TODO Auto-generated method stub	
+	}
+
+	@Override
+	public void disableGps() throws KuraException {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	public List<NetConfig> getConfiguration() {
+		return m_netConfigs;
+	}
+
+	@Override
+	public void setConfiguration(List<NetConfig> netConfigs) {
+		m_netConfigs = netConfigs;
+	}
+
+	@Override
+	public ModemTechnologyType getTechnologyType() {
+		return m_technologyType;
+	}
+
+	@Override
+	public boolean isSimCardReady() throws KuraException {
+		
+		boolean simReady = false;
+		synchronized (m_atLock) {
+			s_logger.debug("sendCommand getSystemInfo :: " + SierraMc87xxAtCommands.getSystemInfo.getCommand());
+    		byte[] reply = null;
+    		CommConnection commAtConnection = openSerialPort(getAtPort());
+    		if (!isAtReachable(commAtConnection)) {
+    			closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(SierraMc87xxAtCommands.getSystemInfo.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String sSysInfo = getResponseString(reply);
+				if ((sSysInfo != null) && (sSysInfo.length() > 0)) { 
+					String [] aSysInfo = sSysInfo.split(",");
+					if (aSysInfo.length == 5) {
+						int simStatus = Integer.parseInt(aSysInfo[4]);
+						if (simStatus == 1) {
+							simReady = true;
+						}
+					}
+				}
+			}
+		}
+		return simReady;
+	}
+	
+private CommConnection openSerialPort (String port) throws KuraException {
+    	
+    	CommConnection connection = null;
+		if(m_connectionFactory != null) {
+			String uri = new CommURI.Builder(port)
+							.withBaudRate(115200)
+							.withDataBits(8)
+							.withStopBits(1)
+							.withParity(0)
+							.withTimeout(2000)
+							.build().toString();
+				
+			try {
+				connection = (CommConnection) m_connectionFactory
+						.createConnection(uri, 1, false);
+			} catch (Exception e) {
+				s_logger.debug("Exception creating connection: " + e);
+				throw new KuraException(KuraErrorCode.CONNECTION_FAILED, e);
+			}
+		}
+		return connection;
+    }
+    
+    private void closeSerialPort (CommConnection connection) throws KuraException {
+		try {
+			connection.close();
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+    }
+    
+    private boolean isAtReachable(CommConnection connection) {
+    
+    	boolean status = false;
+    	int attemptNo = 0;
+    	do {
+			try {
+				status = (connection.sendCommand(
+						SierraMc87xxAtCommands.at.getCommand().getBytes(), 500).length > 0);
+			} catch (Exception e) {
+				attemptNo++;
+				sleep(2000);
+			}
+    	} while((status == false) && (attemptNo < 3));
+    	
+    	return status;	
+    }
+    
+    // Parse the AT command response for the relevant info
+ 	private String getResponseString(String resp) {
+ 	    if(resp == null) {
+ 	        return "";
+ 	    }
+ 	    
+ 	    // remove the command and space at the beginning, and the 'OK' and spaces at the end
+ 	    return resp.replaceFirst("^\\S*\\s*", "").replaceFirst("\\s*(OK)?\\s*$", "");
+ 	}
+ 	
+	private String getResponseString(byte[] resp) {
+		if (resp == null) {
+			return "";
+		}
+
+		return getResponseString(new String(resp));
+	}
+	
+	private void sleep(long millis) {
+		try {
+			Thread.sleep(millis);
+		} catch (InterruptedException e) {
+			// ignore
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxAtCommands.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxAtCommands.java
new file mode 100644
index 0000000000000000000000000000000000000000..14e58a68f191cade50ce3193219fc37b1ff8a44a
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxAtCommands.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.mc87xx;
+
+public enum SierraMc87xxAtCommands {
+
+	at("at\r\n"),
+	getModelNumber("at+gmm\r\n"),
+    getManufacturer("at+gmi\r\n"),
+    getSerialNumber("at+gsn\r\n"),
+    getFirmwareVersion("at!gver?\r\n"),
+    getSystemInfo("at^sysinfo\r\n"),
+    getSignalStrength("at+csq\r\n"),
+    getMobileStationClass("at+cgclass?\r\n"),
+	pdpContext("AT+CGDCONT"),
+	softReset("at!reset\r\n");
+	
+	private String m_command;
+	
+	private SierraMc87xxAtCommands(String atCommand) {
+		m_command = atCommand;
+	}
+	
+	public String getCommand () {
+		return m_command;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxConfigGenerator.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxConfigGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0285abbf5e4272f12b4b460da232bfc63cca2d9
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxConfigGenerator.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.mc87xx;
+
+import org.eclipse.kura.net.admin.modem.ModemPppConfigGenerator;
+import org.eclipse.kura.net.admin.modem.PppPeer;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910AtCommands;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangePair;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.ModemConfig.PdpType;
+
+public class SierraMc87xxConfigGenerator implements ModemPppConfigGenerator {
+
+	@Override
+	public PppPeer getPppPeer(String deviceId, ModemConfig modemConfig,
+			String logFile, String connectScript, String disconnectScript) {
+
+		 PppPeer pppPeer = new PppPeer();
+	        
+	        // default values
+	        pppPeer.setBaudRate(115200);
+	        pppPeer.setEnableDebug(true);
+	        pppPeer.setNetworkTechnology(ModemTechnologyType.HSDPA);
+	        pppPeer.setUseModemControlLines(true);
+	        pppPeer.setUseRtsCtsFlowControl(false);
+	        pppPeer.setLockSerialDevice(true);
+	        pppPeer.setPeerMustAuthenticateItself(false);
+	        pppPeer.setPeerToSupplyLocalIP(true);
+	        pppPeer.setAddDefaultRoute(true);
+	        pppPeer.setUsePeerDns(true);
+	        pppPeer.setAllowProxyArps(false);
+	        pppPeer.setAllowVanJacobsonTcpIpHdrCompression(false);
+	        pppPeer.setAllowVanJacobsonConnectionIDCompression(false);
+	        pppPeer.setAllowBsdCompression(false);
+	        pppPeer.setAllowDeflateCompression(false);
+	        pppPeer.setAllowMagic(false);
+	        pppPeer.setConnect_delay(1000);
+	        pppPeer.setLcp_echo_interval(0);
+
+	        // other config
+	        pppPeer.setLogfile(logFile);
+	        pppPeer.setProvider(deviceId);
+	        pppPeer.setPppUnitNumber(modemConfig.getPppNumber());
+	        pppPeer.setConnectScript(connectScript);
+	        pppPeer.setDisconnectScript(disconnectScript);
+	        pppPeer.setApn(modemConfig.getApn());
+	        pppPeer.setAuthType(modemConfig.getAuthType());
+	        pppPeer.setUsername(modemConfig.getUsername());
+	        pppPeer.setPassword(modemConfig.getPassword());
+	        pppPeer.setDialString(modemConfig.getDialString());
+	        pppPeer.setLcp_echo_interval(modemConfig.getLcpEchoInterval());
+	        pppPeer.setLcp_echo_failure(modemConfig.getLcpEchoFailure());
+
+	        return pppPeer;
+	}
+
+	@Override
+	public ModemXchangeScript getConnectScript(ModemConfig modemConfig) {
+		
+		int pdpPid = 1;
+        String apn = "";
+        String dialString = "";
+        
+        if(modemConfig != null) {
+            apn = modemConfig.getApn();
+            dialString = modemConfig.getDialString();
+        }        
+        
+        ModemXchangeScript modemXchange = new ModemXchangeScript();
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"BUSY\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"VOICE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO CARRIER\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIALTONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIAL TONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"ERROR\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"+++ath\"", "\"\""));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"AT\"", "OK"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair(this.formPDPcontext (pdpPid, PdpType.IP, apn), "OK"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"\\d\\d\\d\"", "OK"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair(this.formDialString(dialString), "\"\""));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"\\c\"", "CONNECT"));
+        
+        return modemXchange;
+	}
+
+	@Override
+	public ModemXchangeScript getDisconnectScript(ModemConfig modemConfig) {
+		
+		ModemXchangeScript modemXchange = new ModemXchangeScript();
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"BUSY\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"VOICE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO CARRIER\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIALTONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIAL TONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("BREAK", "\"\""));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"+++ATH\"", "\"\""));
+    
+        return modemXchange;
+	}
+	
+	/*
+     * This method forms dial string
+     */
+    private String formDialString(String dialString) {
+        StringBuffer buf = new StringBuffer();
+        buf.append('"');
+        if (dialString != null) {
+        	buf.append(dialString);
+        }
+        buf.append('"');
+        return buf.toString();
+    }
+    
+    /*
+     * This method forms PDP context
+     * (e.g. AT+CGDCONT=<pid>,<pdp_type>,<apn>)
+     */
+    private String formPDPcontext(int pdpPid, PdpType pdpType, String apn) {
+
+        StringBuffer pdpcontext = new StringBuffer(TelitHe910AtCommands.pdpContext.getCommand());
+        pdpcontext.append('=');
+        pdpcontext.append(pdpPid);
+        pdpcontext.append(',');
+        pdpcontext.append('"');
+        pdpcontext.append(pdpType.toString());
+        pdpcontext.append('"');
+        pdpcontext.append(',');
+        pdpcontext.append('"');
+        if (apn != null) {
+        	pdpcontext.append(apn);
+        }
+        pdpcontext.append('"');
+
+        return pdpcontext.toString();
+    }
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxModemFactory.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxModemFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..eab809abbe87c156d82d55b36b347e91dade7feb
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/mc87xx/SierraMc87xxModemFactory.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.mc87xx;
+
+import java.util.Hashtable;
+
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.modem.CellularModem;
+import org.eclipse.kura.net.admin.modem.CellularModemFactory;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Defines Sierra MC87xx Modem Factory
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class SierraMc87xxModemFactory implements CellularModemFactory {
+	
+	private static SierraMc87xxModemFactory s_factoryInstance = null;
+    
+	private static ModemTechnologyType s_type = ModemTechnologyType.HSDPA;
+	
+	private BundleContext s_bundleContext = null;
+	private Hashtable<String, SierraMc87xx> m_modemServices = null;
+	
+	private ConnectionFactory m_connectionFactory = null;
+
+	private SierraMc87xxModemFactory () {
+		s_bundleContext = FrameworkUtil.getBundle(NetworkConfigurationService.class).getBundleContext();
+		
+		ServiceTracker<ConnectionFactory, ConnectionFactory> serviceTracker = new ServiceTracker<ConnectionFactory, ConnectionFactory>(s_bundleContext, ConnectionFactory.class, null);
+		serviceTracker.open(true);
+		m_connectionFactory = serviceTracker.getService();
+		
+		m_modemServices = new Hashtable<String, SierraMc87xx>();
+	}
+	
+	public static SierraMc87xxModemFactory getInstance() {
+	    if(s_factoryInstance == null) {
+	        s_factoryInstance = new SierraMc87xxModemFactory();
+	    }
+	    return s_factoryInstance;
+	}
+	
+	@Override
+	public CellularModem obtainCellularModemService(ModemDevice modemDevice,
+			String platform) throws Exception {
+		
+		String key = modemDevice.getProductName();
+		SierraMc87xx sierraMc87xx = m_modemServices.get(key);
+		
+		if (sierraMc87xx == null) {
+			sierraMc87xx = new SierraMc87xx(modemDevice, m_connectionFactory, s_type);
+			this.m_modemServices.put(key, sierraMc87xx);
+		}
+		
+		return sierraMc87xx;
+	}
+
+	@Override
+	public Hashtable<String, ? extends CellularModem> getModemServices() {
+		return m_modemServices;
+	}
+
+	@Override
+	public void releaseModemService(String usbPortAddress) {
+		  m_modemServices.remove(usbPortAddress);
+	}
+
+	@Override
+	public ModemTechnologyType getType() {
+		return s_type;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598.java
new file mode 100644
index 0000000000000000000000000000000000000000..43178fb3e6457ab3571b308eef46aa1c6a7aa9fc
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598.java
@@ -0,0 +1,1077 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.usb598;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.GregorianCalendar;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.admin.modem.EvdoCellularModem;
+import org.eclipse.kura.net.admin.modem.sierra.CnS;
+import org.eclipse.kura.net.admin.modem.sierra.CnsAppIDs;
+import org.eclipse.kura.net.admin.modem.sierra.CnsOpTypes;
+import org.eclipse.kura.net.modem.ModemCdmaServiceProvider;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemRegistrationStatus;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.SerialModemDevice;
+import org.eclipse.kura.usb.UsbModemDevice;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.io.ConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SierraUsb598 implements EvdoCellularModem {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(SierraUsb598.class);
+	
+	private static String[] s_topicsOfInterest = null;
+	//private static final int AT_PORT = 0;
+	private static final int HIP_PORT = 1;
+	
+	private ModemTechnologyType m_technologyType = null;
+	private ConnectionFactory m_connectionFactory = null;
+	private String m_model = null;
+	private String m_manufacturer = null;
+	private String m_esn = null;
+	private String m_revisionId = null;
+	
+	private Object m_atLock = null; 
+	
+	private int m_callStatus = -1; // current call status
+	
+	//private UsbModemDevice m_usbDevice = null;
+	private ModemDevice m_device = null;
+	
+	//private NetInterfaceConfig<? extends NetInterfaceAddressConfig> m_netInterfaceConfig = null;
+	private List<NetConfig> m_netConfigs = null;
+	
+	private CommConnection m_commHipConnection = null;
+	
+	private ScheduledExecutorService m_executor = null;
+	
+	private List<CnS> m_notifications = null;
+	
+	private String m_mdn = null; // mobile directory number
+	private String m_min = null; // mobile identification number
+	
+	private String m_firmwareVersion = "";
+	private String m_firmwareDate = "";
+	private int m_prlVersion = 0; // PRL version
+	
+	/*
+	 * 'Received Signal Strength' (in dBm) and its lock
+	 */
+	private int m_rssi = 0;
+	private Object m_rssiLock = new Object();
+
+	/*
+	 * 'System ID' and its lock
+	 */
+	private int m_sid = -1;
+	private Object m_sidLock = new Object();
+
+	/*
+	 * 'Network ID' and its lock
+	 */
+	private int m_nid = -1;
+	private Object m_nidLock = new Object();
+
+	/*
+	 * 'Channel Number' and its lock
+	 */
+	private int m_channelNo = -1;
+	private Object m_channelNoLock = new Object();
+
+	/*
+	 * 'Channel State' and its lock
+	 */
+	private int m_channelState = -1;
+	private Object m_channelStateLock = new Object();
+
+	/*
+	 * 'Current Band Class' and its lock
+	 */
+	private int m_bandClass = -1;
+	private Object m_bandClassLock = new Object();
+
+	private int m_activationStatus = -1; // activation status
+
+	private GregorianCalendar m_activationDate = null; // activation date
+
+	/*
+	 * 'Roaming Status' and its lock
+	 */
+	private int m_roamingStatus = -1;
+	private Object m_roamingStatusLock = new Object();
+
+	/*
+	 * 'Service Type' and its lock
+	 */
+	private int m_serviceType = -1;
+	private Object m_serviceTypeLock = new Object();
+
+	private long m_txCount = -1L; // number of bytes transmitted during a call
+	private long m_rxCount = -1L; // number of bytes received during a call
+	private Object m_byteCountLock = new Object(); // byte count lock
+
+	/*
+	 * 'Power Mode' and its lock
+	 */
+	private int m_powerMode = -1;
+	private Object m_powerModeLock = new Object();
+	
+	/**
+     * SierraUsb598 modem constructor
+     * 
+     * @param usbDevice - modem USB device as {@link UsbModemDevice}
+     * @param connectionFactory - connection factory as {@link ConnectionFactory}
+     * @param technologyType - cellular technology type as {@link ModemTechnologyType}
+     */
+	public SierraUsb598(ModemDevice device,
+			ConnectionFactory connectionFactory,
+			ModemTechnologyType technologyType) {
+        
+        m_device = device;
+        m_connectionFactory = connectionFactory;
+        m_technologyType = technologyType;
+        m_atLock = new Object();
+        s_topicsOfInterest = generateSubscribeTopics();
+    	// subscribe on specific topics of interest
+        Dictionary d = new Hashtable();
+        d.put(EventConstants.EVENT_TOPIC, s_topicsOfInterest);
+        for (int i = 0; i < s_topicsOfInterest.length; i++) {
+        	s_logger.debug("Subscribing for " + s_topicsOfInterest[i]);
+        }
+        //bundleContext.registerService(EventHandler.class.getName(), this, d);
+        
+    	m_notifications = new ArrayList();
+        
+        // define notification thread
+        m_executor = Executors.newSingleThreadScheduledExecutor();
+    }
+    
+    public void bind() {
+    	try {
+    		m_commHipConnection = openSerialPort(getHipPort());
+    		
+    		this.m_executor.scheduleAtFixedRate(new Runnable() {
+    			public void run() {
+    				Thread.currentThread().setName("SierraUsb598");
+	    			s_logger.debug("**** HIP Thread() run ");
+	    			//if(notificationThread() == false) {
+	    			//s_logger.debug("**** notificationThread() shut down");
+	    			//	m_executor.shutdown();
+	    			//}
+	    			}
+    			}, 0, 1, TimeUnit.SECONDS);
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+    }
+    
+    public void unbind() {
+    	
+    	if (m_commHipConnection != null) {
+    		try {
+    			m_executor.shutdown();
+				closeSerialPort(m_commHipConnection);
+			} catch (KuraException e) {
+				e.printStackTrace();
+			}
+    	}
+    }
+    
+	@Override
+	public String getModel() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_model == null) {
+	    		s_logger.debug("sendCommand getModelNumber :: " + SierraUsb598AtCommands.getModelNumber.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR,
+							"Modem not available for AT commands: "
+									+ SierraUsb598.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(SierraUsb598AtCommands.getModelNumber.getCommand().getBytes(), 500);
+				} catch (IOException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_model = getResponseString(reply);
+					reply = null;
+				}
+				closeSerialPort(commAtConnection);
+	    	}
+    	}
+        return m_model;
+	}
+
+	@Override
+	public String getManufacturer() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_manufacturer == null) {
+		    	s_logger.debug("sendCommand getManufacturer :: " + SierraUsb598AtCommands.getManufacturer.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR,
+							"Modem not available for AT commands: "
+									+ SierraUsb598.class.getName());
+		    	}
+		    	try {
+					reply = commAtConnection.sendCommand(SierraUsb598AtCommands.getManufacturer.getCommand().getBytes(), 500);
+				} catch (IOException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+		    	closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    m_manufacturer = getResponseString(reply); 
+					reply = null;
+				}
+	    	}
+    	}
+        return m_manufacturer;
+	}
+
+	@Override
+	public String getSerialNumber() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_esn != null) {
+	    		s_logger.debug("sendCommand getSerialNumber :: " + SierraUsb598AtCommands.getSerialNumber.getCommand());
+	    		byte[] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+		    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR,
+							"Modem not available for AT commands: "
+									+ SierraUsb598.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(SierraUsb598AtCommands.getSerialNumber.getCommand().getBytes(), 500);
+				} catch (IOException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    StringBuffer replySB = new StringBuffer();
+				    replySB.append(new String(reply));
+	                // if response is incomplete, try to get the rest
+				    if(!replySB.toString().matches(".*OK\\s*$")) {
+				        sleep(200);
+				        try {
+							reply = commAtConnection.flushSerialBuffer();
+						} catch (IOException e) {
+							throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+						}
+				        if(reply != null) {
+				            replySB.append(new String(reply));
+				        }
+				    }
+	
+				    String serialNum = getResponseString(replySB.toString());
+				    if(serialNum != null && !serialNum.isEmpty()) {
+				    	m_esn = serialNum;        
+				    }
+				}
+	    	}
+    	}
+        return m_esn;
+	}
+
+	@Override
+	public String getRevisionID() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_revisionId == null) {
+	    		byte [] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+		    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR,
+							"Modem not available for AT commands: "
+									+ SierraUsb598.class.getName());
+		    	}
+	    		try {
+					reply = commAtConnection.sendCommand(SierraUsb598AtCommands.getRevision.getCommand().getBytes(), 500);
+				} catch (IOException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+	    		closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_revisionId = getResponseString(reply);
+				}
+	    	}
+    	}
+        return m_revisionId;
+	}
+
+	@Override
+	public boolean isReachable() throws KuraException {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void reset() throws KuraException {
+		s_logger.info("resetting modem ...");
+		try {
+			powerOff();
+			sleep(15000);
+			powerOn();
+			sleep(3000);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	@Override
+	public int getSignalStrength() throws KuraException {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public ModemRegistrationStatus getRegistrationStatus() throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public long getCallTxCounter() throws KuraException {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public long getCallRxCounter() throws KuraException {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public String getServiceType() throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ModemDevice getModemDevice() {
+		 return m_device;
+	}
+
+	@Override
+	public String getDataPort() throws KuraException {
+		
+		String port = null;
+		List <String> ports = m_device.getSerialPorts();
+		if ((ports != null) && (ports.size() > 0)) { 	
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getDataPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No PPP serial port available");
+	    		}
+	    	} else if (m_device instanceof SerialModemDevice) {
+	    		// TODO
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+		}
+    	return port;
+	}
+
+	@Override
+	public String getAtPort() throws KuraException {
+		
+		String port = null;
+		List <String> ports = m_device.getSerialPorts();
+		if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getAtPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No AT serial port available");
+	    		}
+	    	} else if (m_device instanceof SerialModemDevice) {
+	    		// TODO
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+		}
+    	return port;
+	}
+	
+	@Override
+	public String getGpsPort() throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean isGpsSupported() throws KuraException {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void enableGps() throws KuraException {
+		// TODO Auto-generated method stub	
+	}
+
+	@Override
+	public void disableGps() throws KuraException {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	public boolean isProvisioned() throws KuraException {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void provision() throws KuraException {
+		// TODO Auto-generated method stub
+	}
+	
+	@Override
+	public String getMobileDirectoryNumber() throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	@Override
+	public String getMobileIdentificationNumber() throws KuraException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	@Override
+	public List<NetConfig> getConfiguration() {
+		return m_netConfigs;
+	}
+
+	@Override
+	public void setConfiguration(List<NetConfig> netConfigs) {
+		m_netConfigs = netConfigs;
+	}
+	
+	@Override
+	public ModemTechnologyType getTechnologyType() {
+		return m_technologyType;
+	}
+	
+	private String getHipPort() throws KuraException {
+		String port = null;
+		
+		if (m_device instanceof UsbModemDevice) {
+			UsbModemDevice usbModemDevice = (UsbModemDevice)m_device;
+			List <String> ports = usbModemDevice.getTtyDevs();
+			if ((ports != null) && (ports.size() > 0)) {
+				port = ports.get(HIP_PORT);
+    		} else {
+    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No HIP serial port available");
+    		}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No HIP serial port available");
+		}
+		
+    	return port;
+	}
+	
+	@Override
+	public ModemCdmaServiceProvider getServiceProvider() {
+		// TODO 
+		return null;
+	}
+	
+	private CommConnection openSerialPort (String port) throws KuraException {
+    	
+		CommConnection connection = null;
+		if(m_connectionFactory != null) {
+			String uri = new CommURI.Builder(port)
+							.withBaudRate(115200)
+							.withDataBits(8)
+							.withStopBits(1)
+							.withParity(0)
+							.withTimeout(2000)
+							.build().toString();
+				
+			try {
+				connection = (CommConnection) m_connectionFactory.createConnection(uri, 1, false);
+			} catch (Exception e) {
+				s_logger.debug("Exception creating connection: " + e);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+		return connection;
+    }
+    
+    private void closeSerialPort (CommConnection connection) throws KuraException {
+		try {
+			connection.close();
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+    }
+    
+    private boolean isAtReachable(CommConnection connection) {
+    
+    	boolean status = false;
+    	int attemptNo = 0;
+    	do {
+			try {
+				status = (connection.sendCommand(
+						SierraUsb598AtCommands.at.getCommand().getBytes(), 500).length > 0);
+			} catch (Exception e) {
+				attemptNo++;
+				sleep(2000);
+			}
+    	} while((status == false) && (attemptNo < 3));
+    	
+    	return status;	
+    }
+    
+    // Parse the AT command response for the relevant info
+ 	private String getResponseString(String resp) {
+ 	    if(resp == null) {
+ 	        return "";
+ 	    }
+ 	    
+ 	    // remove the command and space at the beginning, and the 'OK' and spaces at the end
+ 	    return resp.replaceFirst("^\\S*\\s*", "").replaceFirst("\\s*(OK)?\\s*$", "");
+ 	}
+ 	
+	private String getResponseString(byte[] resp) {
+		if (resp == null) {
+			return "";
+		}
+
+		return getResponseString(new String(resp));
+	}
+	
+	private void powerOff() {
+		// do nothing
+	}
+	
+	private void powerOn() {
+		// do nothing
+	}
+	
+	private void sleep(long millis) {
+		try {
+			Thread.sleep(millis);
+		} catch (InterruptedException e) {
+			// ignore
+		}
+	}
+	
+	/*
+	 * This method generates array of subscribe topics
+	 */
+	private static String[] generateSubscribeTopics() {
+
+		StringBuffer buf = new StringBuffer(SierraUsb598.class.getName()
+				.replace('.', '/'));
+		buf.append('/');
+		buf.append('*');
+		String[] topics = new String[1];
+		topics[0] = new String(buf.toString());
+
+		return topics;
+	}
+	
+	/*
+	private boolean notificationThread() {
+		
+		s_logger.debug("notificationThread() - start");
+		CnS notification = null;
+		// check for notifications (unsolicited messages)
+		s_logger.debug("notificationThread() - alNotifications.size(): " + m_notifications.size());
+		while (m_notifications.size() > 0) {
+		notification = m_notifications.remove(0);
+		s_logger.debug("notificationThread() - first notification: " + notification);
+		if (notification != null) {
+
+		s_logger.debug("Notification ObjID: 0x" + Integer.toHexString(notification.getObjectId()));
+		int objID = notification.getObjectId();
+		
+		switch (objID) {
+		case CnsObjectIDs.OBJID_RSSI.getObjectID():
+		synchronized (m_rssiLock) {
+		this.setSignalStrengthInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_SID_VALUE.getObjectID():
+		synchronized (m_sidLock) {
+		this.setSystemIdInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_NID_VALUE.getObjectID():
+		synchronized (m_nidLock) {
+		this.setNetworkIdInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_CHANNEL_NUMBER.getObjectID():
+		synchronized (m_channelNoLock) {
+		this.setChannelNumberInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_CHANNEL_STATE.getObjectID():
+		synchronized (m_channelStateLock) {
+		this.setChannelStateInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_CURRENT_BAND_CLASS.getObjectID():
+		synchronized (m_bandClassLock) {
+		this.setBandClassInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_ROAMING_STATUS.getObjectID():
+		synchronized (m_roamingStatusLock) {
+		this.setRoamingStatusInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_CALL_BYTE_CNT.getObjectID():
+		synchronized (m_byteCountLock) {
+		this.setCallTxCounterInfo(notification);
+		this.setCallRxCounterInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_SRVC_INDICATION.getObjectID():
+		synchronized (m_serviceTypeLock) {
+		this.setServiceTypeInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_RADIO_PWR.getObjectID():
+		synchronized (m_powerModeLock) {
+		this.setPowerModeInfo(notification);
+		}
+		break;
+		case CnsObjectIDs.OBJID_CALL_DISCONNECTED.getObjectID():
+		// notification-only - no need to synchronize 
+		this.setCallStatusInfo(SierraUsb598StatusCodes.CALLSTAT_DISCONNECTED.getStatusCode());
+		break;
+		case CnsObjectIDs.OBJID_CALL_CONNECTING.getObjectID():
+		// notification-only - no need to synchronize 
+		this.setCallStatusInfo(SierraUsb598StatusCodes.CALLSTAT_CONNECTING.getStatusCode());
+		break;
+		case CnsObjectIDs.OBJID_CALL_CONNECTED.getObjectID():
+		// notification-only - no need to synchronize 
+		this.setCallStatusInfo(SierraUsb598StatusCodes.CALLSTAT_CONNECTED.getStatusCode());
+		break;
+		case CnsObjectIDs.OBJID_CALL_DORMANT.getObjectID():
+		// notification-only - no need to synchronize 
+		this.setCallStatusInfo(SierraUsb598StatusCodes.CALLSTAT_DORMANT.getStatusCode());
+		break;
+
+		
+		// Have not seen this happen case MC572xCnS.OBJID_CALL_ERROR:
+		//
+	    // this.kuraLoggerService.logDebug (LABEL + "!!!!! --------> GOT CALL ERROR NOTIFICATION <------- !!!!!"); byte [] pl = notification.getPayload(); for (int i = 0; i <
+		// notification.getPayloadLength(); i++) { System.out.print("0x" + Integer.toHexString(pl[i]) + " "); } System.out.println(); break;
+	
+		}
+		notification = null; // release notification
+		}
+		}
+		return true;
+	}
+	*/
+	
+	/*
+	 * This method enables notification on specified CnS object
+	 */
+	private void enableNotification(int objID) throws Exception {
+
+		CnS cnsReply = null;
+		CnS cnsCommand = new CnS(objID, CnsOpTypes.OPTYPE_NOTIF_ENB.getOpType(),
+				CnsAppIDs.USB598_APPLICATION_ID.getID());
+
+		cnsReply = this.cnsExchange(cnsCommand, 500);
+		if ((cnsReply != null)
+				&& (cnsReply.getOperationType() == CnsOpTypes.OPTYPE_NOTIF_ENB_REP.getOpType())) {
+			s_logger.debug("Notification on objID=0x"
+					+ Integer.toHexString(objID) + " is enabled");
+		}
+	}
+
+	/*
+	 * This method sets receive signal strength information.
+	 */
+	private void setSignalStrengthInfo(CnS cnsReply) {
+		byte[] cnsPayload = null;
+
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_rssi = 0 - (((cnsPayload[0] << 8) & 0x0ffff) | (cnsPayload[1] & 0x0ff));
+				s_logger.debug("!!! RSS !!! : " + m_rssi + " dBm");
+			}
+		}
+	}
+
+	private void setSystemIdInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_sid = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+				s_logger.debug("!!! SID !!! : " + m_sid);
+			}
+		}
+	}
+
+private void setNetworkIdInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_nid = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+				s_logger.debug("!!! NID !!! : " + m_nid);
+			}
+		}
+	}
+
+	private void setChannelNumberInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_channelNo = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+				s_logger.debug("!!! Channel Number !!! : " + m_channelNo);
+			}
+		}
+	}
+
+	private void setChannelStateInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_channelState = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+
+				s_logger.debug("!!! Channel State !!! : " + m_channelState);
+			}
+		}
+	}
+
+	private void setBandClassInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_bandClass = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+
+				s_logger.debug("!!! Current Band Class !!! : " + m_bandClass);
+			}
+		}
+	}
+
+	/*
+	 * This method sets firmware version
+	 */
+	private void setFirmwareVersion(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_firmwareVersion = new String(cnsPayload);
+			}
+		}
+	}
+
+	/*
+	 * This method sets firmware date
+	 */
+	private void setFirmwareDate(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_firmwareDate = new String(cnsPayload);
+			}
+		}
+	}
+
+	/*
+	 * This method sets PRL version information
+	 */
+	private void setPrlVersionInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_prlVersion = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+
+				s_logger.debug("!!! PRL Version !!! : " + m_prlVersion);
+			}
+		}
+	}
+
+	/*
+	 * This method sets 'Activation Status' information
+	 */
+	private void setActivationStatusInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_activationStatus = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+
+				s_logger.debug("!!! Activation Status !!! : "
+						+ Integer.toHexString(m_activationStatus));
+			}
+		}
+	}
+
+	/*
+	 * This method sets 'Activation Date' information
+	 */
+	private void setActivationDateInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				String sdate = new String(cnsPayload, 2, 8);
+				s_logger.debug("!!! Activation Date !!! : " + sdate
+						+ " length=" + sdate.length());
+
+				SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
+				try {
+					m_activationDate.setTime(df.parse(sdate));
+				} catch (ParseException e) {
+					m_activationDate = null;
+				}
+			}
+		}
+	}
+
+	/*
+	 * This method sets 'Roaming Status' information
+	 */
+	private void setRoamingStatusInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_roamingStatus = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+
+				s_logger.debug("!!! Roaming Status !!! : " + m_roamingStatus);
+			}
+		}
+	}
+
+	private void setMobileDirectoryNumberInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				int len = ((cnsPayload[2] << 8) & 0x0ffff)
+						| (cnsPayload[3] & 0x0ff);
+				StringBuffer mdn = new StringBuffer();
+				int offset = 4;
+				for (int i = 0; i < len; i++) {
+					mdn.append(cnsPayload[offset + i]);
+				}
+				m_mdn = this.convertDecimalNumeralToString(mdn);
+				s_logger.debug("!!! MDN !!! : " + m_mdn);
+			}
+		}
+	}
+
+	private void setMobileIdentificationNumberInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				int len = ((cnsPayload[2] << 8) & 0x0ffff)
+						| (cnsPayload[3] & 0x0ff);
+				StringBuffer min = new StringBuffer();
+				int offset = 4;
+				for (int i = 0; i < len; i++) {
+					min.append(cnsPayload[offset + i]);
+				}
+				m_min = this.convertDecimalNumeralToString(min);
+				s_logger.debug("!!! MIN !!! : " + m_min);
+			}
+		}
+	}
+
+	private void setServiceTypeInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_serviceType = ((cnsPayload[0] << 8) & 0x0ffff)
+						| (cnsPayload[1] & 0x0ff);
+
+				s_logger.debug("!!! Service Type !!! : "
+						+ SierraUsb598Status
+								.getServiceIndication(m_serviceType));
+			}
+		}
+	}
+
+	private void setPowerModeInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_powerMode = ((cnsPayload[2] << 8) & 0x0ffff)
+						| (cnsPayload[3] & 0x0ff);
+
+				s_logger.debug("!!! Power Mode !!! : "
+						+ SierraUsb598Status.getPowerMode(m_powerMode));
+
+			}
+		}
+	}
+
+	/*
+	 * This method sets call TX byte counter information
+	 */
+	private void setCallTxCounterInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_txCount = (((cnsPayload[0] << 24) & 0x0ffffffff)
+						| ((cnsPayload[1] << 16) & 0x0ffffff)
+						| ((cnsPayload[2] << 8) & 0x0ffff) | (cnsPayload[3] & 0x0ff)) & 0x0ffffffffL;
+				s_logger.debug("!!! TX Count !!! :" + m_txCount);
+			}
+		}
+	}
+
+	/*
+	 * This method sets call RX byte counter information
+	 */
+	private void setCallRxCounterInfo(CnS cnsReply) {
+
+		byte[] cnsPayload = null;
+		if (cnsReply != null) {
+			cnsPayload = cnsReply.getPayload();
+			if (cnsPayload != null) {
+				m_rxCount = (((cnsPayload[4] << 24) & 0x0ffffffff)
+						| ((cnsPayload[5] << 16) & 0x0ffffff)
+						| ((cnsPayload[6] << 8) & 0x0ffff) | (cnsPayload[7] & 0x0ff)) & 0x0ffffffffL;
+				s_logger.debug("!!! RX Count !!! :" + m_rxCount);
+			}
+		}
+	}
+	
+	private void setCallStatusInfo(int callStatus) {
+		m_callStatus = callStatus;
+		/*
+		 if ((this.callStatus == Usb598Status.CALLSTAT_CONNECTED) ||
+		 		(this.callStatus == Usb598Status.CALLSTAT_DORMANT)) { 
+		 	this.connected = true; 
+		 } else { 
+		 	this.connected = false; 
+		 }
+		 */
+	}
+	
+	/*
+	 * This method converts supplied string buffer of decimal numerals to string
+	 */
+	private String convertDecimalNumeralToString(StringBuffer buf) {
+
+		StringBuffer ret = new StringBuffer();
+		int num = 0;
+
+		for (int i = 0; i < buf.length(); i = i + 2) {
+			num = (Character.digit(buf.charAt(i), 10) * 10 + Character.digit(
+					buf.charAt(i + 1), 10)) - 0x30;
+			ret.append(num);
+		}
+		return ret.toString();
+	}
+	
+	/*
+	 * This method sends CnS command to the modem and obtains reply.
+	 */
+	private CnS cnsExchange(CnS cnsCommand, int tout) throws Exception {
+		CnS cnsReply = null;
+		// ModemCommand modemCommand = new ModemCommand(cnsCommand);
+		s_logger.debug("cnsExchange() start");
+		try {
+			cnsReply = new CnS(m_commHipConnection.sendCommand(
+					cnsCommand.getRequest(), tout));
+		} catch (Exception e) {
+			s_logger.debug("Failed to send command: " + e);
+		}
+		// ModemReply modemReply =
+		// this.modemChannelService.sendCommand(this.getHIPport(), modemCommand,
+		// tout);
+		// if (modemReply != null) {
+		// cnsReply = modemReply.getCnsReply();
+		// }
+		return cnsReply;
+	}
+
+	/*
+	 * This method sends CnS command to the modem and obtains reply. Default
+	 * timeout is set to 500 msec
+	 */
+	private CnS cnsExchange(CnS cnsCommand) throws Exception {
+
+		return this.cnsExchange(cnsCommand, 500);
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598AtCommands.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598AtCommands.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee7820f745fb1152841b3f8932dddcc9195cbc68
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598AtCommands.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.usb598;
+
+public enum SierraUsb598AtCommands {
+
+	at("at\r\n"),
+	getModelNumber("at+gmm\r\n"),
+	getManufacturer("at+gmi\r\n"),
+	getSerialNumber("at+gsn\r\n"),
+	getRevision("at+gmr\r\n"),
+	reset("at!reset\r\n");
+	
+	private String m_command;
+	
+	private SierraUsb598AtCommands(String atCommand) {
+		m_command = atCommand;
+	}
+	
+	public String getCommand () {
+		return m_command;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598ConfigGenerator.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598ConfigGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..754295a0d15e46ba6b0179c37b1fb1c7230cb25c
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598ConfigGenerator.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.usb598;
+
+import org.eclipse.kura.net.admin.modem.ModemPppConfigGenerator;
+import org.eclipse.kura.net.admin.modem.PppPeer;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.modem.ModemConfig;
+
+public class SierraUsb598ConfigGenerator implements ModemPppConfigGenerator{
+
+	@Override
+	public PppPeer getPppPeer(String deviceId, ModemConfig modemConfig, String logFile,
+			String connectScript, String disconnectScript) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ModemXchangeScript getConnectScript(ModemConfig modemConfig) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ModemXchangeScript getDisconnectScript(ModemConfig modemConfig) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598ModemFactory.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598ModemFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..44ce0dead5f14b7aec62dcd7b8e7e2a9ab99f1f8
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598ModemFactory.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.usb598;
+
+import java.util.Hashtable;
+
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.modem.CellularModem;
+import org.eclipse.kura.net.admin.modem.CellularModemFactory;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.usb.UsbModemDevice;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class SierraUsb598ModemFactory implements CellularModemFactory {
+
+	private static SierraUsb598ModemFactory s_factoryInstance = null;
+	private static ModemTechnologyType s_type = ModemTechnologyType.EVDO;
+	private BundleContext s_bundleContext = null;
+	private Hashtable<String, SierraUsb598> m_modemServices = null;
+	private ConnectionFactory m_connectionFactory = null;
+	
+	private SierraUsb598ModemFactory() {
+		s_bundleContext = FrameworkUtil.getBundle(NetworkConfigurationService.class).getBundleContext();
+		
+		ServiceTracker<ConnectionFactory, ConnectionFactory> serviceTracker = new ServiceTracker<ConnectionFactory, ConnectionFactory>(s_bundleContext, ConnectionFactory.class, null);
+		serviceTracker.open(true);
+		m_connectionFactory = serviceTracker.getService();
+		
+		m_modemServices = new Hashtable<String, SierraUsb598>();
+	}
+	
+	public static SierraUsb598ModemFactory getInstance() {
+	    if(s_factoryInstance == null) {
+	        s_factoryInstance = new SierraUsb598ModemFactory();
+	    }
+	    return s_factoryInstance;
+	}
+
+	@Override
+	public CellularModem obtainCellularModemService(ModemDevice modemDevice, String platform) throws Exception {
+		String key = modemDevice.getProductName();
+		SierraUsb598 sierraUsb598 = m_modemServices.get(key);
+
+		if (sierraUsb598 == null) {
+			sierraUsb598 = new SierraUsb598(modemDevice, m_connectionFactory, s_type);
+			sierraUsb598.bind();
+			this.m_modemServices.put(key, sierraUsb598);
+		}
+		
+		return sierraUsb598;
+	}
+
+	@Override
+	public Hashtable<String, ? extends CellularModem> getModemServices() {
+		return m_modemServices;
+	}
+
+	@Override
+	public void releaseModemService(String usbPortAddress) {
+		SierraUsb598 sierraUsb598 = m_modemServices.remove(usbPortAddress);
+		sierraUsb598.unbind();
+	}
+
+	@Override
+	public ModemTechnologyType getType() {
+		return s_type;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598Status.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598Status.java
new file mode 100644
index 0000000000000000000000000000000000000000..d7c97fbc620e06752d16d00a136e4d06c5798a03
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598Status.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.usb598;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+public class SierraUsb598Status {
+
+	private static final String NOT_AVAIL = "N/A";
+	/*
+	private enum SierraUsb598StatusCodes {
+		
+		NOT_AVAILABLE(-1),
+
+		// channel state return codes
+		CHANSTATE_NOT_ACQUIRED(0x0000),
+		CHANSTATE_ACQUIRED(0x0001),
+		CHANSTATE_SCANNING(0x0005),
+
+		// current band class return codes
+		BANDCLASS_CELLULAR(0x0000),
+		BANDCLASS_PCS(0x0001),
+
+		// activation status return codes
+		ACTSTAT_NOT_ACTIVATED(0x0000),
+		ACTSTAT_ACTIVATED(0x0001),
+
+		// roaming status return codes
+		ROAMSTAT_NOT_ROAMING(0x0000),
+		ROAMSTAT_W_SID(0x0001),
+		ROAMSTAT_WO_SID(0x0002),
+
+		// service indication return codes
+		SRVCIND_NO(0x0000),
+		SRVCIND_CDMA(0x0002),
+		SRVCIND_GPS(0x0003),
+
+		// call status return codes
+		CALLSTAT_DISCONNECTED(0),
+		CALLSTAT_CONNECTING(1),
+		CALLSTAT_CONNECTED(2),
+		CALLSTAT_DORMANT(3),
+
+		// power mode return codes
+		PMODE_LPM(0x0000), // Low Power Mode
+		PMODE_ONLINE(0x0001); // Online
+		
+		private int m_statusCode = 0;
+		
+		private SierraUsb598StatusCodes(int statusCode) {
+			m_statusCode = statusCode;
+		}
+		
+		public int getStatusCode () {
+			return m_statusCode;
+		}
+	}
+	*/
+
+	// status hash tables
+	private static Map<Integer, String> s_ChannelState = new Hashtable<Integer, String>(); // channel state
+	private static Map<Integer, String> s_BandClass = new Hashtable<Integer, String>(); // current band class
+	private static Map<Integer, String> s_ActivationStatus = new Hashtable<Integer, String>(); // activation
+	private static Map<Integer, String> s_RoamingStatus = new Hashtable<Integer, String>(); // roaming
+	private static Map<Integer, String> s_ServiceIndication = new Hashtable<Integer, String>(); // service
+															// indication
+	private static Map<Integer, String> s_CallStatus = new Hashtable<Integer, String>(); // call status
+	private static Map<Integer, String> s_PowerMode = new Hashtable<Integer, String>(); // power mode
+
+	static {
+		// channel state
+		s_ChannelState.put(new Integer(SierraUsb598StatusCodes.CHANSTATE_NOT_ACQUIRED.getStatusCode()), new String(
+				"Not Acquired"));
+		s_ChannelState.put(new Integer(SierraUsb598StatusCodes.CHANSTATE_ACQUIRED.getStatusCode()), new String(
+				"Acquired"));
+		s_ChannelState.put(new Integer(SierraUsb598StatusCodes.CHANSTATE_SCANNING.getStatusCode()), new String(
+				"Scanning"));
+
+		// current band class
+		s_BandClass
+				.put(new Integer(SierraUsb598StatusCodes.BANDCLASS_CELLULAR.getStatusCode()), new String("Cellular"));
+		s_BandClass.put(new Integer(SierraUsb598StatusCodes.BANDCLASS_PCS.getStatusCode()), new String("PCS"));
+
+		// activation status
+		s_ActivationStatus.put(new Integer(SierraUsb598StatusCodes.ACTSTAT_NOT_ACTIVATED.getStatusCode()), new String(
+				"not activated"));
+		s_ActivationStatus.put(new Integer(SierraUsb598StatusCodes.ACTSTAT_ACTIVATED.getStatusCode()), new String(
+				"activated"));
+
+		// roaming status
+		s_RoamingStatus.put(new Integer(SierraUsb598StatusCodes.ROAMSTAT_NOT_ROAMING.getStatusCode()), new String(
+				"Not roaming"));
+		s_RoamingStatus.put(new Integer(SierraUsb598StatusCodes.ROAMSTAT_W_SID.getStatusCode()), new String(
+				"Roaming with guaranteed SID"));
+		s_RoamingStatus.put(new Integer(SierraUsb598StatusCodes.ROAMSTAT_WO_SID.getStatusCode()), new String(
+				"Roaming w/o guaranteed SID"));
+
+		// service indication
+		s_ServiceIndication.put(new Integer(SierraUsb598StatusCodes.SRVCIND_NO.getStatusCode()), new String(
+				"No service"));
+		s_ServiceIndication.put(new Integer(SierraUsb598StatusCodes.SRVCIND_CDMA.getStatusCode()), new String(
+				"Digital CDMA"));
+		s_ServiceIndication.put(new Integer(SierraUsb598StatusCodes.SRVCIND_GPS.getStatusCode()), new String("GPS"));
+
+		// call status
+		s_CallStatus.put(new Integer(SierraUsb598StatusCodes.CALLSTAT_DISCONNECTED.getStatusCode()), new String(
+				"Disconnected"));
+		s_CallStatus.put(new Integer(SierraUsb598StatusCodes.CALLSTAT_CONNECTING.getStatusCode()), new String(
+				"Connecting"));
+		s_CallStatus.put(new Integer(SierraUsb598StatusCodes.CALLSTAT_CONNECTED.getStatusCode()), new String(
+				"Connected"));
+		s_CallStatus.put(new Integer(SierraUsb598StatusCodes.CALLSTAT_DORMANT.getStatusCode()), new String(
+				"Dormant Packet Call"));
+
+		// power mode
+		s_PowerMode.put(new Integer(SierraUsb598StatusCodes.PMODE_LPM.getStatusCode()), "Low Power Mode");
+		s_PowerMode.put(new Integer(SierraUsb598StatusCodes.PMODE_ONLINE.getStatusCode()), "Online");
+
+	}
+
+	/**
+	 * Reports channel state
+	 * 
+	 * @param chanState
+	 * @return channel state
+	 */
+	public static String getChannelState(int chanState) {
+		Object o = s_ChannelState.get(new Integer(chanState));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+
+	/**
+	 * Reports band class
+	 * 
+	 * @param bandClass
+	 * @return band class
+	 */
+	public static String getBandClass(int bandClass) {
+		Object o = s_BandClass.get(new Integer(bandClass));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+
+	/**
+	 * Reports roaming status
+	 * 
+	 * @param roamingStatus
+	 * @return roaming status
+	 */
+	public static String getRoamingStatus(int roamingStatus) {
+		Object o = s_RoamingStatus.get(new Integer(roamingStatus));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+
+	/**
+	 * Reports activation status
+	 * 
+	 * @param activationStatus
+	 *            as <code>String</code>
+	 * @return
+	 */
+	public static String getActivationStatus(int activationStatus) {
+		Object o = s_ActivationStatus.get(new Integer(activationStatus));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+
+	/**
+	 * Reports service indication
+	 * 
+	 * @param serviceIndication
+	 * @return service indication
+	 */
+	public static String getServiceIndication(int serviceIndication) {
+		Object o = s_ServiceIndication.get(new Integer(serviceIndication));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+
+	/**
+	 * Reports call status
+	 * 
+	 * @param callStatus
+	 * @return call status
+	 */
+	public static String getCallStatus(int callStatus) {
+		Object o = s_CallStatus.get(new Integer(callStatus));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+
+	/**
+	 * Reports Power Mode
+	 * 
+	 * @param powerMode
+	 * @return power mode string
+	 */
+	public static String getPowerMode(int powerMode) {
+		Object o = s_PowerMode.get(new Integer(powerMode));
+		return (o != null) ? (String) o : NOT_AVAIL;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598StatusCodes.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598StatusCodes.java
new file mode 100644
index 0000000000000000000000000000000000000000..3640a8d6e464af9dc1ddb01f0f5302b38504faf0
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/sierra/usb598/SierraUsb598StatusCodes.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.sierra.usb598;
+
+public enum SierraUsb598StatusCodes {
+
+	NOT_AVAILABLE(-1),
+
+	// channel state return codes
+	CHANSTATE_NOT_ACQUIRED(0x0000),
+	CHANSTATE_ACQUIRED(0x0001),
+	CHANSTATE_SCANNING(0x0005),
+
+	// current band class return codes
+	BANDCLASS_CELLULAR(0x0000),
+	BANDCLASS_PCS(0x0001),
+
+	// activation status return codes
+	ACTSTAT_NOT_ACTIVATED(0x0000),
+	ACTSTAT_ACTIVATED(0x0001),
+
+	// roaming status return codes
+	ROAMSTAT_NOT_ROAMING(0x0000),
+	ROAMSTAT_W_SID(0x0001),
+	ROAMSTAT_WO_SID(0x0002),
+
+	// service indication return codes
+	SRVCIND_NO(0x0000),
+	SRVCIND_CDMA(0x0002),
+	SRVCIND_GPS(0x0003),
+
+	// call status return codes
+	CALLSTAT_DISCONNECTED(0),
+	CALLSTAT_CONNECTING(1),
+	CALLSTAT_CONNECTED(2),
+	CALLSTAT_DORMANT(3),
+
+	// power mode return codes
+	PMODE_LPM(0x0000), // Low Power Mode
+	PMODE_ONLINE(0x0001); // Online
+	
+	private int m_statusCode = 0;
+	
+	private SierraUsb598StatusCodes(int statusCode) {
+		m_statusCode = statusCode;
+	}
+	
+	public int getStatusCode () {
+		return m_statusCode;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/ICatalystSmBusService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/ICatalystSmBusService.java
new file mode 100644
index 0000000000000000000000000000000000000000..7646788d09f1f82ee19660e00baeae1f8fa5cf63
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/ICatalystSmBusService.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+/* 
+ * Copyright � 2009 Eurotech Inc. All rights reserved.
+ */
+
+
+
+public interface ICatalystSmBusService {
+
+	public static final String SERVICE_NAME = ICatalystSmBusService.class.getName();
+
+	
+	/**
+	 * writes data to the SMbus
+	 * 
+	 * @param slaveAddress	the slave address to write to
+	 * @param command		the command to write
+	 * @param data			the data to write
+	 * @throws Exception	if the write can not succeed
+	 */
+	public void write(byte slaveAddress, byte command, byte[] data) throws Exception;
+
+	/**
+	 * reads a byte from the SMBus
+	 * 
+	 * @param slaveAddress	the slave address to read from
+	 * @param command		the command to send
+	 * @return				the byte read from the SMBus
+	 * @throws Exception	if the read fails
+	 */
+	public byte readByte(byte slaveAddress, byte command) throws Exception;
+
+	/**
+	 * reads a 16 bit word from the SMBus
+	 * 
+	 * @param slaveAddress	the slave address to read from
+	 * @param command		the command to send
+	 * @return				the word read from the SMBus
+	 * @throws Exception	if the read fails
+	 */
+	public short readWord(byte slaveAddress, byte command) throws Exception;
+	
+	/**
+	 * reads a block of bytes from the SMBus
+	 * 
+	 * @param slaveAddress	the slave address to read from
+	 * @param command		the command to send
+	 * @return				an array of bytes read from the SMBus
+	 * @throws Exception	if the read fails
+	 */
+	public byte[] readBlock(byte slaveAddress, byte command) throws Exception;
+
+	/**
+	 * gets the last error provided by the SMBus native library
+	 * 
+	 * @return				an int representing the last error provided by the
+	 * 						SMBus native library
+	 * @throws Exception	if there is an error reading the last error
+	 */
+	public int getLastError() throws Exception;
+	
+	/**
+	 * sets the last error in the SMBus native library
+	 * 
+	 * @param error			the error code to set in the natvie library
+	 * @throws Exception	if there is an error setting the error code
+	 */
+	public void setLastError(int error) throws Exception;
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/IVectorJ21GpioService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/IVectorJ21GpioService.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee58254956ba6231278e9f99aa6bdef8d95f6aaf
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/IVectorJ21GpioService.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+/**
+ * Defines GPIO service interface for the Vector board
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public interface IVectorJ21GpioService {
+
+	/**
+	 * service name of this interface for the bundle activator
+	 */
+	public static final String SERVICE_NAME = IVectorJ21GpioService.class.getName();
+	
+	public static final int J21PIN_DIRECTION_IN = 0;
+	public static final int J21PIN_DIRECTION_OUT = 1;
+	
+	public static final int J21PIN_CELL_RESET = 6;
+	public static final int J21PIN_CELL_ON_OFF = 8;
+	public static final int J21PIN_CELL_PWR_EN = 10;
+	public static final int J21PIN_USB_RESET = 13;
+	public static final int J21PIN_5V_ENABLE = 15;
+	public static final int J21PIN_ZIGBEE_PWR_EN = 18;
+	public static final int J21PIN_PWR_MON = 17;
+	public static final int J21PIN_USB_SER_PWR_EN = 19;
+	public static final int J21PIN_GPS_PWR_EN = 14;
+	public static final int J21PIN_SLOT_PWR_EN = 16;
+	public static final int J21PIN_LAN_PWR_ON = 20;
+	public static final int J21PIN_ADC_ON = 22;
+	
+	/**
+	 * Reports direction of J21 pin.
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @return J21 pin direction as {@link int}
+	 * @throws Exception
+	 */
+	public int j21pinGetDirection (int j21pin) throws Exception;
+	
+	/**
+	 * Sets direction of J21 pin.
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @param direction - J21 pin direction as {@link int}
+	 * @throws Exception
+	 */
+	public void j21pinSetDirection (int j21pin, int direction) throws Exception;
+	
+	
+	/**
+	 * Reports a state of specified J21 pin.
+	 *  
+	 * @param j21pin - J21 pin as {@link int}
+	 * @return pin status as {@link boolean}
+	 * @throws Exception
+	 */
+	public boolean j21pinIsOn (int j21pin) throws Exception;
+	
+	/**
+	 * Reports a status of specified J21 pin.
+	 * 
+	 * @param j21pin - J21 pin as {@link int}
+	 * @return state of specified J21 pin as {@link String}
+	 * @throws Exception
+	 */
+	public String j21pinGetStatus (int j21pin) throws Exception;
+	
+	/**
+	 * Turns specified J21 pin ON.
+	 * 
+	 * @param j21pin - J21 pin to turn ON as {@link int}
+	 * @throws Exception
+	 */
+	public void j21pinTurnOn(int j21pin) throws Exception;
+	
+	/**
+	 * Turns specified J21 pin OFF.
+	 * 
+	 * @param j21pin - J21 pin to turn OFF as {@link int}
+	 * @throws Exception
+	 */
+	public void j21pinTurnOff(int j21pin) throws Exception;
+	
+	/**
+	 * 
+	 * @param j21pin
+	 * @throws Exception
+	 */
+	public void j21pinToggle(int j21pin) throws Exception;
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/SmBus.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/SmBus.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed34d9471ff458e008ca99f34515f542acf5f348
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/SmBus.java
@@ -0,0 +1,195 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+import java.io.IOException;
+
+
+public class SmBus implements ICatalystSmBusService {
+	static {
+		System.loadLibrary("smbus");
+	}
+	
+	private final static String LABEL = "org.eclipse.kura.sbc.catalyst.smbus.SmBus: ";
+
+	public static final int SMBUS_1_KHZ = 1;
+	public static final int SMBUS_10_KHZ = 2;
+	public static final int SMBUS_50_KHZ = 3;
+	public static final int SMBUS_100_KHZ = 4;
+	public static final int SMBUS_400_KHZ = 5;
+	public static final int SMBUS_1_MHZ = 6;
+
+	public static final int SMBUS_ERROR_BASE = 0x4600;
+	public static final int ERR_SMBUS_UNKNOWN_ERROR = SMBUS_ERROR_BASE + 0x0;
+	public static final int ERR_SMBUS_DRIVER_OPEN = SMBUS_ERROR_BASE + 0x1;
+	public static final int ERR_SMBUS_UNKNOWN_EXCEPTION = SMBUS_ERROR_BASE + 0x2;
+	public static final int ERR_SMBUS_ACCESS_DENIED = SMBUS_ERROR_BASE + 0x3;
+	public static final int ERR_SMBUS_SERVICE_NAME_INVALID = SMBUS_ERROR_BASE + 0x4;
+	public static final int ERR_SMBUS_SERVICE_DOES_NOT_EXIST = SMBUS_ERROR_BASE + 0x5;
+	public static final int ERR_SMBUS_SERVICE_ALREADY_RUNNING = SMBUS_ERROR_BASE + 0x6;
+	public static final int ERR_SMBUS_COPYING_DRIVER = SMBUS_ERROR_BASE + 0x7;
+	public static final int ERR_SMBUS_SERVICE_EXISTS = SMBUS_ERROR_BASE + 0x8;
+	public static final int ERR_SMBUS_INVALID_HANDLE = SMBUS_ERROR_BASE + 0x9;
+	public static final int ERR_SMBUS_TIMEOUT_WAITING_FOR_MUTEX = SMBUS_ERROR_BASE + 0xa;
+	public static final int ERR_SMBUS_TIMEOUT = SMBUS_ERROR_BASE + 0xb;
+
+	private native int OpenSMBus();
+	private native int CloseSMBus(int handle);
+
+	private native int SMBusSetClockSpeed(int handle, int freqeuncy);
+	private native int SMBusGetClockSpeed(int handle);
+
+	private native void SMBusWrite(int handle, byte slaveAddress, byte command, byte[] data);
+	private native byte SMBusReadByte(int handle, byte slaveAddress, byte command);
+	private native short SMBusReadWord(int handle, byte slaveAddress, byte command);
+	private native byte[] SMBusReadBlock(int handle, byte slaveAddress, byte command);
+
+	private native int SMBusGetLastError(int handle);
+	private native void SMBusSetLastError(int handle, int error);
+
+	private static Boolean lock;
+	
+	private static SmBus m_smBus = null;
+	
+	private SmBus() {
+		lock = new Boolean(false);
+	}
+	
+	public static SmBus getInstance() {
+		if(m_smBus == null) {
+			m_smBus = new SmBus();
+		}
+		
+		return m_smBus;
+	}
+	
+//	public void bind() {
+//		lock = new Boolean(false);
+//	}
+//	
+//	public void unbind() {
+//		lock = null;
+//	}
+	
+	public void write(byte slaveAddress, byte command, byte[] data) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			SMBusWrite(handle, slaveAddress, command, data);
+			
+			CloseSMBus(handle);
+		}
+	}
+	
+	public byte readByte(byte slaveAddress, byte command) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			byte result = SMBusReadByte(handle, slaveAddress, command);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public short readWord(byte slaveAddress, byte command) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			short result = SMBusReadWord(handle, slaveAddress, command);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public byte[] readBlock(byte slaveAddress, byte command) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			byte[] result = SMBusReadBlock(handle, slaveAddress, command);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public int getLastError() throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			int result = SMBusGetLastError(handle);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public void setLastError(int error) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			SMBusSetLastError(handle, error);
+			CloseSMBus(handle);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbba5da553bddd68b2d69abb8022a5a9bf5a6858
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910.java
@@ -0,0 +1,900 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.linux.net.modem.SerialModemComm;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.admin.modem.EvdoCellularModem;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910;
+import org.eclipse.kura.net.admin.modem.telit.he910.TelitHe910AtCommands;
+import org.eclipse.kura.net.modem.ModemCdmaServiceProvider;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemRegistrationStatus;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.SerialModemDevice;
+import org.eclipse.kura.usb.UsbModemDevice;
+import org.osgi.service.io.ConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TelitDe910 implements EvdoCellularModem {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(TelitDe910.class);
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private IVectorJ21GpioService m_vectorJ21GpioService = null;
+	private ConnectionFactory m_connectionFactory = null;
+	private ModemTechnologyType m_technologyType = null;
+	private String m_model = null;
+	private String m_manufacturer = null;
+	private String m_esn = null;
+	private String m_revisionId = null;
+	
+	private Object m_atLock = null; 
+	private ModemDevice m_device = null;
+	private Boolean m_gpsSupported = null;
+	
+	private List<NetConfig> m_netConfigs = null;
+	
+	public TelitDe910(ModemDevice device, ConnectionFactory connectionFactory,
+			ModemTechnologyType technologyType) {
+		
+        m_device = device;
+        m_connectionFactory = connectionFactory;
+        m_technologyType = technologyType;
+        m_atLock = new Object();
+    }
+	
+	public void bindVectorJ21GpioService(
+			IVectorJ21GpioService vectorJ21GpioService) {
+		
+		s_logger.info("bindVectorJ21GpioService()");
+		m_vectorJ21GpioService = vectorJ21GpioService;
+	}
+	
+	@Override
+	public String getModel() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_model == null) {
+	    		s_logger.debug("sendCommand getModelNumber :: " + TelitDe910AtCommands.getModelNumber.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(TelitDe910AtCommands.getModelNumber.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_model = getResponseString(reply);
+					reply = null;
+				}
+				closeSerialPort(commAtConnection);
+	    	}
+    	}
+        return m_model;
+	}
+	
+	@Override
+	public String getManufacturer() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_manufacturer == null) {
+		    	s_logger.debug("sendCommand getManufacturer :: " + TelitDe910AtCommands.getManufacturer.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+		    	}
+		    	try {
+					reply = commAtConnection.sendCommand(TelitDe910AtCommands.getManufacturer.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+		    	closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    m_manufacturer = getResponseString(reply); 
+					reply = null;
+				}
+	    	}
+    	}
+        return m_manufacturer;
+	}
+
+	@Override
+	public String getSerialNumber() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_esn == null) {
+	    		s_logger.debug("sendCommand getSerialNumber :: " + TelitDe910AtCommands.getSerialNumber.getCommand());
+	    		byte[] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(TelitDe910AtCommands.getSerialNumber.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    String serialNum = getResponseString(reply);
+				    if(serialNum != null && !serialNum.isEmpty()) {
+				    	if (serialNum.startsWith("#CGSN:")) {
+				    		serialNum = serialNum.substring("#CGSN:".length()).trim();
+				    	}
+				    	m_esn = serialNum;        
+				    }
+				}
+	    	}
+    	}
+        return m_esn;
+	}
+
+	@Override
+	public String getRevisionID() throws KuraException {
+		synchronized (m_atLock) {
+	    	if (m_revisionId == null) {
+	    		s_logger.debug("sendCommand getRevision :: " + TelitDe910AtCommands.getRevision.getCommand());
+	    		byte [] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+		    	}
+	    		try {
+					reply = commAtConnection.sendCommand(TelitDe910AtCommands.getRevision.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+	    		closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_revisionId = getResponseString(reply);
+				}
+	    	}
+    	}
+        return m_revisionId;
+	}
+
+	@Override
+	public boolean isReachable() throws KuraException {
+		boolean ret = false;
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getAtPort());
+    		ret = isAtReachable(commAtConnection);
+    		closeSerialPort(commAtConnection);
+    	}
+		return ret;
+	}
+
+	@Override
+	public void reset() throws KuraException {
+		s_logger.info("resetting modem ...");
+		try {
+			powerOff();
+			sleep(15000);
+			powerOn();
+			sleep(3000);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+	@Override
+	public int getSignalStrength() throws KuraException {
+		
+		int rssi = -113;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getSignalStrength :: " + TelitDe910AtCommands.getSignalStrength.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getSignalStrength.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] asCsq = null;
+				String sCsq = this.getResponseString(reply);
+				if (sCsq.startsWith("+CSQ:")) {
+					sCsq = sCsq.substring("+CSQ:".length()).trim();
+					asCsq = sCsq.split(",");
+					if (asCsq.length == 2) {
+						rssi = -113 + 2 * Integer.parseInt(asCsq[0]);
+						
+					}
+				}
+				reply = null;
+			}
+    	}
+        return rssi;
+	}
+
+	@Override
+	public ModemRegistrationStatus getRegistrationStatus() throws KuraException {
+		ModemRegistrationStatus modemRegistrationStatus = ModemRegistrationStatus.UNKNOWN;
+    	synchronized (m_atLock) {
+    		s_logger.debug("sendCommand getRegistrationStatus :: " + TelitDe910AtCommands.getNetRegistrationStatus.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getNetRegistrationStatus.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+	        if (reply != null) {
+	            String sRegStatus = getResponseString(reply);
+	            if (sRegStatus.startsWith("+CREG:")) {
+	            	sRegStatus = sRegStatus.substring("+CREG:".length()).trim();
+	            }
+	            String[] regStatusSplit = sRegStatus.split(",");
+	            if(regStatusSplit.length >= 2) {
+	                int status = Integer.parseInt(regStatusSplit[1]);
+	                switch (status) {
+	                case 0:
+	                	modemRegistrationStatus = ModemRegistrationStatus.NOT_REGISTERED;
+	                	break;
+	                case 1:
+	                	modemRegistrationStatus = ModemRegistrationStatus.REGISTERED_HOME;
+	                	break;
+	                case 3:
+	                	modemRegistrationStatus = ModemRegistrationStatus.REGISTRATION_DENIED;
+	                	break;
+	                case 5:
+	                	modemRegistrationStatus = ModemRegistrationStatus.REGISTERED_ROAMING;
+	                	break;
+	                }
+	            } 
+	        }
+    	}
+        return modemRegistrationStatus;
+	}
+
+	@Override
+	public long getCallTxCounter() throws KuraException {
+		long txCnt = 0;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getGprsSessionDataVolume :: " + TelitDe910AtCommands.getSessionDataVolume.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getSessionDataVolume.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] splitPdp = null;
+				String [] splitData = null;
+				String sDataVolume = this.getResponseString(reply);
+				splitPdp = sDataVolume.split("#GDATAVOL:");
+				if (splitPdp.length > 1) {
+					for (String pdp : splitPdp) {
+						if (pdp.trim().length() > 0) {
+							splitData = pdp.trim().split(",");
+							if (splitData.length >= 4) {
+								txCnt = Integer.parseInt(splitData[2]);
+							}
+							break;
+						}
+					}
+				}
+				reply = null;
+			}
+    	}
+        return txCnt;
+	}
+
+	@Override
+	public long getCallRxCounter() throws KuraException {
+		long rxCnt = 0;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getGprsSessionDataVolume :: " + TelitDe910AtCommands.getSessionDataVolume.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getSessionDataVolume.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] splitPdp = null;
+				String [] splitData = null;
+				String sDataVolume = this.getResponseString(reply);
+				splitPdp = sDataVolume.split("#GDATAVOL:");
+				if (splitPdp.length > 1) {
+					for (String pdp : splitPdp) {
+						if (pdp.trim().length() > 0) {
+							splitData = pdp.trim().split(",");
+							if (splitData.length >= 4) {
+								rxCnt = Integer.parseInt(splitData[3]);
+							}
+							break;
+						}
+					}
+				}
+				reply = null;
+			}
+    	}
+        return rxCnt;
+	}
+
+	@Override
+	public String getServiceType() throws KuraException {
+		String serviceType = null;
+    	synchronized (m_atLock) {
+    		s_logger.debug("sendCommand getServiceType :: " + TelitDe910AtCommands.getServiceType.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getServiceType.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String sServiceType = this.getResponseString(reply);
+				if (sServiceType.startsWith("+SERVICE:")) {
+					sServiceType = sServiceType.substring("+SERVICE:".length()).trim();
+					int servType = Integer.parseInt(sServiceType);
+					switch (servType) {
+					case 0:
+						serviceType = "No Service";
+						break;
+					case 1:
+						serviceType = "1xRTT";
+						break;
+					case 2:
+						serviceType = "EVDO Release 0";
+						break;
+					case 3:
+						serviceType = "EVDO Release A";
+						break;
+					case 4:
+						serviceType = "GPRS";
+						break;
+					}
+				}
+			}
+    	}
+		return serviceType;
+	}
+
+	@Override
+	public ModemDevice getModemDevice() {
+		return m_device;
+	}
+
+	@Override
+	public String getDataPort() throws KuraException {
+		
+		String port = null;
+		List <String> ports = m_device.getSerialPorts();
+		if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getDataPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No PPP serial port available");
+	    		}
+	    	} else if (m_device instanceof SerialModemDevice) {
+	    		// TODO
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+		}
+		
+    	return port;
+	}
+
+	@Override
+	public String getAtPort() throws KuraException {
+		
+		String port = null;
+		List <String> ports = m_device.getSerialPorts();
+			if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getAtPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No AT serial port available");
+	    		}
+	    	} else if (m_device instanceof SerialModemDevice) {
+	    		// TODO
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+		} else {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+		}
+    	
+    	return port;
+	}
+	
+	@Override
+	public String getGpsPort() throws KuraException {
+		String port = null;
+    	if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+    		port = SerialModemComm.MiniGateway.getAtPort();
+    	} else {
+    		port = getAtPort();
+    	}
+    	return port;
+	}
+
+	@Override
+	public boolean isGpsSupported() throws KuraException {
+		synchronized (m_atLock) {
+    		if (m_gpsSupported == null) {
+	    		s_logger.debug("sendCommand isGpsSupported :: " + TelitHe910AtCommands.isGpsPowered.getCommand());
+	    		byte[] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+	    		
+				try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.isGpsPowered.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    String sReply = getResponseString(reply);
+				    if((sReply != null) && !sReply.isEmpty()) {
+				    	if (sReply.startsWith("$GPSP:")) {
+				    		m_gpsSupported = true;
+				    	}
+				    }
+				}
+    		}
+    	}
+		boolean ret = false;
+    	if (m_gpsSupported != null) {
+    		ret = m_gpsSupported;
+    	}
+    	return ret;
+	}
+
+	@Override
+	public void enableGps() throws KuraException {
+		if ((m_gpsSupported == null) || (m_gpsSupported == false)) {
+    		return;
+    	}
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getGpsPort());
+    		if (!isAtReachable(commAtConnection)) {
+    			closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+   
+    		byte[] reply = null;
+    		try {
+    			if (!isGpsPowered(commAtConnection)) {
+    				s_logger.debug("sendCommand gpsPowerUp :: " + TelitHe910AtCommands.gpsPowerUp.getCommand());
+    				commAtConnection.sendCommand(TelitHe910AtCommands.gpsPowerUp.getCommand().getBytes(), 1000, 100);
+    			}
+    			
+    			s_logger.debug("sendCommand gpsEnableNMEA :: " + TelitHe910AtCommands.gpsEnableNMEA.getCommand());
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.gpsEnableNMEA.getCommand().getBytes(), 3000, 100);
+    		} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+    		closeSerialPort(commAtConnection);
+    		
+    		if (reply != null) {
+			    String sReply = getResponseString(reply);
+			    if((sReply != null) && !sReply.isEmpty()) {
+			    	if (sReply.startsWith("CONECT"))
+			    	s_logger.debug("NMEA Enabled");
+			    }
+    		}
+    	}
+	}
+
+	@Override
+	public void disableGps() throws KuraException {
+		if ((m_gpsSupported == null) || (m_gpsSupported == false)) {
+    		return;
+    	}
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getGpsPort());
+    		if (!isAtReachable(commAtConnection)) {
+    			closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+   
+    		try {
+    			if (!isGpsPowered(commAtConnection)) {
+    				s_logger.debug("sendCommand gpsDisableNMEA :: " + TelitHe910AtCommands.gpsDisableNMEA.getCommand());
+    				commAtConnection.sendCommand(TelitHe910AtCommands.gpsDisableNMEA.getCommand().getBytes(), 1000, 100);
+    				
+    				s_logger.debug("sendCommand gpsPowerDown :: " + TelitHe910AtCommands.gpsPowerDown.getCommand());
+    				commAtConnection.sendCommand(TelitHe910AtCommands.gpsPowerDown.getCommand().getBytes(), 1000, 100);
+    			}
+    		} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+    		closeSerialPort(commAtConnection);
+    	}
+	}
+	
+	@Override
+	public String getMobileDirectoryNumber() throws KuraException {
+		
+		String sMdn = null;
+		synchronized (m_atLock) {
+	    
+			s_logger.debug("sendCommand getMdn :: " + TelitDe910AtCommands.getMdn.getCommand());
+			byte[] reply = null;
+			CommConnection commAtConnection = openSerialPort(getAtPort());
+			if (!isAtReachable(commAtConnection)) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+			}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getMdn.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				sMdn = getResponseString(reply);
+				if (sMdn.startsWith("#MODEM:")) {
+					sMdn = sMdn.substring("#MODEM:".length()).trim();
+				}
+			}
+    	}
+        return sMdn;
+	}
+	
+	@Override
+	public String getMobileIdentificationNumber() throws KuraException {
+		
+		String sMsid = null;
+		synchronized (m_atLock) {
+	    
+			s_logger.debug("sendCommand getMdn :: " + TelitDe910AtCommands.getMsid.getCommand());
+			byte[] reply = null;
+			CommConnection commAtConnection = openSerialPort(getAtPort());
+			if (!isAtReachable(commAtConnection)) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+			}
+			try {
+				reply = commAtConnection.sendCommand(TelitDe910AtCommands.getMsid.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				sMsid = getResponseString(reply);
+				if (sMsid.startsWith("#MODEM:")) {
+					sMsid = sMsid.substring("#MODEM:".length()).trim();
+				}
+			}
+    	}
+        return sMsid;
+	}
+	
+	@Override
+	public ModemCdmaServiceProvider getServiceProvider() throws KuraException {
+	
+		ModemCdmaServiceProvider cdmaSerciceProvider = ModemCdmaServiceProvider.UNKNOWN;
+		if (m_revisionId == null) {
+			getRevisionID();
+		}
+		if ((m_revisionId != null) && (m_revisionId.length() >= 9)) {
+			int provider = Integer.parseInt(m_revisionId.substring(7, 8));
+			
+			if (provider == TelitDe910ServiceProviders.SPRINT.getProvider()) {
+				cdmaSerciceProvider = ModemCdmaServiceProvider.SPRINT;
+			} else if (provider == TelitDe910ServiceProviders.AERIS.getProvider()) {
+				cdmaSerciceProvider = ModemCdmaServiceProvider.AERIS;
+			} else if (provider == TelitDe910ServiceProviders.VERIZON.getProvider()) {
+				cdmaSerciceProvider = ModemCdmaServiceProvider.VERIZON;
+			}
+		}
+		return cdmaSerciceProvider;
+	}
+
+	@Override
+	public boolean isProvisioned() throws KuraException {
+		boolean ret = false;
+		String mdn = this.getMobileDirectoryNumber();
+		if ((mdn != null) && (mdn.length() > 4)) {
+			if (!mdn.startsWith("0000")) {
+				ret = true;
+			}
+		}
+		return ret;
+	}
+
+	@Override
+	public void provision() throws KuraException {
+		
+		if (this.getServiceProvider() == ModemCdmaServiceProvider.VERIZON) {
+			
+			s_logger.info("will make an attempt to provision DE910-DUAL modem on VERIZON network");
+		
+			boolean startOTASPsession = false;
+			ModemRegistrationStatus regStatus = getRegistrationStatus();
+			if (regStatus == ModemRegistrationStatus.REGISTERED_ROAMING) {
+				s_logger.warn("The DE910-DUAL cannot typically be fully provisioned while roaming");
+				startOTASPsession = true;
+			} else if (regStatus == ModemRegistrationStatus.REGISTERED_HOME) {
+				s_logger.info("The DE910-DUAL is registered on the network");
+				startOTASPsession = true;
+			} else if (regStatus == ModemRegistrationStatus.NOT_REGISTERED) {
+				s_logger.warn("The DE910-DUAL is not registered on the network, provision session aborted");
+			} else {
+				s_logger.error("Unsupported network registration status, provision session aborted");
+			}
+			
+			if (startOTASPsession) {
+				s_logger.info("Starting 'OTASP' provision session");
+				CommConnection commAtConnection = openSerialPort(getAtPort());
+				if (!isAtReachable(commAtConnection)) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitDe910.class.getName());
+				}
+				try {
+					commAtConnection.sendCommand(TelitDe910AtCommands.provisionVerizon.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+			}
+			
+			s_logger.info("waiting for OTASP session to complete ...");
+			sleep (180000);
+		}
+	}
+	
+	@Override
+	public List<NetConfig> getConfiguration() {
+		return m_netConfigs;
+	}
+
+	@Override
+	public void setConfiguration(List<NetConfig> netConfigs) {
+		m_netConfigs = netConfigs;
+	}
+	
+	@Override
+	public ModemTechnologyType getTechnologyType() {
+		return m_technologyType;
+	}
+	
+	private boolean isGpsPowered(CommConnection commAtConnection) throws KuraException {
+    	
+    	boolean gpsPowered = false;
+    	if ((m_gpsSupported == null) || (m_gpsSupported == false)) {
+    		return false;
+    	}
+    	
+    	s_logger.debug("sendCommand isGpsPowered :: " + TelitHe910AtCommands.isGpsPowered.getCommand());
+    	byte[] reply = null;	
+		try {
+			reply = commAtConnection.sendCommand(TelitHe910AtCommands.isGpsPowered.getCommand().getBytes(), 1000, 100);
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		if (reply != null) {
+			String sReply = getResponseString(reply);
+			if((sReply != null) && !sReply.isEmpty()) {
+				if (sReply.startsWith("$GPSP:")) {
+			    	sReply = sReply.substring("$GPSP:".length()).trim();
+			    	gpsPowered = sReply.equals("1")? true : false;
+			    }
+			}
+		}
+    	
+    	return gpsPowered;
+    }
+		
+	private CommConnection openSerialPort (String port) throws KuraException {
+    	
+		CommConnection connection = null;
+		if(m_connectionFactory != null) {
+			String uri = new CommURI.Builder(port)
+							.withBaudRate(115200)
+							.withDataBits(8)
+							.withStopBits(1)
+							.withParity(0)
+							.withTimeout(2000)
+							.build().toString();
+				
+			try {
+				connection = (CommConnection) m_connectionFactory.createConnection(uri, 1, false);
+			} catch (Exception e) {
+				s_logger.debug("Exception creating connection: " + e);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+		return connection;
+    }
+    
+	private void closeSerialPort(CommConnection connection) throws KuraException {
+		try {
+			connection.close();
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+    
+    private boolean isAtReachable(CommConnection connection) {
+    
+    	boolean status = false;
+    	int attemptNo = 0;
+    	do {
+			try {
+				status = (connection.sendCommand(
+						TelitDe910AtCommands.at.getCommand().getBytes(), 500).length > 0);
+			} catch (Exception e) {
+				attemptNo++;
+				sleep(2000);
+			}
+    	} while((status == false) && (attemptNo < 3));
+    	
+    	return status;	
+    }
+    
+    // Parse the AT command response for the relevant info
+ 	private String getResponseString(String resp) {
+ 	    if(resp == null) {
+ 	        return "";
+ 	    }
+ 	    
+ 	    // remove the command and space at the beginning, and the 'OK' and spaces at the end
+ 	    return resp.replaceFirst("^\\S*\\s*", "").replaceFirst("\\s*(OK)?\\s*$", "");
+ 	}
+ 	
+	private String getResponseString(byte[] resp) {
+		if (resp == null) {
+			return "";
+		}
+
+		return getResponseString(new String(resp));
+	}
+	
+	/*
+	 * This method turns modem power off
+	 */
+	private void powerOff() throws KuraException {
+		
+		if (this.m_vectorJ21GpioService != null) {
+			
+			try {
+				this.m_vectorJ21GpioService
+					.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+				sleep(1000);
+				this.toggle(2);
+				this.m_vectorJ21GpioService
+					.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_PWR_EN);
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			
+			// s_logger.info("DE910 has been powered OFF on USB port - " + m_usbDevice.getUsbPort());
+		}
+	}
+	
+	/*
+	 * This method turns modem power on
+	 */
+	private void powerOn() throws KuraException {
+
+		if (this.m_vectorJ21GpioService != null) {
+
+			try {
+				this.m_vectorJ21GpioService
+						.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+				this.m_vectorJ21GpioService
+						.j21pinTurnOn(IVectorJ21GpioService.J21PIN_CELL_PWR_EN);
+				sleep(1000);
+				this.toggle(5);
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+
+			// s_logger.info("DE910 has been powered ON on USB port - " + m_usbDevice.getUsbPort());
+		}
+	}
+	
+	/*
+	 * This method toggles J21 pin 8 (CELL_ON/OFF)
+	 */
+	private void toggle(int hold) throws KuraException {
+
+		if (this.m_vectorJ21GpioService != null) {
+			try {
+				this.m_vectorJ21GpioService
+					.j21pinTurnOn(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+				
+				sleep(hold * 1000);
+				
+				this.m_vectorJ21GpioService
+						.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+    
+    private void sleep(long millis) {
+		try {
+			Thread.sleep(millis);
+		} catch (InterruptedException e) {
+			// ignore
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910AtCommands.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910AtCommands.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d2a2841bc81f14f87c90e0938f194bbbcf89f9b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910AtCommands.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+public enum TelitDe910AtCommands {
+
+	at("at\r\n"),
+	getModelNumber("at+gmm\r\n"),
+	getManufacturer("at+gmi\r\n"),
+	getSerialNumber("at#cgsn\r\n"),
+	getRevision("at+gmr\r\n"),
+	getSignalStrength("at+csq\r\n"),
+	getNetRegistrationStatus("at+creg?\r\n"), 
+	getMdn("at#modem=0?\r\n"),
+	getMsid("at#modem=1?\r\n"),
+	getServiceType("at+service?\r\n"),
+	getSessionDataVolume("at#gdatavol=1\r\n"),
+	provisionVerizon("atd*22899;\r\n"),
+	isGpsLocked("AT$GPSLOCK?\r\n"),
+	unlockGps("AT$GPSLOCK=0\r\n"),
+	isGpsPowered("AT$GPSP?\r\n"),
+	gpsPowerUp("AT$GPSP=1\r\n"),
+	gpsPowerDown("AT$GPSP=0\r\n"),
+	gpsEnableNMEA("AT$GPSNMUN=3,0,0,1,1,1,1\r\n"),
+	gpsDisableNMEA("+++");
+	
+	private String m_command;
+	
+	private TelitDe910AtCommands (String atCommand) {
+		m_command = atCommand;
+	}
+	
+	public String getCommand () {
+		return m_command;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ConfigGenerator.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ConfigGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..2242516ba2b500a4fcc7622398137f5f40b8fcd0
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ConfigGenerator.java
@@ -0,0 +1,111 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+import org.eclipse.kura.net.admin.modem.ModemPppConfigGenerator;
+import org.eclipse.kura.net.admin.modem.PppPeer;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangePair;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+public class TelitDe910ConfigGenerator implements ModemPppConfigGenerator {
+
+	@Override
+	public PppPeer getPppPeer(String deviceId, ModemConfig modemConfig, String logFile,
+			String connectScript, String disconnectScript) {
+		
+		PppPeer pppPeer = new PppPeer();
+		
+		 // default values
+		pppPeer.setBaudRate(921600);
+		pppPeer.setEnableDebug(true);
+		pppPeer.setNetworkTechnology(ModemTechnologyType.EVDO);
+		pppPeer.setUseRtsCtsFlowControl(true);
+		pppPeer.setLockSerialDevice(true);
+		pppPeer.setPeerMustAuthenticateItself(false);
+		pppPeer.setAddDefaultRoute(true);
+		pppPeer.setUsePeerDns(true);
+		pppPeer.setAllowProxyArps(true);
+		pppPeer.setAllowVanJacobsonTcpIpHdrCompression(true);
+		pppPeer.setAllowVanJacobsonConnectionIDCompression(true);
+		pppPeer.setAllowBsdCompression(true);
+		pppPeer.setAllowDeflateCompression(true);
+		pppPeer.setAllowMagic(true);
+		pppPeer.setConnect_delay(10000);
+		pppPeer.setLcp_echo_failure(4);
+		pppPeer.setLcp_echo_interval(65535);
+		
+		pppPeer.setLogfile(logFile);
+		pppPeer.setProvider(deviceId);
+        pppPeer.setPppUnitNumber(modemConfig.getPppNumber());
+		pppPeer.setConnectScript(connectScript);
+		pppPeer.setDisconnectScript(disconnectScript);
+		pppPeer.setDialString(modemConfig.getDialString());
+		pppPeer.setLcp_echo_interval(modemConfig.getLcpEchoInterval());
+        pppPeer.setLcp_echo_failure(modemConfig.getLcpEchoFailure());
+		
+		return pppPeer;
+	}
+
+	@Override
+	public ModemXchangeScript getConnectScript(ModemConfig modemConfig) {
+		
+		String dialString = "";
+		if(modemConfig != null) {
+            dialString = modemConfig.getDialString();
+        }    
+		
+		ModemXchangeScript modemXchange = new ModemXchangeScript();
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"BUSY\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"VOICE\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO CARRIER\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIALTONE\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIAL TONE\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"ERROR\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"+++ath\"", "\"\""));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"AT\"", "OK"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"ATE1V1&F&D2&C1&C2S0=0\"", "OK"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"ATE1V1\"", "OK"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"ATS7=60\"", "OK"));
+		 modemXchange.addmodemXchangePair(new ModemXchangePair("\"\\d\\d\\d\"", "OK"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair(this.formDialString(dialString), "\"\""));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"\\c\"", "CONNECT"));
+		
+		return modemXchange;
+	}
+
+	@Override
+	public ModemXchangeScript getDisconnectScript(ModemConfig modemConfig) {
+		 
+		ModemXchangeScript modemXchange = new ModemXchangeScript();
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"BUSY\"","ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"VOICE\"","ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO CARRIER\"","ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIALTONE\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIAL TONE\"", "ABORT"));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("BREAK", "\"\""));
+		modemXchange.addmodemXchangePair(new ModemXchangePair("\"+++ATH\"","\"\""));
+
+		return modemXchange;
+	}
+	
+	private String formDialString(String dialString) {
+		StringBuffer buf = new StringBuffer();
+		buf.append('"');
+		if (dialString != null) {
+			buf.append(dialString);
+		}
+		buf.append('"');
+		return buf.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ModemFactory.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ModemFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f1646f0dc8dffd6255a72457b5b8256283731d3
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ModemFactory.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.tracker.ServiceTracker;
+
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.modem.CellularModem;
+import org.eclipse.kura.net.admin.modem.CellularModemFactory;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+public class TelitDe910ModemFactory implements CellularModemFactory {
+
+	private static TelitDe910ModemFactory s_factoryInstance = null;
+	private static ModemTechnologyType s_type = ModemTechnologyType.EVDO;
+	private BundleContext s_bundleContext = null;
+	private Hashtable<String, TelitDe910> m_modemServices = null;
+	private ConnectionFactory m_connectionFactory = null;
+	
+	private TelitDe910ModemFactory () {
+		s_bundleContext = FrameworkUtil.getBundle(NetworkConfigurationService.class).getBundleContext();
+		
+		ServiceTracker<ConnectionFactory, ConnectionFactory> serviceTracker = new ServiceTracker<ConnectionFactory, ConnectionFactory>(s_bundleContext, ConnectionFactory.class, null);
+		serviceTracker.open(true);
+		m_connectionFactory = serviceTracker.getService();
+		
+		m_modemServices = new Hashtable<String, TelitDe910>();
+	}
+	
+	public static TelitDe910ModemFactory getInstance() {
+	    if(s_factoryInstance == null) {
+	        s_factoryInstance = new TelitDe910ModemFactory();
+	    }
+	    return s_factoryInstance;
+	}
+	
+	@Override
+	public CellularModem obtainCellularModemService(ModemDevice modemDevice, String platform) throws Exception {
+		String key = modemDevice.getProductName();
+		TelitDe910 telitDe910 = m_modemServices.get(key);
+
+		if (telitDe910 == null) {
+			telitDe910 = new TelitDe910(modemDevice, m_connectionFactory, s_type);
+			
+			if ((platform != null) && platform.equals("reliagate")) {
+				// FIXME comment out for now
+				// telitDe910.bindVectorJ21GpioService(VectorGpioControl.getInstance());
+			}
+			this.m_modemServices.put(key, telitDe910);
+		}
+		
+		return telitDe910;
+	}
+
+	@Override
+	public Hashtable<String, ? extends CellularModem> getModemServices() {
+		return m_modemServices;
+	}
+
+	@Override
+	public void releaseModemService(String usbPortAddress) {
+		 m_modemServices.remove(usbPortAddress);
+	}
+
+	@Override
+	public ModemTechnologyType getType() {
+		return s_type;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ServiceProviders.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ServiceProviders.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe090ddfc5907677ce95ab3dfea3f95229328e18
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/TelitDe910ServiceProviders.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+public enum TelitDe910ServiceProviders {
+	
+	UNKNOWN(-1),
+	SPRINT(0),
+	AERIS(1),
+	VERIZON(2);
+	
+	private int m_provider;
+	
+	private TelitDe910ServiceProviders(int provider) {
+		m_provider = provider;
+	}
+	
+	public int getProvider () {
+		return m_provider;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/VectorGpioControl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/VectorGpioControl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9d855bdc62e25ff2efb90f47d337c8868f7a168
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/VectorGpioControl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Defines GPIO control for Vector board
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class VectorGpioControl implements IVectorJ21GpioService {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(VectorGpioControl.class);
+	
+	private static final int GPIOCMD_PIN_STATUS = 0;
+	private static final int GPIOCMD_PIN_OUT = 1;
+	private static final int GPIOCMD_PIN_DIRECTION = 2;
+	
+	private static VectorGpioControl s_vectorGpioControl = null;
+	
+	//private static final int [] J21Pins = {3,5,7,9,13,15,17,19,2,4,6,8,10,14,16,18,20,22};
+	
+	private ICatalystSmBusService catalystSmBusService = null;
+	
+	// Slave address for TCA8418 U47 J21
+	private static int TCA8418_ADDRESS = 0x34;
+	
+	private VectorJ21 vectorJ21 = null;
+	
+	private VectorGpioControl() {
+		this.catalystSmBusService = SmBus.getInstance();
+		
+		this.vectorJ21 = new VectorJ21();
+		
+		for (int i = 0; i < VectorJ21.getJ21pins().length; i++) {
+			try {
+				this.setPinDirection(VectorJ21.getJ21pins()[i], this.vectorJ21
+						.getPinDirection(VectorJ21.getJ21pins()[i]));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	public static VectorGpioControl getInstance() {
+		if(s_vectorGpioControl == null) {
+			s_vectorGpioControl = new VectorGpioControl();
+		}
+		return s_vectorGpioControl;
+	}
+	
+//	/**
+//	 * Binds services and allocates resources
+//	 * 
+//	 * @param catalystSmBusService - Catalyst SmBus service as {@link ICatalystSmBusService}
+//	 * @param kuraLoggerService - Kura logger service as {@link IKuraLoggerService}
+//	 */
+//	public void bind(ICatalystSmBusService catalystSmBusService,
+//			IKuraLoggerService kuraLoggerService) {
+//		
+//		this.catalystSmBusService = catalystSmBusService;
+//		this.kuraLoggerService = kuraLoggerService;
+//		
+//		this.vectorJ21 = new VectorJ21();
+//		
+//		for (int i = 0; i < VectorJ21.getJ21pins().length; i++) {
+//			try {
+//				this.setPinDirection(VectorJ21.getJ21pins()[i], this.vectorJ21
+//						.getPinDirection(VectorJ21.getJ21pins()[i]));
+//			} catch (Exception e) {
+//				e.printStackTrace();
+//			}
+//		}
+//	}
+//	
+//	/**
+//	 * Releases resources
+//	 */
+//	public void unbind () {
+//		
+//		this.vectorJ21 = null;
+//		this.catalystSmBusService = null;
+//		this.kuraLoggerService = null;
+//	}
+	
+	public synchronized int j21pinGetDirection (int j21pin) throws Exception {
+		
+		return this.getPinDirection(j21pin);
+	}
+	
+	public synchronized void j21pinSetDirection (int j21pin, int direction) throws Exception {
+		
+		this.setPinDirection(j21pin, direction);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.gpio.service.IVectorGpioService#j21pinIsOn(int)
+	 */
+	public synchronized boolean j21pinIsOn(int j21pin) throws Exception {
+
+		byte pinState = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_STATUS,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+
+		return ((pinState & (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) != 0) ? true
+				: false;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.j21.gpio.service.IVectorJ21GpioService#j21pinGetStatus(int)
+	 */
+	public synchronized String j21pinGetStatus(int j21pin) throws Exception {
+
+		byte pinState = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_STATUS,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+
+		return ((pinState & (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) != 0) ? "ON" : "OFF";
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.gpio.service.IVectorGpioService#j21pinTurnOn(int)
+	 */
+	public synchronized void j21pinTurnOn(int j21pin) throws Exception {
+
+		s_logger.debug("Turning J21 GPIO Pin " + j21pin + " ON");
+		byte pinStatus = this.getPinStatus(j21pin);
+		byte[] mask = { (byte) (pinStatus | (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) };
+		this.catalystSmBusService.write(
+				this.formSlaveWriteAddress(),
+				this.formCommandByte(GPIOCMD_PIN_OUT,
+						this.vectorJ21.getJ21PinIndex(j21pin)), mask);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.gpio.service.IVectorGpioService#j21pinTurnOff(int)
+	 */
+	public synchronized void j21pinTurnOff(int j21pin) throws Exception {
+		
+		s_logger.debug("Turning J21 GPIO Pin " + j21pin + " OFF");
+		byte pinStatus = this.getPinStatus(j21pin);
+		byte [] mask = { (byte)(pinStatus & ~(1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) };
+		this.catalystSmBusService.write(
+				this.formSlaveWriteAddress(),
+				this.formCommandByte(GPIOCMD_PIN_OUT,
+						this.vectorJ21.getJ21PinIndex(j21pin)), mask);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.j21.gpio.service.IVectorJ21GpioService#j21pinToggle(int)
+	 */
+	public void j21pinToggle(int j21pin) throws Exception {
+	
+		if (this.j21pinIsOn(j21pin)) {
+			s_logger.debug("Turning J21 GPIO Pin " + j21pin + " ON/OFF");
+			this.j21pinTurnOff(j21pin);
+		} else {
+			s_logger.debug("Turning J21 GPIO Pin " + j21pin + " OFF/ON");
+			this.j21pinTurnOn(j21pin);
+		}
+	}
+	
+	/*
+	 * This method reports status of J21 pin specified
+	 */
+	private byte getPinStatus (int j21pin) throws Exception {
+		
+		byte pinStatus = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_STATUS,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+		
+		return pinStatus;
+	}
+	
+	/*
+	 * This method set a direction of J21 pin
+	 */
+	private void setPinDirection (int j21pin, int direction) throws Exception {
+		
+		byte pinDirection = this.getPinDirection(j21pin);
+		byte [] mask = new byte [1]; 
+		switch (direction) {
+		case J21PIN_DIRECTION_IN:
+			mask [0] = (byte)(pinDirection & ~(1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8)));
+			break;
+		case J21PIN_DIRECTION_OUT:
+			mask [0] = (byte)(pinDirection | (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8)));
+			break;
+		default:
+//			throw new J21GpioException ("Invalid PIN direction");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid PIN direction");
+		}
+		
+		this.catalystSmBusService.write(
+				this.formSlaveWriteAddress(),
+				this.formCommandByte(GPIOCMD_PIN_DIRECTION,
+						this.vectorJ21.getJ21PinIndex(j21pin)), mask);
+	}
+	
+	/*
+	 * This method reports direction of J21 pin specified
+	 */
+	private byte getPinDirection (int j21pin) throws Exception {
+		
+		byte pinDirection = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_DIRECTION,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+		
+		return pinDirection;
+	}
+	
+	/*
+	 * This method forms slave write address
+	 */
+	private byte formSlaveWriteAddress() {
+		
+		return (byte)(2 * TCA8418_ADDRESS);
+	}
+	
+	/*
+	 * This method forms slave read address
+	 */
+	private byte formSlaveReadAddress() {
+		
+		return (byte)(2 * TCA8418_ADDRESS + 1);
+	}
+	
+	/*
+	 * This method forms SmBus command byte based on supplied command 
+	 * type (pin status, pin output, and pin direction) and J21 pin index
+	 */
+	private byte formCommandByte (int cmdType, int j21PinInd) throws Exception {
+		
+		byte cmd = 0;
+		switch (cmdType) {
+		case GPIOCMD_PIN_STATUS:
+			cmd =  (byte)(0x14 + j21PinInd/8);
+			break;
+		case GPIOCMD_PIN_OUT:
+			cmd =  (byte)(0x17 + j21PinInd/8);
+			break;
+		case GPIOCMD_PIN_DIRECTION:
+			cmd =  (byte)(0x23 + j21PinInd/8);
+			break;
+		default:
+//			throw new J21GpioException ("Invalid GPIO PIN command");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid GPIO PIN command");
+		}
+		
+		return cmd;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/VectorJ21.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/VectorJ21.java
new file mode 100644
index 0000000000000000000000000000000000000000..b04fa03481bc0c9f16621d49e925c955ba43f057
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/de910/VectorJ21.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.de910;
+
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+
+public class VectorJ21 {
+
+	private static final int [] J21Pins = {3,5,7,9,13,15,17,19,2,4,6,8,10,14,16,18,20,22};
+	
+	private int [] j21PinDirections = null;
+
+	/**
+	 * VectorJ21 constructor
+	 */
+	public VectorJ21 () {
+		
+		this.j21PinDirections = new int [J21Pins.length];
+		
+		try {
+			Properties props = new Properties();
+			InputStream is = this.getClass().getResourceAsStream(
+					"/resources/j21pin.direction.config");
+			props.load(is);
+			Enumeration keys = props.keys();
+			while (keys.hasMoreElements()) {
+				String key = (String) keys.nextElement();
+				int j21Pin = this.getJ21Pin(key);
+				int j21PinInd = this.getJ21PinIndex(j21Pin);
+				String sPinDir = props.getProperty(key);
+				if (sPinDir.compareToIgnoreCase("IN") == 0) {
+					this.j21PinDirections[j21PinInd] = IVectorJ21GpioService.J21PIN_DIRECTION_IN;
+				} else if (sPinDir.compareToIgnoreCase("OUT") == 0) {
+					this.j21PinDirections[j21PinInd] = IVectorJ21GpioService.J21PIN_DIRECTION_OUT;
+				} else {
+					this.j21PinDirections[j21PinInd] = IVectorJ21GpioService.J21PIN_DIRECTION_OUT;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			for (int i = 0; i < this.j21PinDirections.length; i++) {
+				this.j21PinDirections[i] = IVectorJ21GpioService.J21PIN_DIRECTION_OUT;
+			}
+		}
+	}
+	
+	
+	/**
+	 * Reports J21 pins array
+	 * 
+	 * @return J21 pins array as {@link int []}
+	 */
+	public static int[] getJ21pins() {
+		return J21Pins;
+	}
+
+
+
+	/**
+	 * Reports J21 pin direction
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @return J21 pin direction as {@link int}
+	 * @throws Exception
+	 */
+	public int getPinDirection (int j21pin) throws Exception {
+
+		return this.j21PinDirections[this.getJ21PinIndex(j21pin)];
+	}
+	
+	/**
+	 * Reports index of J21 pin
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @return index of J21 pin as {@link int}
+	 * @throws Exception
+	 */
+	public int getJ21PinIndex (int j21pin) throws Exception {
+		
+		int j21PinInd = -1;
+		
+		for (int i = 0; i < J21Pins.length; i++) {
+			if (j21pin == J21Pins[i]) {
+				j21PinInd = i;
+				break;
+			}
+		}
+		if (j21PinInd == -1) {
+//			throw new J21GpioException ("Invalid J21 pin");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid J21 pin");
+		}
+		return j21PinInd;
+	}
+	
+	/*
+	 * This method reports a value (J21 pin number) for given property name
+	 */
+	private int getJ21Pin (String propName) throws Exception {
+		
+		int ind = propName.lastIndexOf(".");
+		if (ind < 0) {
+//			throw new J21GpioException ("Invalid property name: " + propName);
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid property name: " + propName);
+		}
+		
+		try {
+			int pinNo = Integer.parseInt(propName.substring(ind+1));
+			return pinNo;
+		} catch (Exception e) {
+//			throw new J21GpioException ("Invalid property name: " + propName, e);
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid property name: " + propName, e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/ICatalystSmBusService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/ICatalystSmBusService.java
new file mode 100644
index 0000000000000000000000000000000000000000..72e87f2b49fbc2732dace88a9f5663346e5fc965
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/ICatalystSmBusService.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+/* 
+ * Copyright � 2009 Eurotech Inc. All rights reserved.
+ */
+
+
+
+public interface ICatalystSmBusService {
+
+	public static final String SERVICE_NAME = ICatalystSmBusService.class.getName();
+
+	
+	/**
+	 * writes data to the SMbus
+	 * 
+	 * @param slaveAddress	the slave address to write to
+	 * @param command		the command to write
+	 * @param data			the data to write
+	 * @throws Exception	if the write can not succeed
+	 */
+	public void write(byte slaveAddress, byte command, byte[] data) throws Exception;
+
+	/**
+	 * reads a byte from the SMBus
+	 * 
+	 * @param slaveAddress	the slave address to read from
+	 * @param command		the command to send
+	 * @return				the byte read from the SMBus
+	 * @throws Exception	if the read fails
+	 */
+	public byte readByte(byte slaveAddress, byte command) throws Exception;
+
+	/**
+	 * reads a 16 bit word from the SMBus
+	 * 
+	 * @param slaveAddress	the slave address to read from
+	 * @param command		the command to send
+	 * @return				the word read from the SMBus
+	 * @throws Exception	if the read fails
+	 */
+	public short readWord(byte slaveAddress, byte command) throws Exception;
+	
+	/**
+	 * reads a block of bytes from the SMBus
+	 * 
+	 * @param slaveAddress	the slave address to read from
+	 * @param command		the command to send
+	 * @return				an array of bytes read from the SMBus
+	 * @throws Exception	if the read fails
+	 */
+	public byte[] readBlock(byte slaveAddress, byte command) throws Exception;
+
+	/**
+	 * gets the last error provided by the SMBus native library
+	 * 
+	 * @return				an int representing the last error provided by the
+	 * 						SMBus native library
+	 * @throws Exception	if there is an error reading the last error
+	 */
+	public int getLastError() throws Exception;
+	
+	/**
+	 * sets the last error in the SMBus native library
+	 * 
+	 * @param error			the error code to set in the natvie library
+	 * @throws Exception	if there is an error setting the error code
+	 */
+	public void setLastError(int error) throws Exception;
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/IVectorJ21GpioService.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/IVectorJ21GpioService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f6c3cd1bccd740ab9c3c8d2aa4cd7f90af2c192a
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/IVectorJ21GpioService.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+/**
+ * Defines GPIO service interface for the Vector board
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public interface IVectorJ21GpioService {
+
+	/**
+	 * service name of this interface for the bundle activator
+	 */
+	public static final String SERVICE_NAME = IVectorJ21GpioService.class.getName();
+	
+	public static final int J21PIN_DIRECTION_IN = 0;
+	public static final int J21PIN_DIRECTION_OUT = 1;
+	
+	public static final int J21PIN_CELL_RESET = 6;
+	public static final int J21PIN_CELL_ON_OFF = 8;
+	public static final int J21PIN_CELL_PWR_EN = 10;
+	public static final int J21PIN_USB_RESET = 13;
+	public static final int J21PIN_5V_ENABLE = 15;
+	public static final int J21PIN_ZIGBEE_PWR_EN = 18;
+	public static final int J21PIN_PWR_MON = 17;
+	public static final int J21PIN_USB_SER_PWR_EN = 19;
+	public static final int J21PIN_GPS_PWR_EN = 14;
+	public static final int J21PIN_SLOT_PWR_EN = 16;
+	public static final int J21PIN_LAN_PWR_ON = 20;
+	public static final int J21PIN_ADC_ON = 22;
+	
+	/**
+	 * Reports direction of J21 pin.
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @return J21 pin direction as {@link int}
+	 * @throws Exception
+	 */
+	public int j21pinGetDirection (int j21pin) throws Exception;
+	
+	/**
+	 * Sets direction of J21 pin.
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @param direction - J21 pin direction as {@link int}
+	 * @throws Exception
+	 */
+	public void j21pinSetDirection (int j21pin, int direction) throws Exception;
+	
+	
+	/**
+	 * Reports a state of specified J21 pin.
+	 *  
+	 * @param j21pin - J21 pin as {@link int}
+	 * @return pin status as {@link boolean}
+	 * @throws Exception
+	 */
+	public boolean j21pinIsOn (int j21pin) throws Exception;
+	
+	/**
+	 * Reports a status of specified J21 pin.
+	 * 
+	 * @param j21pin - J21 pin as {@link int}
+	 * @return state of specified J21 pin as {@link String}
+	 * @throws Exception
+	 */
+	public String j21pinGetStatus (int j21pin) throws Exception;
+	
+	/**
+	 * Turns specified J21 pin ON.
+	 * 
+	 * @param j21pin - J21 pin to turn ON as {@link int}
+	 * @throws Exception
+	 */
+	public void j21pinTurnOn(int j21pin) throws Exception;
+	
+	/**
+	 * Turns specified J21 pin OFF.
+	 * 
+	 * @param j21pin - J21 pin to turn OFF as {@link int}
+	 * @throws Exception
+	 */
+	public void j21pinTurnOff(int j21pin) throws Exception;
+	
+	/**
+	 * 
+	 * @param j21pin
+	 * @throws Exception
+	 */
+	public void j21pinToggle(int j21pin) throws Exception;
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/SmBus.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/SmBus.java
new file mode 100644
index 0000000000000000000000000000000000000000..12dab5ec94c2acf583a9c50cfbfd886ccb65990f
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/SmBus.java
@@ -0,0 +1,195 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+import java.io.IOException;
+
+
+public class SmBus implements ICatalystSmBusService {
+	static {
+		System.loadLibrary("smbus");
+	}
+	
+	private final static String LABEL = "org.eclipse.kura.sbc.catalyst.smbus.SmBus: ";
+
+	public static final int SMBUS_1_KHZ = 1;
+	public static final int SMBUS_10_KHZ = 2;
+	public static final int SMBUS_50_KHZ = 3;
+	public static final int SMBUS_100_KHZ = 4;
+	public static final int SMBUS_400_KHZ = 5;
+	public static final int SMBUS_1_MHZ = 6;
+
+	public static final int SMBUS_ERROR_BASE = 0x4600;
+	public static final int ERR_SMBUS_UNKNOWN_ERROR = SMBUS_ERROR_BASE + 0x0;
+	public static final int ERR_SMBUS_DRIVER_OPEN = SMBUS_ERROR_BASE + 0x1;
+	public static final int ERR_SMBUS_UNKNOWN_EXCEPTION = SMBUS_ERROR_BASE + 0x2;
+	public static final int ERR_SMBUS_ACCESS_DENIED = SMBUS_ERROR_BASE + 0x3;
+	public static final int ERR_SMBUS_SERVICE_NAME_INVALID = SMBUS_ERROR_BASE + 0x4;
+	public static final int ERR_SMBUS_SERVICE_DOES_NOT_EXIST = SMBUS_ERROR_BASE + 0x5;
+	public static final int ERR_SMBUS_SERVICE_ALREADY_RUNNING = SMBUS_ERROR_BASE + 0x6;
+	public static final int ERR_SMBUS_COPYING_DRIVER = SMBUS_ERROR_BASE + 0x7;
+	public static final int ERR_SMBUS_SERVICE_EXISTS = SMBUS_ERROR_BASE + 0x8;
+	public static final int ERR_SMBUS_INVALID_HANDLE = SMBUS_ERROR_BASE + 0x9;
+	public static final int ERR_SMBUS_TIMEOUT_WAITING_FOR_MUTEX = SMBUS_ERROR_BASE + 0xa;
+	public static final int ERR_SMBUS_TIMEOUT = SMBUS_ERROR_BASE + 0xb;
+
+	private native int OpenSMBus();
+	private native int CloseSMBus(int handle);
+
+	private native int SMBusSetClockSpeed(int handle, int freqeuncy);
+	private native int SMBusGetClockSpeed(int handle);
+
+	private native void SMBusWrite(int handle, byte slaveAddress, byte command, byte[] data);
+	private native byte SMBusReadByte(int handle, byte slaveAddress, byte command);
+	private native short SMBusReadWord(int handle, byte slaveAddress, byte command);
+	private native byte[] SMBusReadBlock(int handle, byte slaveAddress, byte command);
+
+	private native int SMBusGetLastError(int handle);
+	private native void SMBusSetLastError(int handle, int error);
+
+	private static Boolean lock;
+	
+	private static SmBus m_smBus = null;
+	
+	private SmBus() {
+		lock = new Boolean(false);
+	}
+	
+	public static SmBus getInstance() {
+		if(m_smBus == null) {
+			m_smBus = new SmBus();
+		}
+		
+		return m_smBus;
+	}
+	
+//	public void bind() {
+//		lock = new Boolean(false);
+//	}
+//	
+//	public void unbind() {
+//		lock = null;
+//	}
+	
+	public void write(byte slaveAddress, byte command, byte[] data) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			SMBusWrite(handle, slaveAddress, command, data);
+			
+			CloseSMBus(handle);
+		}
+	}
+	
+	public byte readByte(byte slaveAddress, byte command) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			byte result = SMBusReadByte(handle, slaveAddress, command);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public short readWord(byte slaveAddress, byte command) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			short result = SMBusReadWord(handle, slaveAddress, command);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public byte[] readBlock(byte slaveAddress, byte command) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			byte[] result = SMBusReadBlock(handle, slaveAddress, command);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public int getLastError() throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			int result = SMBusGetLastError(handle);
+			
+			CloseSMBus(handle);
+			
+			return result;
+		}
+	}
+	
+	public void setLastError(int error) throws Exception {
+		synchronized(lock) {
+			int handle = OpenSMBus();
+			if(handle < 0) {
+				throw new IOException(LABEL + "unable to open SMBus");
+			}
+			
+			if(SMBusSetClockSpeed(handle, SMBUS_50_KHZ) != 0) {
+				throw new IOException(LABEL + "error setting SMBus clock speed");
+			}
+			
+			SMBusSetLastError(handle, error);
+			CloseSMBus(handle);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b4aaa8f238d22fb2428d0f94f39d0a926712933
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910.java
@@ -0,0 +1,855 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.osgi.service.io.ConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.linux.net.modem.SerialModemComm;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.admin.modem.HspaCellularModem;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemRegistrationStatus;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.SerialModemDevice;
+import org.eclipse.kura.usb.UsbModemDevice;
+
+/**
+ * Defines Telit HE910 modem
+ */
+public class TelitHe910 implements HspaCellularModem {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(TelitHe910.class);
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private IVectorJ21GpioService m_vectorJ21GpioService = null;
+	private ConnectionFactory m_connectionFactory = null;
+ 
+	private ModemTechnologyType m_technologyType = null;
+	private String m_model = null;
+	private String m_manufacturer = null;
+	private String m_serialNumber = null;
+	private String m_revisionId = null;
+	private int m_pdpContext = 1;
+	private Boolean m_gpsSupported = null;
+	
+	private Object m_atLock = null; 
+	
+	private ModemDevice m_device = null;
+	private List<NetConfig> m_netConfigs = null;
+
+    /**
+     * TelitHe910 modem constructor
+     * 
+     * @param usbDevice - modem USB device as {@link UsbModemDevice}
+     * @param connectionFactory - connection factory {@link ConnectionFactory}
+     * @param technologyType - cellular technology type as {@link ModemTechnologyType}
+     */
+	public TelitHe910(ModemDevice device, ConnectionFactory connectionFactory,
+			ModemTechnologyType technologyType) {
+        
+        m_device = device;
+        m_connectionFactory = connectionFactory;
+        m_technologyType = technologyType;
+        m_atLock = new Object();
+         
+        try {
+			String atPort = getAtPort();
+			String gpsPort = getGpsPort();
+			if (atPort != null) {
+				if (atPort.equals(getDataPort()) || atPort.equals(gpsPort)) {
+					m_serialNumber = getSerialNumber();
+					m_model = getModel();
+					m_manufacturer = getManufacturer();		
+					m_revisionId = getRevisionID();
+					m_gpsSupported = isGpsSupported();
+				}
+			}
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+    }
+    
+    public void bindVectorJ21GpioService(
+			IVectorJ21GpioService vectorJ21GpioService) {
+		
+		s_logger.info("bindVectorJ21GpioService()");
+		m_vectorJ21GpioService = vectorJ21GpioService;
+	}
+    
+    @Override
+    public String getModel() throws KuraException {
+    	synchronized (m_atLock) {
+	    	if (m_model == null) {
+	    		s_logger.debug("sendCommand getModelNumber :: " + TelitHe910AtCommands.getModelNumber.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.getModelNumber.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_model = getResponseString(reply);
+					reply = null;
+				}
+	    	}
+    	}
+        return m_model;
+    }
+
+    @Override
+    public String getManufacturer() throws KuraException {
+    	synchronized (m_atLock) {
+	    	if (m_manufacturer == null) {
+		    	s_logger.debug("sendCommand getManufacturer :: " + TelitHe910AtCommands.getManufacturer.getCommand());
+		    	byte[] reply = null;
+		    	CommConnection commAtConnection = openSerialPort(getAtPort());
+		    	if (!isAtReachable(commAtConnection)) {
+		    		closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+		    	try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.getManufacturer.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+		    	closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    m_manufacturer = getResponseString(reply); 
+					reply = null;
+				}
+	    	}
+    	}
+        return m_manufacturer;
+    }
+
+    @Override
+    public String getSerialNumber() throws KuraException {
+    	synchronized (m_atLock) {
+	    	if (m_serialNumber == null) {
+	    		s_logger.debug("sendCommand getSerialNumber :: " + TelitHe910AtCommands.getSerialNumber.getCommand());
+	    		byte[] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+				try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.getSerialNumber.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    String serialNum = getResponseString(reply);
+				    if(serialNum != null && !serialNum.isEmpty()) {
+				    	if (serialNum.startsWith("#CGSN:")) {
+				    		serialNum = serialNum.substring("#CGSN:".length()).trim();
+				    	}
+				    	m_serialNumber = serialNum;        
+				    }
+				}
+	    	}
+    	}
+        return m_serialNumber;
+    }
+
+    @Override
+    public String getRevisionID() throws KuraException {
+    	synchronized (m_atLock) {
+	    	if (m_revisionId == null) {
+	    		s_logger.debug("sendCommand getRevision :: " + TelitHe910AtCommands.getRevision.getCommand());
+	    		byte [] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+	    		try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.getRevision.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+	    		closeSerialPort(commAtConnection);
+				if (reply != null) {
+					m_revisionId = getResponseString(reply);
+				}
+	    	}
+    	}
+        return m_revisionId;
+    }
+    
+    @Override
+	public boolean isReachable() throws KuraException {
+    	boolean ret = false;
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getAtPort());
+    		ret = isAtReachable(commAtConnection);
+    		closeSerialPort(commAtConnection);
+    	}
+		return ret;
+	}
+    
+    @Override
+    public boolean isSimCardReady() throws KuraException {
+    	boolean simReady = false;
+    	synchronized (m_atLock) {
+    		s_logger.debug("sendCommand getSimStatus :: " + TelitHe910AtCommands.getSimStatus.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.getSimStatus.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			
+	        if (reply != null) {
+	            String simStatus = getResponseString(reply);
+	            String[] simStatusSplit = simStatus.split(",");
+	            if((simStatusSplit.length > 1) && (Integer.valueOf(simStatusSplit[1]) > 0)) {
+	                simReady = true;
+	            } 
+	        }
+	        
+	        if (!simReady) {
+	        	try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.simulateSimNotInserted.getCommand().getBytes(), 1000, 100);
+					if (reply != null) {
+						sleep(5000);
+						reply = commAtConnection.sendCommand(TelitHe910AtCommands.simulateSimInserted.getCommand().getBytes(), 1000, 100);
+						if (reply != null) {
+							sleep(1000);
+							reply = commAtConnection.sendCommand(TelitHe910AtCommands.getSimStatus.getCommand().getBytes(), 1000, 100);
+	
+							if (reply != null) {
+								String simStatus = getResponseString(reply);
+								String[] simStatusSplit = simStatus.split(",");
+								if ((simStatusSplit.length > 1) && (Integer.valueOf(simStatusSplit[1]) > 0)) {
+									simReady = true;
+								}
+							}
+						}
+					}
+	        	} catch (IOException e) {
+	        		 closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+	        }
+	        
+	        closeSerialPort(commAtConnection);
+    	}
+    	return simReady;
+    }
+
+    @Override
+	public void reset() throws KuraException {
+		s_logger.info("resetting modem ...");
+		try {
+			powerOff();
+			sleep(15000);
+			powerOn();
+			sleep(3000);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+    @Override
+    public int getSignalStrength() throws KuraException {
+    	
+    	int rssi = -113;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getSignalStrength :: " + TelitHe910AtCommands.getSignalStrength.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.getSignalStrength.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] asCsq = null;
+				String sCsq = this.getResponseString(reply);
+				if (sCsq.startsWith("+CSQ:")) {
+					sCsq = sCsq.substring("+CSQ:".length()).trim();
+					asCsq = sCsq.split(",");
+					if (asCsq.length == 2) {
+						rssi = -113 + 2 * Integer.parseInt(asCsq[0]);
+						
+					}
+				}
+				reply = null;
+			}
+    	}
+        return rssi;
+    }
+   
+    @Override
+    public ModemRegistrationStatus getRegistrationStatus() throws KuraException {
+    	
+    	ModemRegistrationStatus modemRegistrationStatus = ModemRegistrationStatus.UNKNOWN;
+    	synchronized (m_atLock) {
+    		s_logger.debug("sendCommand getRegistrationStatus :: " + TelitHe910AtCommands.getRegistrationStatus.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.getRegistrationStatus.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+	        if (reply != null) {
+	            String sRegStatus = getResponseString(reply);
+	            String[] regStatusSplit = sRegStatus.split(",");
+	            if(regStatusSplit.length >= 2) {
+	                int status = Integer.parseInt(regStatusSplit[1]);
+	                switch (status) {
+	                case 0:
+	                	modemRegistrationStatus = ModemRegistrationStatus.NOT_REGISTERED;
+	                	break;
+	                case 1:
+	                	modemRegistrationStatus = ModemRegistrationStatus.REGISTERED_HOME;
+	                	break;
+	                case 3:
+	                	modemRegistrationStatus = ModemRegistrationStatus.REGISTRATION_DENIED;
+	                	break;
+	                case 5:
+	                	modemRegistrationStatus = ModemRegistrationStatus.REGISTERED_ROAMING;
+	                	break;
+	                }
+	            } 
+	        }
+    	}
+        return modemRegistrationStatus;
+    }
+
+    @Override
+    public long getCallTxCounter() throws KuraException {
+    	
+    	long txCnt = 0;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getGprsSessionDataVolume :: " + TelitHe910AtCommands.getGprsSessionDataVolume.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.getGprsSessionDataVolume.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] splitPdp = null;
+				String [] splitData = null;
+				String sDataVolume = this.getResponseString(reply);
+				splitPdp = sDataVolume.split("#GDATAVOL:");
+				if (splitPdp.length > 1) {
+					for (String pdp : splitPdp) {
+						if (pdp.trim().length() > 0) {
+							splitData = pdp.trim().split(",");
+							if (splitData.length >= 4) {
+								int pdpNo = Integer.parseInt(splitData[0]);
+								if (pdpNo == m_pdpContext) {
+									txCnt = Integer.parseInt(splitData[2]);
+								}
+							}
+						}
+					}
+				}
+				reply = null;
+			}
+    	}
+        return txCnt;
+    }
+
+    @Override
+    public long getCallRxCounter() throws KuraException {
+    	long rxCnt = 0;
+    	synchronized (m_atLock) {
+	    	s_logger.debug("sendCommand getGprsSessionDataVolume :: " + TelitHe910AtCommands.getGprsSessionDataVolume.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.getGprsSessionDataVolume.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String [] splitPdp = null;
+				String [] splitData = null;
+				String sDataVolume = this.getResponseString(reply);
+				splitPdp = sDataVolume.split("#GDATAVOL:");
+				if (splitPdp.length > 1) {
+					for (String pdp : splitPdp) {
+						if (pdp.trim().length() > 0) {
+							splitData = pdp.trim().split(",");
+							if (splitData.length >= 4) {
+								int pdpNo = Integer.parseInt(splitData[0]);
+								if (pdpNo == m_pdpContext) {
+									rxCnt = Integer.parseInt(splitData[3]);
+								}
+							}
+						}
+					}
+				}
+				reply = null;
+			}
+    	}
+        return rxCnt;
+    }
+
+    @Override
+    public String getServiceType() throws KuraException {
+    	String serviceType = null;
+    	synchronized (m_atLock) {
+    		s_logger.debug("sendCommand getMobileStationClass :: " + TelitHe910AtCommands.getMobileStationClass.getCommand());
+	    	byte[] reply = null;
+	    	CommConnection commAtConnection = openSerialPort(getAtPort());
+	    	if (!isAtReachable(commAtConnection)) {
+	    		closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+			try {
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.getMobileStationClass.getCommand().getBytes(), 1000, 100);
+			} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			closeSerialPort(commAtConnection);
+			if (reply != null) {
+				String sCgclass = this.getResponseString(reply);
+				if (sCgclass.startsWith("+CGCLASS:")) {
+					sCgclass = sCgclass.substring("+CGCLASS:".length()).trim();
+					if (sCgclass.equals("\"A\"")) {
+						serviceType = "UMTS";
+					} else if (sCgclass.equals("\"B\"")) {
+						serviceType = "GSM/GPRS";
+					} else if (sCgclass.equals("\"CG\"")) {
+						serviceType = "GPRS";
+					} else if (sCgclass.equals("\"CC\"")) {
+						serviceType = "GSM";
+					}
+				}
+				reply = null;
+			}
+    	}
+		
+		return serviceType;
+    }
+
+    @Override
+    public ModemDevice getModemDevice() {
+        return m_device;
+    }
+    
+    @Override
+    public String getDataPort() throws KuraException {
+    	
+    	String port = null;
+    	List <String> ports = m_device.getSerialPorts();
+    	if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null)  {
+	    			port = ports.get(usbModemInfo.getDataPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No PPP serial port available");
+	    		}
+	    	} else if (m_device instanceof SerialModemDevice) {
+	    		SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+	    		if (serialModemInfo != null) {
+	    			port = serialModemInfo.getDriver().getComm().getDataPort();
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No PPP serial port available");
+	    		}
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+    	} else {
+    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+    	}
+		
+    	return port;
+	}
+	
+    @Override
+    public String getAtPort() throws KuraException {
+		
+    	String port = null;
+    	List <String> ports = m_device.getSerialPorts();
+    	if ((ports != null) && (ports.size() > 0)) {
+	    	if (m_device instanceof UsbModemDevice) {
+	    		SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)m_device);
+	    		if (usbModemInfo != null) {
+	    			port = ports.get(usbModemInfo.getAtPort());
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No AT serial port available");
+	    		}
+	    	} else if (m_device instanceof SerialModemDevice) {
+	    		SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+	    		if (serialModemInfo != null) {
+	    			port = serialModemInfo.getDriver().getComm().getAtPort();
+	    		} else {
+	    			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No AT serial port available");
+	    		}
+	    	} else {
+	    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Unsupported modem device");
+	    	}
+    	} else {
+    		throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "No serial ports available");
+    	}
+    	
+    	return port;
+	}
+    
+    public String getGpsPort() throws KuraException {
+    	
+    	String port = null;
+    	if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion())) {
+    		port = SerialModemComm.MiniGateway.getAtPort();
+    	} else {
+    		port = getAtPort();
+    	}
+    	return port;
+    }
+    
+    public boolean isGpsSupported() throws KuraException {
+    	synchronized (m_atLock) {
+    		if (m_gpsSupported == null) {
+	    		s_logger.debug("sendCommand isGpsSupported :: " + TelitHe910AtCommands.isGpsPowered.getCommand());
+	    		byte[] reply = null;
+	    		CommConnection commAtConnection = openSerialPort(getAtPort());
+	    		if (!isAtReachable(commAtConnection)) {
+	    			closeSerialPort(commAtConnection);
+		    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+		    	}
+	    		
+				try {
+					reply = commAtConnection.sendCommand(TelitHe910AtCommands.isGpsPowered.getCommand().getBytes(), 1000, 100);
+				} catch (IOException e) {
+					closeSerialPort(commAtConnection);
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				closeSerialPort(commAtConnection);
+				if (reply != null) {
+				    String sReply = getResponseString(reply);
+				    if((sReply != null) && !sReply.isEmpty()) {
+				    	if (sReply.startsWith("$GPSP:")) {
+				    		m_gpsSupported = true;
+				    	}
+				    }
+				}
+    		}
+    	}
+    	boolean ret = false;
+    	if (m_gpsSupported != null) {
+    		ret = m_gpsSupported;
+    	}
+    	return ret;
+    }
+    
+    public void enableGps() throws KuraException {
+    	if ((m_gpsSupported == null) || (m_gpsSupported == false)) {
+    		return;
+    	}
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getGpsPort());
+    		if (!isAtReachable(commAtConnection)) {
+    			closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+   
+    		byte[] reply = null;
+    		try {
+    			if (!isGpsPowered(commAtConnection)) {
+    				s_logger.debug("sendCommand gpsPowerUp :: " + TelitHe910AtCommands.gpsPowerUp.getCommand());
+    				commAtConnection.sendCommand(TelitHe910AtCommands.gpsPowerUp.getCommand().getBytes(), 1000, 100);
+    			}
+    			
+    			s_logger.debug("sendCommand gpsEnableNMEA :: " + TelitHe910AtCommands.gpsEnableNMEA.getCommand());
+				reply = commAtConnection.sendCommand(TelitHe910AtCommands.gpsEnableNMEA.getCommand().getBytes(), 3000, 100);
+    		} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+    		closeSerialPort(commAtConnection);
+    		
+    		if (reply != null) {
+			    String sReply = getResponseString(reply);
+			    if((sReply != null) && !sReply.isEmpty()) {
+			    	if (sReply.startsWith("CONECT"))
+			    	s_logger.debug("NMEA Enabled");
+			    }
+    		}
+    	}
+    }
+    
+    public void disableGps() throws KuraException {
+    	if ((m_gpsSupported == null) || (m_gpsSupported == false)) {
+    		return;
+    	}
+    	synchronized (m_atLock) {
+    		CommConnection commAtConnection = openSerialPort(getGpsPort());
+    		if (!isAtReachable(commAtConnection)) {
+    			closeSerialPort(commAtConnection);
+	    		throw new KuraException(KuraErrorCode.NOT_CONNECTED, "Modem not available for AT commands: " + TelitHe910.class.getName());
+	    	}
+   
+    		try {
+    			if (!isGpsPowered(commAtConnection)) {
+    				s_logger.debug("sendCommand gpsDisableNMEA :: " + TelitHe910AtCommands.gpsDisableNMEA.getCommand());
+    				commAtConnection.sendCommand(TelitHe910AtCommands.gpsDisableNMEA.getCommand().getBytes(), 1000, 100);
+    				
+    				s_logger.debug("sendCommand gpsPowerDown :: " + TelitHe910AtCommands.gpsPowerDown.getCommand());
+    				commAtConnection.sendCommand(TelitHe910AtCommands.gpsPowerDown.getCommand().getBytes(), 1000, 100);
+    			}
+    		} catch (IOException e) {
+				closeSerialPort(commAtConnection);
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+    		closeSerialPort(commAtConnection);
+    	}
+    }
+    
+    @Override
+	public List<NetConfig> getConfiguration() {
+		return m_netConfigs;
+	}
+
+	@Override
+	public void setConfiguration(List<NetConfig> netConfigs) {
+		m_netConfigs = netConfigs;
+	}
+	
+	@Override
+	public ModemTechnologyType getTechnologyType() {
+		return m_technologyType;
+	}
+	
+	private boolean isGpsPowered(CommConnection commAtConnection) throws KuraException {
+    	
+    	boolean gpsPowered = false;
+    	if ((m_gpsSupported == null) || (m_gpsSupported == false)) {
+    		return false;
+    	}
+    	
+    	s_logger.debug("sendCommand isGpsPowered :: " + TelitHe910AtCommands.isGpsPowered.getCommand());
+    	byte[] reply = null;	
+		try {
+			reply = commAtConnection.sendCommand(TelitHe910AtCommands.isGpsPowered.getCommand().getBytes(), 1000, 100);
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+		if (reply != null) {
+			String sReply = getResponseString(reply);
+			if((sReply != null) && !sReply.isEmpty()) {
+				if (sReply.startsWith("$GPSP:")) {
+			    	sReply = sReply.substring("$GPSP:".length()).trim();
+			    	gpsPowered = sReply.equals("1")? true : false;
+			    }
+			}
+		}
+    	
+    	return gpsPowered;
+    }
+    
+    private CommConnection openSerialPort (String port) throws KuraException {
+    	
+    	CommConnection connection = null;
+		if(m_connectionFactory != null) {
+			String uri = new CommURI.Builder(port)
+							.withBaudRate(115200)
+							.withDataBits(8)
+							.withStopBits(1)
+							.withParity(0)
+							.withTimeout(2000)
+							.build().toString();
+				
+			try {
+				connection = (CommConnection) m_connectionFactory
+						.createConnection(uri, 1, false);
+			} catch (Exception e) {
+				s_logger.debug("Exception creating connection: " + e);
+				throw new KuraException(KuraErrorCode.CONNECTION_FAILED, e);
+			}
+		}
+		return connection;
+    }
+    
+    private void closeSerialPort (CommConnection connection) throws KuraException {
+		try {
+			connection.close();
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+    }
+    
+    private boolean isAtReachable(CommConnection connection) {
+    
+    	boolean status = false;
+    	int attemptNo = 0;
+    	do {
+			try {
+				status = (connection.sendCommand(
+						TelitHe910AtCommands.at.getCommand().getBytes(), 500).length > 0);
+			} catch (Exception e) {
+				attemptNo++;
+				sleep(2000);
+			}
+    	} while((status == false) && (attemptNo < 3));
+    	
+    	return status;	
+    }
+    
+    // Parse the AT command response for the relevant info
+ 	private String getResponseString(String resp) {
+ 	    if(resp == null) {
+ 	        return "";
+ 	    }
+ 	    
+ 	    // remove the command and space at the beginning, and the 'OK' and spaces at the end
+ 	    return resp.replaceFirst("^\\S*\\s*", "").replaceFirst("\\s*(OK)?\\s*$", "");
+ 	}
+ 	
+	private String getResponseString(byte[] resp) {
+		if (resp == null) {
+			return "";
+		}
+
+		return getResponseString(new String(resp));
+	}
+    
+    /*
+	 * This method turns modem power off
+	 */
+	private void powerOff() throws KuraException {
+		
+		if (this.m_vectorJ21GpioService != null) {
+			
+			try {
+				this.m_vectorJ21GpioService
+					.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+				sleep(1000);
+				this.toggle(2);
+				this.m_vectorJ21GpioService
+					.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_PWR_EN);
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			
+			// s_logger.info("HE910 has been powered OFF on USB port - " + m_usbDevice.getUsbPort());
+		}
+	}
+	
+	/*
+	 * This method turns modem power on
+	 */
+	private void powerOn() throws KuraException {
+
+		if (this.m_vectorJ21GpioService != null) {
+
+			try {
+				this.m_vectorJ21GpioService
+						.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+				this.m_vectorJ21GpioService
+						.j21pinTurnOn(IVectorJ21GpioService.J21PIN_CELL_PWR_EN);
+				sleep(1000);
+				this.toggle(5);
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+
+			// s_logger.info("HE910 has been powered ON on USB port - " + m_usbDevice.getUsbPort());
+		}
+	}
+	
+	/*
+	 * This method toggles J21 pin 8 (CELL_ON/OFF)
+	 */
+	private void toggle(int hold) throws KuraException {
+
+		if (this.m_vectorJ21GpioService != null) {
+			try {
+				this.m_vectorJ21GpioService
+					.j21pinTurnOn(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+				
+				sleep(hold * 1000);
+				
+				this.m_vectorJ21GpioService
+						.j21pinTurnOff(IVectorJ21GpioService.J21PIN_CELL_ON_OFF);
+			} catch (Exception e) {
+				throw new KuraException (KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+    
+    private void sleep(long millis) {
+		try {
+			Thread.sleep(millis);
+		} catch (InterruptedException e) {
+			// ignore
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910AtCommands.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910AtCommands.java
new file mode 100644
index 0000000000000000000000000000000000000000..2652eba114a7f855431bafffef90d5a046eb9f25
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910AtCommands.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+/**
+ * Defines AT commands for the Telit HE910 modem.
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public enum TelitHe910AtCommands {
+	
+	at("at\r\n"),
+	getSimStatus("at#qss?\r\n"),
+	getSimPinStatus("at+cpin?\r\n"),
+	setAutoSimDetection("at#simdet=2\r\n"),
+	simulateSimNotInserted("at#simdet=0\r\n"),
+	simulateSimInserted("at#simdet=1\r\n"),
+	getSmsc("at+csca?\r\n"),
+	getModelNumber("at+gmm\r\n"),
+    getManufacturer("at+gmi\r\n"),
+    getSerialNumber("at#cgsn\r\n"),
+    getRevision("at+gmr\r\n"),
+    getSignalStrength("at+csq\r\n"),
+    getMobileStationClass("at+cgclass?\r\n"),
+    getRegistrationStatus("at+cgreg?\r\n"),
+    getGprsSessionDataVolume("at#gdatavol=1\r\n"),
+	pdpContext("AT+CGDCONT"),
+	softReset("atz\r\n"),
+	isGpsPowered("at$GPSP?\r\n"),
+	gpsPowerUp("at$GPSP=1\r\n"),
+	gpsPowerDown("at$GPSP=0\r\n"),
+	gpsEnableNMEA("AT$GPSNMUN=3,0,0,1,1,1,1\r\n"),
+	gpsDisableNMEA("+++");
+	
+	private String m_command;
+	
+	private TelitHe910AtCommands(String atCommand) {
+		m_command = atCommand;
+	}
+	
+	public String getCommand () {
+		return m_command;
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910ConfigGenerator.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910ConfigGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..6650770c0dce0521d9ca60975854b9ee65a3d904
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910ConfigGenerator.java
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+import org.eclipse.kura.net.admin.modem.ModemPppConfigGenerator;
+import org.eclipse.kura.net.admin.modem.PppPeer;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangePair;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.ModemConfig.PdpType;
+
+public class TelitHe910ConfigGenerator implements ModemPppConfigGenerator {
+
+    @Override
+    public PppPeer getPppPeer(
+    		String deviceId,
+            ModemConfig modemConfig,
+            String logFile,
+            String connectScript,
+            String disconnectScript) {
+        
+        PppPeer pppPeer = new PppPeer();
+        
+        // default values
+        pppPeer.setBaudRate(115200);
+        pppPeer.setEnableDebug(true);
+        pppPeer.setNetworkTechnology(ModemTechnologyType.HSDPA);
+        pppPeer.setUseModemControlLines(true);
+        pppPeer.setUseRtsCtsFlowControl(false);
+        pppPeer.setLockSerialDevice(true);
+        pppPeer.setPeerMustAuthenticateItself(false);
+        pppPeer.setPeerToSupplyLocalIP(true);
+        pppPeer.setAddDefaultRoute(true);
+        pppPeer.setUsePeerDns(true);
+        pppPeer.setAllowProxyArps(false);
+        pppPeer.setAllowVanJacobsonTcpIpHdrCompression(false);
+        pppPeer.setAllowVanJacobsonConnectionIDCompression(false);
+        pppPeer.setAllowBsdCompression(false);
+        pppPeer.setAllowDeflateCompression(false);
+        pppPeer.setAllowMagic(false);
+        pppPeer.setConnect_delay(1000);
+        pppPeer.setLcp_echo_interval(0);
+
+        // other config
+        pppPeer.setLogfile(logFile);
+        pppPeer.setProvider(deviceId);
+        pppPeer.setPppUnitNumber(modemConfig.getPppNumber());
+        pppPeer.setConnectScript(connectScript);
+        pppPeer.setDisconnectScript(disconnectScript);
+        pppPeer.setApn(modemConfig.getApn());
+        pppPeer.setAuthType(modemConfig.getAuthType());
+        pppPeer.setUsername(modemConfig.getUsername());
+        pppPeer.setPassword(modemConfig.getPassword());
+        pppPeer.setDialString(modemConfig.getDialString());
+        pppPeer.setLcp_echo_interval(modemConfig.getLcpEchoInterval());
+        pppPeer.setLcp_echo_failure(modemConfig.getLcpEchoFailure());
+
+        return pppPeer;
+    }
+    
+    @Override
+    public ModemXchangeScript getConnectScript(ModemConfig modemConfig) {
+        int pdpPid = 1;
+        String apn = "";
+        String dialString = "";
+        
+        if(modemConfig != null) {
+            apn = modemConfig.getApn();
+            dialString = modemConfig.getDialString();
+        }        
+        
+        ModemXchangeScript modemXchange = new ModemXchangeScript();
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"BUSY\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"VOICE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO CARRIER\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIALTONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIAL TONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"ERROR\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"+++ath\"", "\"\""));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"AT\"", "OK"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair(this.formPDPcontext (pdpPid, PdpType.IP, apn), "OK"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"\\d\\d\\d\"", "OK"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair(this.formDialString(dialString), "\"\""));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"\\c\"", "CONNECT"));
+        
+        return modemXchange;
+    }
+
+    @Override
+    public ModemXchangeScript getDisconnectScript(ModemConfig modemConfig) {
+        
+        ModemXchangeScript modemXchange = new ModemXchangeScript();
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"BUSY\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"VOICE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO CARRIER\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIALTONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"NO DIAL TONE\"", "ABORT"));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("BREAK", "\"\""));
+        modemXchange.addmodemXchangePair(new ModemXchangePair("\"+++ATH\"", "\"\""));
+    
+        return modemXchange;
+    }
+    
+    /*
+     * This method forms dial string
+     */
+    private String formDialString(String dialString) {
+        StringBuffer buf = new StringBuffer();
+        buf.append('"');
+        if (dialString != null) {
+        	buf.append(dialString);
+        }
+        buf.append('"');
+        return buf.toString();
+    }
+    
+    /*
+     * This method forms PDP context
+     * (e.g. AT+CGDCONT=<pid>,<pdp_type>,<apn>)
+     */
+    private String formPDPcontext(int pdpPid, PdpType pdpType, String apn) {
+
+        StringBuffer pdpcontext = new StringBuffer(TelitHe910AtCommands.pdpContext.getCommand());
+        pdpcontext.append('=');
+        pdpcontext.append(pdpPid);
+        pdpcontext.append(',');
+        pdpcontext.append('"');
+        pdpcontext.append(pdpType.toString());
+        pdpcontext.append('"');
+        pdpcontext.append(',');
+        pdpcontext.append('"');
+        if (apn != null) {
+        	pdpcontext.append(apn);
+        }
+        pdpcontext.append('"');
+
+        return pdpcontext.toString();
+    }
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910ModemFactory.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910ModemFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..97d93bfb854f0e2e331944870fa9f9852a46047e
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/TelitHe910ModemFactory.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.tracker.ServiceTracker;
+
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.modem.CellularModem;
+import org.eclipse.kura.net.admin.modem.CellularModemFactory;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+
+/**
+ * Defines Telit HE910 Modem Factory
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class TelitHe910ModemFactory implements CellularModemFactory {
+	
+    //private static final Logger s_logger = LoggerFactory.getLogger(TelitHe910ModemFactory.class);
+    
+    private static TelitHe910ModemFactory s_factoryInstance = null;
+    
+	private static ModemTechnologyType s_type = ModemTechnologyType.HSDPA;
+	
+	private BundleContext s_bundleContext = null;
+	private Hashtable<String, TelitHe910> m_modemServices = null;
+	
+	private ConnectionFactory m_connectionFactory = null;
+	
+	private TelitHe910ModemFactory() {
+		s_bundleContext = FrameworkUtil.getBundle(NetworkConfigurationService.class).getBundleContext();
+		
+		ServiceTracker<ConnectionFactory, ConnectionFactory> serviceTracker = new ServiceTracker<ConnectionFactory, ConnectionFactory>(s_bundleContext, ConnectionFactory.class, null);
+		serviceTracker.open(true);
+		m_connectionFactory = serviceTracker.getService();
+		
+		m_modemServices = new Hashtable<String, TelitHe910>();
+	}
+	
+	public static TelitHe910ModemFactory getInstance() {
+	    if(s_factoryInstance == null) {
+	        s_factoryInstance = new TelitHe910ModemFactory();
+	    }
+	    return s_factoryInstance;
+	}
+
+	@Override
+	public CellularModem obtainCellularModemService(ModemDevice modemDevice, String platform) throws Exception {
+		
+		String key = modemDevice.getProductName();
+		TelitHe910 telitHe910 = m_modemServices.get(key);
+
+		if (telitHe910 == null) {
+			telitHe910 = new TelitHe910(modemDevice, m_connectionFactory, s_type);
+			
+			if ((platform != null) && platform.equals("reliagate")) {
+				// FIXME comment out for now
+				//telitHe910.bindVectorJ21GpioService(VectorGpioControl.getInstance());
+			}
+			this.m_modemServices.put(key, telitHe910);
+		}
+		
+		return telitHe910;
+	}
+
+	@Override
+	public Hashtable<String, ? extends CellularModem> getModemServices() {
+		return m_modemServices;
+	}
+
+	@Override
+	public void releaseModemService(String usbPortAddress) {
+	    m_modemServices.remove(usbPortAddress);
+	}
+
+	@Override
+	public ModemTechnologyType getType() {
+		return s_type;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/VectorGpioControl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/VectorGpioControl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a82fcc9de7ad61117e06d498ebd9c1033b6bf502
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/VectorGpioControl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Defines GPIO control for Vector board
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class VectorGpioControl implements IVectorJ21GpioService {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(VectorGpioControl.class);
+	
+	private static final int GPIOCMD_PIN_STATUS = 0;
+	private static final int GPIOCMD_PIN_OUT = 1;
+	private static final int GPIOCMD_PIN_DIRECTION = 2;
+	
+	private static VectorGpioControl s_vectorGpioControl = null;
+	
+	//private static final int [] J21Pins = {3,5,7,9,13,15,17,19,2,4,6,8,10,14,16,18,20,22};
+	
+	private ICatalystSmBusService catalystSmBusService = null;
+	
+	// Slave address for TCA8418 U47 J21
+	private static int TCA8418_ADDRESS = 0x34;
+	
+	private VectorJ21 vectorJ21 = null;
+	
+	private VectorGpioControl() {
+		this.catalystSmBusService = SmBus.getInstance();
+		
+		this.vectorJ21 = new VectorJ21();
+		
+		for (int i = 0; i < VectorJ21.getJ21pins().length; i++) {
+			try {
+				this.setPinDirection(VectorJ21.getJ21pins()[i], this.vectorJ21
+						.getPinDirection(VectorJ21.getJ21pins()[i]));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	public static VectorGpioControl getInstance() {
+		if(s_vectorGpioControl == null) {
+			s_vectorGpioControl = new VectorGpioControl();
+		}
+		return s_vectorGpioControl;
+	}
+	
+//	/**
+//	 * Binds services and allocates resources
+//	 * 
+//	 * @param catalystSmBusService - Catalyst SmBus service as {@link ICatalystSmBusService}
+//	 * @param kuraLoggerService - Kura logger service as {@link IKuraLoggerService}
+//	 */
+//	public void bind(ICatalystSmBusService catalystSmBusService,
+//			IKuraLoggerService kuraLoggerService) {
+//		
+//		this.catalystSmBusService = catalystSmBusService;
+//		this.kuraLoggerService = kuraLoggerService;
+//		
+//		this.vectorJ21 = new VectorJ21();
+//		
+//		for (int i = 0; i < VectorJ21.getJ21pins().length; i++) {
+//			try {
+//				this.setPinDirection(VectorJ21.getJ21pins()[i], this.vectorJ21
+//						.getPinDirection(VectorJ21.getJ21pins()[i]));
+//			} catch (Exception e) {
+//				e.printStackTrace();
+//			}
+//		}
+//	}
+//	
+//	/**
+//	 * Releases resources
+//	 */
+//	public void unbind () {
+//		
+//		this.vectorJ21 = null;
+//		this.catalystSmBusService = null;
+//		this.kuraLoggerService = null;
+//	}
+	
+	public synchronized int j21pinGetDirection (int j21pin) throws Exception {
+		
+		return this.getPinDirection(j21pin);
+	}
+	
+	public synchronized void j21pinSetDirection (int j21pin, int direction) throws Exception {
+		
+		this.setPinDirection(j21pin, direction);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.gpio.service.IVectorGpioService#j21pinIsOn(int)
+	 */
+	public synchronized boolean j21pinIsOn(int j21pin) throws Exception {
+
+		byte pinState = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_STATUS,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+
+		return ((pinState & (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) != 0) ? true
+				: false;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.j21.gpio.service.IVectorJ21GpioService#j21pinGetStatus(int)
+	 */
+	public synchronized String j21pinGetStatus(int j21pin) throws Exception {
+
+		byte pinState = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_STATUS,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+
+		return ((pinState & (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) != 0) ? "ON" : "OFF";
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.gpio.service.IVectorGpioService#j21pinTurnOn(int)
+	 */
+	public synchronized void j21pinTurnOn(int j21pin) throws Exception {
+
+		s_logger.debug("Turning J21 GPIO Pin " + j21pin + " ON");
+		byte pinStatus = this.getPinStatus(j21pin);
+		byte[] mask = { (byte) (pinStatus | (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) };
+		this.catalystSmBusService.write(
+				this.formSlaveWriteAddress(),
+				this.formCommandByte(GPIOCMD_PIN_OUT,
+						this.vectorJ21.getJ21PinIndex(j21pin)), mask);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.gpio.service.IVectorGpioService#j21pinTurnOff(int)
+	 */
+	public synchronized void j21pinTurnOff(int j21pin) throws Exception {
+		
+		s_logger.debug("Turning J21 GPIO Pin " + j21pin + " OFF");
+		byte pinStatus = this.getPinStatus(j21pin);
+		byte [] mask = { (byte)(pinStatus & ~(1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8))) };
+		this.catalystSmBusService.write(
+				this.formSlaveWriteAddress(),
+				this.formCommandByte(GPIOCMD_PIN_OUT,
+						this.vectorJ21.getJ21PinIndex(j21pin)), mask);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.kura.sbc.vector.j21.gpio.service.IVectorJ21GpioService#j21pinToggle(int)
+	 */
+	public void j21pinToggle(int j21pin) throws Exception {
+	
+		if (this.j21pinIsOn(j21pin)) {
+			s_logger.debug("Turning J21 GPIO Pin " + j21pin + " ON/OFF");
+			this.j21pinTurnOff(j21pin);
+		} else {
+			s_logger.debug("Turning J21 GPIO Pin " + j21pin + " OFF/ON");
+			this.j21pinTurnOn(j21pin);
+		}
+	}
+	
+	/*
+	 * This method reports status of J21 pin specified
+	 */
+	private byte getPinStatus (int j21pin) throws Exception {
+		
+		byte pinStatus = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_STATUS,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+		
+		return pinStatus;
+	}
+	
+	/*
+	 * This method set a direction of J21 pin
+	 */
+	private void setPinDirection (int j21pin, int direction) throws Exception {
+		
+		byte pinDirection = this.getPinDirection(j21pin);
+		byte [] mask = new byte [1]; 
+		switch (direction) {
+		case J21PIN_DIRECTION_IN:
+			mask [0] = (byte)(pinDirection & ~(1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8)));
+			break;
+		case J21PIN_DIRECTION_OUT:
+			mask [0] = (byte)(pinDirection | (1 << (this.vectorJ21.getJ21PinIndex(j21pin) % 8)));
+			break;
+		default:
+//			throw new J21GpioException ("Invalid PIN direction");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid PIN direction");
+		}
+		
+		this.catalystSmBusService.write(
+				this.formSlaveWriteAddress(),
+				this.formCommandByte(GPIOCMD_PIN_DIRECTION,
+						this.vectorJ21.getJ21PinIndex(j21pin)), mask);
+	}
+	
+	/*
+	 * This method reports direction of J21 pin specified
+	 */
+	private byte getPinDirection (int j21pin) throws Exception {
+		
+		byte pinDirection = this.catalystSmBusService.readByte(
+				this.formSlaveReadAddress(),
+				this.formCommandByte(GPIOCMD_PIN_DIRECTION,
+						this.vectorJ21.getJ21PinIndex(j21pin)));
+		
+		return pinDirection;
+	}
+	
+	/*
+	 * This method forms slave write address
+	 */
+	private byte formSlaveWriteAddress() {
+		
+		return (byte)(2 * TCA8418_ADDRESS);
+	}
+	
+	/*
+	 * This method forms slave read address
+	 */
+	private byte formSlaveReadAddress() {
+		
+		return (byte)(2 * TCA8418_ADDRESS + 1);
+	}
+	
+	/*
+	 * This method forms SmBus command byte based on supplied command 
+	 * type (pin status, pin output, and pin direction) and J21 pin index
+	 */
+	private byte formCommandByte (int cmdType, int j21PinInd) throws Exception {
+		
+		byte cmd = 0;
+		switch (cmdType) {
+		case GPIOCMD_PIN_STATUS:
+			cmd =  (byte)(0x14 + j21PinInd/8);
+			break;
+		case GPIOCMD_PIN_OUT:
+			cmd =  (byte)(0x17 + j21PinInd/8);
+			break;
+		case GPIOCMD_PIN_DIRECTION:
+			cmd =  (byte)(0x23 + j21PinInd/8);
+			break;
+		default:
+//			throw new J21GpioException ("Invalid GPIO PIN command");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid GPIO PIN command");
+		}
+		
+		return cmd;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/VectorJ21.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/VectorJ21.java
new file mode 100644
index 0000000000000000000000000000000000000000..f46f4c0e785256c45e0a3739d052195891d19d4b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/modem/telit/he910/VectorJ21.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.modem.telit.he910;
+
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+
+public class VectorJ21 {
+
+	private static final int [] J21Pins = {3,5,7,9,13,15,17,19,2,4,6,8,10,14,16,18,20,22};
+	
+	private int [] j21PinDirections = null;
+
+	/**
+	 * VectorJ21 constructor
+	 */
+	public VectorJ21 () {
+		
+		this.j21PinDirections = new int [J21Pins.length];
+		
+		try {
+			Properties props = new Properties();
+			InputStream is = this.getClass().getResourceAsStream(
+					"/resources/j21pin.direction.config");
+			props.load(is);
+			Enumeration keys = props.keys();
+			while (keys.hasMoreElements()) {
+				String key = (String) keys.nextElement();
+				int j21Pin = this.getJ21Pin(key);
+				int j21PinInd = this.getJ21PinIndex(j21Pin);
+				String sPinDir = props.getProperty(key);
+				if (sPinDir.compareToIgnoreCase("IN") == 0) {
+					this.j21PinDirections[j21PinInd] = IVectorJ21GpioService.J21PIN_DIRECTION_IN;
+				} else if (sPinDir.compareToIgnoreCase("OUT") == 0) {
+					this.j21PinDirections[j21PinInd] = IVectorJ21GpioService.J21PIN_DIRECTION_OUT;
+				} else {
+					this.j21PinDirections[j21PinInd] = IVectorJ21GpioService.J21PIN_DIRECTION_OUT;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			for (int i = 0; i < this.j21PinDirections.length; i++) {
+				this.j21PinDirections[i] = IVectorJ21GpioService.J21PIN_DIRECTION_OUT;
+			}
+		}
+	}
+	
+	
+	/**
+	 * Reports J21 pins array
+	 * 
+	 * @return J21 pins array as {@link int []}
+	 */
+	public static int[] getJ21pins() {
+		return J21Pins;
+	}
+
+
+
+	/**
+	 * Reports J21 pin direction
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @return J21 pin direction as {@link int}
+	 * @throws Exception
+	 */
+	public int getPinDirection (int j21pin) throws Exception {
+
+		return this.j21PinDirections[this.getJ21PinIndex(j21pin)];
+	}
+	
+	/**
+	 * Reports index of J21 pin
+	 * 
+	 * @param j21pin - J21 pin number as {@link int}
+	 * @return index of J21 pin as {@link int}
+	 * @throws Exception
+	 */
+	public int getJ21PinIndex (int j21pin) throws Exception {
+		
+		int j21PinInd = -1;
+		
+		for (int i = 0; i < J21Pins.length; i++) {
+			if (j21pin == J21Pins[i]) {
+				j21PinInd = i;
+				break;
+			}
+		}
+		if (j21PinInd == -1) {
+//			throw new J21GpioException ("Invalid J21 pin");
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid J21 pin");
+		}
+		return j21PinInd;
+	}
+	
+	/*
+	 * This method reports a value (J21 pin number) for given property name
+	 */
+	private int getJ21Pin (String propName) throws Exception {
+		
+		int ind = propName.lastIndexOf(".");
+		if (ind < 0) {
+//			throw new J21GpioException ("Invalid property name: " + propName);
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid property name: " + propName);
+		}
+		
+		try {
+			int pinNo = Integer.parseInt(propName.substring(ind+1));
+			return pinNo;
+		} catch (Exception e) {
+//			throw new J21GpioException ("Invalid property name: " + propName, e);
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Invalid property name: " + propName, e);
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/DnsMonitorServiceImpl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/DnsMonitorServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b1f12c8e4c7179253a05b92a89dbe2c20da238d
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/DnsMonitorServiceImpl.java
@@ -0,0 +1,424 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.monitor;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.linux.net.dns.LinuxDns;
+import org.eclipse.kura.linux.net.dns.LinuxNamed;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkPair;
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.event.NetworkConfigurationChangeEvent;
+import org.eclipse.kura.net.admin.event.NetworkStatusChangeEvent;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig;
+import org.eclipse.kura.net.dns.DnsMonitorService;
+import org.eclipse.kura.net.dns.DnsServerConfigIP4;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DnsMonitorServiceImpl implements DnsMonitorService, EventHandler {
+    
+    private static final Logger s_logger = LoggerFactory.getLogger(DnsMonitorServiceImpl.class);
+
+    private final static String[] EVENT_TOPICS = new String[] {
+        NetworkStatusChangeEvent.NETWORK_EVENT_STATUS_CHANGE_TOPIC,
+        NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC,
+    };
+    
+    private final static long THREAD_INTERVAL = 60000;
+    private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+    private static Future<?> s_monitorTask;
+    private ExecutorService m_executor;
+    
+    private boolean m_enabled;
+    private static boolean stopThread;
+    private NetworkConfigurationService m_netConfigService;
+    private NetworkConfiguration m_networkConfiguration;
+    private Set<NetworkPair<IP4Address>> m_allowedNetworks;
+    private Set<IP4Address> m_forwarders;
+
+    public void setNetworkConfigurationService(NetworkConfigurationService netConfigService) {
+        m_netConfigService = netConfigService;
+    }
+    
+    public void unsetNetworkConfigurationService(NetworkConfigurationService netConfigService) {
+        m_netConfigService = null;
+    }
+    
+    protected void activate(ComponentContext componentContext) {        
+        s_logger.debug("Activating DnsProxyMonitor Service...");
+
+        Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+        d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+        componentContext.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+        
+        try {
+			m_networkConfiguration = m_netConfigService.getNetworkConfiguration();
+		} catch (KuraException e) {
+			s_logger.error("Could not get initial network configuration", e);
+		}
+        
+        //FIXME - brute force handler for DNS updates
+        // m_executorUtil = ExecutorUtil.getInstance();
+        m_executor = Executors.newSingleThreadExecutor();
+        stopThread = false;
+        s_monitorTask = m_executor.submit(new Runnable() {
+    		@Override
+    		public void run() {
+    			while (!stopThread) {
+	    			Thread.currentThread().setName("DnsMonitorServiceImpl");
+	    			Set<IPAddress> dnsServers = LinuxDns.getInstance().getDnServers();
+	    			
+	    			// Check that resolv.conf matches what is configured
+	    			Set<IPAddress> configuredServers = getConfiguredDnsServers();
+	    			if(!configuredServers.equals(dnsServers)) {
+	    				setDnsServers(configuredServers);
+	    				dnsServers = configuredServers;
+	    			}
+	    			
+	    			Set<IP4Address> forwarders = new HashSet<IP4Address>();    			
+	                if(dnsServers != null && !dnsServers.isEmpty()) {
+	                	for(IPAddress dnsServer : dnsServers) {
+	                		s_logger.debug("Found DNS Server: " + dnsServer.getHostAddress());
+	                		forwarders.add((IP4Address) dnsServer);
+	                	}
+	                }
+	                
+	                if(forwarders != null && !forwarders.isEmpty()) {
+	                	if(!forwarders.equals(m_forwarders)) {
+	                		//there was a change - deal with it
+	                		s_logger.info("Detected DNS resolv.conf change - restarting DNS proxy");
+	                		m_forwarders = forwarders;
+	                		
+	                		try {
+	                            LinuxNamed linuxNamed = LinuxNamed.getInstance();
+	                            DnsServerConfigIP4 currentDnsServerConfig = linuxNamed.getDnsServerConfig();
+	                            DnsServerConfigIP4 newDnsServerConfig = new DnsServerConfigIP4(m_forwarders, m_allowedNetworks); 
+	                            
+	                            if(currentDnsServerConfig.equals(newDnsServerConfig)) {
+	                            	s_logger.debug("DNS server config has changed - updating from " + currentDnsServerConfig + " to " + newDnsServerConfig);
+		                            s_logger.debug("Disabling DNS proxy");
+		                            linuxNamed.disable();
+		                            
+		                            s_logger.debug("Writing config");
+		                            linuxNamed.setConfig(newDnsServerConfig);
+		
+		                            if(m_enabled) {
+		                                sleep(500);
+		                                s_logger.debug("Starting DNS proxy");
+		                                linuxNamed.enable();
+		                            } else {
+		                            	s_logger.debug("DNS proxy not enabled");
+		                            }
+	                            }
+	                        } catch (KuraException e) {
+	                            e.printStackTrace();
+	                        }        
+	                	}
+	                }
+	                try {
+						Thread.sleep(THREAD_INTERVAL);
+					} catch (InterruptedException e) {
+						s_logger.debug(e.getMessage());
+					}
+    			}
+    		}
+    	});
+    }
+    
+    protected void deactivate(ComponentContext componentContext) {
+    	
+    	stopThread = true;
+        if ((s_monitorTask != null) && (!s_monitorTask.isDone())) {
+        	s_logger.debug("Cancelling DnsMonitorServiceImpl task ...");
+        	s_monitorTask.cancel(true);
+    		s_logger.info("DnsMonitorServiceImpl task cancelled? = {}", s_monitorTask.isDone());
+    		s_monitorTask = null;
+        }
+            
+        if (m_executor != null) {
+        	s_logger.debug("Terminating DnsMonitorServiceImpl Thread ...");
+        	m_executor.shutdownNow();
+    		try {
+				m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("DnsMonitorServiceImpl Thread terminated? - {}", m_executor.isTerminated());
+        	m_executor = null;
+        }
+    }
+    
+    @Override
+    public void handleEvent(Event event) {
+        s_logger.debug("handleEvent - topic: " + event.getTopic());
+        String topic = event.getTopic();
+        
+        if (topic.equals(NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC)) {
+            NetworkConfigurationChangeEvent netConfigChangedEvent = (NetworkConfigurationChangeEvent)event;
+            String [] propNames = netConfigChangedEvent.getPropertyNames();
+            if ((propNames != null) && (propNames.length > 0)) {
+                Map<String, Object> props = new HashMap<String, Object>();
+                for (String propName : propNames) {
+                    Object prop = netConfigChangedEvent.getProperty(propName);
+                    if (prop != null) {
+                        props.put(propName, prop);
+                    }
+                }
+                try {
+                    m_networkConfiguration = new NetworkConfiguration(props);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        	updateDnsResolverConfig();
+        	updateDnsProxyConfig();
+        } else if (topic.equals(NetworkStatusChangeEvent.NETWORK_EVENT_STATUS_CHANGE_TOPIC)) {
+        	updateDnsResolverConfig();
+        	updateDnsProxyConfig();
+        }
+    }
+    
+    private void updateDnsResolverConfig() {
+    	s_logger.debug("Updating resolver config");
+    	setDnsServers(getConfiguredDnsServers());
+    }
+
+	private void updateDnsProxyConfig() {
+		m_enabled = false;
+
+		m_allowedNetworks = new HashSet<NetworkPair<IP4Address>>();
+		m_forwarders = new HashSet<IP4Address>();
+		        
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = m_networkConfiguration.getNetInterfaceConfigs();
+		 
+		for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+		    if (netInterfaceConfig.getType() == NetInterfaceType.ETHERNET || 
+		            netInterfaceConfig.getType() == NetInterfaceType.WIFI || 
+		            netInterfaceConfig.getType() == NetInterfaceType.MODEM) {
+		        try{
+		            getAllowedNetworks(netInterfaceConfig);
+		        } catch (KuraException e) {
+		            s_logger.error("Error updating dns proxy", e);
+		        }
+		    }
+		}
+		
+		Set<IPAddress> dnsServers = LinuxDns.getInstance().getDnServers();
+		if(dnsServers != null && !dnsServers.isEmpty()) {
+			for(IPAddress dnsServer : dnsServers) {
+				s_logger.debug("Found DNS Server: " + dnsServer.getHostAddress());
+				m_forwarders.add((IP4Address) dnsServer);
+			}
+		}
+		
+		try {
+		    LinuxNamed linuxNamed = LinuxNamed.getInstance();
+
+		    s_logger.debug("Disabling DNS proxy");
+		    linuxNamed.disable();
+		    
+		    s_logger.debug("Writing config");
+		    DnsServerConfigIP4 dnsServerConfigIP4 = new DnsServerConfigIP4(m_forwarders, m_allowedNetworks);            
+		    linuxNamed.setConfig(dnsServerConfigIP4);
+
+		    if(m_enabled) {
+		        sleep(500);
+		        s_logger.debug("Starting DNS proxy");
+		        linuxNamed.enable();
+		    } else {
+		    	s_logger.debug("DNS proxy not enabled");
+		    }
+		} catch (KuraException e) {
+		    e.printStackTrace();
+		}
+	}
+    
+    private void getAllowedNetworks(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+        
+        String interfaceName = netInterfaceConfig.getName();
+        s_logger.debug("Getting DNS proxy config for " + interfaceName);
+
+        List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = null;
+        netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+
+        if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+            for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+                List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+                if(netConfigs != null && netConfigs.size() > 0) {
+                    for(int i=0; i<netConfigs.size(); i++) {
+                        NetConfig netConfig = netConfigs.get(i);
+                        if(netConfig instanceof DhcpServerConfig) {
+                            if(((DhcpServerConfig) netConfig).isPassDns()) {
+                                s_logger.debug("Found an allowed network: " + ((DhcpServerConfig) netConfig).getRouterAddress() + "/" + ((DhcpServerConfig) netConfig).getPrefix());
+                                m_enabled = true;
+                                
+                                //this is an 'allowed network'
+                                m_allowedNetworks.add(new NetworkPair<IP4Address>((IP4Address)((DhcpServerConfig) netConfig).getRouterAddress(), ((DhcpServerConfig) netConfig).getPrefix()));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    private boolean isEnabledForWan(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) {
+    	for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceConfig.getNetInterfaceAddresses()) {
+    		for(NetConfig netConfig : netInterfaceAddressConfig.getConfigs()) {
+    			if(netConfig instanceof NetConfigIP4) {
+    				return NetInterfaceStatus.netIPv4StatusEnabledWAN.equals(((NetConfigIP4) netConfig).getStatus());
+    			}
+    		}
+    	}
+    	
+    	return false;
+    }
+    
+	private void setDnsServers(Set<IPAddress> newServers) {
+    	LinuxDns linuxDns = LinuxDns.getInstance();
+    	Set<IPAddress> currentServers = linuxDns.getDnServers();
+    	
+    	if(newServers == null || newServers.isEmpty()) {
+    		s_logger.warn("Not Setting DNS servers to empty");
+    		return;
+    	}
+    	
+    	if(currentServers != null && !currentServers.isEmpty()) {
+    		if(!currentServers.equals(newServers)) {
+    			s_logger.info("Change to DNS - setting dns servers: " + newServers);
+    			linuxDns.setDnServers(newServers);
+    		} else {
+    			s_logger.debug("No change to DNS servers - not updating");
+    		}
+    	} else {
+    		s_logger.info("Current DNS servers are null - setting dns servers: " + newServers);
+    		linuxDns.setDnServers(newServers);
+    	}
+	}
+
+    // Get a list of dns servers for all WAN interfaces
+	private Set<IPAddress> getConfiguredDnsServers() {
+		LinkedHashSet<IPAddress> serverList = new LinkedHashSet<IPAddress>();
+    	
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = m_networkConfiguration.getNetInterfaceConfigs();
+		// If there are multiple WAN interfaces, their configured DNS servers are all included in no particular order
+		for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {		
+		    if (netInterfaceConfig.getType() == NetInterfaceType.ETHERNET || 
+		            netInterfaceConfig.getType() == NetInterfaceType.WIFI || 
+		            netInterfaceConfig.getType() == NetInterfaceType.MODEM) {
+	        	if(isEnabledForWan(netInterfaceConfig)) {
+	        		try {
+	        			Set<IPAddress> servers = getConfiguredDnsServers(netInterfaceConfig);
+	        			s_logger.trace(netInterfaceConfig.getName() + " is WAN, adding its dns servers: " + servers);
+						serverList.addAll(servers);
+					} catch (KuraException e) {
+						s_logger.error("Error adding dns servers for " + netInterfaceConfig.getName(), e);
+					}
+		        }
+		    }
+		}
+		return serverList;
+	}
+
+	// Get a list of dns servers for the specified NetInterfaceConfig
+    private Set<IPAddress> getConfiguredDnsServers(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+    	String interfaceName = netInterfaceConfig.getName();
+    	s_logger.trace("Getting dns servers for " + interfaceName);
+    	LinuxDns linuxDns = LinuxDns.getInstance();
+    	LinkedHashSet<IPAddress> serverList = new LinkedHashSet<IPAddress>();
+    	
+    	for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceConfig.getNetInterfaceAddresses()) {
+    		for(NetConfig netConfig : netInterfaceAddressConfig.getConfigs()) {
+    			if(netConfig instanceof NetConfigIP4) {
+    				NetConfigIP4 netConfigIP4 = (NetConfigIP4) netConfig;
+					List<IP4Address> userServers = netConfigIP4.getDnsServers();
+    				if(netConfigIP4.isDhcp()) {
+    					// If DHCP but there are user defined entries, use those instead
+    					if(userServers != null && !userServers.isEmpty()) {
+    						s_logger.debug("Configured for DHCP with user-defined servers - adding: " + userServers);
+    						serverList.addAll(userServers);
+    					} else {
+    						if(netInterfaceConfig.getType().equals(NetInterfaceType.MODEM)) {
+    							// FIXME - don't like this
+    							// cannot use interfaceName here because it one config behind
+    							int pppNo = ((ModemInterfaceConfigImpl) netInterfaceConfig).getPppNum();
+    							if (LinuxNetworkUtil.isUp("ppp"+pppNo)) {  
+	    							List<IPAddress> servers = linuxDns.getPppDnServers();   
+	    							if (servers != null) {
+	    								s_logger.debug("Adding PPP dns servers: " + servers);
+	    								serverList.addAll(servers);
+	    							}
+    							}
+    						} else {
+    							String currentAddress = LinuxNetworkUtil.getCurrentIpAddress(interfaceName);
+    							List<IPAddress> servers = linuxDns.getDhcpDnsServers(interfaceName, currentAddress); 
+    							if (servers != null) {
+    								s_logger.debug("Configured for DHCP - adding DHCP servers: " + servers);
+    								serverList.addAll(servers);
+    							}
+    						}
+    					}    					
+    				} else {
+    					// If static, use the user defined entries
+    					s_logger.debug("Configured for static - adding user-defined servers: " + userServers);
+    					serverList.addAll(userServers);
+    				}
+    			}
+    		}
+    	}    	
+    	return serverList;
+    }
+    
+    private static void sleep(int millis) {
+        long start = System.currentTimeMillis();
+        long now = start;
+        long end = start + millis;
+        
+        while(now < end) {
+            try {
+                Thread.sleep(end - now);
+            } catch (InterruptedException e) {
+                s_logger.debug("sleep interrupted: " + e);
+            }
+            
+            now = System.currentTimeMillis();
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/EthernetMonitorServiceImpl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/EthernetMonitorServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..1cf05016a66eb5583b721becb10a232d5536e72d
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/EthernetMonitorServiceImpl.java
@@ -0,0 +1,549 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.monitor;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.EthernetInterfaceConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.linux.net.dhcp.DhcpServerManager;
+import org.eclipse.kura.linux.net.route.RouteService;
+import org.eclipse.kura.linux.net.route.RouteServiceImpl;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.EthernetMonitorService;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkAdminService;
+import org.eclipse.kura.net.NetworkPair;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.event.NetworkConfigurationChangeEvent;
+import org.eclipse.kura.net.admin.event.NetworkStatusChangeEvent;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.eclipse.kura.net.route.RouteConfig;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EthernetMonitorServiceImpl implements EthernetMonitorService, EventHandler {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(EthernetMonitorServiceImpl.class);
+	
+	private final static String[] EVENT_TOPICS = new String[] {
+        NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC,
+    };
+	
+	private final static long THREAD_INTERVAL = 30000;
+	private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+	
+	private static Map<String, Future<?>> tasks;
+	private static Map<String, Boolean> stopThreads;
+	
+	private NetworkService m_networkService;
+	private EventAdmin m_eventAdmin;
+	private NetworkAdminService m_netAdminService;
+	private NetworkConfigurationService m_netConfigService;
+	private RouteService m_routeService;
+	
+	private Map<String, InterfaceState> m_interfaceState = new HashMap<String, InterfaceState>();
+	private Map<String, EthernetInterfaceConfigImpl> m_networkConfiguration = new HashMap<String, EthernetInterfaceConfigImpl>();
+	private Map<String, EthernetInterfaceConfigImpl> m_newNetworkConfiguration = new HashMap<String, EthernetInterfaceConfigImpl>();
+	private ExecutorService m_executor;
+	
+    // ----------------------------------------------------------------
+    //
+    //   Dependencies
+    //
+    // ----------------------------------------------------------------
+	
+    public void setNetworkService(NetworkService networkService) {
+    	m_networkService = networkService;
+    }
+    
+    public void unsetNetworkService(NetworkService networkService) {
+    	m_networkService = null;
+    }
+
+    public void setEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = eventAdmin;
+    }
+
+    public void unsetEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = null;
+    }
+    
+    public void setNetworkAdminService(NetworkAdminService netAdminService) {
+    	m_netAdminService = netAdminService;
+    }
+    
+    public void unsetNetworkAdminService(NetworkAdminService netAdminService) {
+    	m_netAdminService = null;
+    }
+    
+    public void setNetworkConfigurationService(NetworkConfigurationService netConfigService) {
+    	m_netConfigService = netConfigService;
+    }
+    
+    public void unsetNetworkConfigurationService(NetworkConfigurationService netConfigService) {
+    	m_netConfigService = null;
+    }
+
+    // ----------------------------------------------------------------
+    //
+    //   Activation APIs
+    //
+    // ----------------------------------------------------------------
+
+    protected void activate(ComponentContext componentContext) {
+
+    	s_logger.debug("Activating EthernetMonitor Service...");
+    	
+    	Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+        d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+        componentContext.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+        
+        m_routeService = RouteServiceImpl.getInstance();
+        
+        m_executor = Executors.newFixedThreadPool(2);
+		
+        // Get initial configurations
+        try {
+        	NetworkConfiguration netConfiguration = m_netConfigService.getNetworkConfiguration();
+        	if (netConfiguration != null) {
+				for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig: netConfiguration.getNetInterfaceConfigs()) {
+					if (netInterfaceConfig instanceof EthernetInterfaceConfigImpl) {
+						s_logger.debug("Adding initial ethernet config for " + netInterfaceConfig.getName());
+						EthernetInterfaceConfigImpl newEthernetConfig = (EthernetInterfaceConfigImpl) netInterfaceConfig;
+						m_newNetworkConfiguration.put(netInterfaceConfig.getName(), newEthernetConfig);
+						m_networkConfiguration.put(netInterfaceConfig.getName(), newEthernetConfig);
+					}
+				}
+			}
+        } catch (KuraException e) {
+        	s_logger.error("Could not update list of interfaces", e);
+        }
+        
+        // Initialize monitors
+        initializeMonitors();
+        
+    	s_logger.debug("Done Activating EthernetMonitor Service...");
+    }
+
+    protected void deactivate(ComponentContext componentContext) {
+    	for (String key : tasks.keySet()) {
+    		stopMonitor(key);
+    	}
+    	
+    	if (m_executor != null) {
+    		s_logger.debug("Terminating EthernetMonitor Thread ...");
+    		m_executor.shutdownNow();
+    		try {
+				m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("EthernetMonitor Thread terminated? - {}", m_executor.isTerminated());
+    		m_executor = null;
+    	}
+    }
+    
+	private void monitor(String interfaceName) {
+		while (!stopThreads.get(interfaceName)) {
+			try {
+				List <? extends NetInterfaceAddressConfig> new_niacs = null;
+				List <? extends NetInterfaceAddressConfig> cur_niacs = null;
+				InterfaceState currentInterfaceState = null;
+	        	boolean interfaceEnabled = false;
+	        	boolean isDhcpClient = false;
+	        	boolean dhcpServerEnabled = false;
+	        	IPAddress dhcpServerSubnet = null;
+	        	short dhcpServerPrefix = -1;
+	        	boolean postStatusChangeEvent = false;
+	        	
+	        	EthernetInterfaceConfigImpl currentInterfaceConfig = m_networkConfiguration.get(interfaceName);
+	        	EthernetInterfaceConfigImpl newInterfaceConfig = m_newNetworkConfiguration.get(interfaceName);
+	        	
+	        	// Make sure the Ethernet Controllers are powered
+	        	if(!LinuxNetworkUtil.isEthernetControllerPowered(interfaceName)) {
+					LinuxNetworkUtil.powerOnEthernetController(interfaceName);
+				}
+	        	
+	        	// If a new configuration exists, compare it to the existing configuration
+	        	if (newInterfaceConfig != null) {
+	        		// Get all configurations for the interface
+	        		new_niacs = newInterfaceConfig.getNetInterfaceAddresses();
+	        		if (currentInterfaceConfig != null) {
+	        			cur_niacs = currentInterfaceConfig.getNetInterfaceAddresses();
+	        		}
+	        		
+	        		if (isConfigChanged(new_niacs, cur_niacs)) {
+	        			s_logger.debug("Found a new network configuration for " + interfaceName);
+		        		
+		        		// Disable the interface to be reconfigured below
+						disableInterface(interfaceName);
+	
+		        		// Set the current config to the new config
+		      			m_networkConfiguration.put(interfaceName, newInterfaceConfig);
+						currentInterfaceConfig = newInterfaceConfig;
+	
+						postStatusChangeEvent = true;
+	        		}
+	        		
+	        		m_newNetworkConfiguration.remove(interfaceName);
+	        	}
+	        		
+	        	// Monitor for status changes and ensure dhcp server is running when enabled
+	
+	    		interfaceEnabled = isEthernetEnabled(currentInterfaceConfig);
+	    		InterfaceState prevInterfaceState = m_interfaceState.get(interfaceName);
+				currentInterfaceState = new InterfaceState(interfaceName);
+				if(!currentInterfaceState.equals(prevInterfaceState)) {
+					postStatusChangeEvent = true;
+				}
+				
+				// Find if DHCP server or DHCP client mode is enabled
+	            if (currentInterfaceConfig != null) {
+	            	NetInterfaceStatus netInterfaceStatus = getStatus(currentInterfaceConfig);
+	            	
+	            	cur_niacs = currentInterfaceConfig.getNetInterfaceAddresses();
+	            	
+	            	if ((cur_niacs != null) && cur_niacs.size() > 0) {
+	        			for (NetInterfaceAddressConfig niac : cur_niacs) {
+	        				List<NetConfig> netConfigs = niac.getConfigs();
+	        				if ((netConfigs != null) && netConfigs.size() > 0) {
+	        					for (NetConfig netConfig : netConfigs) {
+	        						if (netConfig instanceof DhcpServerConfig4) {
+	        			            	// only enable if Enabled for LAN
+	        			            	if(netInterfaceStatus.equals(NetInterfaceStatus.netIPv4StatusEnabledLAN)) {
+	        			            		dhcpServerEnabled = ((DhcpServerConfig4) netConfig).isEnabled();
+	        			            		dhcpServerSubnet = ((DhcpServerConfig4) netConfig).getSubnet();
+	        			            		dhcpServerPrefix = ((DhcpServerConfig4) netConfig).getPrefix();
+	        			            	} else {
+	        			            		s_logger.trace("Not enabling DHCP server for " + interfaceName + " since it is set to " + netInterfaceStatus);
+	        			            	}
+	    	                        } else if (netConfig instanceof NetConfigIP4) {
+	        							isDhcpClient = ((NetConfigIP4) netConfig).isDhcp();
+	        						}
+	        					}
+	        				}
+	        			}
+	        		} else {
+	        			s_logger.debug("No current net interface addresses for " + interfaceName);
+	        		}
+	            } else {
+	            	s_logger.debug("Current interface config is null for " + interfaceName);
+	            }
+	            
+	            // Enable/disable based on configuration and current status
+	            if(interfaceEnabled) {
+		            if(currentInterfaceState.isUp()) {
+		            	if(!currentInterfaceState.isLinkUp()) {
+		            		s_logger.debug("link is down - disabling " + interfaceName);
+		            		disableInterface(interfaceName);
+		            	}
+		            } else {
+		            	// State is currently down
+		            	if(currentInterfaceState.isLinkUp()) {
+		            		s_logger.debug("link is up - enabling " + interfaceName);
+		            		m_netAdminService.enableInterface(interfaceName, isDhcpClient);
+		            	}
+		            }
+	            } else {
+	            	if(currentInterfaceState.isUp()) {
+	                    s_logger.debug(interfaceName + " is currently up - disable interface");
+	                    disableInterface(interfaceName);            		
+	            	}
+	            }
+	            
+	            // Get the status after all ifdowns and ifups
+	            currentInterfaceState = new InterfaceState(interfaceName);
+	
+	            // Manage the DHCP server and validate routes
+	            if (currentInterfaceState != null && currentInterfaceState.isUp() && currentInterfaceState.isLinkUp()) {
+	            	NetInterfaceStatus netInterfaceStatus = getStatus(currentInterfaceConfig);
+	            	if(netInterfaceStatus == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+	            		// This should be the default gateway - make sure it is
+	            		boolean found = false;
+	            		
+	            		RouteConfig[] routes = m_routeService.getRoutes();
+	            		if(routes != null && routes.length > 0) {
+	            			for(RouteConfig route : routes) {
+	            				if(route.getInterfaceName().equals(interfaceName) && 
+	            						route.getDestination().equals(IPAddress.parseHostAddress("0.0.0.0")) &&
+	            						!route.getGateway().equals(IPAddress.parseHostAddress("0.0.0.0"))) {
+	            					found = true;
+	            					break;
+	            				}
+	            			}
+	            		}
+	            		
+	            		if(!found) {
+	            			//disable the interface and reenable - something didn't happen at initialization as it was supposed to
+	            			s_logger.error("WAN interface " + interfaceName + " did not have a route setting it as the default gateway, restarting it");
+	            			m_netAdminService.disableInterface(interfaceName);
+	            			m_netAdminService.enableInterface(interfaceName, isDhcpClient);
+	            		}
+	            	} else if (netInterfaceStatus == NetInterfaceStatus.netIPv4StatusEnabledLAN) {
+	            		if (isDhcpClient) {
+	            			RouteService rs = RouteServiceImpl.getInstance();
+	            			RouteConfig rconf = rs.getDefaultRoute(interfaceName);
+	            			if (rconf != null) {
+	            				s_logger.debug("{} is configured for LAN/DHCP - removing GATEWAY route ...", rconf.getInterfaceName());
+	            				rs.removeStaticRoute(rconf.getDestination(), rconf.getGateway(), rconf.getNetmask(), rconf.getInterfaceName());
+	            			}
+	            		}
+	            	}
+	            	
+	            	if(dhcpServerEnabled && !DhcpServerManager.isRunning(interfaceName)) {
+	            		s_logger.debug("Starting DHCP server for " + interfaceName);
+	            		m_netAdminService.manageDhcpServer(interfaceName, true, new NetworkPair(dhcpServerSubnet, dhcpServerPrefix));
+	            	}
+				} else if(DhcpServerManager.isRunning(interfaceName)) {
+					s_logger.debug("Stopping DHCP server for " + interfaceName);
+					m_netAdminService.manageDhcpServer(interfaceName, false, null);
+				}
+	            
+	            // post event if there were any changes
+	            if(postStatusChangeEvent) {            	
+	            	s_logger.debug("Posting NetworkStatusChangeEvent for " + interfaceName + ": " + currentInterfaceState);
+					m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, currentInterfaceState, null));
+		            m_interfaceState.put(interfaceName, currentInterfaceState);
+	            }
+	
+	            // If the interface is disabled in Denali, stop the monitor
+	            if(!interfaceEnabled) {
+	            	s_logger.debug(interfaceName + " is disabled - stopping monitor");
+	                stopMonitor(interfaceName);
+	            }
+	            Thread.sleep(30000);
+			} catch (KuraException kuraException) {
+				s_logger.debug(kuraException.getMessage());
+				
+			} catch (Exception e) {
+				s_logger.debug(e.getMessage());
+			}
+		}
+	}
+	
+	// On a network config change event, verify the change was for ethernet and add a new ethernet config
+	@Override
+	public void handleEvent(Event event) {
+		String topic = event.getTopic();
+		s_logger.debug("handleEvent - topic: " + topic);
+        
+		if (topic.equals(NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC)) {
+			NetworkConfigurationChangeEvent netConfigChangedEvent = (NetworkConfigurationChangeEvent)event;
+            String [] propNames = netConfigChangedEvent.getPropertyNames();
+            if ((propNames != null) && (propNames.length > 0)) {
+                Map<String, Object> props = new HashMap<String, Object>();
+                for (String propName : propNames) {
+                    Object prop = netConfigChangedEvent.getProperty(propName);
+                    if (prop != null) {
+                        props.put(propName, prop);
+                    }
+                    else {
+                    }
+                }
+                try {
+                    NetworkConfiguration newNetworkConfig = new NetworkConfiguration(props);
+                    if (newNetworkConfig != null) {
+						for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig: newNetworkConfig.getNetInterfaceConfigs()) {
+							if (netInterfaceConfig instanceof EthernetInterfaceConfigImpl) {
+								s_logger.debug("Adding new ethernet config for " + netInterfaceConfig.getName());
+								EthernetInterfaceConfigImpl newEthernetConfig = (EthernetInterfaceConfigImpl) netInterfaceConfig;
+								m_newNetworkConfiguration.put(netInterfaceConfig.getName(), newEthernetConfig);
+								if (isEthernetEnabled(newEthernetConfig)) {
+									startMonitor(netInterfaceConfig.getName());
+								}
+							}
+						}
+					}
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+		}
+		
+	}
+	
+	// Compare configurations
+	private boolean isConfigChanged(List <? extends NetInterfaceAddressConfig> newConfig, List <? extends NetInterfaceAddressConfig> currentConfig) {
+		if(newConfig == null && currentConfig == null) {
+			return false;
+		}
+		
+		if ((newConfig == null || currentConfig == null) || (newConfig.size() != currentConfig.size())) {
+			return true;
+		}
+		
+		for (int i = 0; i < newConfig.size(); i++) {
+			List<NetConfig> newNetConfigs = newConfig.get(i).getConfigs();
+			List<NetConfig> currentNetConfigs = currentConfig.get(i).getConfigs();
+				
+			if(newNetConfigs == null && currentNetConfigs == null) {
+				continue;
+			}
+			
+			if((newNetConfigs == null || currentNetConfigs == null) || (newNetConfigs.size() != currentNetConfigs.size())) {
+				s_logger.debug("Config changed current - " + currentNetConfigs);
+				s_logger.debug("Config changed new     - " + newNetConfigs);
+				return true;
+			}
+			
+			for(int j = 0; j < newNetConfigs.size(); j++) {
+				boolean foundMatch = false;
+				NetConfig newNetConfig = newNetConfigs.get(j);
+				for(int k = 0; k < currentNetConfigs.size(); k++) {
+					NetConfig currentNetConfig = currentNetConfigs.get(k);
+					
+					if(newNetConfig.getClass() == currentNetConfig.getClass()) {
+						foundMatch = true;
+						if(!newNetConfig.equals(currentNetConfig) && newNetConfig.getClass() != FirewallNatConfig.class) {
+							s_logger.debug("\tConfig changed - Current config: " + currentNetConfig.toString());
+							s_logger.debug("\tConfig changed - New config: " + newNetConfig.toString());
+							return true;
+						}
+						break;
+					}
+				}
+				
+				if(!foundMatch) {
+					return true;
+				}
+			}
+			
+			/*
+			if (!newConfig.get(i).equals(currentConfig.get(i))) {
+				s_logger.debug("\tConfig changed - Old config: " + currentConfig.get(i).toString());
+				s_logger.debug("\tConfig changed - New config: " + newConfig.get(i).toString());
+				return true;
+			}*/
+		}
+		return false;
+	}
+	
+	// Very the interface is enabled in Denali
+	private boolean isEthernetEnabled(EthernetInterfaceConfigImpl ethernetInterfaceConfig) {
+		NetInterfaceStatus status = getStatus(ethernetInterfaceConfig);
+		
+		return status.equals(NetInterfaceStatus.netIPv4StatusEnabledLAN) || status.equals(NetInterfaceStatus.netIPv4StatusEnabledWAN);
+	}
+	
+	private NetInterfaceStatus getStatus(EthernetInterfaceConfigImpl ethernetInterfaceConfig) {
+		NetInterfaceStatus status = NetInterfaceStatus.netIPv4StatusUnknown;
+		
+		if (ethernetInterfaceConfig != null) {
+			for (NetInterfaceAddressConfig addresses : ethernetInterfaceConfig.getNetInterfaceAddresses()) {
+				for (NetConfig netConfig : addresses.getConfigs()) {
+					if (netConfig instanceof NetConfigIP4) {
+						status = ((NetConfigIP4)netConfig).getStatus();
+					}
+				}
+			}
+		}
+		
+		return status;
+	}
+	
+		// Initialize a monitor thread for each ethernet interface
+	private void initializeMonitors() {
+		 List<String> currentInterfaceNames;
+		try {
+			currentInterfaceNames = m_networkService.getAllNetworkInterfaceNames();
+			if(currentInterfaceNames != null && currentInterfaceNames.size() > 0) {
+				for (String interfaceName : currentInterfaceNames) {
+			        // skip non-ethernet interfaces
+			        if(LinuxNetworkUtil.getType(interfaceName) != NetInterfaceType.ETHERNET) {
+			            continue;
+			        }
+			        startMonitor(interfaceName);
+				}
+			         
+			}
+		} catch (KuraException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	// Start a interface specific monitor thread
+	private void startMonitor(final String interfaceName) {
+		if (tasks == null) {
+			tasks = new HashMap<String, Future<?>>();
+		}
+		if (stopThreads == null) {
+			stopThreads = new HashMap<String, Boolean>();
+		}
+		
+		stopThreads.put(interfaceName, false);
+		
+		// Ensure monitor doesn't already exist for this interface
+		if (tasks.get(interfaceName) == null) {
+			s_logger.debug("Starting monitor for " + interfaceName);
+			Future<?> task = m_executor.submit(new Runnable() {
+	    		@Override
+	    		public void run() {
+		    			Thread.currentThread().setName("EthernetMonitor_" + interfaceName);
+		    			while (!stopThreads.get(interfaceName)) {
+		    				monitor(interfaceName);
+		    				try {
+		    					Thread.sleep(THREAD_INTERVAL);
+		    				} catch (InterruptedException interruptedException) {
+		    					Thread.currentThread().interrupt();
+		    					s_logger.debug(interruptedException.getMessage());
+		    				}
+		    			}
+	    	}});
+			
+			tasks.put(interfaceName, task);
+		}
+	}
+	
+	// Stop a interface specific monitor thread
+	private void stopMonitor(String interfaceName) {
+		m_interfaceState.remove(interfaceName);
+		
+		Future<?> task = tasks.get(interfaceName);
+		if ((task != null) && (!task.isDone())) {
+			stopThreads.put(interfaceName, true);
+			s_logger.debug("Stopping monitor for {} ...", interfaceName);
+			task.cancel(true);
+			s_logger.info("Monitor for {} cancelled? = {}", interfaceName, task.isDone());
+			tasks.put(interfaceName, null);
+		}
+	}
+	
+	private void disableInterface(String interfaceName) throws Exception {
+		LinuxNetworkUtil.disableInterface(interfaceName);
+		LinuxNetworkUtil.powerOnEthernetController(interfaceName);
+		m_netAdminService.manageDhcpServer(interfaceName, false, null);
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/InterfaceState.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/InterfaceState.java
new file mode 100644
index 0000000000000000000000000000000000000000..ffd426ba02e67d9ad693d3ea2aaacc6d1f830777
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/InterfaceState.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.monitor;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.linux.net.ConnectionInfoImpl;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.ConnectionInfo;
+import org.eclipse.kura.net.IPAddress;
+
+public class InterfaceState {
+	
+	private String m_name;
+    private boolean m_up;
+    private boolean m_link;
+    private IPAddress m_ipAddress;
+
+    public InterfaceState(String interfaceName, boolean up, boolean link, IPAddress ipAddress) {
+    	m_name = interfaceName;
+        m_up = up;
+        m_link = link;
+        m_ipAddress = ipAddress;
+    }
+    
+    public InterfaceState(String interfaceName) throws KuraException {
+    	m_name = interfaceName;
+    	m_up = LinuxNetworkUtil.isUp(interfaceName);
+    	m_link = LinuxNetworkUtil.isLinkUp(interfaceName);
+    	
+    	ConnectionInfo connInfo = new ConnectionInfoImpl(interfaceName);
+    	m_ipAddress = connInfo.getIpAddress();
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((m_name != null) ? m_name.hashCode() : 0);
+        result = prime * result + (m_link ? 1231 : 1237);
+        result = prime * result + (m_up ? 1231 : 1237);
+        result = prime * result + ((m_ipAddress != null) ? m_ipAddress.hashCode() : 0);
+        return result;
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        InterfaceState other = (InterfaceState) obj;
+        if (m_name != null) {
+        	if(!m_name.equals(other.m_name)) {
+        		return false;
+        	}
+        } else if (other.m_name != null) {
+        	return false;
+        }
+        if (m_link != other.m_link)
+            return false;
+        if (m_up != other.m_up)
+            return false;
+        if (m_ipAddress != null) {
+        	if(!m_ipAddress.equals(other.m_ipAddress)) {
+        		return false;
+        	}
+        } else if (other.m_ipAddress != null) {
+        	return false;
+        }
+        
+        return true;
+    }
+
+	public String getName() {
+		return m_name;
+	}
+
+	public boolean isUp() {
+		return m_up;
+	}
+
+	public boolean isLinkUp() {
+		return m_link;
+	}
+	
+	public IPAddress getIpAddress() {
+		return m_ipAddress;
+	}
+	
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(m_name);
+		sb.append(" -- Link Up?: ");
+		sb.append(m_link);
+		sb.append(", Is Up?: ");
+		sb.append(m_up);
+		sb.append(", IP Address: ");
+		sb.append(m_ipAddress);
+		return sb.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/ModemMonitorServiceImpl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/ModemMonitorServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..777abca868e35cb87f6292037c405f7ec88af8e8
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/ModemMonitorServiceImpl.java
@@ -0,0 +1,577 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.monitor;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.linux.net.ConnectionInfoImpl;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.ConnectionInfo;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetworkAdminService;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.admin.event.NetworkConfigurationChangeEvent;
+import org.eclipse.kura.net.admin.event.NetworkStatusChangeEvent;
+import org.eclipse.kura.net.admin.modem.CellularModem;
+import org.eclipse.kura.net.admin.modem.CellularModemFactory;
+import org.eclipse.kura.net.admin.modem.EvdoCellularModem;
+import org.eclipse.kura.net.admin.modem.HspaCellularModem;
+import org.eclipse.kura.net.admin.modem.IModemLinkService;
+import org.eclipse.kura.net.admin.modem.ModemManagerService;
+import org.eclipse.kura.net.admin.modem.PppFactory;
+import org.eclipse.kura.net.admin.modem.PppState;
+import org.eclipse.kura.net.admin.modem.SupportedSerialModemsFactoryInfo;
+import org.eclipse.kura.net.admin.modem.SupportedSerialModemsFactoryInfo.SerialModemFactoryInfo;
+import org.eclipse.kura.net.admin.modem.SupportedUsbModemsFactoryInfo;
+import org.eclipse.kura.net.admin.modem.SupportedUsbModemsFactoryInfo.UsbModemFactoryInfo;
+import org.eclipse.kura.net.modem.ModemAddedEvent;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemDevice;
+import org.eclipse.kura.net.modem.ModemInterface;
+import org.eclipse.kura.net.modem.ModemMonitorListener;
+import org.eclipse.kura.net.modem.ModemMonitorService;
+import org.eclipse.kura.net.modem.ModemRemovedEvent;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.SerialModemDevice;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.usb.UsbDeviceEvent;
+import org.eclipse.kura.usb.UsbModemDevice;
+
+public class ModemMonitorServiceImpl implements ModemMonitorService, ModemManagerService, EventHandler {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(ModemMonitorServiceImpl.class);
+	
+	private ComponentContext      m_ctx;
+	private final static String[] EVENT_TOPICS = new String[] {
+			NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC,
+			ModemAddedEvent.MODEM_EVENT_ADDED_TOPIC,
+			ModemRemovedEvent.MODEM_EVENT_REMOVED_TOPIC, };
+	
+	private final static long THREAD_INTERVAL = 30000;
+	private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+	
+	private static Future<?>  task;
+	private static boolean stopThread;
+
+	private SystemService m_systemService;
+	private NetworkService m_networkService;
+	private NetworkAdminService m_networkAdminService;
+	private EventAdmin m_eventAdmin;
+	
+	private List<ModemMonitorListener>m_listeners;
+	
+	private ExecutorService m_executor;
+	
+	private Map<String, CellularModem> m_modems;
+	private Map<String, InterfaceState> m_interfaceStatuses;
+	
+	private Boolean m_gpsSupported = null;
+	
+	private boolean m_serviceActivated; 
+	    
+    public void setNetworkService(NetworkService networkService) {
+        m_networkService = networkService;
+    }
+    
+    public void unsetNetworkService(NetworkService networkService) {
+        m_networkService = null;
+    }
+
+    public void setEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = eventAdmin;
+    }
+
+    public void unsetEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = null;
+    }
+    
+    public void setNetworkAdminService(NetworkAdminService networkAdminService) {
+    	m_networkAdminService = networkAdminService;
+    }
+    
+    public void unsetNetworkAdminService(NetworkAdminService networkAdminService) {
+    	m_networkAdminService = null;
+    }
+        
+	public void setSystemService(SystemService systemService) {
+		m_systemService = systemService;
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+		m_systemService = null;
+	}
+	
+    protected void activate(ComponentContext componentContext)  {
+    	// save the bundle context
+    	m_ctx = componentContext;
+    	
+    	Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+    	d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+    	m_ctx.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+    	
+		m_modems = new HashMap<String, CellularModem>();
+		m_interfaceStatuses = new HashMap<String, InterfaceState>();
+		m_listeners = new ArrayList<ModemMonitorListener>();
+		
+		// track currently installed modems
+		try {
+			for(NetInterface<? extends NetInterfaceAddress> netInterface : m_networkService.getNetworkInterfaces()) {
+				if(netInterface instanceof ModemInterface) {
+					ModemDevice modemDevice = ((ModemInterface<?>) netInterface).getModemDevice();
+					trackModem(modemDevice);
+				}
+			}
+		} catch (Exception e) {
+			s_logger.error("Error getting installed modems", e);
+		}
+		
+		stopThread = false;
+		m_executor = Executors.newSingleThreadExecutor();
+		task = m_executor.submit(new Runnable() {
+    		@Override
+    		public void run() {
+    			while (!stopThread) {
+	    			Thread.currentThread().setName("ModemMonitor");
+	    			monitor();
+	    			try {
+						Thread.sleep(THREAD_INTERVAL);
+					} catch (InterruptedException e) {
+						s_logger.debug(e.getMessage());
+					}
+    			}
+    	}});
+		
+		m_serviceActivated = true;
+		s_logger.debug("ModemMonitor activated and ready to receive events");
+    }
+    
+    protected void deactivate(ComponentContext componentContext) {
+    	m_listeners = null;
+    	stopThread = true;
+    	PppFactory.releaseAllPppServices();
+    	if ((task != null) && (!task.isDone())) {
+    		s_logger.debug("Cancelling ModemMonitor task ...");
+    		task.cancel(true);
+    		s_logger.info("ModemMonitor task cancelled? = {}", task.isDone());
+    		task = null;
+    	}
+    	
+    	if (m_executor != null) {
+    		s_logger.debug("Terminating ModemMonitor Thread ...");
+    		m_executor.shutdownNow();
+    		try {
+				m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("ModemMonitor Thread terminated? - {}", m_executor.isTerminated());
+			m_executor = null;
+    	}
+    	m_serviceActivated = false;
+	}
+    
+    @Override
+	public void handleEvent(Event event) {
+    	s_logger.debug("handleEvent - topic: " + event.getTopic());
+        String topic = event.getTopic();
+        if (topic.equals(NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC)) {
+        	Set<String> keySet = m_modems.keySet();
+    		Iterator<String> keySetItetrator = keySet.iterator();
+    		while (keySetItetrator.hasNext()) {
+    			String usbPort = keySetItetrator.next();
+    			CellularModem modem = m_modems.get(usbPort);
+    			try {
+    				String ifaceName = null;
+	    			if (m_networkService != null) {
+	    				ifaceName = m_networkService.getModemPppPort(modem.getModemDevice());
+	    			}
+	    			if (ifaceName != null) {
+		    			List<NetConfig> oldNetConfigs = modem.getConfiguration();
+		    			List<NetConfig>newNetConfigs = m_networkAdminService.getNetworkInterfaceConfigs(ifaceName);
+		    			if ((oldNetConfigs == null) || !oldNetConfigs.equals(newNetConfigs)) {
+		    				s_logger.info("new configuration for cellular modem on usb port " + usbPort + " netinterface " + ifaceName); 
+		    				int ifaceNo = getInterfaceNumber(oldNetConfigs);
+		    				if (ifaceNo >= 0) {
+		    					IModemLinkService pppService = PppFactory.obtainPppService(ifaceNo, modem.getDataPort());
+		    					if (pppService != null) {
+		    						PppState pppState = pppService.getPppState();
+									if ((pppState == PppState.CONNECTED) || (pppState == PppState.IN_PROGRESS)) {
+										s_logger.info("disconnecting " + pppService.getIfaceName());
+										pppService.disconnect();
+									}
+									PppFactory.releasePppService(pppService.getIfaceName());
+		    					}
+		    				}
+		    				
+		    				modem.setConfiguration(newNetConfigs);
+		    				if (m_gpsSupported == null) {
+		    					boolean gpsSupported = modem.isGpsSupported();
+		    					m_gpsSupported = gpsSupported;
+		    				}
+		    				s_logger.debug("handleEvent() :: gpsSupported={}", m_gpsSupported);
+		    				if (m_gpsSupported) {
+		    					if (isGpsEnabledInConfig(newNetConfigs)) {
+		    						s_logger.debug("handleEvent() :: enabling GPS");
+		    						modem.enableGps();
+		    					} else {
+		    						s_logger.debug("handleEvent() :: disabling GPS");
+		    						modem.disableGps();
+		    					}
+		    				}
+		    				if (modem instanceof EvdoCellularModem) {
+			    				NetInterfaceStatus netIfaceStatus = getNetInterfaceStatus(newNetConfigs);
+								if (netIfaceStatus == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+									if (!((EvdoCellularModem) modem).isProvisioned()) {
+										s_logger.info("NetworkConfigurationChangeEvent :: The " + modem.getModel() + " is not provisioned, will try to provision it ...");
+										
+										if ((task != null) && !task.isCancelled()) {
+											s_logger.info("NetworkConfigurationChangeEvent :: Cancelling monitor task");
+											stopThread = true;
+											task.cancel(true);
+											task = null;
+										}
+										
+										((EvdoCellularModem) modem).provision();
+										if (task == null) {
+											s_logger.info("NetworkConfigurationChangeEvent :: Restarting monitor task");
+											stopThread = false;
+											task = m_executor.submit(new Runnable() {
+									    		@Override
+									    		public void run() {
+									    			while (!stopThread) {
+									    				Thread.currentThread().setName("ModemMonitor");
+									    				monitor();
+									    				try {
+															Thread.sleep(THREAD_INTERVAL);
+														} catch (InterruptedException e) {
+															s_logger.debug(e.getMessage());
+														}
+									    			}
+									    	}});
+										}
+									} else {
+										s_logger.info("NetworkConfigurationChangeEvent :: The " + modem.getModel() + " is provisioned");
+									}
+								}
+		    				}
+		    			}
+	    			}
+    			} catch (KuraException e) {
+    				e.printStackTrace();
+    			}
+    		}
+        } else if (topic.equals(ModemAddedEvent.MODEM_EVENT_ADDED_TOPIC)) {
+        	
+        	ModemAddedEvent modemAddedEvent = (ModemAddedEvent)event;
+        	ModemDevice modemDevice = modemAddedEvent.getModemDevice();
+        	if (m_serviceActivated) {
+        		trackModem(modemDevice);
+        	}
+        } else if (topic.equals(ModemRemovedEvent.MODEM_EVENT_REMOVED_TOPIC)) {
+        	ModemRemovedEvent modemRemovedEvent = (ModemRemovedEvent)event;
+        	String usbPort = (String)modemRemovedEvent.getProperty(UsbDeviceEvent.USB_EVENT_USB_PORT_PROPERTY);
+        	m_modems.remove(usbPort);
+        }	
+	}
+
+	
+    @Override
+	public CellularModem getModemService (String usbPort) {
+		return m_modems.get(usbPort);
+	}
+    
+	private NetInterfaceStatus getNetInterfaceStatus (List<NetConfig> netConfigs) {
+		
+		NetInterfaceStatus interfaceStatus = NetInterfaceStatus.netIPv4StatusUnknown;
+		if ((netConfigs != null) && (netConfigs.size() > 0)) {
+			for (NetConfig netConfig : netConfigs) {
+				if (netConfig instanceof NetConfigIP4) {
+					interfaceStatus = ((NetConfigIP4) netConfig).getStatus();
+					break;
+				}
+			}
+		}
+		return interfaceStatus;
+	}
+	
+	@Override
+	public void registerListener(ModemMonitorListener newListener) {
+		boolean found = false;
+		if (m_listeners == null) {
+			m_listeners = new ArrayList<ModemMonitorListener>();
+		}
+		if (m_listeners.size() > 0) {
+			for (ModemMonitorListener listener : m_listeners) {
+				if (listener.equals(newListener)) {
+					found = true;
+					break;
+				}
+			}
+		}
+		if (!found) {
+			m_listeners.add(newListener);
+		}
+	}
+	
+	@Override
+	public void unregisterListener(ModemMonitorListener listenerToUnregister) {
+		if ((m_listeners != null) && (m_listeners.size() > 0)) {
+			
+			for (int i = 0; i < m_listeners.size(); i++) {
+				if (((ModemMonitorListener)m_listeners.get(i)).equals(listenerToUnregister)) {
+					m_listeners.remove(i);
+				}
+			}
+		}
+	}
+	
+	private int getInterfaceNumber (List<NetConfig> netConfigs) {
+		int ifaceNo = -1;
+		if ((netConfigs != null) && (netConfigs.size() > 0)) {
+			for (NetConfig netConfig : netConfigs) {
+				if (netConfig instanceof ModemConfig) {
+					ifaceNo = ((ModemConfig) netConfig).getPppNumber();
+					break;
+				}
+			}
+		}
+		return ifaceNo;
+	}
+	
+	private boolean isGpsEnabledInConfig(List<NetConfig> netConfigs) {
+		boolean isGpsEnabled = false;
+		if ((netConfigs != null) && (netConfigs.size() > 0)) {
+			for (NetConfig netConfig : netConfigs) {
+				if (netConfig instanceof ModemConfig) {
+					isGpsEnabled = ((ModemConfig) netConfig).isGpsEnabled();
+					break;
+				}
+			}
+		}
+		return isGpsEnabled;
+	}
+	
+ 	private void monitor() {
+ 		HashMap<String, InterfaceState> newInterfaceStatuses = new HashMap<String, InterfaceState>();
+		Set<String> keySet = m_modems.keySet();
+		Iterator<String> keySetItetrator = keySet.iterator();
+		while (keySetItetrator.hasNext()) {
+			String usbPort = keySetItetrator.next();
+			CellularModem modem = m_modems.get(usbPort);
+			
+			// get signal strength only if somebody needs it
+			if ((m_listeners != null) && (m_listeners.size() > 0)) {
+				for (ModemMonitorListener listener : m_listeners) {
+					try {
+						int rssi = modem.getSignalStrength();
+						listener.setCellularSignalLevel(rssi);
+					} catch (KuraException e) {
+						listener.setCellularSignalLevel(0);
+						e.printStackTrace();
+					}
+				}
+			}
+			
+			NetInterfaceStatus netInterfaceStatus = getNetInterfaceStatus(modem.getConfiguration());
+			if (netInterfaceStatus == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+				try {
+					String ifaceName = m_networkService.getModemPppPort(modem.getModemDevice());
+					if (ifaceName != null) {
+						IModemLinkService pppService = PppFactory.obtainPppService(ifaceName, modem.getDataPort());
+						PppState pppState = pppService.getPppState();
+						if (pppState == PppState.NOT_CONNECTED) {
+							if (modem.getTechnologyType() == ModemTechnologyType.HSDPA) {
+								if(((HspaCellularModem)modem).isSimCardReady()) {
+									s_logger.info("!!! SIM CARD IS READY !!! connecting ...");
+									pppService.connect();
+								}
+							} else {
+								s_logger.info("connecting ...");
+								pppService.connect();
+							}
+						}
+						ConnectionInfo connInfo = new ConnectionInfoImpl(ifaceName);
+						InterfaceState interfaceState = new InterfaceState(ifaceName, 
+								LinuxNetworkUtil.isUp(ifaceName), 
+								pppState == PppState.CONNECTED, 
+								connInfo.getIpAddress());
+						newInterfaceStatuses.put(ifaceName, interfaceState);
+					}
+				} catch (KuraException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		
+		// post event for any status changes
+		checkStatusChange(m_interfaceStatuses, newInterfaceStatuses);
+		m_interfaceStatuses = newInterfaceStatuses;
+ 	}
+ 	
+    private void checkStatusChange(Map<String, InterfaceState> oldStatuses, Map<String, InterfaceState> newStatuses) {
+		
+		if (newStatuses != null) {
+	        // post NetworkStatusChangeEvent on current and new interfaces
+			for(String interfaceName : newStatuses.keySet()) {
+				if ((oldStatuses != null) && oldStatuses.containsKey(interfaceName)) {
+					if (!newStatuses.get(interfaceName).equals(oldStatuses.get(interfaceName))) {
+						s_logger.debug("Posting NetworkStatusChangeEvent on interface: " + interfaceName);
+						m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, newStatuses.get(interfaceName), null));
+					}
+				} else {
+					s_logger.debug("Posting NetworkStatusChangeEvent on enabled interface: " + interfaceName);
+					m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, newStatuses.get(interfaceName), null));
+				}
+			}
+	        
+	        // post NetworkStatusChangeEvent on interfaces that are no longer there
+	        if (oldStatuses != null) {
+	        	for(String interfaceName : oldStatuses.keySet()) {
+                    if(!newStatuses.containsKey(interfaceName)) {
+                        s_logger.debug("Posting NetworkStatusChangeEvent on disabled interface: " + interfaceName);
+                        m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, oldStatuses.get(interfaceName), null));
+                    }
+                }
+	        }
+		}
+	}
+    
+	private void trackModem(ModemDevice modemDevice) {
+		
+		Class<? extends CellularModemFactory> modemFactoryClass = null;
+		
+		if (modemDevice instanceof UsbModemDevice) {
+			SupportedUsbModemInfo supportedUsbModemInfo = SupportedUsbModemsInfo.getModem((UsbModemDevice)modemDevice);
+			UsbModemFactoryInfo usbModemFactoryInfo = SupportedUsbModemsFactoryInfo.getModem(supportedUsbModemInfo);
+			modemFactoryClass = usbModemFactoryInfo.getModemFactoryClass();
+		} else if (modemDevice instanceof SerialModemDevice) {
+			SupportedSerialModemInfo supportedSerialModemInfo = SupportedSerialModemsInfo.getModem();
+			SerialModemFactoryInfo serialModemFactoryInfo = SupportedSerialModemsFactoryInfo.getModem(supportedSerialModemInfo);
+			modemFactoryClass = serialModemFactoryInfo.getModemFactoryClass();
+		}
+		
+		if (modemFactoryClass != null) {
+			CellularModemFactory modemFactoryService = null;
+			try {
+				try {
+					Method getInstanceMethod = modemFactoryClass.getDeclaredMethod("getInstance", (Class<?>[]) null);
+					getInstanceMethod.setAccessible(true);
+					modemFactoryService = (CellularModemFactory) getInstanceMethod.invoke(null, (Object[]) null);
+				} catch (Exception e) {
+					s_logger.error("Error calling getInstance() method on " + modemFactoryClass.getName() + e);
+				}
+				
+				// if unsuccessful in calling getInstance()
+				if (modemFactoryService == null) {
+					modemFactoryService = (CellularModemFactory) modemFactoryClass.newInstance();
+				}
+				
+				String platform = null;
+				if(m_systemService != null) {
+					platform = m_systemService.getPlatform();
+				}
+				CellularModem modem = modemFactoryService.obtainCellularModemService(modemDevice, platform);
+				
+				String ifaceName = m_networkService.getModemPppPort(modemDevice);
+				List<NetConfig> netConfigs = null;
+				if (ifaceName != null) {
+					netConfigs = m_networkAdminService.getNetworkInterfaceConfigs(ifaceName);
+					if ((netConfigs != null) && (netConfigs.size() > 0)) {
+						modem.setConfiguration(netConfigs);
+					}
+				}
+				
+				if (modem instanceof EvdoCellularModem) {
+					NetInterfaceStatus netIfaceStatus = getNetInterfaceStatus(netConfigs);
+					if (netIfaceStatus == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+						if (!((EvdoCellularModem) modem).isProvisioned()) {
+							s_logger.info("trackModem() :: The " + modem.getModel() + " is not provisioned, will try to provision it ...");
+							if ((task != null) && !task.isCancelled()) {
+								s_logger.info("trackModem() :: Cancelling monitor task");
+								stopThread = true;
+								task.cancel(true);
+								task = null;
+							}
+							((EvdoCellularModem) modem).provision();
+							if (task == null) {
+								s_logger.info("trackModem() :: Restarting monitor task");
+								stopThread = false;
+								task = m_executor.submit(new Runnable() {
+						    		@Override
+						    		public void run() {
+						    			while (!stopThread) {
+						    				Thread.currentThread().setName("ModemMonitor");
+						    				monitor();
+						    			}
+						    	}});
+							}
+						} else {
+							s_logger.info("trackModem() :: The " + modem.getModel() + " is provisioned");
+						}
+					}
+				}
+				
+				if (m_gpsSupported == null) {
+					boolean gpsSupported = modem.isGpsSupported();
+					m_gpsSupported = gpsSupported;
+				}
+				s_logger.debug("trackModem() :: gpsSupported={}", m_gpsSupported);
+				if (m_gpsSupported) {
+					if (isGpsEnabledInConfig(netConfigs)) {
+						s_logger.debug("trackModem() :: enabling GPS");
+						modem.enableGps();
+					} else {
+						s_logger.debug("trackModem() :: disabling GPS");
+						modem.disableGps();
+					}
+				}
+				
+				if (modemDevice instanceof UsbModemDevice) {
+					m_modems.put(((UsbModemDevice)modemDevice).getUsbPort(), modem);
+				} else if (modemDevice instanceof SerialModemDevice) {
+					m_modems.put(modemDevice.getProductName(), modem);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/WifiMonitorServiceImpl.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/WifiMonitorServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..397a8ff7202e4a4b29557486299fa2da116842c4
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/monitor/WifiMonitorServiceImpl.java
@@ -0,0 +1,860 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.monitor;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.linux.net.route.RouteService;
+import org.eclipse.kura.linux.net.route.RouteServiceImpl;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkAdminService;
+import org.eclipse.kura.net.NetworkPair;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.net.admin.NetworkConfigurationService;
+import org.eclipse.kura.net.admin.event.NetworkConfigurationChangeEvent;
+import org.eclipse.kura.net.admin.event.NetworkStatusChangeEvent;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.eclipse.kura.net.route.RouteConfig;
+import org.eclipse.kura.net.wifi.WifiAccessPoint;
+import org.eclipse.kura.net.wifi.WifiClientMonitorListener;
+import org.eclipse.kura.net.wifi.WifiClientMonitorService;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WifiMonitorServiceImpl implements WifiClientMonitorService, EventHandler {
+	
+    private static final Logger s_logger = LoggerFactory.getLogger(WifiMonitorServiceImpl.class);
+    
+    //private static final String OS_VERSION = System.getProperty("kura.os.version");
+    
+    private final static String[] EVENT_TOPICS = new String[] {
+        NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC,
+    };
+    
+    private final static long THREAD_INTERVAL = /*30000*/10000;
+    private final static long THREAD_TERMINATION_TOUT = 1; // in seconds
+    
+    private static Future<?> monitorTask;
+    private static boolean stopThread;
+            
+    private NetworkService m_networkService;
+    private EventAdmin m_eventAdmin;
+    private NetworkAdminService m_netAdminService;
+    private NetworkConfigurationService m_netConfigService;
+    private List<WifiClientMonitorListener>m_listeners;
+    
+    private Set<String> m_enabledInterfaces;
+    private Set<String> m_disabledInterfaces;
+    private Map<String, InterfaceState> m_interfaceStatuses;
+    private ExecutorService m_executor;
+	private Object m_lock = new Object();
+	
+	private NetworkConfiguration m_currentNetworkConfiguration;
+	private NetworkConfiguration m_newNetConfiguration;
+	
+	
+    // ----------------------------------------------------------------
+    //
+    //   Dependencies
+    //
+    // ----------------------------------------------------------------
+
+    public void setNetworkService(NetworkService networkService) {
+        m_networkService = networkService;
+    }
+    
+    public void unsetNetworkService(NetworkService networkService) {
+        m_networkService = null;
+    }
+
+    public void setEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = eventAdmin;
+    }
+
+    public void unsetEventAdmin(EventAdmin eventAdmin) {
+        m_eventAdmin = null;
+    }
+    
+    public void setNetworkAdminService(NetworkAdminService netAdminService) {
+        m_netAdminService = netAdminService;
+    }
+    
+    public void unsetNetworkAdminService(NetworkAdminService netAdminService) {
+        m_netAdminService = null;
+    }
+    
+    public void setNetworkConfigurationService(NetworkConfigurationService netConfigService) {
+        m_netConfigService = netConfigService;
+    }
+    
+    public void unsetNetworkConfigurationService(NetworkConfigurationService netConfigService) {
+        m_netConfigService = null;
+    }
+    
+    // ----------------------------------------------------------------
+    //
+    //   Activation APIs
+    //
+    // ----------------------------------------------------------------
+
+    protected void activate(ComponentContext componentContext) {
+
+        s_logger.debug("Activating WifiMonitor Service...");
+
+        m_enabledInterfaces = new HashSet<String>();
+        m_disabledInterfaces = new HashSet<String>();
+        m_interfaceStatuses = new HashMap<String, InterfaceState>();
+        
+        m_executor = Executors.newSingleThreadExecutor();
+		
+        Dictionary<String, String[]> d = new Hashtable<String, String[]>();
+        d.put(EventConstants.EVENT_TOPIC, EVENT_TOPICS);
+        componentContext.getBundleContext().registerService(EventHandler.class.getName(), this, d);
+        m_listeners = new ArrayList<WifiClientMonitorListener>();
+        try {
+            m_newNetConfiguration = m_netConfigService.getNetworkConfiguration();
+            initializeMonitoredInterfaces(m_newNetConfiguration);
+        } catch (KuraException e) {
+            s_logger.error("Could not update list of interfaces", e);
+        }        
+    }
+
+    protected void deactivate(ComponentContext componentContext) {
+    	m_listeners = null;
+    	stopThread = true;
+        if ((monitorTask != null) && (!monitorTask.isDone())) {
+        	s_logger.debug("Cancelling WifiMonitor task ...");
+        	monitorTask.cancel(true);
+    		s_logger.info("WifiMonitor task cancelled? = {}", monitorTask.isDone());
+            monitorTask = null;
+        }
+        
+        if (m_executor != null) {
+        	s_logger.debug("Terminating WifiMonitor Thread ...");
+        	m_executor.shutdownNow();
+    		try {
+				m_executor.awaitTermination(THREAD_TERMINATION_TOUT, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				s_logger.warn("Interrupted", e);
+			}
+    		s_logger.info("WifiMonitor Thread terminated? - {}", m_executor.isTerminated());
+        	m_executor = null;
+        }
+    }
+    
+    private void monitor() {
+        synchronized(m_lock) {
+            try {
+                // Check to see if the configuration has changed
+            	//s_logger.debug("m_newNetConfiguration: " + m_newNetConfiguration);
+            	//s_logger.debug("m_currentNetworkConfiguration: " + m_currentNetworkConfiguration);
+            	
+                if(m_newNetConfiguration != null && !m_newNetConfiguration.equals(m_currentNetworkConfiguration)) {
+                    s_logger.debug("Found a new network configuration");
+                    List<String> interfacesToReconfigure = new ArrayList<String>();
+    
+                    interfacesToReconfigure.addAll(getReconfiguredWifiInterfaces());
+                        
+                    m_currentNetworkConfiguration = m_newNetConfiguration;
+                    
+                    // Reconfigure the interface
+                    for(String interfaceName : interfacesToReconfigure) {
+                        s_logger.debug("configuration has changed for " + interfaceName + ", disabling...");
+                        disableInterface(interfaceName);
+                    }
+                }
+                
+                // Check all interfaces configured to be enabled
+                for(String interfaceName : m_enabledInterfaces) {
+                    InterfaceState wifiState = m_interfaceStatuses.get(interfaceName);
+                    WifiInterfaceConfigImpl wifiInterfaceConfig = (WifiInterfaceConfigImpl) m_currentNetworkConfiguration.getNetInterfaceConfig(interfaceName);;                            
+                    WifiConfig wifiConfig = getWifiConfig(wifiInterfaceConfig);
+    
+                    //s_logger.debug("Evaluating: " + interfaceName + " and is currently up? " + wifiState.isUp());
+                    //s_logger.debug("Evaluating: " + interfaceName + " and is currently link up? " + wifiState.isLinkUp());
+                     
+                    if(wifiState.isUp()) {
+                        if(WifiMode.INFRA.equals(wifiConfig.getMode())) {
+                        	// get signal strength only if somebody needs it
+                        	if ((m_listeners != null) && (m_listeners.size() > 0)) {
+                        		int rssi = 0;
+                        		try {
+                        			s_logger.debug("Getting Signal Level for {} -> {}", interfaceName,wifiConfig.getSSID());
+                        			rssi = getSignalLevel(interfaceName,wifiConfig.getSSID());
+                        			s_logger.debug("Wifi RSSI is {}", rssi);
+                        		} catch (KuraException e) {
+                        			s_logger.error("Failed to get Signal Level for {} -> {}", interfaceName,wifiConfig.getSSID());
+                        			e.printStackTrace();
+                        			rssi = 0;
+                        		} 
+                        		for (WifiClientMonitorListener listener : m_listeners) {
+                        			listener.setWifiSignalLevel(rssi);
+                        		}
+                        	}
+                        	
+                        	if(!wifiState.isLinkUp()) {
+                                s_logger.debug("link is down - disabling " + interfaceName);                                
+                                disableInterface(interfaceName);
+                            }
+                            
+                        	s_logger.debug("monitor() :: pingAccessPoint()? {}", wifiConfig.pingAccessPoint());
+                        	if(wifiConfig.pingAccessPoint()) {
+	                            NetConfigIP4 netConfigIP4 = getIP4config(wifiInterfaceConfig);
+	                            if ((netConfigIP4 != null) && netConfigIP4.isDhcp()) {
+	                            	boolean isApReachable = false;
+	                            	for (int i = 0; i < 3; i++) {
+	                            		isApReachable = isAccessPointReachable(interfaceName, 1000);
+	                            		if (isApReachable) {
+	                            			break;
+	                            		}
+	                            		try {Thread.sleep(1000);} catch (InterruptedException e) {}
+	                            	}
+		                            if (!isApReachable) {
+		                            	m_netAdminService.renewDhcpLease(interfaceName);
+		                            }
+	                        	}
+                        	}
+                        	
+                        	NetConfigIP4 netConfigIP4 = getIP4config(wifiInterfaceConfig);
+                        	if(netConfigIP4.getStatus().equals(NetInterfaceStatus.netIPv4StatusEnabledLAN)) {
+                        		if (netConfigIP4.isDhcp()) {
+        	            			RouteService rs = RouteServiceImpl.getInstance();
+        	            			RouteConfig rconf = rs.getDefaultRoute(interfaceName);
+        	            			if (rconf != null) {
+        	            				s_logger.debug("{} is configured for LAN/DHCP - removing GATEWAY route ...", rconf.getInterfaceName());
+        	            				rs.removeStaticRoute(rconf.getDestination(), rconf.getGateway(), rconf.getNetmask(), rconf.getInterfaceName());
+        	            			}
+        	            		}
+                        	}
+                        }
+                        // if MASTER consider the link as 'up' - TODO: check that hostapd is running
+                    } else {
+                        // State is currently down
+                        if(WifiMode.MASTER.equals(wifiConfig.getMode())) {
+                            s_logger.debug("enable " + interfaceName + " in master mode");                            
+                            enableInterface(wifiInterfaceConfig);
+                        } else if (WifiMode.INFRA.equals(wifiConfig.getMode())) {
+                            if(isAccessPointAvailable(interfaceName, wifiConfig.getSSID())) {
+                                s_logger.debug("found access point - enable " + interfaceName + " in infra mode");                                
+                                enableInterface(wifiInterfaceConfig);
+                            } else {
+                            	s_logger.warn("{} - access point is not available", wifiConfig.getSSID());
+                            }
+                        }
+                    }
+                }
+                
+                // Check all interfaces configured to be disabled
+                for(String interfaceName : m_disabledInterfaces) {
+                    InterfaceState wifiState = m_interfaceStatuses.get(interfaceName);
+                    if(wifiState != null && wifiState.isUp()) {
+                        s_logger.debug(interfaceName + " is currently up - disable interface");
+                        disableInterface(interfaceName);
+                    }
+                }
+                
+                // Post event for any status changes
+                Map<String, InterfaceState> newStatuses = getInterfaceStatuses(m_enabledInterfaces); 
+                checkStatusChange(m_interfaceStatuses, newStatuses);
+                m_interfaceStatuses = newStatuses;
+                
+                // Shut down the monitor if no interface is enabled
+                if(m_enabledInterfaces.size() == 0) {
+                    if(monitorTask != null) {
+                        s_logger.debug("No enabled wifi interfaces - shutting down monitor thread");
+                        stopThread = true;
+                        monitorTask.cancel(true);
+                        monitorTask = null;
+                    }
+                }
+    
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+    
+    private void checkStatusChange(Map<String, InterfaceState> oldStatuses, Map<String, InterfaceState> newStatuses) {
+		
+		if (newStatuses != null) {
+	        // post NetworkStatusChangeEvent on current and new interfaces
+			Iterator<String> it = newStatuses.keySet().iterator();
+			while (it.hasNext()) {
+				String interfaceName = it.next();
+				if ((oldStatuses != null) && oldStatuses.containsKey(interfaceName)) {
+					if (!newStatuses.get(interfaceName).equals(oldStatuses.get(interfaceName))) {
+						s_logger.debug("Posting NetworkStatusChangeEvent on interface: " + interfaceName);
+						m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, newStatuses.get(interfaceName), null));
+					}
+				} else {
+					s_logger.debug("Posting NetworkStatusChangeEvent on enabled interface: " + interfaceName);
+					m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, newStatuses.get(interfaceName), null));
+				}
+			}
+	        
+	        // post NetworkStatusChangeEvent on interfaces that are no longer there
+	        if (oldStatuses != null) {
+                it = oldStatuses.keySet().iterator();
+                while (it.hasNext()) {                    
+                    String interfaceName = it.next();
+                    if(!newStatuses.containsKey(interfaceName)) {
+                        s_logger.debug("Posting NetworkStatusChangeEvent on disabled interface: " + interfaceName);
+                        m_eventAdmin.postEvent(new NetworkStatusChangeEvent(interfaceName, oldStatuses.get(interfaceName), null));
+                    }
+                }
+	        }
+		}
+	}
+    
+    @Override
+	public void registerListener(WifiClientMonitorListener newListener) {
+    	boolean found = false;
+		if (m_listeners == null) {
+			m_listeners = new ArrayList<WifiClientMonitorListener>();
+		}
+		if (m_listeners.size() > 0) {
+			for (WifiClientMonitorListener listener : m_listeners) {
+				if (listener.equals(newListener)) {
+					found = true;
+					break;
+				}
+			}
+		}
+		if (!found) {
+			m_listeners.add(newListener);
+		}
+	}
+    
+    @Override
+	public void unregisterListener(WifiClientMonitorListener listenerToUnregister) {
+    	if ((m_listeners != null) && (m_listeners.size() > 0)) {
+    		
+    		for (int i = 0; i < m_listeners.size(); i++) {
+    			if (((WifiClientMonitorListener)m_listeners.get(i)).equals(listenerToUnregister)) {
+    				m_listeners.remove(i);
+    			}
+    		}
+		}
+	}
+
+    @Override
+    public void handleEvent(Event event) {
+        s_logger.debug("handleEvent - topic: " + event.getTopic());
+        String topic = event.getTopic();
+        
+        if (topic.equals(NetworkConfigurationChangeEvent.NETWORK_EVENT_CONFIG_CHANGE_TOPIC)) {
+            NetworkConfigurationChangeEvent netConfigChangedEvent = (NetworkConfigurationChangeEvent)event;
+            String [] propNames = netConfigChangedEvent.getPropertyNames();
+            if ((propNames != null) && (propNames.length > 0)) {
+                Map<String, Object> props = new HashMap<String, Object>();
+                for (String propName : propNames) {
+                    Object prop = netConfigChangedEvent.getProperty(propName);
+                    if (prop != null) {
+                        props.put(propName, prop);
+                    }
+                }
+                try {
+                    m_newNetConfiguration = new NetworkConfiguration(props);
+                    
+                    // Initialize the monitor thread if needed
+                    if(monitorTask == null) {
+                        initializeMonitoredInterfaces(m_newNetConfiguration);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    
+    private boolean isWifiEnabled(WifiInterfaceConfigImpl wifiInterfaceConfig) {
+        WifiMode wifiMode = WifiMode.UNKNOWN;
+        NetInterfaceStatus status = NetInterfaceStatus.netIPv4StatusUnknown;
+        
+        if(wifiInterfaceConfig != null) {
+            for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceConfig.getNetInterfaceAddresses()) {
+                wifiMode = wifiInterfaceAddressConfig.getMode();
+                
+                for(NetConfig netConfig : wifiInterfaceAddressConfig.getConfigs()) {
+                    if(netConfig instanceof NetConfigIP4) {
+                        status = ((NetConfigIP4)netConfig).getStatus();
+                    }
+                }
+            }
+        } else {
+        	s_logger.debug("wifiInterfaceConfig is null");
+        }
+        
+        boolean statusEnabled = (status.equals(NetInterfaceStatus.netIPv4StatusEnabledLAN)
+                || status.equals(NetInterfaceStatus.netIPv4StatusEnabledWAN));
+        boolean wifiEnabled = (wifiMode.equals(WifiMode.INFRA) 
+                || wifiMode.equals(WifiMode.MASTER));
+
+        s_logger.debug("statusEnabled: " + statusEnabled);
+        s_logger.debug("wifiEnabled: " + wifiEnabled);
+         
+        return statusEnabled && wifiEnabled;
+    }
+    
+    private WifiConfig getWifiConfig(WifiInterfaceConfigImpl wifiInterfaceConfig) {
+        WifiConfig selectedWifiConfig = null;
+        WifiMode wifiMode = WifiMode.UNKNOWN;
+        
+        if(wifiInterfaceConfig != null) {
+            loop:
+            for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceConfig.getNetInterfaceAddresses()) {
+                wifiMode = wifiInterfaceAddressConfig.getMode();
+                
+                for(NetConfig netConfig : wifiInterfaceAddressConfig.getConfigs()) {
+                    if(netConfig instanceof WifiConfig) {
+                        WifiConfig wifiConfig = (WifiConfig)netConfig;
+                        if(wifiMode.equals(wifiConfig.getMode())) {
+                            selectedWifiConfig = wifiConfig;
+                            break loop;
+                        }
+                    }
+                }
+            }
+        }
+        return selectedWifiConfig;
+    }
+    
+    private NetConfigIP4 getIP4config(WifiInterfaceConfigImpl wifiInterfaceConfig) {
+    	
+    	NetConfigIP4 netConfigIP4 = null;
+    	if(wifiInterfaceConfig != null) {
+    		loop:
+    		for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceConfig.getNetInterfaceAddresses()) {
+    			for(NetConfig netConfig : wifiInterfaceAddressConfig.getConfigs()) {
+    				if(netConfig instanceof NetConfigIP4) {
+    					netConfigIP4 = (NetConfigIP4)netConfig;
+    					break loop;
+    				}
+    			}
+    		}
+    	}
+    	
+    	return netConfigIP4;
+    }
+    
+    private void disableInterface(String interfaceName) throws KuraException {
+        s_logger.debug("Disabling " + interfaceName);
+        m_netAdminService.disableInterface(interfaceName);
+        m_netAdminService.manageDhcpServer(interfaceName, false, null);
+    }
+    
+    private void enableInterface(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+        
+        s_logger.debug("enableInterface: " + netInterfaceConfig);
+        WifiInterfaceConfigImpl wifiInterfaceConfig = null;
+        
+        if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+            wifiInterfaceConfig = (WifiInterfaceConfigImpl) netInterfaceConfig;
+        } else {
+            return;
+        }
+        
+        String interfaceName = wifiInterfaceConfig.getName();
+        
+        WifiMode wifiMode = WifiMode.UNKNOWN;
+        NetInterfaceStatus status = NetInterfaceStatus.netIPv4StatusUnknown;
+        boolean isDhcpClient = false;
+        boolean enableDhcpServer = false;
+        IPAddress dhcpServerSubnet = null;
+        short dhcpServerPrefix = -1;
+        
+        if(wifiInterfaceConfig != null) {
+            for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceConfig.getNetInterfaceAddresses()) {
+                wifiMode = wifiInterfaceAddressConfig.getMode();
+                
+                for(NetConfig netConfig : wifiInterfaceAddressConfig.getConfigs()) {
+                    if(netConfig instanceof NetConfigIP4) {
+                        status = ((NetConfigIP4) netConfig).getStatus();
+                        isDhcpClient = ((NetConfigIP4) netConfig).isDhcp();
+                    } else if(netConfig instanceof DhcpServerConfig4) {
+                        enableDhcpServer = ((DhcpServerConfig4) netConfig).isEnabled();
+                        dhcpServerSubnet = ((DhcpServerConfig4) netConfig).getSubnet();
+                        dhcpServerPrefix = ((DhcpServerConfig4) netConfig).getPrefix();
+                    }
+                }
+            }
+        }
+
+        if(status.equals(NetInterfaceStatus.netIPv4StatusEnabledLAN)
+                || status.equals(NetInterfaceStatus.netIPv4StatusEnabledWAN)) {
+            
+            if(wifiMode.equals(WifiMode.INFRA) || wifiMode.equals(WifiMode.MASTER)) {
+                m_netAdminService.enableInterface(interfaceName, isDhcpClient);
+
+                if(enableDhcpServer) {
+                    m_netAdminService.manageDhcpServer(interfaceName, true, new NetworkPair(dhcpServerSubnet, dhcpServerPrefix));
+                }
+            }
+        }
+    }
+    
+    private void initializeMonitoredInterfaces(NetworkConfiguration networkConfiguration) throws KuraException {
+        synchronized (m_lock) {
+            m_enabledInterfaces.clear();
+            m_disabledInterfaces.clear();
+    
+            if(networkConfiguration != null) {
+                for (String interfaceName : m_networkService.getAllNetworkInterfaceNames()) {
+                    // skip non-wifi interfaces
+                    if(LinuxNetworkUtil.getType(interfaceName) != NetInterfaceType.WIFI) {
+                        continue;
+                    }
+    
+                    // ignore "mon" interface
+                    if(interfaceName.startsWith("mon")) {
+                        continue;
+                    }
+                    
+                    NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig = networkConfiguration.getNetInterfaceConfig(interfaceName);
+                    if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                        if(isWifiEnabled((WifiInterfaceConfigImpl)netInterfaceConfig)) {
+                        	s_logger.debug("Adding " + interfaceName + " to enabledInterfaces");
+                            m_enabledInterfaces.add(interfaceName);
+                        } else {
+                        	s_logger.debug("Adding " + interfaceName + " to disabledInterfaces");
+                            m_disabledInterfaces.add(interfaceName);
+                        }
+                    }
+                }
+            } else {
+            	s_logger.debug("networkConfiguration is null");
+            }
+            
+            if(m_enabledInterfaces.size() > 0) {
+                m_interfaceStatuses = getInterfaceStatuses(m_enabledInterfaces);
+                
+                if(monitorTask == null) {
+	                s_logger.debug("Starting WifiMonitor thread...");
+	                stopThread = false;
+	                monitorTask = m_executor.submit(new Runnable() {
+	                    @Override
+	                    public void run() {
+	                    	while (!stopThread) {
+	                    		Thread.currentThread().setName("WifiMonitor Thread");
+	                        	monitor();
+	                        	try {
+									Thread.sleep(THREAD_INTERVAL);
+								} catch (InterruptedException e) {
+									s_logger.debug(e.getMessage());
+								}
+	                    	}
+	                }});
+                }
+            }
+        }
+    }
+    
+    private Collection<String> getReconfiguredWifiInterfaces() throws KuraException {
+        
+    	Set<String> reconfiguredInterfaces = new HashSet<String>();
+        m_enabledInterfaces = new HashSet<String>();
+        m_disabledInterfaces = new HashSet<String>();
+        
+        for(String interfaceName : m_networkService.getAllNetworkInterfaceNames()) {
+            // skip non-wifi interfaces
+            if(LinuxNetworkUtil.getType(interfaceName) != NetInterfaceType.WIFI) {
+                continue;
+            }
+
+            // ignore "mon" interface
+            if(interfaceName.startsWith("mon")) {
+                continue;
+            }
+            
+            // Get the old wifi config
+            WifiInterfaceConfigImpl currentConfig = null;
+            if(m_currentNetworkConfiguration != null) {
+                NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig = m_currentNetworkConfiguration.getNetInterfaceConfig(interfaceName);
+                if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                	currentConfig = (WifiInterfaceConfigImpl) netInterfaceConfig;
+                }
+            }
+            
+            // Get the new wifi config
+            WifiInterfaceConfigImpl newConfig = null;
+            if(m_newNetConfiguration != null) {
+                NetInterfaceConfig<? extends NetInterfaceAddressConfig> newNetInterfaceConfig = m_newNetConfiguration.getNetInterfaceConfig(interfaceName);
+                if(newNetInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                    newConfig = (WifiInterfaceConfigImpl) newNetInterfaceConfig;
+                }
+            }
+            
+            if(newConfig != null && currentConfig != null) {
+            	List<WifiInterfaceAddressConfig> currentInterfaceAddressConfigs = currentConfig.getNetInterfaceAddresses();
+            	List<WifiInterfaceAddressConfig> newInterfaceAddressConfigs = newConfig.getNetInterfaceAddresses();
+            	
+            	if(currentInterfaceAddressConfigs == null && newInterfaceAddressConfigs == null) {
+            		//no config changed - continue
+            		continue;
+            	}
+            	
+            	if(currentInterfaceAddressConfigs == null || newInterfaceAddressConfigs == null) {
+            		reconfiguredInterfaces.add(interfaceName);
+            		continue;
+            	}
+            	
+            	// TODO: compare interfaceAddressConfigs
+            	
+            	//FIXME - assuming one InterfaceAddressConfig for now
+            	WifiInterfaceAddressConfig currentInterfaceAddressConfig = currentInterfaceAddressConfigs.get(0);
+            	WifiInterfaceAddressConfig newInterfaceAddressConfig = newInterfaceAddressConfigs.get(0);
+            	
+            	WifiMode newWifiMode = newInterfaceAddressConfig.getMode();
+            	
+            	if(currentInterfaceAddressConfig.getConfigs() == null && newInterfaceAddressConfig.getConfigs() == null) {
+            		continue;
+            	}
+            	
+            	if(currentInterfaceAddressConfig.getConfigs() == null || newInterfaceAddressConfig.getConfigs() == null) {
+            		reconfiguredInterfaces.add(interfaceName);
+            		continue;
+            	}
+            	
+            	// Remove other WifiConfigs that don't match the selected mode, for comparison purposes
+            	List<NetConfig> currentNetConfigs = new ArrayList<NetConfig>(currentInterfaceAddressConfig.getConfigs());
+            	List<NetConfig> newNetConfigs = new ArrayList<NetConfig>(newInterfaceAddressConfig.getConfigs());            	
+
+            	Iterator<NetConfig> it = currentNetConfigs.iterator();
+            	while(it.hasNext()) {
+            		NetConfig nc = it.next();
+            		if(nc instanceof WifiConfig && ((WifiConfig) nc).getMode() != newWifiMode) {
+            			s_logger.debug("removing current non-active WifiConfig for comparison: " + nc);
+						it.remove();
+        			}
+            	}
+            	
+            	it = newNetConfigs.iterator();
+            	while(it.hasNext()) {
+            		NetConfig nc = it.next();
+            		if(nc instanceof WifiConfig && ((WifiConfig) nc).getMode() != newWifiMode) {
+            			s_logger.debug("removing new non-active WifiConfig for comparison: " + nc);
+						it.remove();
+        			}
+            	}
+            	
+            	if(currentNetConfigs.size() != newNetConfigs.size()) {
+            	    s_logger.debug("\tNumber of configs changed - Old config has: " + currentNetConfigs.size());
+            	    s_logger.debug("\tNumber of configs changed - New config has: " + newNetConfigs.size());
+                    reconfiguredInterfaces.add(interfaceName);
+            	} else {
+                	for(int i = 0; i < currentNetConfigs.size(); i++) {
+                		boolean foundConfigMatch = false;
+                		NetConfig currentNetConfig = currentNetConfigs.get(i);
+                		for(int j = 0; j < newNetConfigs.size(); j++) {
+                			NetConfig newNetConfig = newNetConfigs.get(j);
+                			
+                			if(newNetConfig.getClass() == currentNetConfig.getClass()) {
+        						foundConfigMatch = true;        						
+        						
+        						//if the config is different and is not the FirewallNatConfig
+        						if(!newNetConfig.equals(currentNetConfig) && newNetConfig.getClass() != FirewallNatConfig.class) {
+        							s_logger.debug("\tConfig changed - Old config: " + currentNetConfig.toString());
+        							s_logger.debug("\tConfig changed - New config: " + newNetConfig.toString());
+        							reconfiguredInterfaces.add(interfaceName);
+        						}
+        						break;
+        					}
+                		}
+                		
+                		if(!foundConfigMatch) {
+                		    s_logger.debug("\tConfig was removed - Old config: " + currentNetConfig.toString());
+                			reconfiguredInterfaces.add(interfaceName);
+                			break;
+                		}
+                	}
+            	}
+            	
+            	/*
+                if(!newConfig.equals(currentConfig)) {
+                    s_logger.debug("Configuration for " + interfaceName + " has changed - need to reconfigure");
+                    reconfiguredInterfaces.add(interfaceName);
+                }*/
+            } else if(newConfig != null) {
+            	//only newConfig - oldConfig is null
+            	s_logger.debug("oldConfig was null, adding newConfig");
+            	reconfiguredInterfaces.add(interfaceName);
+            } else if(currentConfig != null) {
+                s_logger.debug("Configuration for " + interfaceName + " has changed");
+                reconfiguredInterfaces.add(interfaceName);
+                s_logger.debug("Removing " + interfaceName + " from list of enabled interfaces because it is not configured");
+                m_disabledInterfaces.add(interfaceName);
+            } else {
+            	s_logger.debug("old and new wifi config are null...");
+            }
+            
+            // do we need to monitor?
+            if(isWifiEnabled(newConfig)) {
+                s_logger.debug("Adding " + interfaceName + " to list of enabled interfaces");
+                m_enabledInterfaces.add(interfaceName);
+            } else {
+                s_logger.debug("Removing " + interfaceName + " from list of enabled interfaces because it is disabled");
+                m_disabledInterfaces.add(interfaceName);
+            }
+        }
+        
+        return reconfiguredInterfaces;
+    }
+    
+    private boolean isAccessPointAvailable(String interfaceName, String ssid) throws KuraException {
+        boolean available = false;
+        if(ssid != null) {
+        	//if(OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {   do not use libnl80211
+        		List<WifiAccessPoint> wifiAccessPoints = LinuxNetworkUtil.getAvailableAccessPoints(interfaceName, 3);
+                for(WifiAccessPoint wap : wifiAccessPoints) {
+                    if(ssid.equals(wap.getSSID())) {
+                    	s_logger.trace("isAccessPointAvailable() :: SSID={} is available :: strength={}", ssid, wap.getStrength());
+                        available = wap.getStrength() > 0;
+                        break;
+                    }
+                }
+            /* do not use libnl80211
+        	} else {
+	        	NL80211 nl80211 = NL80211.getInstance(interfaceName);
+	        	nl80211.setMode(WifiMode.INFRA, 3);
+	        	if (nl80211.triggerScan()) {
+	        		Map<String, WifiHotspotInfo> wifiHotspotInfoMap = nl80211.getScanResults(3, 2);
+	        		if ((wifiHotspotInfoMap != null) && (!wifiHotspotInfoMap.isEmpty())) {
+	    				Collection<WifiHotspotInfo> wifiHotspotInfoCollection = wifiHotspotInfoMap.values();
+	    				Iterator<WifiHotspotInfo> it = wifiHotspotInfoCollection.iterator();
+	    				while (it.hasNext()) {
+	    					WifiHotspotInfo wifiHotspotInfo = it.next();
+	    					s_logger.info("isAccessPointAvailable() :: looking for {} - found {} in range", ssid, wifiHotspotInfo.getSsid());
+	    					if (ssid.equals(wifiHotspotInfo.getSsid())) {
+	    						s_logger.info("isAccessPointAvailable() :: {} is available", wifiHotspotInfo.getSsid());
+	    						available = true;
+	    						break;
+	    					}
+	    				}
+	        		}
+	    	    }
+        	}
+        	*/
+        }
+        
+        return available;
+    }
+    
+    private int getSignalLevel(String interfaceName, String ssid) throws KuraException {
+		int rssi = 0;
+		if (ssid != null) {
+			//if (OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {   do not use libnl80211
+				List<WifiAccessPoint> wifiAccessPoints = LinuxNetworkUtil.getAvailableAccessPoints(interfaceName, 3);
+				for (WifiAccessPoint wap : wifiAccessPoints) {
+					if (ssid.equals(wap.getSSID())) {
+						if (wap.getStrength() > 0) {
+							rssi = 0 - wap.getStrength();
+						}
+						break;
+					}
+				}
+			/*  do not use libnl80211
+			} else {
+				NL80211 nl80211 = NL80211.getInstance(interfaceName);
+				if (nl80211.triggerScan()) {
+					Map<String, WifiHotspotInfo> wifiHotspotInfoMap = nl80211.getScanResults(3, 2);
+					if ((wifiHotspotInfoMap != null) && (!wifiHotspotInfoMap.isEmpty())) {
+						Collection<WifiHotspotInfo> wifiHotspotInfoCollection = wifiHotspotInfoMap.values();
+						Iterator<WifiHotspotInfo> it = wifiHotspotInfoCollection.iterator();
+						while (it.hasNext()) {
+							WifiHotspotInfo wifiHotspotInfo = it.next();
+							s_logger.debug("getSignalLevel() :: looking for {} - found {} in range",ssid, wifiHotspotInfo.getSsid());
+							if (ssid.equals(wifiHotspotInfo.getSsid())) {
+								s_logger.debug("getSignalLevel() :: {} is available", wifiHotspotInfo.getSsid());
+								rssi = wifiHotspotInfo.getSignalLevel();
+								break;
+							}
+						}
+					}
+				}
+			}
+			*/
+		}
+
+		return rssi;
+	}
+    
+    private boolean isAccessPointReachable(String interfaceName, int tout) throws KuraException {
+    	
+    	boolean ret = true;
+    	RouteService rs = RouteServiceImpl.getInstance();
+    	RouteConfig rconf = rs.getDefaultRoute(interfaceName);
+    	if (rconf != null) {
+    		IPAddress ipAddress = rconf.getGateway();
+    		String iface = rconf.getInterfaceName();
+    		if ((ipAddress != null) && (iface != null) && iface.equals(interfaceName)) {
+	    		try {
+					InetAddress inetAddress = InetAddress.getByName(ipAddress.getHostAddress());
+					try {
+						ret = inetAddress.isReachable(tout);
+						s_logger.info("Access point reachable? " + ret);
+					} catch (IOException e) {
+						throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+					}
+				} catch (UnknownHostException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+    		}
+    	}
+    	return ret;
+    }
+        
+    private Map<String, InterfaceState> getInterfaceStatuses(Collection<String> interfaceList) throws KuraException {
+        Map<String, InterfaceState> statuses = new HashMap<String, InterfaceState>();
+        
+        for(String interfaceName : interfaceList) {
+            statuses.put(interfaceName, new InterfaceState(interfaceName));
+        }
+        
+        return statuses;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/util/LinuxFileUtil.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/util/LinuxFileUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4954eb523f624bf678e7ee37693e2e33f49d4e0c
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/util/LinuxFileUtil.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.util;
+
+import java.io.File;
+
+import org.eclipse.kura.core.linux.util.LinuxProcessUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LinuxFileUtil {
+    
+    private static final Logger s_logger = LoggerFactory.getLogger(LinuxFileUtil.class);
+    
+    /*
+     * This method creates symbolic link, deleting existing link by default
+     */
+    public static void createSymbolicLink(String sourceFile, String targetFile)
+            throws Exception {
+        createSymbolicLink(sourceFile, targetFile, true);
+    }
+    
+    /*
+     * This method creates symbolic link
+     */
+    public static void createSymbolicLink(String sourceFile, String targetFile, boolean deleteOldLink)
+            throws Exception {
+
+        s_logger.debug("Creating symbolic link from " + targetFile + " to " + sourceFile);
+        
+        File f = new File(targetFile);
+        if (f.exists()) {
+            if (deleteOldLink) {
+                s_logger.debug("Deleting existing link");
+                f.delete();
+            }
+        }
+    
+        if (!f.exists()) {
+            StringBuffer buf = new StringBuffer("ln -s");
+            buf.append(' ');
+            buf.append(sourceFile);
+            buf.append(' ');
+            buf.append(targetFile);
+
+            int ret = LinuxProcessUtil.start(buf.toString());
+            if (ret != 0) {
+                throw new Exception("error executing command - "
+                        + buf.toString());
+            }
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/DhcpConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/DhcpConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c3d8960a08504b41c35478f799ce1486ea92107
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/DhcpConfigReader.java
@@ -0,0 +1,225 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.eclipse.kura.net.dhcp.DhcpServerConfigIP4;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DhcpConfigReader implements NetworkConfigurationVisitor {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(DhcpConfigReader.class);
+	
+	private static final String FILE_DIR = "/etc/";
+	
+	private static DhcpConfigReader s_instance;
+	
+	public static DhcpConfigReader getInstance() {
+		if (s_instance == null) {
+			s_instance = new DhcpConfigReader();
+		}
+		
+		return s_instance;
+	}
+	
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+        
+		Properties kuraExtendedProps = KuranetConfig.getProperties();
+		
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            getConfig(netInterfaceConfig, kuraExtendedProps);
+        }
+	}
+	
+	private void getConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig, Properties kuraExtendedProps) throws KuraException{
+        String interfaceName = netInterfaceConfig.getName();
+        s_logger.debug("Getting DHCP server config for " + interfaceName);
+        
+        NetInterfaceType type = netInterfaceConfig.getType(); 
+        if (type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI) {
+            StringBuffer configFilename = new StringBuffer(FILE_DIR).append("dhcpd-").append(interfaceName).append(".conf");
+            File dhcpConfigFile = new File(configFilename.toString());
+            
+            if (dhcpConfigFile.exists()) {
+                DhcpServerConfig4 dhcpServerConfig4 = populateConfig(interfaceName, dhcpConfigFile, kuraExtendedProps);
+
+                if(dhcpServerConfig4 != null) {
+            	    List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+                    
+                    if(netInterfaceAddressConfigs == null) { 
+                        throw KuraException.internalError("NetInterfaceAddress list is null for interface " + interfaceName);
+                    } else if(netInterfaceAddressConfigs.size() == 0) {
+                        throw KuraException.internalError("NetInterfaceAddress list is empty for interface " + interfaceName);
+                    }
+                    
+                    for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+                        List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+                        
+                        if(netConfigs == null) {
+                            netConfigs = new ArrayList<NetConfig>();
+                            if(netInterfaceAddressConfig instanceof NetInterfaceAddressConfigImpl) {
+                                ((NetInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                            } else if (netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+                                ((WifiInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                            }
+                        }
+                        
+                        netConfigs.add(dhcpServerConfig4);
+                    }
+                }
+            } else {
+                s_logger.debug("There is no current DHCP server configuration for " + interfaceName);
+            }
+        }
+	}
+	
+	private DhcpServerConfig4 populateConfig(String interfaceName, File dhcpConfigFile, Properties kuraExtendedProps) throws KuraException{
+        DhcpServerConfigIP4 dhcpServerConfigIP4 = null;
+	    BufferedReader br = null;
+	    
+		try {
+			boolean enabled = false;
+			IP4Address subnet = null;
+			IP4Address netmask = null;
+			IP4Address router = null;
+			int defaultLeaseTime = -1;
+			int maxLeaseTime = -1;
+			IP4Address rangeStart = null;
+			IP4Address rangeEnd = null;
+			boolean passDns = true;
+			ArrayList<IP4Address> dnsList = new ArrayList<IP4Address>();
+			
+			br = new BufferedReader(new FileReader(dhcpConfigFile));
+			
+			String line = null;
+			while((line = br.readLine()) != null) {
+				//TODO - really simple for now
+				StringTokenizer st = new StringTokenizer(line);
+				while(st.hasMoreTokens()) {
+					String token = st.nextToken();
+					if(token.equals("#")) {
+						break;
+					} else if(token.equals("subnet")) {
+						subnet = (IP4Address) IPAddress.parseHostAddress(st.nextToken());
+						if(!st.nextToken().equals("netmask")) {
+							br.close();
+							br = null;
+							throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "invalid dhcp config file: " + dhcpConfigFile.getAbsolutePath());
+						}
+						netmask = (IP4Address) IPAddress.parseHostAddress(st.nextToken());
+					} else if(token.equals("interface")) {
+						interfaceName = st.nextToken();
+						interfaceName = interfaceName.substring(0, interfaceName.indexOf(';'));
+					} else if(token.equals("ddns-update-style")) {
+						if(st.nextToken().equals("none;")) {
+							passDns = false;
+						}
+					} else if(token.equals("ddns-updates")) {
+						if(st.nextToken().equals("off;")) {
+							passDns = false;
+						}
+					} else if(token.equals("default-lease-time")) {
+						String leaseTime = st.nextToken();
+						defaultLeaseTime = Integer.parseInt(leaseTime.substring(0, leaseTime.indexOf(';')));
+					} else if(token.equals("max-lease-time")) {
+						String leaseTime = st.nextToken();
+						maxLeaseTime = Integer.parseInt(leaseTime.substring(0, leaseTime.indexOf(';')));
+					} else if(token.equals("range")) {
+						rangeStart = (IP4Address) IPAddress.parseHostAddress(st.nextToken());
+						String rangeEndString = st.nextToken();
+						rangeEndString = rangeEndString.substring(0, rangeEndString.indexOf(';'));
+						rangeEnd = (IP4Address) IPAddress.parseHostAddress(rangeEndString);
+					} else if(token.equals("option")) {
+						String option = st.nextToken();
+						if(option.equals("routers")) {
+							String routerString = st.nextToken();
+							routerString = routerString.substring(0, routerString.indexOf(';'));
+							router = (IP4Address) IPAddress.parseHostAddress(routerString);
+						} else if(option.equals("domain-name-servers")) {
+							String dnsString = st.nextToken();
+							dnsString = dnsString.substring(0, dnsString.indexOf(';'));
+							dnsList.add((IP4Address) IPAddress.parseHostAddress(dnsString));
+						}
+					}
+				}
+			}
+            br.close();
+            br = null;
+
+			StringBuilder sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.dhcpServer4.enabled");
+			if(kuraExtendedProps != null && kuraExtendedProps.getProperty(sb.toString()) != null) {
+				enabled = Boolean.parseBoolean(kuraExtendedProps.getProperty(sb.toString()));
+			} else {
+				//the file is present and the flag is not - so assume enabled is true
+				enabled = true;
+			}
+			sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.dhcpServer4.passDns");
+			if(kuraExtendedProps != null && kuraExtendedProps.getProperty(sb.toString()) != null) {
+				passDns = Boolean.parseBoolean(kuraExtendedProps.getProperty(sb.toString()));
+			} 
+			
+			short prefix = NetworkUtil.getNetmaskShortForm(netmask.getHostAddress());
+			
+			s_logger.debug("instantiating DHCP server configuration during init with " + 
+					" | interfaceName: " + interfaceName +
+					" | enabled: " + enabled +
+					" | subnet: " + subnet.getHostAddress() +
+					" | router: " + router.getHostAddress() +
+					" | netmask: " + netmask.getHostAddress() +
+					" | prefix: " + prefix +
+					" | defaultLeaseTime: " + defaultLeaseTime +
+					" | maxLeaseTime: " + maxLeaseTime +
+					" | rangeStart: " + rangeStart.getHostAddress() +
+					" | rangeEnd: " + rangeEnd.getHostAddress() +
+					" | passDns: " + passDns +
+					" | dnsList: " + dnsList.toString());
+			
+			dhcpServerConfigIP4 = new DhcpServerConfigIP4(interfaceName, enabled, subnet, router, netmask, defaultLeaseTime, maxLeaseTime,
+					prefix, rangeStart, rangeEnd, passDns, dnsList);
+			
+		} catch (FileNotFoundException e) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+		}
+        
+        return dhcpServerConfigIP4;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/DhcpConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/DhcpConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..995ebe529bb690ee0fb5662eb8847de6fe715211
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/DhcpConfigWriter.java
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.EthernetInterfaceConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.dhcp.DhcpServerConfig4;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DhcpConfigWriter implements NetworkConfigurationVisitor {
+	
+private static final Logger s_logger = LoggerFactory.getLogger(DhcpConfigWriter.class);
+	
+	private static final String FILE_DIR = "/etc/";
+	//private static final String PID_FILE_DIR = "/var/run/";
+	
+	private static DhcpConfigWriter s_instance;
+	
+	public static DhcpConfigWriter getInstance() {
+		if (s_instance == null) {
+			s_instance = new DhcpConfigWriter();
+		}
+		
+		return s_instance;
+	}
+
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+		 
+		for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+			if (netInterfaceConfig.getType() == NetInterfaceType.ETHERNET || netInterfaceConfig.getType() == NetInterfaceType.WIFI) {
+				writeConfig(netInterfaceConfig);
+				writeKuraExtendedConfig(netInterfaceConfig, KuranetConfig.getProperties());
+			}
+		}
+	}
+	
+	private void writeConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		String interfaceName = netInterfaceConfig.getName();
+		String dhcpConfigFileName = new StringBuffer().append(FILE_DIR).append("dhcpd-").append(interfaceName).append(".conf").toString();
+		String tmpDhcpConfigFileName = new StringBuffer().append(FILE_DIR).append("dhcpd-").append(interfaceName).append(".conf").append(".tmp").toString();		
+		s_logger.debug("Writing DHCP config for " + interfaceName);
+		
+		List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+		
+		if (netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+			for (NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+				List<NetConfig> netConfigs =  netInterfaceAddressConfig.getConfigs();
+				
+				if (netConfigs != null) {
+					for (NetConfig netConfig : netConfigs) {
+						if(netConfig instanceof DhcpServerConfig4) {
+							DhcpServerConfig4 dhcpServerConfig = (DhcpServerConfig4) netConfig;
+							
+							try {
+								FileOutputStream fos = new FileOutputStream(tmpDhcpConfigFileName);
+								PrintWriter pw = new PrintWriter(fos);
+								s_logger.trace("writing to " + FILE_DIR + tmpDhcpConfigFileName + " with: " + dhcpServerConfig.toString());
+								pw.print(dhcpServerConfig.toString());				
+								pw.flush();
+								fos.getFD().sync();
+								pw.close();
+								fos.close();
+								
+								//move the file if we made it this far and they are different
+								File tmpDhcpConfigFile = new File(tmpDhcpConfigFileName);
+								File dhcpConfigFile = new File(dhcpConfigFileName);
+								if(!FileUtils.contentEquals(tmpDhcpConfigFile, dhcpConfigFile)) {
+									if(tmpDhcpConfigFile.renameTo(dhcpConfigFile)) {
+										s_logger.trace("Successfully wrote DHCP config file");
+									} else {
+										s_logger.error("Failed to write DHCP config file for " + interfaceName);
+										throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration files for dhcp server: " + interfaceName);
+									}
+								} else {
+									s_logger.info("Not rewriting DHCP config file for " + interfaceName + " because it is the same");
+								}
+							} catch(Exception e) {
+								e.printStackTrace();
+								throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration files for dhcp servers: " + e.getMessage());
+							}	
+							
+						}
+					}
+				}
+			}
+		}
+		
+	}
+	
+	private void writeKuraExtendedConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig, Properties kuraExtendedProps) throws KuraException {
+		boolean enabled = false;
+		boolean passDns = false;
+		
+		List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = null;
+		if(netInterfaceConfig instanceof EthernetInterfaceConfigImpl) {
+    		netInterfaceAddressConfigs = ((EthernetInterfaceConfigImpl)netInterfaceConfig).getNetInterfaceAddresses();
+    	} else if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+    		netInterfaceAddressConfigs = ((WifiInterfaceConfigImpl)netInterfaceConfig).getNetInterfaceAddresses();
+    	} else {
+    		s_logger.error("not adding config for " + netInterfaceConfig.getName());
+    	}
+		
+		if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+    		for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+    			List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+    			if(netConfigs != null && netConfigs.size() > 0) {
+    				for(int i=0; i<netConfigs.size(); i++) {
+    					NetConfig netConfig = netConfigs.get(i);
+    					if(netConfig instanceof DhcpServerConfig4) {
+    						enabled = ((DhcpServerConfig4) netConfig).isEnabled();
+    						passDns = ((DhcpServerConfig4) netConfig).isPassDns();
+    					}
+    				}
+    			}
+    		}
+    	}
+
+    	//set it all
+    	if(kuraExtendedProps == null) {
+    		s_logger.debug("kuraExtendedProps was null");
+    		kuraExtendedProps = new Properties();
+    	}
+    	StringBuilder sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.dhcpServer4.enabled");
+    	kuraExtendedProps.put(sb.toString(), Boolean.toString(enabled));
+    	sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.dhcpServer4.passDns");
+    	kuraExtendedProps.put(sb.toString(), Boolean.toString(passDns));
+    	
+    	//write it
+    	if(kuraExtendedProps != null && !kuraExtendedProps.isEmpty()) {
+			try {
+			    KuranetConfig.storeProperties(kuraExtendedProps);
+			} catch (Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/FirewallNatConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/FirewallNatConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec9dbd0267918925bd09066517cc56a451318b7c
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/FirewallNatConfigReader.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.linux.net.iptables.LinuxFirewall;
+import org.eclipse.kura.linux.net.iptables.NATRule;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FirewallNatConfigReader implements NetworkConfigurationVisitor {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(FirewallNatConfigReader.class);
+	
+	private static FirewallNatConfigReader s_instance;
+	
+	public static FirewallNatConfigReader getInstance () {
+		
+		if (s_instance == null) {
+			s_instance = new FirewallNatConfigReader();
+		}
+		return s_instance;
+	}
+	
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+		for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            getConfig(netInterfaceConfig, KuranetConfig.getProperties());
+        }
+	}
+	
+	private void getConfig(
+			NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig,
+			Properties kuraProps) throws KuraException {
+		
+		String interfaceName = netInterfaceConfig.getName();
+		
+		NetInterfaceType type = netInterfaceConfig.getType();
+		if (type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI) {
+			s_logger.debug("Getting NAT config for " + interfaceName);
+			if(kuraProps != null) {
+				s_logger.debug("Getting NAT config from kuraProps");
+				boolean natEnabled = false;
+				boolean useMasquerade = false;
+				String prop = null;
+				String srcIface = null;
+				String dstIface = null;
+				StringBuilder sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.nat.enabled");
+				if((prop = kuraProps.getProperty(sb.toString())) != null) {
+					natEnabled = Boolean.parseBoolean(prop);
+				} 
+				
+				sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.nat.masquerade");
+				if((prop = kuraProps.getProperty(sb.toString())) != null) {
+					useMasquerade = Boolean.parseBoolean(prop);
+				} 
+				
+				sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.nat.src.interface");
+				if((prop = kuraProps.getProperty(sb.toString())) != null) {
+					srcIface = prop;
+				} 
+				
+				sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.nat.dst.interface");
+				if((prop = kuraProps.getProperty(sb.toString())) != null) {
+					dstIface = prop;
+				} 
+				
+				if (natEnabled) {
+					FirewallNatConfig natConfig = new FirewallNatConfig(srcIface, dstIface, useMasquerade);
+					
+					List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+                    
+                    if(netInterfaceAddressConfigs == null) { 
+                        throw KuraException.internalError("NetInterfaceAddress list is null for interface " + interfaceName);
+                    } else if(netInterfaceAddressConfigs.size() == 0) {
+                        throw KuraException.internalError("NetInterfaceAddress list is empty for interface " + interfaceName);
+                    }
+                    
+                    for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+                        List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+                        
+                        if(netConfigs == null) {
+                            netConfigs = new ArrayList<NetConfig>();
+                            if(netInterfaceAddressConfig instanceof NetInterfaceAddressConfigImpl) {
+                                ((NetInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                            } else if (netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+                                ((WifiInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                            }
+                        }
+                            
+                        netConfigs.add(natConfig);
+                    }
+				}
+			} else {
+				//get it from the firewall file if possible
+				LinuxFirewall firewall = LinuxFirewall.getInstance();
+				Set<NATRule> natRules = firewall.getNatRules();
+				if(natRules != null && !natRules.isEmpty()) {
+					Iterator<NATRule> it = natRules.iterator();
+					while(it.hasNext()) {
+						NATRule rule = it.next();
+						if(rule.getSourceInterface().equals(interfaceName)) {
+							s_logger.debug("found NAT rule: " + rule);
+							
+							//this is the one we care about
+							FirewallNatConfig natConfig = new FirewallNatConfig(rule.getSourceInterface(), rule.getDestinationInterface(), rule.isMasquerade());
+							
+							List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+		                    
+		                    if(netInterfaceAddressConfigs == null) { 
+		                        throw KuraException.internalError("NetInterfaceAddress list is null for interface " + interfaceName);
+		                    } else if(netInterfaceAddressConfigs.size() == 0) {
+		                        throw KuraException.internalError("NetInterfaceAddress list is empty for interface " + interfaceName);
+		                    }
+		                    
+		                    for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+		                        List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+		                        
+		                        if(netConfigs == null) {
+		                            netConfigs = new ArrayList<NetConfig>();
+		                            if(netInterfaceAddressConfig instanceof NetInterfaceAddressConfigImpl) {
+		                                ((NetInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+		                            } else if (netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+		                                ((WifiInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+		                            }
+		                        }
+		                            
+		                        netConfigs.add(natConfig);
+		                    }
+						}
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/FirewallNatConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/FirewallNatConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..4178fae074f258366dcf5457ecdcd9cf2ade3507
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/FirewallNatConfigWriter.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.linux.net.iptables.LinuxFirewall;
+import org.eclipse.kura.linux.net.iptables.NATRule;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.eclipse.kura.net.firewall.FirewallReverseNatConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FirewallNatConfigWriter implements NetworkConfigurationVisitor {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(FirewallNatConfigWriter.class);
+
+	private static FirewallNatConfigWriter s_instance;
+	
+	public static FirewallNatConfigWriter getInstance() {
+		
+		if (s_instance == null) {
+			s_instance = new FirewallNatConfigWriter();
+		}
+		return s_instance;
+	}
+	
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+			
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+		 
+		for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+			if (netInterfaceConfig.getType() == NetInterfaceType.ETHERNET || netInterfaceConfig.getType() == NetInterfaceType.WIFI) {
+				writeConfig(netInterfaceConfig, KuranetConfig.getProperties());
+			}
+		}
+		
+		applyNatConfig(config);
+	}
+	
+	private void writeConfig(
+			NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig,
+			Properties kuraProps) throws KuraException {
+		
+		String interfaceName = netInterfaceConfig.getName();
+		s_logger.debug("Writing NAT config for " + interfaceName);
+
+		List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = null;
+		netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+		
+		boolean natEnabled = false;
+		boolean useMasquerade = false;
+		String srcIface = null;
+		String dstIface = null;
+		if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+    		for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+    			List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+    			if(netConfigs != null && netConfigs.size() > 0) {
+    				for(int i=0; i<netConfigs.size(); i++) {
+    					NetConfig netConfig = netConfigs.get(i);
+    					if(netConfig instanceof FirewallNatConfig) {
+    						natEnabled = true;
+    						srcIface = ((FirewallNatConfig) netConfig).getSourceInterface();
+    						dstIface = ((FirewallNatConfig) netConfig).getDestinationInterface();
+    						useMasquerade = ((FirewallNatConfig) netConfig).isMasquerade();
+    					}
+    				}
+    			}
+    		}
+    	}
+		
+		//set it all
+    	if(kuraProps == null) {
+    		s_logger.debug("kuraExtendedProps was null");
+    		kuraProps = new Properties();
+    	}
+    	
+    	StringBuilder sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.nat.enabled");
+    	kuraProps.put(sb.toString(), Boolean.toString(natEnabled));
+    	if (natEnabled && (srcIface != null) && (dstIface != null)) {
+    		sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.nat.dst.interface");
+        	kuraProps.put(sb.toString(), dstIface);
+        	
+        	sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.nat.masquerade");
+        	kuraProps.put(sb.toString(), Boolean.toString(useMasquerade));
+    	}
+    	
+    	//write it
+    	if(kuraProps != null && !kuraProps.isEmpty()) {
+			try {
+			    KuranetConfig.storeProperties(kuraProps);
+			} catch (Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+	
+	private void applyNatConfig(NetworkConfiguration networkConfig) throws KuraException {
+        LinuxFirewall firewall = LinuxFirewall.getInstance();
+        firewall.replaceAllNatRules(getNatConfigs(networkConfig)); 
+        firewall.enable();
+	}
+	
+    private LinkedHashSet<NATRule> getNatConfigs(NetworkConfiguration networkConfig) {
+        LinkedHashSet<NATRule> natConfigs = new LinkedHashSet<NATRule>();
+
+        if(networkConfig != null) {
+            ArrayList<String> wanList = new ArrayList<String>();
+            ArrayList<String> natList = new ArrayList<String>();
+           
+            // get relevant interfaces
+            for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : networkConfig.getNetInterfaceConfigs()) {
+                String interfaceName = netInterfaceConfig.getName();
+                NetInterfaceStatus status = NetInterfaceStatus.netIPv4StatusUnknown;
+                boolean isNat = false;
+                
+                for(NetInterfaceAddressConfig addressConfig : netInterfaceConfig.getNetInterfaceAddresses()) {
+                    for(NetConfig netConfig : addressConfig.getConfigs()) {
+                        if(netConfig instanceof NetConfigIP4) {
+                            status = ((NetConfigIP4)netConfig).getStatus();
+                        } else if(netConfig instanceof FirewallNatConfig) {
+                        	s_logger.debug("getNatConfigs() :: FirewallNatConfig: {}", ((FirewallNatConfig)netConfig).toString());
+                            isNat = true;
+                        } else if (netConfig instanceof FirewallReverseNatConfig) {
+                        	s_logger.debug("getNatConfigs() ::  FirewallReverseNatConfig: {}", ((FirewallReverseNatConfig)netConfig).toString());
+                        }
+                    }
+                }
+                
+                if(NetInterfaceStatus.netIPv4StatusEnabledWAN.equals(status)) {
+                    wanList.add(interfaceName);
+                } else if(NetInterfaceStatus.netIPv4StatusEnabledLAN.equals(status) && isNat) {
+                    natList.add(interfaceName);
+                }
+            }
+            
+            // create a nat rule for each interface to all potential wan interfaces       
+            for(String sourceInterface : natList) {
+                for(String destinationInterface : wanList) {
+                    s_logger.debug("Got NAT rule for source: " + sourceInterface +", destination: " + destinationInterface);
+                    natConfigs.add(new NATRule(sourceInterface, destinationInterface, true));
+                }
+            }
+        }
+        
+        return natConfigs;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/HostapdConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/HostapdConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..8af8687fb93199ba496898fefbccda29b453e131
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/HostapdConfigReader.java
@@ -0,0 +1,201 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class HostapdConfigReader implements NetworkConfigurationVisitor {
+
+    private static final Logger s_logger = LoggerFactory.getLogger(HostapdConfigReader.class);
+    
+    private static final String HOSTAPD_CONFIG_FILE = "/etc/hostapd.conf";
+
+    private static HostapdConfigReader s_instance;
+    
+    public static HostapdConfigReader getInstance() {
+        if(s_instance == null) {
+            s_instance = new HostapdConfigReader();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                getConfig((WifiInterfaceConfigImpl)netInterfaceConfig);
+            }
+        }
+    }
+    
+    private void getConfig(WifiInterfaceConfigImpl wifiInterfaceConfig) throws KuraException {
+        String interfaceName = wifiInterfaceConfig.getName();
+        s_logger.debug("Getting hostapd config for " + interfaceName);
+        
+        List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = wifiInterfaceConfig.getNetInterfaceAddresses();
+        
+        if(wifiInterfaceAddressConfigs == null || wifiInterfaceAddressConfigs.size() == 0) { 
+            wifiInterfaceAddressConfigs = new ArrayList<WifiInterfaceAddressConfig>();
+            wifiInterfaceAddressConfigs.add(new WifiInterfaceAddressConfigImpl());
+            wifiInterfaceConfig.setNetInterfaceAddresses(wifiInterfaceAddressConfigs);
+        }
+        
+        for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceAddressConfigs) {
+            if(wifiInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+                List<NetConfig> netConfigs = wifiInterfaceAddressConfig.getConfigs();
+                
+                if(netConfigs == null) {
+                    netConfigs = new ArrayList<NetConfig>();
+                    ((WifiInterfaceAddressConfigImpl)wifiInterfaceAddressConfig).setNetConfigs(netConfigs);
+                }
+                
+            	netConfigs.add(getWifiHostConfig(interfaceName));
+            }
+        }
+    }
+    
+    private static WifiConfig getWifiHostConfig(String ifaceName) throws KuraException {
+        
+        try {
+        	WifiConfig wifiConfig = new WifiConfig();
+            wifiConfig.setMode(WifiMode.MASTER);
+
+            File configFile = new File(HOSTAPD_CONFIG_FILE);
+            Properties hostapdProps = new Properties();
+            
+            s_logger.debug("parsing hostapd config file: " + configFile.getAbsolutePath());
+            if(configFile.exists()) {
+                hostapdProps.load(new FileInputStream(configFile));
+
+                // remove any quotes around the values
+                Enumeration<Object> keys = hostapdProps.keys();
+                while(keys.hasMoreElements()) {
+                    String key = keys.nextElement().toString();
+                    String val = hostapdProps.getProperty(key);
+                    if(val.startsWith("\"") && val.endsWith("\"") && val.length() > 1) {
+                        hostapdProps.setProperty(key, val.substring(1, val.length()-1));
+                    }
+                }
+                
+                String iface = hostapdProps.getProperty("interface");
+                
+                if(ifaceName != null && ifaceName.equals(iface)) {
+                    String driver = hostapdProps.getProperty("driver");
+                    String essid = hostapdProps.getProperty("ssid");
+                    int channel = Integer.parseInt(hostapdProps.getProperty("channel"));
+                    
+                    // Determine radio mode
+                    WifiRadioMode wifiRadioMode = null;
+                    String hwModeStr = hostapdProps.getProperty("hw_mode");
+                    if("a".equals(hwModeStr)) {
+                        wifiRadioMode = WifiRadioMode.RADIO_MODE_80211a;
+                    } else if("b".equals(hwModeStr)) {
+                        wifiRadioMode = WifiRadioMode.RADIO_MODE_80211b;
+                    } else if("g".equals(hwModeStr)) {
+                        wifiRadioMode = WifiRadioMode.RADIO_MODE_80211g;
+                        if("1".equals(hostapdProps.getProperty("ieee80211n"))) {
+                            wifiRadioMode = WifiRadioMode.RADIO_MODE_80211nHT20;
+                            String ht_capab = hostapdProps.getProperty("ht_capab");
+                            if(ht_capab != null) {
+                                if(ht_capab.contains("HT40+")) {
+                                    wifiRadioMode = WifiRadioMode.RADIO_MODE_80211nHT40above;
+                                } else if(ht_capab.contains("HT40-")) {
+                                    wifiRadioMode = WifiRadioMode.RADIO_MODE_80211nHT40below;
+                                }
+                            }
+                        }
+                    } else {
+                        throw KuraException.internalError("malformatted config file, unexpected hw_mode: " + configFile.getAbsolutePath());
+                    }
+                    
+                    // Determine security and pass
+                    WifiSecurity security = WifiSecurity.SECURITY_NONE;
+                    String password = "";         
+                    
+                    if(hostapdProps.containsKey("wpa")) {
+                        if("1".equals(hostapdProps.getProperty("wpa"))) {
+                            security = WifiSecurity.SECURITY_WPA;
+                        } else if("2".equals(hostapdProps.getProperty("wpa"))) {
+                            security = WifiSecurity.SECURITY_WPA2;
+                        } else {
+                            throw KuraException.internalError("malformatted config file: " + configFile.getAbsolutePath());
+                        }
+                        
+                        if(hostapdProps.containsKey("wpa_passphrase")) {
+                            password = hostapdProps.getProperty("wpa_passphrase");
+                        } else if(hostapdProps.containsKey("wpa_psk")) {
+                            password = hostapdProps.getProperty("wpa_psk");
+                        } else {
+                            throw KuraException.internalError("malformatted config file, no wpa passphrase: " + configFile.getAbsolutePath());
+                        }
+                    } else if(hostapdProps.containsKey("wep_key0")) {
+                        security = WifiSecurity.SECURITY_WEP;
+                        password = hostapdProps.getProperty("wep_key0");
+                    }
+                    
+    
+                    // Populate the config
+                    wifiConfig.setSSID(essid);
+                    wifiConfig.setDriver(driver);
+                    wifiConfig.setChannels(new int[]{channel});
+                    wifiConfig.setPasskey(password);
+                    wifiConfig.setBroadcast(true);      // TODO: always true?  is this needed?
+                    wifiConfig.setSecurity(security);
+                    wifiConfig.setRadioMode(wifiRadioMode);
+                    
+                    // hw mode
+                    if(wifiRadioMode == WifiRadioMode.RADIO_MODE_80211b) {
+                        wifiConfig.setHardwareMode("b");
+                    } else if(wifiRadioMode == WifiRadioMode.RADIO_MODE_80211g) {
+                        wifiConfig.setHardwareMode("g");
+                    } else if(wifiRadioMode == WifiRadioMode.RADIO_MODE_80211nHT20 ||
+                            wifiRadioMode == WifiRadioMode.RADIO_MODE_80211nHT40above ||
+                            wifiRadioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+                        
+                        // TODO: specify these 'n' modes separately?
+                        wifiConfig.setHardwareMode("n");
+                    }
+                }
+            }
+            
+            return wifiConfig;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw KuraException.internalError(e);
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/HostapdConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/HostapdConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..d63c3805b90c9ace6ca93f9175c29bfc110c561d
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/HostapdConfigWriter.java
@@ -0,0 +1,528 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.wifi.Hostapd;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HostapdConfigWriter implements NetworkConfigurationVisitor {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(HostapdConfigWriter.class);
+	
+	private static final String HEXES = "0123456789ABCDEF";
+	
+	private static final String HOSTAPD_CONFIG_FILE = "/etc/hostapd.conf";
+	
+	private static final String HOSTAPD_TMP_CONFIG_FILE = "/etc/hostapd.conf.tmp";
+	
+	private static HostapdConfigWriter s_instance;
+	
+	public static HostapdConfigWriter getInstance() {
+		if(s_instance == null) {
+			s_instance = new HostapdConfigWriter();
+		}
+		
+		return s_instance;
+	}
+
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+		
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+		
+		for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig: netInterfaceConfigs) {
+			if(netInterfaceConfig.getType() == NetInterfaceType.WIFI) {
+                // ignore 'mon' interface
+                if(netInterfaceConfig.getName().startsWith("mon.")) {
+                    continue;
+                }
+
+			    writeConfig(netInterfaceConfig);
+			}
+		}
+	}
+	
+	private void writeConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		
+		String interfaceName = netInterfaceConfig.getName();
+		
+		List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+
+		if (netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+			for (NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+				if (netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+					List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+					NetInterfaceStatus netInterfaceStatus = NetInterfaceStatus.netIPv4StatusDisabled;
+					WifiConfig apConfig = null;
+					String interfaceDriver = null;
+					if (netConfigs != null) {
+						for (NetConfig netConfig : netConfigs) {
+							try {
+								if(netConfig instanceof WifiConfig) {
+								    if(((WifiConfig)netConfig).getMode() == WifiMode.MASTER) {
+								        s_logger.debug("Found wifiConfig with mode set to master");
+								        interfaceDriver = ((WifiConfig)netConfig).getDriver();
+								        if(interfaceDriver != null) {
+    								        s_logger.debug("Writing wifiConfig: " + netConfig);
+    								        apConfig = (WifiConfig)netConfig;
+								        } else {
+								            s_logger.error("Can't generate hostapd config - no driver specified");
+								        }
+								    }
+								} else  if(netConfig instanceof NetConfigIP4) {
+		    						netInterfaceStatus = ((NetConfigIP4) netConfig).getStatus();
+		    					}
+							} catch (Exception e) {
+								s_logger.error("Failed to configure Hostapd");
+					        	throw KuraException.internalError(e);
+							}
+						}
+						
+						if(netInterfaceStatus == NetInterfaceStatus.netIPv4StatusDisabled) {
+		        			s_logger.info("Network interface status for " + interfaceName + " is disabled - not overwriting hostapd configuration file");
+		        			return;
+		        		}
+						
+						if (apConfig != null) {
+							try {
+								generateHostapdConf(apConfig, interfaceName, interfaceDriver);
+							} catch (Exception e) {
+								s_logger.error("Failed to generate hostapd configuration file");
+								throw KuraException.internalError(e);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	/*
+	 * This method generates hostapd configuration file
+	 */
+	private void generateHostapdConf(WifiConfig wifiConfig, String interfaceName, String interfaceDriver) throws Exception {
+		
+		s_logger.debug("Generating Hostapd Config");
+		
+		if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_NONE) {
+			
+			File outputFile = new File(HOSTAPD_TMP_CONFIG_FILE);
+			InputStream is = getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_no_security");
+			
+			//relace the necessary components
+			String fileAsString = readInputStreamAsString(is);
+			if(interfaceName != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_INTERFACE", interfaceName);
+			} else {
+				throw KuraException.internalError("the interface name can not be null");
+			}
+			if((interfaceDriver != null) && (interfaceDriver.length() > 0)) {
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", interfaceDriver);
+			} else {
+				String drv = Hostapd.getDriver(interfaceName);
+				s_logger.warn("The 'driver' parameter must be set: setting to: " + drv);
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", drv);
+				//throw KuraException.internalError("the driver name can not be null");
+			}
+			if(wifiConfig.getSSID() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", wifiConfig.getSSID());
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			WifiRadioMode radioMode = wifiConfig.getRadioMode();
+			if (radioMode == WifiRadioMode.RADIO_MODE_80211a) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "a");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "b");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT20) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[SHORT-GI-20]");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40+][SHORT-GI-20][SHORT-GI-40]");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40-][SHORT-GI-20][SHORT-GI-40]");
+			} else {
+				throw KuraException.internalError("invalid hardware mode");
+			}
+			
+			if(wifiConfig.getChannels()[0] > 0 && wifiConfig.getChannels()[0] < 14) {
+				fileAsString = fileAsString.replaceFirst("KURA_CHANNEL", Integer.toString(wifiConfig.getChannels()[0]));
+			} else {
+				throw KuraException.internalError("the channel " + wifiConfig.getChannels()[0] + " must be between 1 (inclusive) and 11 (inclusive) or 1 (inclusive) and 13 (inclusive) depending on your locale");
+			}
+			
+			//everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			
+			//move the file if we made it this far
+			this.moveFile();
+			
+			return;
+		} else if(wifiConfig.getSecurity() == WifiSecurity.SECURITY_WEP) {
+			File outputFile = new File(HOSTAPD_TMP_CONFIG_FILE);
+			InputStream is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_wep");
+			
+			//relace the necessary components
+			String fileAsString = readInputStreamAsString(is);
+			if(interfaceName != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_INTERFACE", interfaceName);
+			} else {
+				throw KuraException.internalError("the interface name can not be null");
+			}
+			if((interfaceDriver != null) && (interfaceDriver.length() > 0)) {
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", interfaceDriver);
+			} else {
+				String drv = Hostapd.getDriver(interfaceName);
+				s_logger.warn("The 'driver' parameter must be set: setting to: " + drv);
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", drv);
+				//throw KuraException.internalError("the driver name can not be null");
+			}
+			if(wifiConfig.getSSID() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", wifiConfig.getSSID());
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			WifiRadioMode radioMode = wifiConfig.getRadioMode();
+			if (radioMode == WifiRadioMode.RADIO_MODE_80211a) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "a");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "b");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT20) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[SHORT-GI-20]");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40+][SHORT-GI-20][SHORT-GI-40]");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40-][SHORT-GI-20][SHORT-GI-40]");
+			} else {
+				throw KuraException.internalError("invalid hardware mode");
+			}
+			
+			if(wifiConfig.getChannels()[0] > 0 && wifiConfig.getChannels()[0] < 14) {
+				fileAsString = fileAsString.replaceFirst("KURA_CHANNEL", Integer.toString(wifiConfig.getChannels()[0]));
+			} else {
+				throw KuraException.internalError("the channel must be between 1 (inclusive) and 11 (inclusive) or 1 (inclusive) and 13 (inclusive) depending on your locale");
+			}
+			String passKey = wifiConfig.getPasskey();
+			if(passKey != null) {
+				if(passKey.length() == 10) {
+					//check to make sure it is all hex
+					try {
+						Long.parseLong(passKey, 16);
+					} catch(Exception e) {
+						throw KuraException.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else if(passKey.length() == 26) {
+					String part1 = passKey.substring(0, 13);
+					String part2 = passKey.substring(13);
+					
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+					} catch(Exception e) {
+						throw KuraException.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else if(passKey.length() == 32) {
+					String part1 = passKey.substring(0, 10);
+					String part2 = passKey.substring(10, 20);
+					String part3 = passKey.substring(20);
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+						Long.parseLong(part3, 16);
+					} catch(Exception e) {
+						throw KuraException.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else if ((passKey.length() == 5)
+						|| (passKey.length() == 13)
+						|| (passKey.length() == 16)) {
+					
+					// 5, 13, or 16 ASCII characters
+					passKey = toHex(passKey);
+					
+					//since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else {
+					throw KuraException.internalError("the WEP key (passwd) must be 10, 26, or 32 HEX characters in length");
+				}
+				
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+
+			//everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			
+			//move the file if we made it this far
+			this.moveFile();
+			
+			return;
+		} else if ((wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA)
+				|| (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA2)) {
+
+		    File tmpOutputFile = new File(HOSTAPD_TMP_CONFIG_FILE);
+			
+			InputStream is = null;
+			if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA) {
+				is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_master_wpa_psk");
+			} else if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA2) {
+				is = this.getClass().getResourceAsStream("/src/main/resources/wifi/hostapd.conf_master_wpa2_psk");
+			}
+			
+			//replace the necessary components
+			String fileAsString = readInputStreamAsString(is);
+			if(interfaceName != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_INTERFACE", interfaceName);
+			} else {
+				throw KuraException.internalError("the interface name can not be null");
+			}
+			if((interfaceDriver != null) && (interfaceDriver.length() > 0)) {
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", interfaceDriver);
+			} else {
+				String drv = Hostapd.getDriver(interfaceName);
+				s_logger.warn("The 'driver' parameter must be set: setting to: " + drv);
+				fileAsString = fileAsString.replaceFirst("KURA_DRIVER", drv);
+				//throw KuraException.internalError("the driver name can not be null");
+			}
+			if(wifiConfig.getSSID() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", wifiConfig.getSSID());
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			WifiRadioMode radioMode = wifiConfig.getRadioMode();
+			if (radioMode == WifiRadioMode.RADIO_MODE_80211a) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "a");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211b) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "b");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211g) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "0");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "0");
+				fileAsString = fileAsString.replaceFirst("ht_capab=KURA_HTCAPAB", "");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT20) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[SHORT-GI-20]");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT40above) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40+][SHORT-GI-20][SHORT-GI-40]");
+			} else if (radioMode == WifiRadioMode.RADIO_MODE_80211nHT40below) {
+				fileAsString = fileAsString.replaceFirst("KURA_HW_MODE", "g");
+				fileAsString = fileAsString.replaceFirst("KURA_WME_ENABLED", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_IEEE80211N", "1");
+				fileAsString = fileAsString.replaceFirst("KURA_HTCAPAB", "[HT40-][SHORT-GI-20][SHORT-GI-40]");
+			} else {
+				throw KuraException.internalError("invalid hardware mode");
+			}
+			
+			if((wifiConfig.getChannels()[0] > 0) && (wifiConfig.getChannels()[0] < 14)) {
+				fileAsString = fileAsString.replaceFirst("KURA_CHANNEL", Integer.toString(wifiConfig.getChannels()[0]));
+			} else {
+				throw KuraException.internalError("the channel must be between 1 (inclusive) and 11 (inclusive) or 1 (inclusive) and 13 (inclusive) depending on your locale");
+			}
+			if(wifiConfig.getPasskey() != null && wifiConfig.getPasskey().trim().length() > 0) {
+				if((wifiConfig.getPasskey().length() < 8) || (wifiConfig.getPasskey().length() > 63)) {
+					throw KuraException.internalError("the WPA passphrase (passwd) must be between 8 (inclusive) and 63 (inclusive) characters in length: " + wifiConfig.getPasskey());
+				} else {
+					fileAsString = fileAsString.replaceFirst("KURA_PASSPHRASE", wifiConfig.getPasskey().trim());
+				}
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+
+			//everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, tmpOutputFile);
+			
+			//move the file if we made it this far
+			this.moveFile();
+			
+			return;
+		} else {
+			s_logger.error("unsupported security type: " + wifiConfig.getSecurity() +
+					" It must be WifiSecurity.SECURITY_NONE, WifiSecurity.SECURITY_WEP, WifiSecurity.SECURITY_WPA, or WifiSecurity.SECURITY_WPA2");
+			throw KuraException.internalError("unsupported security type: " + wifiConfig.getSecurity());
+		}
+	}
+	
+	/*
+	 * This method reads supplied input stream into a string
+	 */
+	private static String readInputStreamAsString(InputStream is) throws IOException {
+		BufferedInputStream bis = new BufferedInputStream(is);
+		ByteArrayOutputStream buf = new ByteArrayOutputStream();
+		int result = bis.read();
+		while(result != -1) {
+			byte b = (byte)result;
+			buf.write(b);
+			result = bis.read();
+		}
+		return buf.toString();
+	}
+	
+	/*
+	 * This method copies supplied String to a file
+	 */
+	private void copyFile(String data, File destination) throws KuraException {
+		try {
+			FileOutputStream fos = new FileOutputStream(destination);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data);
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+			
+			setPermissions(destination.toString());
+		} catch (IOException e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	private void moveFile() throws Exception {
+		File tmpFile = new File(HOSTAPD_TMP_CONFIG_FILE);
+		File file = new File(HOSTAPD_CONFIG_FILE);
+		if(!FileUtils.contentEquals(tmpFile, file)) {
+			if(tmpFile.renameTo(file)){
+				s_logger.trace("Successfully wrote hostapd.conf file");
+			}else{
+				s_logger.error("Failed to write hostapd.conf file");
+				throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for hostapd");
+			}
+		} else {
+			s_logger.info("Not rewriting hostapd.conf file because it is the same");
+		}
+	}
+	
+	/*
+	 * This method sets permissions to hostapd configuration file 
+	 */
+	private void setPermissions(String fileName) throws KuraException {
+		Process procDos = null;
+		Process procChmod = null;
+		try {
+			procChmod = ProcessUtil.exec("chmod 600 " + fileName);
+			procChmod.waitFor();
+			
+			procDos = ProcessUtil.exec("dos2unix " + fileName);
+			procDos.waitFor();
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(procChmod);
+			ProcessUtil.destroy(procDos);			
+		}
+	}
+	
+	/*
+	 * This method converts supplied string to hex
+	 */
+	private String toHex(String s) {
+		if (s == null) {
+			return null;
+		}
+		byte[] raw = s.getBytes();
+
+		StringBuffer hex = new StringBuffer(2 * raw.length);
+		for (int i = 0; i < raw.length; i++) {
+			hex.append(HEXES.charAt((raw[i] & 0xF0) >> 4)).append(HEXES.charAt((raw[i] & 0x0F)));
+		}
+		return hex.toString();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/IfcfgConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/IfcfgConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..d149da601f7e80aa7c2b2be09f092727386a0d16
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/IfcfgConfigReader.java
@@ -0,0 +1,415 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.Scanner;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.linux.net.dns.LinuxDns;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class IfcfgConfigReader implements NetworkConfigurationVisitor {
+
+    private static final Logger s_logger = LoggerFactory.getLogger(IfcfgConfigReader.class);
+    
+    private static final String OS_VERSION = System.getProperty("kura.os.version");
+    private static final String REDHAT_NET_CONFIGURATION_DIRECTORY = "/etc/sysconfig/network-scripts/";
+    private static final String DEBIAN_NET_CONFIGURATION_DIRECTORY = "/etc/network/";
+
+    private static IfcfgConfigReader s_instance;
+    
+    public static IfcfgConfigReader getInstance() {
+        if(s_instance == null) {
+            s_instance = new IfcfgConfigReader();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+        
+        Properties kuraExtendedProps = KuranetConfig.getProperties();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            getConfig(netInterfaceConfig, kuraExtendedProps);
+        }
+    }
+    
+    private void getConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig, Properties kuraExtendedProps) throws KuraException {
+        String interfaceName = netInterfaceConfig.getName();
+        s_logger.debug("Getting config for " + interfaceName);
+
+        NetInterfaceType type = netInterfaceConfig.getType();        
+        if(type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI || type == NetInterfaceType.LOOPBACK) {
+                
+			NetInterfaceStatus netInterfaceStatus = null;
+            
+			StringBuilder sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.ip4.status");
+			if(kuraExtendedProps != null && kuraExtendedProps.getProperty(sb.toString()) != null) {
+				netInterfaceStatus = NetInterfaceStatus.valueOf(kuraExtendedProps.getProperty(sb.toString()));
+			} else {
+				netInterfaceStatus = NetInterfaceStatus.netIPv4StatusDisabled;
+			}
+			s_logger.debug("Setting NetInterfaceStatus to " + netInterfaceStatus + " for " + netInterfaceConfig.getName());
+            
+            boolean autoConnect = false;
+            int mtu = -1;
+            boolean dhcp = false;
+            IP4Address address = null;
+            String ipAddress = null;
+            String prefixString = null;
+            String netmask = null;
+            String broadcast = null;
+            String gateway = null;
+                
+            File ifcfgFile = null;
+            if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion()) || 
+            		OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+            	ifcfgFile = new File(DEBIAN_NET_CONFIGURATION_DIRECTORY + "interfaces");
+            }
+            else {
+            	ifcfgFile = new File(REDHAT_NET_CONFIGURATION_DIRECTORY + "ifcfg-" + interfaceName);
+            }
+            	
+            if(ifcfgFile.exists()) {
+            	Properties kuraProps;
+                //found our match so load the properties
+            	if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion()) ||
+            			OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+            		kuraProps = parseDebianConfigFile(ifcfgFile, interfaceName);
+            	}
+            	else {
+            		kuraProps = parseRedhatConfigFile(ifcfgFile, interfaceName);                
+            	}
+
+                if(kuraProps != null) {
+                    String onBoot = kuraProps.getProperty("ONBOOT");
+                    if("yes".equals(onBoot)) {
+                    	s_logger.debug("Setting autoConnect to true");
+                        autoConnect = true;
+                    } else {
+                    	s_logger.debug("Setting autoConnect to false");
+                        autoConnect = false;
+                    }
+        
+                    //override MTU with what is in config if it is present
+                    String stringMtu = kuraProps.getProperty("MTU");
+                    if(stringMtu == null) {
+                        try {
+                            mtu = LinuxNetworkUtil.getCurrentMtu(interfaceName);
+                        } catch(KuraException e) {
+                            //just assume ???
+                            if(interfaceName.equals("lo")) {
+                                mtu = 16436;
+                            } else {
+                                mtu = 1500;
+                            }
+                        }
+                    } else {
+                        mtu = Short.parseShort(stringMtu);
+                    }
+        
+                    //get the bootproto
+                    String bootproto = kuraProps.getProperty("BOOTPROTO");
+                    if(bootproto == null) {
+                        bootproto="static";
+                    }
+                    
+                    //get the defroute
+                    String defroute = kuraProps.getProperty("DEFROUTE");
+                    if(defroute == null) {
+                        defroute="no";
+                    }
+                    
+                    //correct the status if needed by validating against the actual properties
+                    if(netInterfaceStatus == NetInterfaceStatus.netIPv4StatusDisabled) {
+                    	if(autoConnect) {
+                    		if(defroute.equals("no")) {
+                    			netInterfaceStatus = NetInterfaceStatus.netIPv4StatusEnabledLAN;
+                    		} else {
+                    			netInterfaceStatus = NetInterfaceStatus.netIPv4StatusEnabledWAN;
+                    		}
+                    	}
+                    }
+        
+                    //check for dhcp or static configuration
+                    try {
+                        ipAddress = kuraProps.getProperty("IPADDR");
+                        prefixString = kuraProps.getProperty("PREFIX");
+                        netmask = kuraProps.getProperty("NETMASK");
+                        broadcast = kuraProps.getProperty("BROADCAST");
+                        try {
+                            gateway = kuraProps.getProperty("GATEWAY");
+                            s_logger.debug("got gateway for " + interfaceName + ": " + gateway);
+                        } catch(Exception e) {
+                            s_logger.warn("missing gateway stanza for " + interfaceName);
+                        }
+        
+                        if (bootproto.equals("dhcp")) {
+                            s_logger.debug("currently set for DHCP");
+                            dhcp = true;
+                            ipAddress = null;
+                            netmask = null;
+                        } else {
+                            s_logger.debug("currently set for static address");
+                            dhcp = false;
+                        }
+                    } catch(Exception e) {
+                        e.printStackTrace();
+                        throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "malformatted config file: " + ifcfgFile.toString());
+                    }
+        
+                    if(ipAddress != null && !ipAddress.isEmpty()) {
+                        try {
+                            address = (IP4Address) IPAddress.parseHostAddress(ipAddress);
+                        } catch (UnknownHostException e) {
+                            s_logger.error("Error parsing address: " + ipAddress, e);
+                        }
+                    }
+                    
+                    //make sure at least prefix or netmask is present if static
+                    if(autoConnect && !dhcp && prefixString == null && netmask == null) {
+                        throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "malformatted config file: " + ifcfgFile.toString() + " must contain NETMASK and/or PREFIX");
+                    }
+                }
+                
+                List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+                
+                if(netInterfaceAddressConfigs == null) { 
+                	throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "InterfaceAddressConfig list is null"); 
+                } else if (netInterfaceAddressConfigs.size() == 0) {
+                    throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "InterfaceAddressConfig list has no entries");
+                }
+                
+                for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+                    List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+                    
+                    if(netConfigs == null) {
+                        netConfigs = new ArrayList<NetConfig>();
+                        if(netInterfaceAddressConfig instanceof NetInterfaceAddressConfigImpl) {
+                            ((NetInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                            if(dhcp) {
+                                // Replace with DNS provided by DHCP server (displayed as read-only in Denali)
+                            	List<? extends IPAddress>dhcpDnsServers = getDhcpDnsServers(interfaceName, netInterfaceAddressConfig.getAddress());
+                                if (dhcpDnsServers != null) {
+                                	((NetInterfaceAddressConfigImpl) netInterfaceAddressConfig).setDnsServers(dhcpDnsServers);
+                                }
+                            }
+                        } else if(netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+                            ((WifiInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                            if(dhcp) {
+                                // Replace with DNS provided by DHCP server (displayed as read-only in Denali)
+                            	List<? extends IPAddress>dhcpDnsServers = getDhcpDnsServers(interfaceName, netInterfaceAddressConfig.getAddress());
+                            	if (dhcpDnsServers != null) {
+                            		((WifiInterfaceAddressConfigImpl) netInterfaceAddressConfig).setDnsServers(dhcpDnsServers);
+                            	}
+                            }
+                        }
+                    }
+                    
+                    NetConfigIP4 netConfig = new NetConfigIP4(netInterfaceStatus, autoConnect);
+                    setNetConfigIP4(netConfig, autoConnect, dhcp, address, gateway, prefixString, netmask, kuraProps);
+                    s_logger.debug("NetConfig: " + netConfig.toString());
+                    netConfigs.add(netConfig);
+                }
+            }
+        }
+    }
+    
+    private Properties parseRedhatConfigFile(File ifcfgFile, String interfaceName) {
+    	Properties kuraProps = new Properties();
+    	try {
+            kuraProps.load(new FileInputStream(ifcfgFile));
+        } catch (Exception e) {
+            s_logger.error("Could not get configuration for " + interfaceName, e);
+        }
+    	return kuraProps;
+    }
+    
+    static Properties parseDebianConfigFile(File ifcfgFile, String interfaceName) throws KuraException{
+    	Properties kuraProps = new Properties();
+    	Scanner scanner;
+		try {
+			scanner = new Scanner (new FileInputStream(ifcfgFile));
+
+			//Debian specific routine to create Properties object
+	        kuraProps.setProperty("ONBOOT", "no");
+	
+	        try {
+	            while (scanner.hasNextLine()) {
+	                String line = scanner.nextLine().trim();
+	                //ignore comments and blank lines
+	                if (!line.isEmpty() && !line.startsWith("#")) {
+	                    String[] args = line.split("\\s+");
+	                    try {
+	                        //must be a line stating that interface starts on boot
+	                    	if (args[0].equals("auto") && args[1].equals(interfaceName)) {
+	                    		s_logger.debug("Setting ONBOOT to yes for " + interfaceName);
+	                            kuraProps.setProperty("ONBOOT", "yes");
+	                        }
+	                    	//once the correct interface is found, read all configuration information
+	                        else if (args[0].equals("iface") && args[1].equals(interfaceName)) {
+	                            kuraProps.setProperty("BOOTPROTO", args[3]);
+	                            if(args[3].equals("dhcp")) {
+                                    kuraProps.setProperty("DEFROUTE", "yes");
+	                            }
+	                            while (scanner.hasNextLine()) {
+	                            	line = scanner.nextLine().trim();
+	                            	if(line != null && !line.isEmpty()) {
+	                            		if(line.startsWith("auto") || line.startsWith("iface")) {
+	                            			break;
+	                            		}
+	                            		
+		                            	args = line.trim().split("\\s+");
+		                            	if (args[0].equals("mtu")) {
+		                            		kuraProps.setProperty("mtu", args[1]);
+		                            	} else if (args[0].equals( "address")) {
+		                            		kuraProps.setProperty("IPADDR", args[1]);
+		                            	} else if (args[0].equals( "netmask")) {
+		                            		kuraProps.setProperty("NETMASK", args[1]);
+		                            	} else if (args[0].equals( "gateway")) {
+		                            		kuraProps.setProperty("GATEWAY", args[1]);
+		                            		kuraProps.setProperty("DEFROUTE", "yes");
+		                            	} else if(args[0].equals("dns-nameservers")) {
+		                            		if (args.length > 1) {
+		                            			for(int i=1; i < args.length; i++) {
+		                            				kuraProps.setProperty("DNS" + Integer.toString(i), args[i]);
+		                            			}
+		                            		}
+		                            	} else if (args[0].equals("post-up")) {
+		                            		StringBuffer sb = new StringBuffer();
+		                            		for (int i = 1; i < args.length; i++) {
+		                            			sb.append(args[i]);
+		                            			sb.append(' ');
+		                            		}
+		                            		if (sb.toString().trim().equals("route del default dev " + interfaceName)) {
+		                            			kuraProps.setProperty("DEFROUTE", "no");
+		                            		}
+		                            	}
+	                            	}
+	                            }
+	                            //Debian makes assumptions about lo, handle those here
+	                            if (interfaceName.equals("lo") && kuraProps.getProperty("IPADDR") == null && kuraProps.getProperty("NETMASK") == null) {
+	                            	kuraProps.setProperty("IPADDR", "127.0.0.1");
+	                            	kuraProps.setProperty("NETMASK", "255.0.0.0");
+	                            }
+	                            break;
+	                        }
+	                    } catch (Exception e) {
+	                    	s_logger.warn("Possible malformed configuration file for " + interfaceName, e);
+	                    }
+	                }
+	            }
+	            
+	        } finally {
+	            scanner.close();
+	        }
+		} catch (FileNotFoundException err) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, err);
+		}
+    	return kuraProps;
+    }
+    
+    private static void setNetConfigIP4(NetConfigIP4 netConfig,
+            boolean autoConnect,
+            boolean dhcp,
+            IP4Address address,
+            String gateway,
+            String prefixString,
+            String netmask,
+            Properties kuraProps) throws KuraException {
+
+        netConfig.setDhcp(dhcp);
+        if(kuraProps != null) {
+            //get the DNS
+            List<IP4Address> dnsServers = new ArrayList<IP4Address>();
+            int count = 1;
+            while(true) {
+                String dns = null;
+                if((dns = kuraProps.getProperty("DNS" + count)) != null) {
+                    try {
+                        dnsServers.add((IP4Address) IP4Address.parseHostAddress(dns));
+                    } catch (UnknownHostException e) {
+                        s_logger.error("Could not parse address: " + dns, e);
+                    }
+                    count++;
+                } else {
+                    break;
+                }
+            }
+            netConfig.setDnsServers(dnsServers);
+
+            if(!dhcp) {
+                netConfig.setAddress(address);
+                //TODO ((NetConfigIP4)netConfig).setDomains(domains);
+                if(gateway != null && !gateway.isEmpty()) {
+                    try {
+                        netConfig.setGateway((IP4Address) IP4Address.parseHostAddress(gateway));
+                    } catch (UnknownHostException e) {
+                        s_logger.error("Could not parse address: " + gateway, e);
+                    }
+                }
+                if(prefixString != null) {
+                    short prefix = Short.parseShort(prefixString);
+                    netConfig.setNetworkPrefixLength(prefix);
+                }
+                if(netmask != null) {
+                    netConfig.setNetworkPrefixLength(NetworkUtil.getNetmaskShortForm(netmask));
+                }
+                //TODO netConfig.setWinsServers(winsServers);
+            }
+        }
+    }
+    
+    private static List<? extends IPAddress> getDhcpDnsServers(String interfaceName, IPAddress address) {
+        List<IPAddress> dnsServers = null;
+        
+        if (address != null) {
+	        LinuxDns linuxDns = LinuxDns.getInstance();
+	        try {
+	            dnsServers = linuxDns.getDhcpDnsServers(interfaceName, address);
+	        } catch (KuraException e) {
+	            s_logger.error("Error getting DHCP DNS servers", e);
+	        }
+        }
+        
+        return dnsServers;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/IfcfgConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/IfcfgConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..93e47e02b84842453861d2ccad38cb762c1c85ee
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/IfcfgConfigWriter.java
@@ -0,0 +1,613 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Properties;
+import java.util.Scanner;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetworkAdminService;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class IfcfgConfigWriter implements NetworkConfigurationVisitor {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(IfcfgConfigWriter.class);
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+    private static final String REDHAT_NET_CONFIGURATION_DIRECTORY = "/etc/sysconfig/network-scripts/";
+    private static final String DEBIAN_NET_CONFIGURATION_FILE = "/etc/network/interfaces";
+    private static final String DEBIAN_TMP_NET_CONFIGURATION_FILE = "/etc/network/interfaces.tmp";
+	
+	private static IfcfgConfigWriter s_instance;
+	
+	public static IfcfgConfigWriter getInstance() {
+		if (s_instance == null) {
+			s_instance = new IfcfgConfigWriter();
+		}
+		
+		return s_instance;
+	}
+	
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+		 
+		for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+			writeConfig(netInterfaceConfig);
+			writeKuraExtendedConfig(netInterfaceConfig);
+		}
+	}
+	
+	private void writeConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		if (OS_VERSION.equals(KuraConstants.Mini_Gateway.getImageName() + "_" + KuraConstants.Mini_Gateway.getImageVersion()) ||
+				OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+			NetInterfaceType type = netInterfaceConfig.getType();
+			if(type == NetInterfaceType.LOOPBACK || type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI) {					
+				if(configHasChanged(netInterfaceConfig)) {
+					if(netInterfaceConfig.getType() != NetInterfaceType.LOOPBACK) {
+						disableInterface(netInterfaceConfig.getName());
+					}
+					writeDebianConfig(netInterfaceConfig);
+				}
+			}
+		}
+		else {
+			writeRedhatConfig(netInterfaceConfig);
+		}
+	}
+
+	private void writeRedhatConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		String interfaceName = netInterfaceConfig.getName();
+		String outputFileName = new StringBuffer().append(REDHAT_NET_CONFIGURATION_DIRECTORY).append("ifcfg-").append(interfaceName).toString();
+		String tmpOutputFileName = new StringBuffer().append(REDHAT_NET_CONFIGURATION_DIRECTORY).append("ifcfg-").append(interfaceName).append(".tmp").toString();
+		s_logger.debug("Writing config for " + interfaceName);
+		
+		NetInterfaceType type = netInterfaceConfig.getType();
+		if (type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI || type == NetInterfaceType.LOOPBACK) {
+			StringBuffer sb = new StringBuffer();
+			sb.append("# Networking Interface\n");
+			
+			//DEVICE
+			sb.append("DEVICE=")
+			.append(netInterfaceConfig.getName())
+			.append("\n");
+			
+			//NAME
+			sb.append("NAME=")
+			.append(netInterfaceConfig.getName())
+			.append("\n");
+			
+			//TYPE
+			sb.append("TYPE=")
+			.append(netInterfaceConfig.getType())
+			.append("\n");
+			
+			List<?extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+			s_logger.debug("There are " + netInterfaceAddressConfigs.size() + " NetInterfaceConfigs in this configuration");
+			
+			boolean allowWrite = false;
+			for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+				List<NetConfig> netConfigs =  netInterfaceAddressConfig.getConfigs();
+
+				if(netConfigs != null) {
+					for(NetConfig netConfig : netConfigs) {
+						if(netConfig instanceof NetConfigIP4) {
+							//ONBOOT
+							sb.append("ONBOOT=");
+							if(((NetConfigIP4) netConfig).isAutoConnect()) {
+								sb.append("yes");
+							} else {
+								sb.append("no");
+							}
+							sb.append("\n");
+							
+							if(((NetConfigIP4) netConfig).isDhcp()) {
+							    //BOOTPROTO
+                                sb.append("BOOTPROTO=");
+                                s_logger.debug("new config is DHCP");
+                                sb.append("dhcp");
+                                sb.append("\n");
+							} else {
+							    //BOOTPROTO
+                                sb.append("BOOTPROTO=");
+                                s_logger.debug("new config is STATIC");
+                                sb.append("static");
+                                sb.append("\n");
+
+								//IPADDR
+								sb.append("IPADDR=")
+								.append(((NetConfigIP4) netConfig).getAddress().getHostAddress())
+								.append("\n");
+
+								//PREFIX
+								sb.append("PREFIX=")
+								.append(((NetConfigIP4) netConfig).getNetworkPrefixLength())
+								.append("\n");
+								
+								//Gateway
+								if(((NetConfigIP4) netConfig).getGateway() != null) {
+									sb.append("GATEWAY=")
+									.append(((NetConfigIP4) netConfig).getGateway().getHostAddress())
+									.append("\n");
+								}
+							}
+							
+                            //DEFROUTE
+                            if(((NetConfigIP4) netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+                                sb.append("DEFROUTE=yes\n");
+                            } else {
+                                sb.append("DEFROUTE=no\n");
+                            }
+
+                            //DNS
+                            List<? extends IPAddress> dnsAddresses = ((NetConfigIP4) netConfig).getDnsServers();
+                            if(dnsAddresses != null && dnsAddresses.size() > 0) {
+	                            for(int i=0; i<dnsAddresses.size(); i++) {
+	                            	IPAddress ipAddr = dnsAddresses.get(i);
+	                            	if (!(ipAddr.isLoopbackAddress()
+											|| ipAddr.isLinkLocalAddress() 
+											|| ipAddr.isMulticastAddress())) {
+		                                sb.append("DNS")
+		                                .append(i+1)
+		                                .append("=")
+		                                .append(ipAddr.getHostAddress())
+		                                .append("\n");
+	                            	}
+	                            }
+                            } else {
+                            	s_logger.debug("no DNS entries");
+                            }
+
+							allowWrite = true;
+						}
+					}
+				} else {
+					s_logger.debug("netConfigs is null");
+				}
+				
+				// WIFI
+				if(netInterfaceAddressConfig instanceof WifiInterfaceAddressConfig) {
+					s_logger.debug("new config is a WifiInterfaceAddressConfig");
+					sb.append("\n#Wireless configuration\n");
+					
+					// MODE
+					String mode = null;
+					WifiMode wifiMode = ((WifiInterfaceAddressConfig)netInterfaceAddressConfig).getMode(); 
+					if (wifiMode == WifiMode.INFRA) {
+						mode = "Managed";
+					} else if (wifiMode == WifiMode.MASTER) {
+						mode = "Master";
+					} else if (wifiMode == WifiMode.ADHOC) {
+						mode = "Ad-Hoc";
+					} else if (wifiMode == null) {
+						s_logger.error("WifiMode is null");
+						mode = "null";
+					} else {
+						mode = wifiMode.toString();
+					}
+					sb.append("MODE=").append(mode).append("\n");
+				}
+			}
+			
+			if (allowWrite) {
+				try {
+					FileOutputStream fos = new FileOutputStream(tmpOutputFileName);
+					PrintWriter pw = new PrintWriter(fos);
+					pw.write(sb.toString());
+					pw.flush();
+					fos.getFD().sync();
+					pw.close();
+					fos.close();
+				} catch (Exception e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+				
+				//move the file if we made it this far
+				File tmpFile = new File(tmpOutputFileName);
+				File outputFile = new File(outputFileName);
+				try {
+					if(!FileUtils.contentEquals(tmpFile, outputFile)) {
+						if(tmpFile.renameTo(outputFile)){
+							s_logger.trace("Successfully wrote network interface file for " + interfaceName);
+						}else{
+							s_logger.error("Failed to write network interface file");
+							throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for network interface " + interfaceName);
+						}
+					} else {
+						s_logger.info("Not rewriting network interfaces file for " + interfaceName + " because it is the same");
+					}
+				} catch(IOException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+			} else {
+				s_logger.warn("writeNewConfig :: operation is not allowed");
+			}
+		}
+	}
+	
+	private void writeDebianConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		StringBuffer sb = new StringBuffer();
+		File kuraFile = new File(DEBIAN_NET_CONFIGURATION_FILE);
+		String iName = netInterfaceConfig.getName();
+		boolean appendConfig = true;
+				
+		if(kuraFile.exists()) {
+			//found our match so load the properties
+			Scanner scanner = null;
+			try {
+				scanner = new Scanner (new FileInputStream(kuraFile));
+			} catch (FileNotFoundException e1) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e1);
+			}
+		
+			//need to loop through the existing file and replace only the desired interface
+			while (scanner.hasNextLine()) {
+				String noTrimLine = scanner.nextLine();
+				String line = noTrimLine.trim();
+                //ignore comments and blank lines
+                if (!line.isEmpty() && !line.startsWith("#")) {
+                    String[] args = line.split("\\s+");
+                        //must be a line stating that interface starts on boot
+                    if(args.length > 1) {
+                    	if (args[1].equals(iName)) {
+                    		s_logger.debug("Found entry in interface file...");
+                    		appendConfig = false;
+                            sb.append(debianWriteUtility(netInterfaceConfig.getNetInterfaceAddresses(), iName));
+							
+							//remove old config lines from the scanner
+							while (scanner.hasNextLine() && !(line = scanner.nextLine()).isEmpty()) {
+							}
+							sb.append("\n");
+                    	} else {
+                    		sb.append(noTrimLine + "\n");
+                    	}
+                    }
+                } else {
+                	sb.append(noTrimLine + "\n");
+                }
+			}
+			// If config not present in file, append to end
+			if (appendConfig) {
+				s_logger.debug("Appending entry to interface file...");
+				sb.append(debianWriteUtility(netInterfaceConfig.getNetInterfaceAddresses(), iName));
+				sb.append("\n");
+			}
+			
+			scanner.close();
+			scanner = null;
+			
+			try {
+				FileOutputStream fos = new FileOutputStream(DEBIAN_TMP_NET_CONFIGURATION_FILE);
+				PrintWriter pw = new PrintWriter(fos);
+				pw.write(sb.toString());
+				pw.flush();
+				fos.getFD().sync();
+				pw.close();
+				fos.close();
+			} catch(Exception e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+			
+			//move the file if we made it this far
+	        File tmpFile = new File(DEBIAN_TMP_NET_CONFIGURATION_FILE);
+	        File file = new File(DEBIAN_NET_CONFIGURATION_FILE);
+	        try {
+		        if(!FileUtils.contentEquals(tmpFile, file)) {
+			        if(tmpFile.renameTo(file)){
+			        	s_logger.trace("Successfully wrote network interfaces file");
+			        }else{
+			        	s_logger.error("Failed to write network interfaces file");
+			        	throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for network interfaces");
+			        }
+		        } else {
+					s_logger.info("Not rewriting network interfaces file because it is the same");
+				}
+	        } catch(IOException e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+	
+	private String debianWriteUtility(List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs, String interfaceName) {
+		StringBuffer sb = new StringBuffer();
+		
+		s_logger.debug("There are " + netInterfaceAddressConfigs.size() + " NetInterfaceAddressConfigs in this configuration");
+		
+		for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+			List<NetConfig> netConfigs =  netInterfaceAddressConfig.getConfigs();
+
+			if(netConfigs != null) {
+				for(NetConfig netConfig : netConfigs) {
+					if(netConfig instanceof NetConfigIP4) {
+						s_logger.debug("Writing netconfig " + netConfig.getClass().toString() + " for " + interfaceName);
+						
+						//ONBOOT
+						if(((NetConfigIP4) netConfig).isAutoConnect())
+							sb.append("auto " + interfaceName + "\n" );
+						
+						//BOOTPROTO
+						sb.append("iface " + interfaceName + " inet ");
+						if(((NetConfigIP4) netConfig).isDhcp()) {
+							s_logger.debug("new config is DHCP");
+							sb.append("dhcp\n");
+						} else {
+							s_logger.debug("new config is STATIC");
+							sb.append("static\n");
+						}
+
+						if(!((NetConfigIP4) netConfig).isDhcp()) {
+							//IPADDR
+							sb.append("\taddress ")
+							.append(((NetConfigIP4) netConfig).getAddress().getHostAddress())
+							.append("\n");
+							
+							//NETMASK
+							sb.append("\tnetmask ")
+							.append(((NetConfigIP4) netConfig).getSubnetMask().getHostAddress())
+							.append("\n");
+							
+							//NETWORK
+							//TODO: Handle Debian NETWORK value
+
+							//Gateway
+							if(((NetConfigIP4) netConfig).getGateway() != null) {
+								sb.append("\tgateway ")
+								.append(((NetConfigIP4) netConfig).getGateway().getHostAddress())
+								.append("\n");
+							}
+						} else {
+							// DEFROUTE
+                            if(((NetConfigIP4) netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledLAN) {
+                            	sb.append("post-up route del default dev ");
+                            	sb.append(interfaceName);
+                            	sb.append("\n");
+                            }
+						}
+
+						//DNS
+						List<? extends IPAddress> dnsAddresses = ((NetConfigIP4) netConfig).getDnsServers();
+						if (!dnsAddresses.isEmpty()) {
+						boolean setDns = false;
+						for (int i = 0; i < dnsAddresses.size(); i++) {
+							if(!dnsAddresses.get(i).getHostAddress().equals("127.0.0.1")) {
+								if(!setDns) {
+							sb.append("\tdns-nameservers ");
+									setDns = true;
+								}
+								sb.append(dnsAddresses.get(i).getHostAddress() + " ");
+							}
+						}
+							sb.append("\n");
+						}
+					}					
+				}
+			} else {
+				s_logger.debug("netConfigs is null");
+			}
+			
+			// WIFI
+			if(netInterfaceAddressConfig instanceof WifiInterfaceAddressConfig) {
+				s_logger.debug("new config is a WifiInterfaceAddressConfig");
+			}
+		}
+		return sb.toString();
+	}
+	
+	public static void writeKuraExtendedConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		NetInterfaceStatus netInterfaceStatus = null;
+
+		boolean gotNetConfigIP4 = false;
+
+		List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+
+    	if(netInterfaceAddressConfigs != null && netInterfaceAddressConfigs.size() > 0) {
+    		for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+    			List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+    			if(netConfigs != null && netConfigs.size() > 0) {
+    				for(int i=0; i<netConfigs.size(); i++) {
+    					NetConfig netConfig = netConfigs.get(i);
+    					if(netConfig instanceof NetConfigIP4) {
+    						netInterfaceStatus = ((NetConfigIP4) netConfig).getStatus();
+    						gotNetConfigIP4 = true;
+    					}
+    				}
+    			}
+    		}
+    	}
+
+    	if(!gotNetConfigIP4) {
+    		netInterfaceStatus = NetInterfaceStatus.netIPv4StatusDisabled;
+    	}
+
+    	s_logger.debug("Setting NetInterfaceStatus to " + netInterfaceStatus + " for " + netInterfaceConfig.getName());
+
+    	//set it all
+    	Properties kuraExtendedProps = KuranetConfig.getProperties();
+    	
+    	if(kuraExtendedProps == null) {
+    		s_logger.debug("kuraExtendedProps was null");
+    		kuraExtendedProps = new Properties();
+    	}
+    	StringBuilder sb = new StringBuilder().append("net.interface.").append(netInterfaceConfig.getName()).append(".config.ip4.status");
+    	kuraExtendedProps.put(sb.toString(), netInterfaceStatus.toString());
+    	
+    	//write it
+    	if(kuraExtendedProps != null && !kuraExtendedProps.isEmpty()) {
+			try {
+			    KuranetConfig.storeProperties(kuraExtendedProps);
+			} catch (IOException e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+	}
+	
+	public static void removeKuraExtendedConfig(String interfaceName) throws KuraException {
+		try {
+			StringBuilder sb = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.ip4.status");
+			KuranetConfig.deleteProperty(sb.toString());
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	private void disableInterface(String interfaceName) {
+		BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
+		if(bundleContext != null) {
+			ServiceReference<NetworkAdminService> sr = bundleContext.getServiceReference(NetworkAdminService.class);
+			if (sr != null) {
+				NetworkAdminService nas = bundleContext.getService(sr);
+				try {
+					nas.disableInterface(interfaceName);
+				} catch (KuraException e) {
+					s_logger.warn("Could not disable " + interfaceName, e);
+				}
+			}
+		}
+	}
+	
+	private Properties parseNetInterfaceAddressConfig(NetInterfaceAddressConfig netInterfaceAddressConfig) {
+		Properties props = new Properties();
+		
+		List<NetConfig> netConfigs =  netInterfaceAddressConfig.getConfigs();
+
+		if(netConfigs != null) {
+			for(NetConfig netConfig : netConfigs) {
+				if(netConfig instanceof NetConfigIP4) {
+					NetConfigIP4 netConfigIP4 = (NetConfigIP4) netConfig;
+
+					// ONBOOT
+					props.setProperty("ONBOOT", netConfigIP4.isAutoConnect() ? "yes" : "no");
+					
+					//BOOTPROTO
+					props.setProperty("BOOTPROTO", netConfigIP4.isDhcp() ? "dhcp" : "static");
+
+					if(!netConfigIP4.isDhcp()) {
+						//IPADDR
+						if(netConfigIP4.getAddress() != null) {
+							props.setProperty("IPADDR", netConfigIP4.getAddress().getHostAddress());
+						}
+						
+						//NETMASK
+						if(netConfigIP4.getSubnetMask() != null) {
+							props.setProperty("NETMASK", netConfigIP4.getSubnetMask().getHostAddress());
+						}
+						
+						//NETWORK
+						//TODO: Handle Debian NETWORK value
+
+						//GATEWAY
+						if(netConfigIP4.getGateway() != null) {
+							props.setProperty("GATEWAY", netConfigIP4.getGateway().getHostAddress());
+							props.setProperty("DEFROUTE", "yes");
+						} else {
+							props.setProperty("DEFROUTE", "no");
+						}
+					} else {
+						 if(((NetConfigIP4) netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+							 props.setProperty("DEFROUTE", "yes");
+						 } else {
+							 props.setProperty("DEFROUTE", "no");
+						 }
+					}
+
+					//DNS
+					List<? extends IPAddress> dnsAddresses = ((NetConfigIP4) netConfig).getDnsServers();
+					if (!dnsAddresses.isEmpty()) {
+						for (int i = 0; i < dnsAddresses.size(); i++) {
+							if(!dnsAddresses.get(i).getHostAddress().equals("127.0.0.1")) {
+								props.setProperty("DNS" + Integer.toString(i+1), dnsAddresses.get(i).getHostAddress());
+							}
+						}
+					}					
+				}
+			}
+		} else {
+			s_logger.debug("netConfigs is null");
+		}
+		
+		return props;
+	}
+	
+	private boolean configHasChanged(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+		Properties oldConfig = IfcfgConfigReader.parseDebianConfigFile(new File(DEBIAN_NET_CONFIGURATION_FILE), netInterfaceConfig.getName());
+		Properties newConfig = parseNetInterfaceAddressConfig(netInterfaceConfig.getNetInterfaceAddresses().get(0));	// FIXME: assumes only one addressConfig
+
+		s_logger.debug("Comparing configs for " + netInterfaceConfig.getName());
+		s_logger.debug("oldProps: " + oldConfig);
+		s_logger.debug("newProps: " + newConfig);
+
+		if(!compare(oldConfig, newConfig, "ONBOOT")) {
+			s_logger.debug("ONBOOT differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "BOOTPROTO")) {
+			s_logger.debug("BOOTPROTO differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "IPADDR")) {
+			s_logger.debug("IPADDR differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "NETMASK")) {
+			s_logger.debug("NETMASK differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "GATEWAY")) {
+			s_logger.debug("GATEWAY differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "DNS1")) {
+			s_logger.debug("DNS1 differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "DNS2")) {
+			s_logger.debug("DNS2 differs");
+			return true;
+		} else if(!compare(oldConfig, newConfig, "DNS3")) {
+			s_logger.debug("DNS3 differs");
+			return true;
+		} else if (!compare(oldConfig, newConfig, "DEFROUTE")) {
+			s_logger.debug("DEFROUTE differs");
+			return true;
+		}
+
+		s_logger.debug("Configs match");
+		return false;
+	}
+	
+	private boolean compare(Properties prop1, Properties prop2, String key) {
+		String val1 = prop1.getProperty(key);
+		String val2 = prop2.getProperty(key);
+		
+		return (val1 != null) ? val1.equals(val2) : val2 == null;		
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/LinuxReadVisitor.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/LinuxReadVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c1ef5ee86d6e42f9e7512f25220b2242b88042c
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/LinuxReadVisitor.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+
+
+public class LinuxReadVisitor implements NetworkConfigurationVisitor{
+
+    private static LinuxReadVisitor s_instance;
+    
+    private List<NetworkConfigurationVisitor> m_visitors;
+    
+    private LinuxReadVisitor() {
+        m_visitors = new ArrayList<NetworkConfigurationVisitor>();
+        m_visitors.add(IfcfgConfigReader.getInstance());
+        m_visitors.add(WifiConfigReader.getInstance());
+        m_visitors.add(PppConfigReader.getInstance());
+        m_visitors.add(DhcpConfigReader.getInstance());
+        m_visitors.add(FirewallNatConfigReader.getInstance());
+    }
+    
+    public static LinuxReadVisitor getInstance() {
+        if(s_instance == null) {
+            s_instance = new LinuxReadVisitor();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        for(NetworkConfigurationVisitor visitor : m_visitors) {
+            visitor.visit(config);
+        }
+    }
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/LinuxWriteVisitor.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/LinuxWriteVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b8db735426d032b0740df45c6a19a6813cb6057
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/LinuxWriteVisitor.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+
+
+public class LinuxWriteVisitor implements NetworkConfigurationVisitor{
+    
+    private static LinuxWriteVisitor s_instance;
+    
+    private List<NetworkConfigurationVisitor> m_visitors;
+    
+    private LinuxWriteVisitor() {
+        m_visitors = new ArrayList<NetworkConfigurationVisitor>();
+        m_visitors.add(IfcfgConfigWriter.getInstance());
+        m_visitors.add(WifiConfigWriter.getInstance());
+        m_visitors.add(PppConfigWriter.getInstance());
+        m_visitors.add(DhcpConfigWriter.getInstance());
+        m_visitors.add(FirewallNatConfigWriter.getInstance());
+    }
+    
+    public static LinuxWriteVisitor getInstance() {
+        if(s_instance == null) {
+            s_instance = new LinuxWriteVisitor();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        for(NetworkConfigurationVisitor visitor : m_visitors) {
+            visitor.visit(config);
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/PppConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/PppConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c92d540fb9dc8979bba208227ab9cf49b02d31f
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/PppConfigReader.java
@@ -0,0 +1,462 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.modem.ModemInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.linux.net.dns.LinuxDns;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.linux.net.util.LinuxNetworkUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.NetworkConfigurationServiceImpl;
+import org.eclipse.kura.net.admin.visitor.linux.util.ChapLinux;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangePair;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.admin.visitor.linux.util.PapLinux;
+import org.eclipse.kura.net.admin.visitor.linux.util.PppUtil;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.modem.ModemConfig.AuthType;
+import org.eclipse.kura.net.modem.ModemConfig.PdpType;
+import org.eclipse.kura.usb.UsbDevice;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class PppConfigReader implements NetworkConfigurationVisitor {
+	
+	private static class FileFilter implements FilenameFilter {
+
+		@Override
+		public boolean accept(File directory, String filename) {
+			return filename.startsWith("ppp")? true : false;
+		}
+	}
+
+    private static final Logger s_logger = LoggerFactory.getLogger(PppConfigReader.class);
+    
+    public static final String PEERS_DIRECTORY = "/etc/ppp/peers/";
+    public static final String SCRIPTS_DIRECTORY = "/etc/ppp/scripts/";
+    
+    private static PppConfigReader s_instance;
+    
+    public static PppConfigReader getInstance() {
+        if(s_instance == null) {
+            s_instance = new PppConfigReader();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+    	
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig.getType() == NetInterfaceType.MODEM) {
+                getConfig(netInterfaceConfig);
+            }
+        }
+    }
+    
+    private void getConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException {
+    	
+        String interfaceName = netInterfaceConfig.getName();
+        s_logger.debug("Getting ppp config for " + interfaceName);
+        
+        if(netInterfaceConfig instanceof ModemInterfaceConfigImpl) {
+            StringBuilder key = new StringBuilder("net.interface." + netInterfaceConfig.getName() + ".modem.identifier");
+            String modemId = KuranetConfig.getProperty(key.toString());
+            s_logger.debug("Getting modem identifier using key " + key + ": " + modemId);
+        
+            if(modemId != null) {
+                ((ModemInterfaceConfigImpl) netInterfaceConfig).setModemIdentifier(modemId);
+            }
+        }
+        
+        List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+        
+        for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+            if(netInterfaceAddressConfig instanceof ModemInterfaceAddressConfigImpl) {
+                List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+                
+                if(netConfigs == null) {
+                    netConfigs = new ArrayList<NetConfig>();
+                    ((ModemInterfaceAddressConfigImpl)netInterfaceAddressConfig).setNetConfigs(netConfigs);
+                }
+                
+                // Create a ModemConfig
+	            ModemConfig modemConfig = getModemConfig(interfaceName, netInterfaceConfig.getUsbDevice());
+	            if(modemConfig != null) {
+	            	netConfigs.add(modemConfig);
+	            }
+                
+                // Create a NetConfigIP4
+                netConfigs.add(getNetConfigIP4(interfaceName));
+                
+                // Populate with DNS provided by PPP (displayed as read-only in Denali)
+                if (LinuxNetworkUtil.isUp("ppp" + modemConfig.getPppNumber())) {  
+	            	List<? extends IPAddress>pppDnsServers = LinuxDns.getInstance().getPppDnServers();
+	            	if (pppDnsServers != null) {
+	            		((ModemInterfaceAddressConfigImpl) netInterfaceAddressConfig).setDnsServers(pppDnsServers);
+	            	}
+                }
+            }
+        }
+    }
+    
+    private static ModemConfig getModemConfig(String ifaceName, UsbDevice usbDevice) throws KuraException {
+        s_logger.debug("parsePppPeerConfig()");
+        boolean isHspa = false;
+        List<ModemTechnologyType> technologyTypes = null;
+        if (usbDevice != null) {
+	        SupportedUsbModemInfo usbModemInfo = SupportedUsbModemsInfo.getModem(usbDevice);
+	        if(usbModemInfo != null) {
+	            technologyTypes = usbModemInfo.getTechnologyTypes();
+	            
+	        }
+        } else {
+        	SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+        	if (serialModemInfo != null) {
+        		 technologyTypes = serialModemInfo.getTechnologyTypes();
+        	}
+        }
+        
+        if (technologyTypes != null) {
+        	for (ModemTechnologyType technologyType : technologyTypes) {
+            	if (technologyType == ModemTechnologyType.HSDPA) {
+            		isHspa = true;
+            		break;
+            	}
+            }
+        }
+        
+        boolean enabled = true;
+        int unitNum = getUnitNum(ifaceName);
+        
+		String apn = "";
+		String pdpType = "UNKNOWN";
+		String dialString = "";
+		String username = "";
+		String password = "";
+		String technology = "";
+		String model = "";
+		String serialNum = "";
+		String modemId = "";
+        AuthType authType = AuthType.NONE;
+        int lcpEchoInterval = 0;
+        int lcpEchoFailure = 0;
+        
+        String peerFilename = getPeerFilename(ifaceName, usbDevice);
+        File peerFile = new File(peerFilename);
+        if(!peerFile.exists()) {
+            s_logger.warn("File does not exist - " + peerFilename);
+        } else {
+	        // Check if peer file is a symlink.  If so, get information from the linked filename.
+	        try {
+	            if(!peerFile.getCanonicalPath().equals(peerFile.getAbsolutePath())) {
+	                Map<String, String> fileInfo = PppUtil.parsePeerFilename(peerFile.getCanonicalFile().getName());
+	                technology = fileInfo.get("technology");
+	                model = fileInfo.get("model");
+	                serialNum = fileInfo.get("serialNum");
+	                modemId = fileInfo.get("modemId");
+	            }
+	        } catch (IOException e) {
+	            s_logger.error("Error checking for symlink", e);
+	        }
+	
+	        
+	        Properties props = new Properties();
+	        try {
+	            FileInputStream fis = new FileInputStream(peerFilename);    
+	            props.load(fis);
+	            fis.close();
+	        } catch (Exception e) {
+	            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Error getting modem config", e);
+	        }
+	        
+	        s_logger.debug("peer properties: " + props);
+	
+	        if(props.getProperty("unit") != null) {
+	            unitNum = Integer.parseInt(props.getProperty("unit"));
+	        }
+	
+	        if(props.getProperty("user") != null) {
+	            username = removeQuotes(props.getProperty("user"));  
+	        }
+	        
+	        if (props.getProperty("lcp-echo-interval") != null) {
+	        	lcpEchoInterval = Integer.parseInt(props.getProperty("lcp-echo-interval"));
+	        }
+	        
+	        if (props.getProperty("lcp-echo-failure") != null) {
+	        	lcpEchoFailure = Integer.parseInt(props.getProperty("lcp-echo-failure"));
+	        }
+	        
+	        String chatFilename = "";
+	        String connectProperty = removeQuotes(props.getProperty("connect"));
+	        String[] args = connectProperty.split("\\s+");
+	        for(int i=0; i<args.length; i++) {
+	            if(args[i].equals("-f") && args.length > i+1) {
+	                chatFilename = args[i+1];
+	                break;
+	            }
+	        }
+	
+	        String disconnectFilename = "";
+	        String disconnectProperty = removeQuotes(props.getProperty("disconnect"));
+	        args = disconnectProperty.split("\\s+");
+	        for(int i=0; i<args.length; i++) {
+	            if(args[i].equals("-f") && args.length > i+1) {
+	                disconnectFilename = args[i+1];
+	                break;
+	            }
+	        }
+	   
+	        // Parse the connect script
+	        ModemXchangeScript connectScript = null;
+	        
+	        try {
+	            connectScript = ModemXchangeScript.parseFile(chatFilename);
+	        } catch (Exception e) {
+	            throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "Error parsing " + chatFilename, e);
+	        }
+	        
+	        if(connectScript != null) {
+	            ModemXchangePair modemXchangePair = connectScript.getFirstModemXchangePair();
+	            ModemXchangePair prevXchangePair = null;
+	            String expectedStr, sendStr;
+	            
+	            while(modemXchangePair != null) {
+	                expectedStr = modemXchangePair.getExpectString();
+	                sendStr = removeQuotes(modemXchangePair.getSendString());
+	                                    
+	                if(expectedStr.equals("OK")) {
+	                    // apn
+	                    if(sendStr.contains(",")) {
+	                        String[] sendArgs = sendStr.split(",");
+	                        if((sendArgs.length == 3) && isHspa) {
+	                            pdpType = removeQuotes(sendArgs[1]);
+	                            apn = removeQuotes(sendArgs[2]);
+	                        }
+	                    }
+	                // } else if(expectedStr.equals("\"\"")) {
+	                } else if(expectedStr.equals("CONNECT")) {
+	                    // dial string
+	                    if(prevXchangePair != null) {
+	                        dialString = removeQuotes(prevXchangePair.getSendString());
+	                    }
+	                }
+	                
+	                prevXchangePair = modemXchangePair;
+	                modemXchangePair = connectScript.getNextModemXchangePair();
+	            }
+	        }
+	        
+	        s_logger.debug("* Enabled: " + enabled);
+	        s_logger.debug("* CHAT file: " + chatFilename);
+	        s_logger.debug("* UnitNum: " + unitNum);    
+	        s_logger.debug("* dial string: " + dialString);
+	        s_logger.debug("* LCP Echo Interval: " + lcpEchoInterval);
+	        s_logger.debug("* LCP Echo Failure: " + lcpEchoFailure);
+	        
+	        // Get the auth type and credentials
+	        // pppd will use CHAP if available, else PAP
+	        String secret = "";
+	        if (isHspa) {
+	        	String chapSecret = ChapLinux.getInstance().getSecret(model, username, "*", "*");
+	        	String papSecret = PapLinux.getInstance().getSecret(model, username, "*", "*");
+	        	if ((chapSecret != null) && (papSecret != null) && chapSecret.equals(papSecret)) {
+	        		authType = AuthType.AUTO;
+	        		secret = chapSecret;
+	        	} else if (chapSecret != null) {
+	        		authType = AuthType.CHAP;
+	        		secret = chapSecret;
+	        	} else if (papSecret != null) {
+	        		authType = AuthType.PAP;
+	        		secret = papSecret;
+	        	} 
+	        	
+		        s_logger.debug("* APN: " + apn);
+		        s_logger.debug("* auth: " + authType);
+		        s_logger.debug("* username: " + username);
+		        s_logger.debug("* password: " + secret);
+	        }
+        }
+        
+        boolean gpsEnabled = false;
+        StringBuilder key = new StringBuilder().append("net.interface.").append(ifaceName).append(".config.gpsEnabled");
+        String statusString = KuranetConfig.getProperty(key.toString());
+        if(statusString != null && !statusString.isEmpty()) {
+            gpsEnabled = Boolean.parseBoolean(statusString);
+        }
+        
+        // Populate the modem config
+        ModemConfig modemConfig = new ModemConfig();
+        
+        modemConfig.setPppNumber(unitNum);
+        modemConfig.setLcpEchoInterval(lcpEchoInterval);
+        modemConfig.setLcpEchoFailure(lcpEchoFailure);
+        modemConfig.setEnabled(enabled);    // TODO - from self configuring properties 
+        modemConfig.setDataCompression(0);  // FIXME
+        modemConfig.setDialString(dialString);
+        modemConfig.setHeaderCompression(0);    // FIXME
+        modemConfig.setGpsEnabled(gpsEnabled);       
+        
+		if (isHspa) {
+			modemConfig.setApn(apn);
+			modemConfig.setAuthType(authType);
+			modemConfig.setPassword(password);
+			modemConfig.setPdpType(PdpType.valueOf(pdpType.toUpperCase()));
+			modemConfig.setUsername(username);
+		}
+        
+        return modemConfig;
+    }
+    
+    private static NetConfigIP4 getNetConfigIP4(String interfaceName) throws KuraException {
+    	NetConfigIP4 netConfigIP4 = null;
+        NetInterfaceStatus netInterfaceStatus = NetInterfaceStatus.netIPv4StatusDisabled;
+        
+        StringBuilder key = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.ip4.status");
+        String statusString = KuranetConfig.getProperty(key.toString());
+        if(statusString != null && !statusString.isEmpty()) {
+            netInterfaceStatus = NetInterfaceStatus.valueOf(statusString);
+        }
+        s_logger.debug("Setting NetInterfaceStatus to " + netInterfaceStatus + " for " + interfaceName);
+        
+        netConfigIP4 = new NetConfigIP4(netInterfaceStatus, true, true);
+        
+        key = new StringBuilder("net.interface.").append(interfaceName).append(".config.dnsServers");
+        String dnsServersStr = KuranetConfig.getProperty(key.toString());
+        List<IP4Address> dnsServersList = new ArrayList<IP4Address>();
+        
+        if(dnsServersStr != null && !dnsServersStr.isEmpty()) {
+        	String[] serversArr = dnsServersStr.split(PppConfigWriter.DNS_DELIM);
+        	for(String server : serversArr) {
+        		try {
+					dnsServersList.add((IP4Address) IP4Address.parseHostAddress(server));
+				} catch (UnknownHostException e) {
+					throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+				}
+        	}
+        	netConfigIP4.setDnsServers(dnsServersList);
+        }
+        
+        return netConfigIP4;
+    }
+    
+    private static String getPeerFilename(String interfaceName, UsbDevice usbDevice) {
+        String filename = null;
+
+        // if interfaceName is a usb port address
+        if(interfaceName.matches(NetworkConfigurationServiceImpl.UNCONFIGURED_MODEM_REGEX)) {
+            filename = PppConfigWriter.formPeerFilename(usbDevice);
+        } else {
+        StringBuilder sb = new StringBuilder();
+            sb.append(PEERS_DIRECTORY).append(interfaceName);
+            filename = sb.toString();
+        }
+        
+        return filename;
+    }
+    
+    /**
+     * Remove quotes if they exist at the start and end of a string.
+     * Otherwise, return the string with no changes.
+     * 
+     * @param line
+     * @return line without surrounding quotes
+     */
+    private static String removeQuotes(String line) {
+        if(line != null) {      
+            if((line.startsWith("'") && line.endsWith("'"))      // remove surrounding quotes
+                    || (line.startsWith("\"") && line.endsWith("\""))) {
+         
+                return line.substring(1, line.length()-1);
+            }
+        }
+        
+        return line;
+    }
+    
+    private static int getUnitNum(String interfaceName) {
+        int unitNum = -1;
+        
+        if(interfaceName.matches("(?i)ppp\\d+")) {
+            unitNum = Integer.parseInt(interfaceName.substring(3));
+        } else {
+        	unitNum = getUnitNum();
+        }
+        
+        return unitNum;
+    }
+    
+    private static int getUnitNum() {
+
+		int unit = 0;
+		try {
+			File peersFolder = new File(PEERS_DIRECTORY).getCanonicalFile();
+			String[] files = peersFolder.list(new FileFilter());
+			if ((files != null) && (files.length > 0)) {
+				int [] pppUnitNumbers = new int [files.length];
+				
+				for (int i = 0; i < pppUnitNumbers.length; i++) {
+					pppUnitNumbers[i] = Integer.parseInt(files[i].substring(3));	
+				}
+				Arrays.sort(pppUnitNumbers);
+				boolean found = false;
+				for (int i = 0; i < pppUnitNumbers.length; i++) {
+					if (i < pppUnitNumbers[i]) {
+						found = true;
+						unit = i;
+						break;
+					}
+				}
+				if (!found) {
+					unit = pppUnitNumbers.length;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		return unit;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/PppConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/PppConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..1576e8ac91b22dfd6d6bf651fd75056c03729cc7
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/PppConfigWriter.java
@@ -0,0 +1,359 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.modem.ModemInterfaceConfigImpl;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedSerialModemsInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemInfo;
+import org.eclipse.kura.linux.net.modem.SupportedUsbModemsInfo;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.admin.modem.ModemPppConfigGenerator;
+import org.eclipse.kura.net.admin.modem.PppPeer;
+import org.eclipse.kura.net.admin.modem.SupportedSerialModemsFactoryInfo;
+import org.eclipse.kura.net.admin.modem.SupportedUsbModemsFactoryInfo;
+import org.eclipse.kura.net.admin.modem.SupportedSerialModemsFactoryInfo.SerialModemFactoryInfo;
+import org.eclipse.kura.net.admin.modem.SupportedUsbModemsFactoryInfo.UsbModemFactoryInfo;
+import org.eclipse.kura.net.admin.util.LinuxFileUtil;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.ModemXchangeScript;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+import org.eclipse.kura.usb.UsbDevice;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PppConfigWriter implements NetworkConfigurationVisitor {
+
+    private static final Logger s_logger = LoggerFactory.getLogger(PppConfigWriter.class);
+
+    public static final String OS_PEERS_DIRECTORY = "/etc/ppp/peers/";
+    public static final String OS_PPP_LOG_DIRECTORY = "/var/log/";
+    public static final String OS_SCRIPTS_DIRECTORY = "/etc/ppp/scripts/";
+    public static final String DNS_DELIM = ",";
+    
+    private static PppConfigWriter s_instance;
+    
+    public static PppConfigWriter getInstance() {
+        if(s_instance == null) {
+            s_instance = new PppConfigWriter();            
+        }
+        
+        return s_instance;
+    }
+    
+    private PppConfigWriter() {
+        File peersDir = new File(OS_PEERS_DIRECTORY);
+        if(!peersDir.exists()) {
+            if(peersDir.mkdirs()) {
+                s_logger.debug("Created directory: " + OS_PEERS_DIRECTORY);
+            } else {
+                s_logger.warn("Could not create peers directory: " + OS_PEERS_DIRECTORY);
+            }
+        }
+        
+        File scriptsDir = new File(OS_SCRIPTS_DIRECTORY);
+        if(!scriptsDir.exists()) {
+            if(scriptsDir.mkdirs()) {
+                s_logger.debug("Created directory: " + OS_SCRIPTS_DIRECTORY);
+            } else {
+                s_logger.warn("Could not create scripts directory: " + OS_SCRIPTS_DIRECTORY);
+            }
+        }
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+    	
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig instanceof ModemInterfaceConfigImpl) {
+                writeConfig((ModemInterfaceConfigImpl)netInterfaceConfig);
+            }
+        }
+    }
+    
+    private void writeConfig(ModemInterfaceConfigImpl modemInterfaceConfig) throws KuraException {
+    	
+        String oldInterfaceName = modemInterfaceConfig.getName();
+        String newInterfaceName = modemInterfaceConfig.getName();
+        
+        // Get the configs
+        ModemConfig modemConfig = null;
+        NetConfigIP4 netConfigIP4 = null;
+
+        for(ModemInterfaceAddressConfig modemInterfaceAddressConfig : modemInterfaceConfig.getNetInterfaceAddresses()) {
+            for(NetConfig netConfig : modemInterfaceAddressConfig.getConfigs()) {
+                if(netConfig instanceof ModemConfig) {
+                    modemConfig = (ModemConfig) netConfig;
+                } else if(netConfig instanceof NetConfigIP4) {
+                	netConfigIP4 = (NetConfigIP4) netConfig;
+                }
+            }
+        }
+         
+        // Use the ppp number for the interface name, if configured
+        int pppNum = -1;
+        if(modemConfig != null) {
+            pppNum = modemConfig.getPppNumber();
+            if(pppNum >= 0) {
+                newInterfaceName = "ppp" + pppNum;
+                modemInterfaceConfig.setName(newInterfaceName);
+            }
+        }
+
+        // Save the status and priority
+        IfcfgConfigWriter.writeKuraExtendedConfig(modemInterfaceConfig);
+        
+        Class<? extends ModemPppConfigGenerator> configClass = null;
+        UsbDevice usbDevice = modemInterfaceConfig.getUsbDevice();
+        int baudRate = -1;
+		if (usbDevice != null) {
+			SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem(usbDevice);
+			UsbModemFactoryInfo usbFactoryInfo = SupportedUsbModemsFactoryInfo.getModem(modemInfo);
+			if (usbFactoryInfo != null) {
+				configClass = usbFactoryInfo.getConfigGeneratorClass();
+			}
+			baudRate = 921600;
+		} else {
+			SupportedSerialModemInfo serialModemInfo = SupportedSerialModemsInfo.getModem();
+			SerialModemFactoryInfo serialFactoryInfo = SupportedSerialModemsFactoryInfo.getModem(serialModemInfo);
+			configClass = serialFactoryInfo.getConfigGeneratorClass();
+			baudRate = serialModemInfo.getDriver().getComm().getBaudRate();
+		}
+		
+		String pppPeerFilename = formPeerFilename(usbDevice);
+		String pppLogfile = formPppLogFilename(usbDevice);
+		String chatFilename = formChatFilename(usbDevice);
+		String disconnectFilename = formDisconnectFilename(usbDevice);
+
+		/*
+		String tmpPppPeerFilename = new StringBuffer().append(pppPeerFilename).append(".tmp").toString();
+		String tmpPppLogfile = new StringBuffer().append(pppLogfile).append(".tmp").toString();
+		String tmpChatFilename = new StringBuffer().append(chatFilename).append(".tmp").toString();
+		String tmpDisconnectFilename = new StringBuffer().append(chatFilename).append(".tmp").toString();
+		*/
+		
+		// Cleanup values associated with the old name if the interface name has changed
+		if (!oldInterfaceName.equals(newInterfaceName)) {
+			try {
+				// Remove the old ppp peers symlink
+				s_logger.debug("Removing old symlinks to " + pppPeerFilename);
+				removeSymbolicLinks(pppPeerFilename, OS_PEERS_DIRECTORY);
+				
+				// Remove the old modem identifier
+				StringBuilder key = new StringBuilder("net.interface.").append(oldInterfaceName).append(".modem.identifier");
+				s_logger.debug("Removing modem identifier for " + oldInterfaceName);
+				KuranetConfig.deleteProperty(key.toString());
+				
+				// Remove custom dns servers
+				key = new StringBuilder("net.interface.").append(oldInterfaceName).append(".config.dnsServers");
+				s_logger.debug("Removing dns servers for " + oldInterfaceName);
+				KuranetConfig.deleteProperty(key.toString());
+				
+				// Remove gpsEnabled 
+				key = new StringBuilder().append("net.interface.").append(oldInterfaceName).append(".config.gpsEnabled");
+				s_logger.debug("Removing gpsEnabled for " + oldInterfaceName);
+				KuranetConfig.deleteProperty(key.toString());
+				
+				// Remove status
+				IfcfgConfigWriter.removeKuraExtendedConfig(oldInterfaceName);
+			} catch (IOException e) {
+				throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+			}
+		}
+            
+		if (configClass != null) {
+			try {
+				ModemPppConfigGenerator scriptGenerator = configClass
+						.newInstance();
+
+				if (modemConfig != null) {
+					s_logger.debug("Writing connect scripts for " + modemInterfaceConfig.getName() + " using " + configClass.toString());
+
+					s_logger.debug("Writing " + pppPeerFilename);
+					PppPeer pppPeer = scriptGenerator.getPppPeer(getDeviceId(usbDevice), modemConfig,pppLogfile, chatFilename, disconnectFilename);
+					pppPeer.setBaudRate(baudRate);
+					pppPeer.write(pppPeerFilename);
+
+					s_logger.debug("Writing " + chatFilename);
+					ModemXchangeScript connectScript = scriptGenerator.getConnectScript(modemConfig);
+					connectScript.writeScript(chatFilename);
+
+					s_logger.debug("Writing " + disconnectFilename);
+					ModemXchangeScript disconnectScript = scriptGenerator.getDisconnectScript(modemConfig);
+					disconnectScript.writeScript(disconnectFilename);
+
+					if (pppNum >= 0) {
+						s_logger.debug("Linking peer file using ppp number: " + pppNum);
+						String symlinkFilename = formPeerLinkAbsoluteName(pppNum);
+						LinuxFileUtil.createSymbolicLink(pppPeerFilename, symlinkFilename);
+					} else {
+						s_logger.error("Can't create symbolic link to " + pppPeerFilename + ", invalid ppp number: " + pppNum);
+					}
+
+					String modemIdentifier = modemInterfaceConfig.getModemIdentifier();
+					if (modemIdentifier != null) {
+						StringBuilder key = new StringBuilder("net.interface.").append(modemInterfaceConfig.getName()).append(".modem.identifier");
+						s_logger.debug("Storing modem identifier " + modemIdentifier + " using key: " + key);
+						KuranetConfig.setProperty(key.toString(), modemIdentifier);
+					}
+					
+					// Custom dns servers
+					if (netConfigIP4 != null) {
+						StringBuilder key = new StringBuilder("net.interface.").append(modemInterfaceConfig.getName()).append(".config.dnsServers");
+
+						List<IP4Address> dnsServers = netConfigIP4.getDnsServers();
+						if(dnsServers != null && !dnsServers.isEmpty()) {
+							StringBuilder serversSB = new StringBuilder();
+							
+							Iterator<IP4Address> it = dnsServers.iterator();
+							serversSB.append(it.next().getHostAddress());
+							while(it.hasNext()) {
+								serversSB.append(DNS_DELIM).append(it.next().getHostAddress());
+							}
+
+							s_logger.debug("Storing DNS servers " + serversSB + " using key: " + key);
+							KuranetConfig.setProperty(key.toString(), serversSB.toString());
+						} else {
+							KuranetConfig.deleteProperty(key.toString());
+						}
+					}
+					
+					StringBuilder key = new StringBuilder().append("net.interface.").append(newInterfaceName).append(".config.gpsEnabled");
+					s_logger.debug("Setting gpsEnabled for " + newInterfaceName);
+					KuranetConfig.setProperty(key.toString(), Boolean.toString(modemConfig.isGpsEnabled()));
+				} else {
+					s_logger.error("Error writing connect scripts - modemConfig is null");
+				}
+			} catch (Exception e) {
+				s_logger.error("Could not write modem config", e);
+			}
+		}
+    }
+    
+    public static String formPeerFilename(UsbDevice usbDevice) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(OS_PEERS_DIRECTORY);
+        buf.append(formBaseFilename(usbDevice));
+        return buf.toString();
+    }
+    
+    public static String formPppLogFilename(UsbDevice usbDevice) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(OS_PPP_LOG_DIRECTORY);
+        buf.append(formBaseFilename(usbDevice));
+        return buf.toString();
+    }
+
+    public static String formChatFilename(UsbDevice usbDevice) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(OS_SCRIPTS_DIRECTORY);
+        buf.append("chat");
+        buf.append('_');
+        buf.append(formBaseFilename(usbDevice));
+        return buf.toString();
+    }
+    
+    public static String formPeerLinkName(int pppUnitNo) {
+        StringBuffer peerLinkName = new StringBuffer();
+        peerLinkName.append("ppp");
+        peerLinkName.append(pppUnitNo);
+
+        return peerLinkName.toString();
+    }
+
+    public static String formPeerLinkAbsoluteName(int pppUnitNo) {
+        StringBuffer peerLink = new StringBuffer();
+        peerLink.append(OS_PEERS_DIRECTORY);
+        peerLink.append(formPeerLinkName(pppUnitNo));
+        return peerLink.toString();
+    }
+
+    public static String formDisconnectFilename(UsbDevice usbDevice) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(OS_SCRIPTS_DIRECTORY);
+        buf.append("disconnect");
+        buf.append('_');
+        buf.append(formBaseFilename(usbDevice));
+        return buf.toString();
+    }
+    
+    private static String formBaseFilename(UsbDevice usbDevice) {
+        StringBuffer sb = new StringBuffer();
+        
+        if(usbDevice != null) {
+            SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem(usbDevice);
+            if(modemInfo != null) {
+                sb.append(modemInfo.getDeviceName());
+                sb.append('_');
+                sb.append(usbDevice.getUsbPort());
+            }
+        } else {
+        	SupportedSerialModemInfo modemInfo = SupportedSerialModemsInfo.getModem();
+        	if(modemInfo != null) {
+        		sb.append(modemInfo.getModemName());
+        	}
+        }
+        return sb.toString();
+    }
+    
+	private static String getDeviceId(UsbDevice usbDevice) {
+
+		StringBuffer sb = new StringBuffer();
+		if (usbDevice != null) {
+			SupportedUsbModemInfo modemInfo = SupportedUsbModemsInfo.getModem(usbDevice);
+			if (modemInfo != null) {
+				sb.append(modemInfo.getDeviceName());
+			}
+		} else {
+			SupportedSerialModemInfo modemInfo = SupportedSerialModemsInfo.getModem();
+			if (modemInfo != null) {
+				sb.append(modemInfo.getModemName());
+			}
+		}
+
+		return sb.toString();
+	}
+
+    // Delete all symbolic links to the specified target file in the specified directory
+    private void removeSymbolicLinks(String target, String directory) throws IOException {
+        File targetFile = new File(target);
+        File dir = new File(directory);
+        if(dir.isDirectory()) {
+            for(File file : dir.listFiles()) {
+                if(file.getAbsolutePath().equals(targetFile.getAbsolutePath())) {
+                    // this is the target file
+                    continue;
+                }
+                
+                if(file.getCanonicalPath().equals(targetFile.getAbsolutePath())) {
+                    s_logger.debug("Deleting " + file.getAbsolutePath());
+                    file.delete();
+                }
+            }
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WifiConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WifiConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..871a217ef1211203b68e3db178611d34c5cae9eb
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WifiConfigReader.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class WifiConfigReader implements NetworkConfigurationVisitor{
+
+    private static final Logger s_logger = LoggerFactory.getLogger(WifiConfigReader.class);
+            
+    private static WifiConfigReader s_instance;
+    
+    private List<NetworkConfigurationVisitor> m_visitors;
+    
+    private WifiConfigReader() {
+        m_visitors = new ArrayList<NetworkConfigurationVisitor>();
+        m_visitors.add(WpaSupplicantConfigReader.getInstance());
+        m_visitors.add(HostapdConfigReader.getInstance());
+    }
+    
+    public static WifiConfigReader getInstance() {
+        if(s_instance == null) {
+            s_instance = new WifiConfigReader();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                getConfig((WifiInterfaceConfigImpl)netInterfaceConfig);
+            }
+        }
+        
+        // Get wpa_supplicant and hostapd configs
+        for(NetworkConfigurationVisitor visitor : m_visitors) {
+            visitor.visit(config);
+        }
+    }
+
+    // Get common wifi config
+    private void getConfig(WifiInterfaceConfigImpl wifiInterfaceConfig) throws KuraException {
+        String interfaceName = wifiInterfaceConfig.getName();
+        s_logger.debug("Getting wifi config for " + interfaceName);
+        
+        List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = wifiInterfaceConfig.getNetInterfaceAddresses();
+        
+        if(wifiInterfaceAddressConfigs == null || wifiInterfaceAddressConfigs.size() == 0) { 
+            wifiInterfaceAddressConfigs = new ArrayList<WifiInterfaceAddressConfig>();
+            wifiInterfaceAddressConfigs.add(new WifiInterfaceAddressConfigImpl());
+            wifiInterfaceConfig.setNetInterfaceAddresses(wifiInterfaceAddressConfigs);
+        }
+        
+        for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceAddressConfigs) {
+            if(wifiInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+                StringBuilder wifiModeKey = new StringBuilder("net.interface.").append(interfaceName).append(".config.wifi.mode");
+                
+                WifiMode wifiMode = WifiMode.UNKNOWN;
+                String wifiModeString = KuranetConfig.getProperty(wifiModeKey.toString());
+                if(wifiModeString != null) {
+                    wifiMode = WifiMode.valueOf(wifiModeString);
+                }
+                
+                s_logger.debug("Got wifiMode: " + wifiMode);
+                ((WifiInterfaceAddressConfigImpl) wifiInterfaceAddressConfig).setMode(wifiMode);
+            }
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WifiConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WifiConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..9627dc69c301bb4d4399474846f6cf834caeb38b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WifiConfigWriter.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class WifiConfigWriter implements NetworkConfigurationVisitor{
+
+    private static final Logger s_logger = LoggerFactory.getLogger(WifiConfigWriter.class);
+            
+    private static WifiConfigWriter s_instance;
+    
+    private List<NetworkConfigurationVisitor> m_visitors;
+    
+    private WifiConfigWriter() {
+        m_visitors = new ArrayList<NetworkConfigurationVisitor>();
+        m_visitors.add(WpaSupplicantConfigWriter.getInstance());
+        m_visitors.add(HostapdConfigWriter.getInstance());
+    }
+    
+    public static WifiConfigWriter getInstance() {
+        if(s_instance == null) {
+            s_instance = new WifiConfigWriter();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                writeConfig((WifiInterfaceConfigImpl)netInterfaceConfig);
+            }
+        }
+        
+        // Write wpa_supplicant and hostapd configs
+        for(NetworkConfigurationVisitor visitor : m_visitors) {
+            visitor.visit(config);
+        }
+    }
+
+    // Write common wifi config
+    private void writeConfig(WifiInterfaceConfigImpl wifiInterfaceConfig) throws KuraException {
+        String interfaceName = wifiInterfaceConfig.getName();
+        s_logger.debug("Writing wifi config for " + interfaceName);
+        
+        List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = wifiInterfaceConfig.getNetInterfaceAddresses();
+        
+        if(wifiInterfaceAddressConfigs != null) { 
+            for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceAddressConfigs) {
+                // Store the selected wifi mode
+                WifiMode wifiMode = wifiInterfaceAddressConfig.getMode();
+
+                s_logger.debug("Store wifiMode: " + wifiMode);
+                StringBuilder key = new StringBuilder("net.interface." + interfaceName + ".config.wifi.mode");
+                try {
+                    KuranetConfig.setProperty(key.toString(), wifiMode.toString());
+                } catch (Exception e) {
+                    s_logger.error("Failed to save kuranet config", e);
+                    throw KuraException.internalError(e);
+                }
+            }
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WpaSupplicantConfigReader.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WpaSupplicantConfigReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..3854124822f4243d0381b61131edb1059b61dabc
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WpaSupplicantConfigReader.java
@@ -0,0 +1,321 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.net.WifiInterfaceConfigImpl;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.WpaSupplicantUtil;
+import org.eclipse.kura.net.wifi.WifiBgscan;
+import org.eclipse.kura.net.wifi.WifiCiphers;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class WpaSupplicantConfigReader implements NetworkConfigurationVisitor {
+
+    private static final Logger s_logger = LoggerFactory.getLogger(WpaSupplicantConfigReader.class);
+    
+    private static final String WPA_CONFIG_FILE = "/etc/wpa_supplicant.conf";
+
+    private static WpaSupplicantConfigReader s_instance;
+    
+    public static WpaSupplicantConfigReader getInstance() {
+        if(s_instance == null) {
+            s_instance = new WpaSupplicantConfigReader();
+        }
+        
+        return s_instance;
+    }
+    
+    @Override
+    public void visit(NetworkConfiguration config) throws KuraException {
+        List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getNetInterfaceConfigs();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig instanceof WifiInterfaceConfigImpl) {
+                getConfig((WifiInterfaceConfigImpl)netInterfaceConfig);
+            }
+        }
+    }
+    
+    private void getConfig(WifiInterfaceConfigImpl wifiInterfaceConfig) throws KuraException {
+        String interfaceName = wifiInterfaceConfig.getName();
+        s_logger.debug("Getting wpa_supplicant config for " + interfaceName);
+        
+        List<WifiInterfaceAddressConfig> wifiInterfaceAddressConfigs = wifiInterfaceConfig.getNetInterfaceAddresses();
+        
+        if(wifiInterfaceAddressConfigs == null || wifiInterfaceAddressConfigs.size() == 0) { 
+        	wifiInterfaceAddressConfigs = new ArrayList<WifiInterfaceAddressConfig>();
+        	wifiInterfaceAddressConfigs.add(new WifiInterfaceAddressConfigImpl());
+        	wifiInterfaceConfig.setNetInterfaceAddresses(wifiInterfaceAddressConfigs);
+        }
+        
+        for(WifiInterfaceAddressConfig wifiInterfaceAddressConfig : wifiInterfaceAddressConfigs) {
+            if(wifiInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+                List<NetConfig> netConfigs = wifiInterfaceAddressConfig.getConfigs();
+                
+                if(netConfigs == null) {
+                    netConfigs = new ArrayList<NetConfig>();
+                    ((WifiInterfaceAddressConfigImpl)wifiInterfaceAddressConfig).setNetConfigs(netConfigs);
+                }
+                
+                // Get infrastructure config
+            	netConfigs.add(getWifiClientConfig(interfaceName, WifiMode.INFRA));
+                
+		/*
+                // Get adhoc config
+                WifiConfig adhocConfig = new WifiConfig();                
+                setWifiClientConfig(adhocConfig, interfaceName, WifiMode.ADHOC);                
+                netConfigs.add(adhocConfig);
+		*/
+            }
+        }
+    }
+    
+    private static WifiConfig getWifiClientConfig(String ifaceName, WifiMode wifiMode) throws KuraException {
+        
+    	WifiConfig wifiConfig = new WifiConfig();
+        
+        String ssid = "";
+        WifiSecurity wifiSecurity = WifiSecurity.NONE;
+        String password = "";
+        int [] channels = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
+        WifiBgscan bgscan = new WifiBgscan("");
+        WifiCiphers pairwiseCiphers = null;
+        WifiCiphers groupCiphers = null;
+
+    	// Get properties from config file
+        Properties props = parseConfigFile();
+        
+        if (props == null) {
+            s_logger.warn("WPA in client mode is not configured");
+        } else {
+	        ssid = props.getProperty("ssid");
+	        if(ssid == null) {
+	            s_logger.warn("WPA in client mode is not configured");
+	        } else {
+		        s_logger.debug("curent wpa_supplicant.conf: ssid=" + ssid);
+		        
+		        // wifi mode
+		        int currentMode = (props.getProperty("mode") != null) ? Integer.parseInt(props.getProperty("mode")) : WpaSupplicantUtil.MODE_INFRA;
+		        s_logger.debug("current wpa_supplicant.conf: mode=" + currentMode);
+		
+		        switch (wifiMode) {
+		        case INFRA:
+		            String scan_freq = props.getProperty("scan_freq");
+		            if (scan_freq != null) {
+		                s_logger.debug("current wpa_supplicant.conf: scan_freq=" + scan_freq);
+		                String [] saScanFreq = scan_freq.split(" ");
+		                channels = new int [saScanFreq.length];
+		                for (int i = 0; i < channels.length; i++) {
+		                    try {
+		                        channels[i] = WpaSupplicantUtil.convFrequencyToChannel(Integer.parseInt(saScanFreq[i]));
+		                    } catch (NumberFormatException e) {
+		                    }
+		                }
+		            }
+		            break;
+			/*
+		        case ADHOC:
+		            channels = new int [1];
+		            String frequency = props.getProperty("frequency");
+		            s_logger.debug("current wpa_supplicant.conf: frequency=" + frequency);
+		            int freq = 2412;
+		            if (frequency != null) { 
+		                try {
+		                    freq = Integer.parseInt(frequency);
+		                } catch (NumberFormatException e) {
+		                }
+		            }
+		            channels[0] = WpaSupplicantUtil.convFrequencyToChannel(freq);
+		            wifiDriver = KuranetConfig.getProperty(adhocDriverKey.toString());
+		            if(wifiDriver == null) {
+		                wifiDriver = KuranetConfig.getProperty(infraDriverKey.toString());
+		            }
+		            break;
+			*/
+		        case MASTER:
+		            throw KuraException
+		                    .internalError("failed to get wpa_supplicant configuration: MASTER mode is invalid");
+		        default:
+		            throw KuraException
+		                .internalError("failed to get wpa_supplicant configuration: invalid mode: " + wifiMode);
+		        }
+		        
+		        String proto = props.getProperty("proto");
+		        if (proto != null) {
+		            s_logger.debug("current wpa_supplicant.conf: proto=" + proto);
+		        }
+		        
+		        String pairwise = props.getProperty("pairwise");
+		        if (pairwise != null) {
+		            s_logger.debug("current wpa_supplicant.conf: pairwise=" + pairwise);
+		            if(pairwise.contains(WifiCiphers.toString(WifiCiphers.CCMP_TKIP))) {
+		                pairwiseCiphers = WifiCiphers.CCMP_TKIP;
+		            } else if(pairwise.contains(WifiCiphers.toString(WifiCiphers.TKIP))) {
+		                pairwiseCiphers = WifiCiphers.TKIP;
+		            } else if(pairwise.contains(WifiCiphers.toString(WifiCiphers.CCMP))) {
+		                pairwiseCiphers = WifiCiphers.CCMP;
+		            } 
+		        }
+		        
+		        String group = props.getProperty("group");
+		        if (group != null) {
+		            s_logger.debug("current wpa_supplicant.conf: group=" + group);
+		            if(group.contains(WifiCiphers.toString(WifiCiphers.CCMP_TKIP))) {
+		                groupCiphers = WifiCiphers.CCMP_TKIP;
+		            } else if(group.contains(WifiCiphers.toString(WifiCiphers.TKIP))) {
+		                groupCiphers = WifiCiphers.TKIP;
+		            } else if(group.contains(WifiCiphers.toString(WifiCiphers.CCMP))) {
+		                groupCiphers = WifiCiphers.CCMP;
+		            } 
+		        }
+		        
+		        // security
+		        String keyMgmt = props.getProperty("key_mgmt");
+		        s_logger.debug("current wpa_supplicant.conf: key_mgmt=" + keyMgmt);
+		        if (keyMgmt != null && keyMgmt.equalsIgnoreCase("WPA-PSK")) {
+		            password = props.getProperty("psk");
+		            if (proto != null) {
+						if(proto.trim().equals("WPA")) {
+							wifiSecurity = WifiSecurity.SECURITY_WPA;
+						} else if(proto.trim().equals("RSN")) {
+							wifiSecurity = WifiSecurity.SECURITY_WPA2;
+						} else if(proto.trim().equals("WPA RSN")) {
+							wifiSecurity = WifiSecurity.SECURITY_WPA_WPA2;
+						}
+					} else {
+						wifiSecurity = WifiSecurity.SECURITY_WPA2;
+					}
+		        } else {
+		            password = props.getProperty("wep_key0");
+		            if (password != null) {
+		                wifiSecurity = WifiSecurity.SECURITY_WEP;
+		            } else {
+		                wifiSecurity = WifiSecurity.SECURITY_NONE;
+		            }
+		            pairwiseCiphers = null;
+		            groupCiphers = null;
+		        }
+		        if(password == null) {
+		        	password = "";
+		        }
+		        
+		        String sBgscan = props.getProperty("bgscan");
+		        if (sBgscan != null) {
+		            s_logger.debug("current wpa_supplicant.conf: bgscan=" + sBgscan);
+		            bgscan = new WifiBgscan(sBgscan);
+		        }
+	        }
+        }
+         
+        // Populate the config
+        wifiConfig.setMode(wifiMode);
+        wifiConfig.setSSID(ssid);
+        wifiConfig.setSecurity(wifiSecurity);
+        wifiConfig.setPasskey(password);
+        wifiConfig.setHardwareMode("");
+        wifiConfig.setPairwiseCiphers(pairwiseCiphers);
+        wifiConfig.setGroupCiphers(groupCiphers);
+        wifiConfig.setChannels(channels);
+        wifiConfig.setBgscan(bgscan);
+        
+		boolean pingAP = false;
+        StringBuilder key = new StringBuilder().append("net.interface.").append(ifaceName).append(".config.wifi.infra.pingAccessPoint");
+        String statusString = KuranetConfig.getProperty(key.toString());
+        if(statusString != null && !statusString.isEmpty()) {
+        	pingAP = Boolean.parseBoolean(statusString);
+        }
+        
+		wifiConfig.setPingAccessPoint(pingAP);
+        
+    	// Get self-stored properties
+        StringBuilder infraDriverKey = new StringBuilder("net.interface.").append(ifaceName).append(".config.wifi.infra.driver");
+        //StringBuilder adhocDriverKey = new StringBuilder("net.interface.").append(ifaceName).append(".config.wifi.adhoc.driver");
+        String wifiDriver = KuranetConfig.getProperty(infraDriverKey.toString());
+        if(wifiDriver == null || wifiDriver.isEmpty()) {
+        	wifiDriver = "nl80211";
+        }
+        wifiConfig.setDriver(wifiDriver);
+
+        return wifiConfig;
+    }
+    
+    private static Properties parseConfigFile () throws KuraException {
+        
+        Properties props = null;
+        
+        try {
+            File wpaConfigFile = new File(WPA_CONFIG_FILE);
+            if (wpaConfigFile.exists()) {
+    
+                // Read into a string
+                BufferedReader br = new BufferedReader(
+                        new FileReader(wpaConfigFile));
+                StringBuilder sb = new StringBuilder();
+                String line = null;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line).append("\n");
+                }
+                br.close();
+    
+                String newConfig = null;
+                int beginIndex = sb.toString().indexOf("network");
+                int endIndex = sb.toString().indexOf('}');
+                if ((beginIndex >= 0) && (endIndex > beginIndex)) {
+                    newConfig = sb.toString().substring(beginIndex, endIndex);
+                    beginIndex = newConfig.indexOf('{');
+                    if (beginIndex >= 0) {
+                        newConfig = newConfig.substring(beginIndex + 1);
+                        props = new Properties();
+                        props.load(new StringReader(newConfig));
+                        Enumeration<Object> keys = props.keys();
+                        while (keys.hasMoreElements()) {
+                            String key = keys.nextElement().toString();
+                            String val = props.getProperty(key);
+                            if (val != null) {
+                                if(val.startsWith("\"") && val.endsWith("\"") && val.length() > 1) {
+                                    props.setProperty(key, val.substring(1, val.length()-1));
+                                }
+                            }
+                        }       
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw KuraException
+                    .internalError("wpa_supplicant failed to parse its configuration file");
+        }
+
+        return props;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WpaSupplicantConfigWriter.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WpaSupplicantConfigWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..282a0885b7c34823a01d4a91cff1402bce03848b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/WpaSupplicantConfigWriter.java
@@ -0,0 +1,567 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.NetworkConfiguration;
+import org.eclipse.kura.core.net.NetworkConfigurationVisitor;
+import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl;
+import org.eclipse.kura.core.util.ProcessUtil;
+import org.eclipse.kura.linux.net.util.KuraConstants;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig;
+import org.eclipse.kura.net.admin.visitor.linux.util.WpaSupplicantUtil;
+import org.eclipse.kura.net.wifi.WifiCiphers;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WpaSupplicantConfigWriter implements NetworkConfigurationVisitor {
+	private static final Logger s_logger = LoggerFactory.getLogger(WpaSupplicantConfigWriter.class);
+	
+	private static final String WPA_CONFIG_FILE = "/etc/wpa_supplicant.conf";
+	private static final String WPA_TMP_CONFIG_FILE = "/etc/wpa_supplicant.conf.tmp";
+	private static final String TMP_WPA_CONFIG_FILE = "/tmp/wpa_supplicant.conf";
+	
+	private static final String OS_VERSION = System.getProperty("kura.os.version");
+	
+	private static final String HEXES = "0123456789ABCDEF";
+	
+	private static WpaSupplicantConfigWriter s_instance;
+	
+	public static WpaSupplicantConfigWriter getInstance() {
+		if (s_instance == null) {
+			s_instance = new WpaSupplicantConfigWriter();
+		}
+		
+		return s_instance;
+	}
+
+	@Override
+	public void visit(NetworkConfiguration config) throws KuraException {
+		List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config.getModifiedNetInterfaceConfigs();
+        
+        for(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) {
+            if(netInterfaceConfig.getType() == NetInterfaceType.WIFI) {
+                // ignore 'mon' interface
+                if(netInterfaceConfig.getName().startsWith("mon.")) {
+                    continue;
+                }
+                
+                writeConfig(netInterfaceConfig);
+            }
+        }
+
+	}
+	
+	public void generateTempWpaSupplicantConf(WifiConfig wifiConfig, String interfaceName) throws KuraException {
+
+		try {
+			this.generateWpaSupplicantConf(wifiConfig, interfaceName, TMP_WPA_CONFIG_FILE);
+		} catch (Exception e) {
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void generateTempWpaSupplicantConf() throws KuraException {
+		
+		InputStream is = getClass().getResourceAsStream("/src/main/resources/wifi/wpasupplicant.conf");;
+		try {
+			String fileAsString = readInputStreamAsString(is);
+			File outputFile = new File(TMP_WPA_CONFIG_FILE);
+			copyFile(fileAsString, outputFile);
+		} catch (Exception e) {
+			throw KuraException.internalError("Failed to generate wpa_supplicant.conf");
+		}
+	}
+	
+	private void writeConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig) throws KuraException{
+		String interfaceName = netInterfaceConfig.getName();
+        s_logger.debug("Writing wpa_supplicant config for " + interfaceName);
+        
+        List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig.getNetInterfaceAddresses();
+        
+        if(netInterfaceAddressConfigs.size() > 0) {
+        
+	        for(NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) {
+	        	if(netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) {
+	        		List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs();
+	        		NetInterfaceStatus netInterfaceStatus = NetInterfaceStatus.netIPv4StatusDisabled;
+	        		WifiMode wifiMode = ((WifiInterfaceAddressConfigImpl) netInterfaceAddressConfig).getMode();
+	        		WifiConfig infraConfig = null;
+	        		WifiConfig adhocConfig = null;
+	        		WifiConfig wpaSupplicantConfig = null;
+	        		
+	        		// Get the wifi configs
+	        		if(netConfigs != null) {
+	        			for(NetConfig netConfig : netConfigs){
+				        	if(netConfig instanceof WifiConfig) {
+				        	    if(((WifiConfig) netConfig).getMode() == WifiMode.ADHOC) {
+				        	        adhocConfig = (WifiConfig) netConfig;
+				        	    } else if (((WifiConfig) netConfig).getMode() == WifiMode.INFRA) {
+				        	        infraConfig = (WifiConfig) netConfig;
+				        	    }
+				        	} else  if(netConfig instanceof NetConfigIP4) {
+	    						netInterfaceStatus = ((NetConfigIP4) netConfig).getStatus();
+	    					}
+	        			}
+	        		}
+	        		
+	        		if(netInterfaceStatus == NetInterfaceStatus.netIPv4StatusDisabled) {
+	        			s_logger.info("Network interface status for " + interfaceName + " is disabled - not overwriting wpaconfig file");
+	        			return;
+	        		}
+
+                    // Choose which config to write
+                    if(wifiMode == WifiMode.INFRA) {
+                        if(infraConfig != null) {
+                        	StringBuilder key = new StringBuilder().append("net.interface.").append(interfaceName).append(".config.wifi.infra.pingAccessPoint");
+        					try {
+    							KuranetConfig.setProperty(key.toString(), Boolean.toString(infraConfig.pingAccessPoint()));
+    						} catch (IOException e) {
+    							e.printStackTrace();
+    						}
+                            wpaSupplicantConfig = infraConfig;
+                        } else {
+                            s_logger.debug("Not updating wpa_supplicant config - wifi mode is " + wifiMode + " but the infra config is null");
+                        }
+                    } else if (wifiMode == WifiMode.ADHOC) {
+                        if(adhocConfig != null) {
+                            wpaSupplicantConfig = adhocConfig;
+                        } else {
+                            s_logger.debug("Not updating wpa_supplicant config - wifi mode is " + wifiMode + " but the adhoc config is null");
+                        }
+                    } else if (wifiMode == WifiMode.MASTER) {
+                        if(infraConfig != null && adhocConfig != null) {
+                            wpaSupplicantConfig = infraConfig;      // Choose the infra config if both are present?
+                        } else if (infraConfig != null) {
+                            wpaSupplicantConfig = infraConfig;
+                        } else if (adhocConfig != null) {
+                            wpaSupplicantConfig = adhocConfig;
+                        } else {
+                            s_logger.debug("Not updating wpa_supplicant config - wifi mode is " + wifiMode + " and the infra and adhoc configs are null");
+                        }
+                    }
+
+                    // Write the config
+	        		try {
+    	        		if(wpaSupplicantConfig != null) {
+                            s_logger.debug("Writing wifiConfig: " + wpaSupplicantConfig);
+                            generateWpaSupplicantConf(wpaSupplicantConfig, interfaceName, WPA_TMP_CONFIG_FILE);
+                            moveWpaSupplicantConf(WPA_TMP_CONFIG_FILE);
+    	        		}
+                    } catch (Exception e) {
+                        s_logger.error("Failed to configure WPA Supplicant");
+                        throw KuraException.internalError(e);
+                    }
+	        	}
+	        }
+        }
+	}
+	
+	/*
+	 * This method generates the wpa_supplicant configuration file
+	 */
+	private void generateWpaSupplicantConf(WifiConfig wifiConfig, String interfaceName, String configFile) throws Exception {
+		s_logger.debug("Generating WPA Supplicant Config");
+		s_logger.debug("Store wifiMode driver: " + wifiConfig.getDriver());
+        StringBuilder key = new StringBuilder("net.interface." +  interfaceName + ".config.wifi." + wifiConfig.getMode().toString().toLowerCase() + ".driver");
+		try {
+            KuranetConfig.setProperty(key.toString(), wifiConfig.getDriver());
+        } catch (Exception e) {
+            s_logger.error("Failed to save kuranet config", e);
+            throw KuraException.internalError(e);
+        }
+		if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WEP) {
+			File outputFile = new File(configFile);
+			
+			InputStream is = null;
+			String fileAsString = null;
+			
+			if (wifiConfig.getMode() == WifiMode.INFRA) {
+				is = getClass().getResourceAsStream("/src/main/resources/wifi/wpasupplicant.conf_wep");
+				fileAsString = readInputStreamAsString(is);
+			} else if (wifiConfig.getMode() == WifiMode.ADHOC) { 
+				is = getClass().getResourceAsStream("/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep");
+				fileAsString = readInputStreamAsString(is);
+				fileAsString = fileAsString.replaceFirst("KURA_FREQUENCY", Integer.toString(
+						WpaSupplicantUtil.convChannelToFrequency(wifiConfig.getChannels()[0])));
+			} else {
+				throw KuraException.internalError("Failed to generate wpa_supplicant.conf -- Inavlid mode: " + wifiConfig.getMode());
+			}
+			
+			// Remove the 'wheel' group assignment for Yocto image on Raspberry_Pi
+			if (OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+				fileAsString = fileAsString.replaceFirst("ctrl_interface_group=wheel", "#ctrl_interface_group=wheel");
+			}
+			// Replace the necessary components
+			fileAsString = fileAsString.replaceFirst("KURA_MODE",
+					Integer.toString(getSupplicantMode(wifiConfig.getMode())));
+			if (wifiConfig.getSSID() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", wifiConfig.getSSID());
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			String passKey = wifiConfig.getPasskey();
+			if (passKey != null) {
+				if (passKey.length() == 10) {
+					// check to make sure it is all hex
+					try {
+						Long.parseLong(passKey, 16);
+					} catch (Exception e) {
+						throw KuraException
+								.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else if (passKey.length() == 26) {
+					String part1 = passKey.substring(0, 13);
+					String part2 = passKey.substring(13);
+
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+					} catch (Exception e) {
+						throw KuraException
+								.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else if (passKey.length() == 32) {
+					String part1 = passKey.substring(0, 10);
+					String part2 = passKey.substring(10, 20);
+					String part3 = passKey.substring(20);
+					try {
+						Long.parseLong(part1, 16);
+						Long.parseLong(part2, 16);
+						Long.parseLong(part3, 16);
+					} catch (Exception e) {
+						throw KuraException
+								.internalError("the WEP key (passwd) must be all HEX characters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, and f");
+					}
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else if ((passKey.length() == 5)
+						|| (passKey.length() == 13)
+						|| (passKey.length() == 16)) {
+
+					// 5, 13, or 16 ASCII characters
+					passKey = toHex(passKey);
+
+					// since we're here - save the password
+					fileAsString = fileAsString.replaceFirst("KURA_WEP_KEY", passKey);
+				} else {
+					throw KuraException
+							.internalError("the WEP key (passwd) must be 10, 26, or 32 HEX characters in length");
+				}
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+			
+			if (wifiConfig.getBgscan() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN",
+						wifiConfig.getBgscan().toString());
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", "");
+			}
+			
+			fileAsString = fileAsString.replaceFirst("KURA_SCANFREQ",
+					getScanFrequenciesMHz(wifiConfig.getChannels()));
+
+			// everything is set and we haven't failed - write the file
+			copyFile(fileAsString, outputFile);
+			return;
+		} else if ((wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA)
+				|| (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA2)) {
+
+			File outputFile = new File(configFile);
+			InputStream is = null;
+			String fileAsString = null;
+
+			if (wifiConfig.getMode() == WifiMode.INFRA) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_wpa");
+				fileAsString = readInputStreamAsString(is);
+			} else if (wifiConfig.getMode() == WifiMode.ADHOC) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa");
+				fileAsString = readInputStreamAsString(is);
+				fileAsString = fileAsString
+						.replaceFirst("KURA_FREQUENCY", Integer.toString(
+								WpaSupplicantUtil.convChannelToFrequency(wifiConfig.getChannels()[0])));
+				fileAsString = fileAsString
+						.replaceFirst("KURA_PAIRWISE", "NONE");
+			} else {
+				throw KuraException
+						.internalError("Failed to generate wpa_supplicant.conf -- Invalid mode: " + wifiConfig.getMode());
+			}
+			
+			// Remove the 'wheel' group assignment for Yocto image on Raspberry_Pi
+			if (OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+				fileAsString = fileAsString.replaceFirst("ctrl_interface_group=wheel", "#ctrl_interface_group=wheel");
+			}
+			// replace the necessary components
+			fileAsString = fileAsString.replaceFirst("KURA_MODE",
+					Integer.toString(getSupplicantMode(wifiConfig.getMode())));
+
+			if (wifiConfig.getSSID() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", wifiConfig.getSSID());
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			String passKey = wifiConfig.getPasskey();
+			if (passKey != null && passKey.trim().length() > 0) {
+				if ((passKey.length() < 8)
+						|| (passKey.length() > 63)) {
+					throw KuraException
+							.internalError("the WPA passphrase (passwd) must be between 8 (inclusive) and 63 (inclusive) characters in length: " + passKey);
+				} else {
+					fileAsString = fileAsString.replaceFirst("KURA_PASSPHRASE", passKey.trim());
+				}
+			} else {
+				throw KuraException.internalError("the passwd can not be null");
+			}
+			
+			if(wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA) {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "WPA");
+			} else if(wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA2) {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "RSN");
+			} else if(wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA_WPA2) {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "WPA RSN");
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_PROTO", "WPA RSN");
+			}
+
+			if (wifiConfig.getPairwiseCiphers() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_PAIRWISE", WifiCiphers.toString(wifiConfig.getPairwiseCiphers()));
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_PAIRWISE", "CCMP TKIP");
+			}
+
+			if (wifiConfig.getGroupCiphers() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_GROUP", WifiCiphers.toString(wifiConfig.getGroupCiphers()));
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_GROUP", "CCMP TKIP");
+			}
+			
+			if (wifiConfig.getBgscan() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", wifiConfig.getBgscan().toString());
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", "");
+			}
+
+			fileAsString = fileAsString.replaceFirst("KURA_SCANFREQ", getScanFrequenciesMHz(wifiConfig.getChannels()));
+			
+			// everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			return;
+		} else if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_NONE || wifiConfig.getSecurity() == WifiSecurity.NONE) {
+			File outputFile = new File(configFile);
+			InputStream is = null;
+			String fileAsString = null;
+
+			if (wifiConfig.getMode() == WifiMode.INFRA) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_open");
+				fileAsString = readInputStreamAsString(is);
+			} else if (wifiConfig.getMode() == WifiMode.ADHOC) {
+				is = this.getClass().getResourceAsStream(
+						"/src/main/resources/wifi/wpasupplicant.conf_adhoc_open");
+				fileAsString = readInputStreamAsString(is);
+				fileAsString = fileAsString
+						.replaceFirst("KURA_FREQUENCY", Integer.toString(
+								WpaSupplicantUtil.convChannelToFrequency(wifiConfig.getChannels()[0])));
+			} else {
+				throw KuraException
+						.internalError("Failed to generate wpa_supplicant.conf -- Invalid mode: " + wifiConfig.getMode());
+			}
+
+			// Remove the 'wheel' group assignment for Yocto image on Raspberry_Pi
+			if (OS_VERSION.equals(KuraConstants.Raspberry_Pi.getImageName())) {
+				fileAsString = fileAsString.replaceFirst("ctrl_interface_group=wheel", "#ctrl_interface_group=wheel");
+			}
+			// replace the necessary components
+			fileAsString = fileAsString.replaceFirst("KURA_MODE",
+					Integer.toString(getSupplicantMode(wifiConfig.getMode())));
+
+			if (wifiConfig.getSSID() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_ESSID", wifiConfig.getSSID());
+			} else {
+				throw KuraException.internalError("the essid can not be null");
+			}
+			
+			if (wifiConfig.getBgscan() != null) {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", wifiConfig.getBgscan().toString());
+			} else {
+				fileAsString = fileAsString.replaceFirst("KURA_BGSCAN", "");
+			}
+
+			fileAsString = fileAsString.replaceFirst("KURA_SCANFREQ", getScanFrequenciesMHz(wifiConfig.getChannels()));
+
+			// everything is set and we haven't failed - write the file
+			this.copyFile(fileAsString, outputFile);
+			return;
+		} else {
+			throw KuraException.internalError("unsupported security type: " + wifiConfig.getSecurity());
+		}
+	}
+	
+	private void moveWpaSupplicantConf(String configFile) throws KuraException {
+		
+		File outputFile = new File(configFile);
+		File wpaConfigFile = new File(WPA_CONFIG_FILE);
+		try {
+			if(!FileUtils.contentEquals(outputFile, wpaConfigFile)) {
+			    if(outputFile.renameTo(wpaConfigFile)){
+			    	s_logger.trace("Successfully wrote wpa_supplicant config file");
+			    }else{
+			    	s_logger.error("Failed to write wpa_supplicant config file");
+			    	throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for wpa_supplicant config");
+			    }
+			} else {
+				s_logger.info("Not rewriting wpa_supplicant.conf file because it is the same");
+			}
+		} catch (IOException e) {
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for wpa_supplicant config");
+		}
+	}
+	
+	/*
+	 * This method copies supplied String to a file
+	 */
+	private void copyFile(String data, File destination) throws KuraException {
+		try {
+			FileOutputStream fos = new FileOutputStream(destination);
+			PrintWriter pw = new PrintWriter(fos);
+			pw.write(data);
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+
+			setPermissions(destination.toString());
+		} catch (IOException e) {
+			throw KuraException.internalError(e);
+		}
+	}
+	
+	/*
+	 * This method sets permissions to the wpa_supplicant configuration file
+	 */
+	private void setPermissions(String fileName) throws KuraException {
+		Process procChmod = null;
+		Process procDos = null;
+		try {
+			procChmod = ProcessUtil.exec("chmod 600 " + fileName);
+			procChmod.waitFor();
+			procDos = ProcessUtil.exec("dos2unix " + fileName);
+			procDos.waitFor();
+		} catch (Exception e) {
+			throw KuraException.internalError(e);
+		}
+		finally {
+			ProcessUtil.destroy(procChmod);
+			ProcessUtil.destroy(procDos);
+		}
+	}
+	
+	/*
+	 * This method reads supplied input stream into a string
+	 */
+	private static String readInputStreamAsString(InputStream is) throws IOException {
+		BufferedInputStream bis = new BufferedInputStream(is);
+		ByteArrayOutputStream buf = new ByteArrayOutputStream();
+		int result = bis.read();
+		while (result != -1) {
+			byte b = (byte) result;
+			buf.write(b);
+			result = bis.read();
+		}
+		return buf.toString();
+	}
+	
+	/*
+	 * This method converts the supplied string to hex
+	 */
+	private String toHex(String s) {
+		if (s == null) {
+			return null;
+		}
+		byte[] raw = s.getBytes();
+		
+		StringBuffer hex = new StringBuffer(2 * raw.length);
+		for (int i = 0; i < raw.length; i++) {
+			hex.append(HEXES.charAt((raw[i] & 0xF0) >> 4)).append(
+					HEXES.charAt((raw[i] & 0x0F)));
+		}
+		return hex.toString();
+	}
+	
+	/*
+	 * This method returns the supplicant mode
+	 */
+	private static int getSupplicantMode(WifiMode mode) {
+		if (mode == WifiMode.ADHOC) {
+			return WpaSupplicantUtil.MODE_IBSS;
+		} else if (mode == WifiMode.MASTER) {
+			return WpaSupplicantUtil.MODE_AP;
+		} else {
+			return WpaSupplicantUtil.MODE_INFRA;
+		}
+	}
+	
+	/*
+	 * This method returns a list of frequencies based on a list of channels
+	 */
+	private String getScanFrequenciesMHz(int[] channels) {
+		StringBuffer sbFrequencies = new StringBuffer();
+		if (channels != null && channels.length > 0) {
+			for (int i = 0; i < channels.length; i++) {
+				sbFrequencies.append(WpaSupplicantUtil.convChannelToFrequency(channels[i]));
+				if (i < (channels.length - 1)) {
+					sbFrequencies.append(' ');
+				}
+			}
+		} else {
+			for (int i = 1; i <= 13; i++) {
+				sbFrequencies.append(WpaSupplicantUtil.convChannelToFrequency(i));
+				if (i < 13) {
+					sbFrequencies.append(' ');
+				}
+			}
+		}
+		
+		return sbFrequencies.toString();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ChapLinux.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ChapLinux.java
new file mode 100644
index 0000000000000000000000000000000000000000..99dc43aafc8c3905a71b0dcf5aecb8bf72f6fa93
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ChapLinux.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+
+/**
+ * Defines CHAP authentication in Linux
+ */
+public class ChapLinux extends PppAuthSecrets {
+	
+	/*
+	#Secrets for authentication using CHAP
+	#client					server			secret			IP addresses	Provider
+	ISP@CINGULARGPRS.COM	*               CINGULAR1		*				#att
+	mobileweb				* 				password		*				#o2
+	user					*				pass			*				#orange
+	web						*				web				*				#vodaphone
+	*/
+	
+	private static final String CHAP_SECRETS_FILE = "/etc/ppp/chap-secrets";
+
+	private static ChapLinux s_instance = null;
+
+	/**
+	 * ChapLinux constructor
+	 */
+	private ChapLinux() {
+	    super(CHAP_SECRETS_FILE);
+	}
+	
+	/**
+	 * Get a singleton instance
+	 * 
+	 * @return ChapLinux
+	 */
+	public static ChapLinux getInstance() {
+	    if(s_instance == null) {
+	        s_instance = new ChapLinux();
+	    }
+	    
+	    return s_instance;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/KuranetConfig.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/KuranetConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f04aff4a985f3bb73480ec15e2265968ae4ec2a
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/KuranetConfig.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KuranetConfig {
+    
+    private static final Logger s_logger = LoggerFactory.getLogger(KuranetConfig.class);
+            
+    private static final String KURANET_FILENAME = "/opt/eclipse/kura/data/kuranet.conf";
+    private static final String KURANET_TMP_FILENAME = "/opt/eclipse/kura/data/kuranet.conf.tmp";
+    
+    public static Properties getProperties() {
+        Properties kuraExtendedProps = null;   
+        
+        s_logger.debug("Getting " + KURANET_FILENAME);
+
+        File kuranetFile = new File(KURANET_FILENAME);
+
+        if(kuranetFile.exists()) {
+            //found our match so load the properties
+            kuraExtendedProps = new Properties();
+            try {
+                kuraExtendedProps.load(new FileInputStream(kuranetFile));
+            } catch (Exception e) {
+                s_logger.error("Could not load " + KURANET_FILENAME);
+            }
+        } else {
+            s_logger.debug("File does not exist: " + KURANET_FILENAME);
+        }
+
+        return kuraExtendedProps;
+    }
+    
+    public static String getProperty(String key) {
+        String value = null;
+        
+        Properties props = KuranetConfig.getProperties();
+        if(props != null) {
+            value = props.getProperty(key);
+            s_logger.debug("Got property " + key + " :: " + value);
+        }
+
+        return value;
+    }
+    
+    public static void storeProperties(Properties props) throws IOException, KuraException {
+        Properties oldProperties = KuranetConfig.getProperties();
+        
+        if(oldProperties == null || !oldProperties.equals(props)) {
+        	FileOutputStream fos = new FileOutputStream(KURANET_TMP_FILENAME);
+            props.store(fos, null);
+            fos.flush();
+            fos.getFD().sync();
+            fos.close();
+            
+          //move the file if we made it this far
+            File tmpFile = new File(KURANET_TMP_FILENAME);
+            File file = new File(KURANET_FILENAME);
+            if(!FileUtils.contentEquals(tmpFile, file)) {
+	            if(tmpFile.renameTo(file)){
+	            	s_logger.trace("Successfully wrote kuranet props file");
+	            }else{
+	            	s_logger.error("Failed to write kuranet props file");
+	            	throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "error while building up new configuration file for kuranet props");
+	            }
+            } else {
+				s_logger.info("Not rewriting kuranet props file because it is the same");
+			}
+        }
+    }
+    
+    public static void setProperty(String key, String value) throws IOException, KuraException {
+        s_logger.debug("Setting property " + key + " :: " + value);
+        Properties properties = KuranetConfig.getProperties();
+        
+        if(properties == null) {
+            properties = new Properties();
+        }
+        
+        properties.setProperty(key, value);
+        KuranetConfig.storeProperties(properties);
+    }
+    
+    public static void deleteProperty(String key) throws IOException, KuraException {
+    	Properties properties = KuranetConfig.getProperties();
+        
+        if(properties != null) {
+        	if(properties.containsKey(key)) {
+            	s_logger.debug("Deleting property " + key);
+        		properties.remove(key);
+        		KuranetConfig.storeProperties(properties);
+        	} else {
+        		s_logger.debug("Property does not exist " + key);
+        	}
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ModemXchangePair.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ModemXchangePair.java
new file mode 100644
index 0000000000000000000000000000000000000000..18d487abc4b9a3c546a13dac4674b697118f605b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ModemXchangePair.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+/* 
+ * Copyright � 2009 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Defines Modem Exchange "Send/Expect" pair
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class ModemXchangePair {
+
+	/* send string */ 
+	private String sendString = null;
+	
+	/* expect string */
+	private String expectString = null;
+	
+	/**
+	 * ModemXchangePair constructor
+	 * 
+	 * @param send - 'send' string
+	 * @param expect - 'expect' string
+	 */
+	public ModemXchangePair (String send, String expect) {
+		this.sendString = send;
+		this.expectString = expect;
+	}
+
+	/**
+	 * Reports 'send' string
+	 * 
+	 * @return 'send' string
+	 */
+	public String getSendString() {
+		return sendString;
+	}
+
+	/**
+	 * Reports 'expect' string
+	 * 
+	 * @return 'expect string
+	 */
+	public String getExpectString() {
+		return expectString;
+	}
+	
+	@Override
+	public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append(expectString);
+        buf.append('\t');
+        buf.append(sendString);
+        
+        return buf.toString();
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ModemXchangeScript.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ModemXchangeScript.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9e3747fdc7595aae238c042295bb923857ba28e
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/ModemXchangeScript.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+/* 
+ * Copyright 2013 Eurotech Inc. All rights reserved.
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.ListIterator;
+
+/**
+ * This class defines Modem Exchange script that is used for
+ * establishing PPP connection with service provider.
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class ModemXchangeScript {
+
+	/* list of modem exchange send/expect pairs */
+	private ArrayList<ModemXchangePair> modemXchangePairs = null;
+	private ListIterator<ModemXchangePair> iterator;
+	
+	/**
+	 * ModemXchangeScript constructor
+	 */
+	public ModemXchangeScript () {
+		this.modemXchangePairs = new ArrayList<ModemXchangePair>();
+	}
+	
+	/**
+	 * Adds 'send/expect' pair to the modem exchange script
+	 * 
+	 * @param xchangePair - 'send/expect' pair
+	 */
+	public void addmodemXchangePair (ModemXchangePair xchangePair) {
+		this.modemXchangePairs.add(xchangePair);
+	}
+	
+	/**
+	 * Reports first 'send/expect' pair of thew modem exchange script.
+	 * 
+	 * @return ModemXchangePair
+	 */
+	public ModemXchangePair getFirstModemXchangePair () {
+		
+		ModemXchangePair modemXchangePair = null;
+		this.iterator = modemXchangePairs.listIterator(0);
+
+		if (this.iterator.hasNext()) {
+			modemXchangePair = (ModemXchangePair)this.iterator.next();
+		}
+		return modemXchangePair;
+	}
+	
+	/**
+	 * Reports next 'send/expect' pair of thew modem exchange script.
+	 * 
+	 * @return ModemXchangePair
+	 */
+	public ModemXchangePair getNextModemXchangePair () {
+		
+		ModemXchangePair modemXchangePair = null;
+		if (this.iterator.hasNext()) {
+			modemXchangePair = (ModemXchangePair)this.iterator.next();
+		}
+		return modemXchangePair;
+	}
+	
+	public void writeScript(String filename) throws Exception {
+        ModemXchangePair modemXchangePair = null;
+
+        PrintWriter writer = new PrintWriter(new FileOutputStream(filename));
+
+        modemXchangePair = this.getFirstModemXchangePair();
+        while (modemXchangePair != null) {
+            writer.println(modemXchangePair.toString());
+            modemXchangePair = this.getNextModemXchangePair();
+        }
+
+        writer.close();
+	}
+	
+	public static ModemXchangeScript parseFile(String filename) throws IOException {
+        ModemXchangeScript script = new ModemXchangeScript();
+        File scriptFile = new File(filename);
+        
+        if (scriptFile.exists()) {
+            BufferedReader reader = new BufferedReader(new FileReader(scriptFile));
+            
+            String line = reader.readLine();
+            String[] pair;
+            while(line != null) {
+                pair = line.split("\\s", 2);
+                if(pair.length == 2) {
+                    script.addmodemXchangePair(new ModemXchangePair(pair[1], pair[0]));
+                }
+                line = reader.readLine();
+            }
+
+            reader.close();
+        }
+	    
+	    return script;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PapLinux.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PapLinux.java
new file mode 100644
index 0000000000000000000000000000000000000000..483f244aed7c1a8fbffc5298c8a1cdb64c5f028b
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PapLinux.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+
+/**
+ * Defines PAP authentication in Linux
+ */
+public class PapLinux extends PppAuthSecrets {
+	
+	/*
+	#Secrets for authentication using PAP
+	#client					server			secret			IP addresses	Provider
+	ISP@CINGULARGPRS.COM	*               CINGULAR1		*				#att
+	mobileweb				* 				password		*				#o2
+	user					*				pass			*				#orange
+	web						*				web				*				#vodaphone
+	*/
+	
+	private static final String PAP_SECRETS_FILE = "/etc/ppp/pap-secrets";
+
+	private static PapLinux s_instance = null;
+
+	/**
+	 * PapLinux constructor
+	 */
+	private PapLinux() {
+	    super(PAP_SECRETS_FILE);
+	}
+	
+	/**
+	 * Get a singleton instance
+	 * 
+	 * @return PapLinux
+	 */
+	public static PapLinux getInstance() {
+	    if(s_instance == null) {
+	        s_instance = new PapLinux();
+	    }
+	    
+	    return s_instance;
+	}
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PppAuthSecrets.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PppAuthSecrets.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae8e450f017876f4408b3a724713d572e1c9d38d
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PppAuthSecrets.java
@@ -0,0 +1,350 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2013 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Defines PAP/CHAP authentication in Linux
+ * 
+ * @author ilya.binshtok
+ *
+ */
+public class PppAuthSecrets {
+	
+	/*
+	#Secrets for authentication using PAP/CHAP
+	#client					server			secret			IP addresses	Provider
+	ISP@CINGULARGPRS.COM	*               CINGULAR1		*				#att
+	mobileweb				* 				password		*				#o2
+	user					*				pass			*				#orange
+	web						*				web				*				#vodaphone
+	*/
+		
+	private static final Logger s_logger = LoggerFactory.getLogger(PppAuthSecrets.class);
+
+	private String m_secretsFilename;
+	
+	private ArrayList<String> providers;
+	private ArrayList<String> clients;
+	private ArrayList<String> servers;
+	private ArrayList<String> secrets;
+	private ArrayList<String> ipAddresses;
+
+	/**
+	 * PppAuthSecrets constructor
+	 * 
+	 * @param secretsFilename
+	 */
+	public PppAuthSecrets(String secretsFilename) {
+		
+	    m_secretsFilename = secretsFilename;
+	    		
+		providers = new ArrayList<String>();
+		clients = new ArrayList<String>();
+		servers = new ArrayList<String>();
+		secrets = new ArrayList<String>();
+		ipAddresses = new ArrayList<String>();
+
+		try {
+	        File secretsFile = new File(m_secretsFilename);
+	        
+	        if(secretsFile.exists()) {
+    	        BufferedReader br = null;
+    	        String currentLine = null;
+    	        StringTokenizer st = null;
+    		    
+    			br = new BufferedReader(new FileReader(m_secretsFilename));
+    			
+    			while((currentLine = br.readLine()) != null) {
+    				currentLine = currentLine.trim();
+    				
+    				if(currentLine.indexOf('#') > 0) {
+    					st = new StringTokenizer(currentLine);
+    					clients.add(st.nextToken());
+    					servers.add(st.nextToken());
+    					secrets.add(st.nextToken());
+    					ipAddresses.add(st.nextToken());
+    					providers.add(st.nextToken().substring(1));
+    				}
+    			}
+    			
+    			br.close();
+    			
+    			for(int i=0; i<providers.size(); ++i) {
+    				s_logger.debug((String)clients.get(i)+"\t");
+    				s_logger.debug((String)servers.get(i)+"\t");
+    				s_logger.debug((String)secrets.get(i)+"\t");
+    				s_logger.debug((String)ipAddresses.get(i)+"\t");
+    				s_logger.debug((String)providers.get(i)+"\n");
+    			}
+	        } else {
+	            // Create an empty file
+	            s_logger.info("File does not exist - creating " + m_secretsFilename);
+	            this.writeToFile();
+	        }
+		} catch(Exception e) {
+			s_logger.error("Could not initialize", e);
+		}
+		
+	}
+	
+	
+	/**
+	 * Add a new entry to the secrets file
+	 * 
+	 * @param provider cellular provider for which this secret applies
+	 * @param client client/username for this secret
+	 * @param server server ip for which this entry requires
+	 * @param secret secret/password for this account
+	 * @param ipAddress ipaddress for this account
+	 * @throws Exception 
+	 */
+	public void addEntry(String provider, String client, String server, String secret, String ipAddress) throws Exception {
+	    boolean addNewEntry = true;
+	    
+		//make sure this is not a duplicate entry, if it is, replace the old one
+		for(int i=0; i<this.providers.size(); ++i) {
+			if(((String)(this.providers.get(i))).compareTo(provider) == 0) {
+				//found a provider match so replace the variables
+				this.clients.remove(i);
+				this.clients.add(i, client);
+
+				this.servers.remove(i);
+				this.servers.add(i, server);
+				
+				this.secrets.remove(i);
+				this.secrets.add(i, secret);
+				
+				this.ipAddresses.remove(i);
+				this.ipAddresses.add(i, ipAddress);
+				
+				addNewEntry = false;
+				break;
+			}
+		}
+		
+		if(addNewEntry) {
+    		clients.add(client);
+    		servers.add(server);
+    		secrets.add(secret);
+    		ipAddresses.add(ipAddress);
+    		providers.add(provider);
+		}
+		
+		writeToFile();
+	}
+	
+	/**
+	 * Writes current contents in ram back to the pap-secrets file
+	 * 
+	 * @throws Exception for file IO errors
+	 */
+	private void writeToFile() throws Exception {		
+		String authType = "";
+		if (m_secretsFilename.indexOf("chap") >= 0) {
+			authType = "CHAP";
+		} else if (m_secretsFilename.indexOf("pap") >= 0) {
+			authType = "PAP";
+		}
+		
+		PrintWriter pw = null;
+		try {
+			FileOutputStream fos = new FileOutputStream(m_secretsFilename);
+			pw = new PrintWriter(fos);
+
+			pw.write("#Secrets for authentication using " + authType + "\n");
+			pw.write("#client					server			secret			IP addresses	#Provider\n");
+			
+			for(int i=0; i<providers.size(); ++i) {
+				pw.write((String)clients.get(i)+"\t");
+				pw.write((String)servers.get(i)+"\t");
+				pw.write((String)secrets.get(i)+"\t");
+				pw.write((String)ipAddresses.get(i)+"\t");
+				pw.write("#"+(String)providers.get(i)+"\n");
+			}
+            
+			pw.flush();
+			fos.getFD().sync();
+			pw.close();
+			fos.close();
+		} catch (IOException ioe) {
+			throw ioe;
+		} finally {
+			if (pw != null) {
+				pw.close();
+				pw = null;
+			}
+		}
+	}
+	
+	/**
+	 * Removed an entry based on a 'type' where the type can be either provider,
+	 * client, server, secret, or ipaddress.  Note if the type occurs more than
+	 * once, all entries of 'type' matching 'value' will be removed
+	 * 
+	 * @param type can be either provider, client, server, secret, or ipaddress
+	 * 
+	 * @param value is the value for the given type.  For example, if the type is
+	 * 				provider, then the value could be att
+	 * 
+	 * @throws Exception for indexing problems
+	 */
+	public void removeEntry(String type, String value) throws Exception {
+		if(type.compareTo("provider") == 0) {
+			for(int i=0; i<providers.size(); ++i) {
+				if(((String)(providers.get(i))).compareTo(value) == 0) {
+					try {
+						this.removeEntry(i);
+					} catch(Exception e) {
+						throw e;
+					}
+				}
+			}
+		} else if(type.compareTo("client") == 0) {
+			for(int i=0; i<clients.size(); ++i) {
+				if(((String)(clients.get(i))).compareTo(value) == 0) {
+					try {
+						this.removeEntry(i);
+					} catch(Exception e) {
+						throw e;
+					}
+				}
+			}
+		} else if(type.compareTo("server") == 0) {
+			for(int i=0; i<servers.size(); ++i) {
+				if(((String)(servers.get(i))).compareTo(value) == 0) {
+					try {
+						this.removeEntry(i);
+					} catch(Exception e) {
+						throw e;
+					}
+				}
+			}
+		} else if(type.compareTo("secret") == 0) {
+			for(int i=0; i<secrets.size(); ++i) {
+				if(((String)(secrets.get(i))).compareTo(value) == 0) {
+					try {
+						this.removeEntry(i);
+					} catch(Exception e) {
+						throw e;
+					}
+				}
+			}
+		} else if(type.compareTo("ipAddress") == 0) {
+			for(int i=0; i<ipAddresses.size(); ++i) {
+				if(((String)(ipAddresses.get(i))).compareTo(value) == 0) {
+					try {
+						this.removeEntry(i);
+					} catch(Exception e) {
+						throw e;
+					}
+				}
+			}
+		} else {
+			//unaccepted type
+		}
+		
+		writeToFile();
+	}
+	
+	/**
+	 * removed an entry based on an index
+	 * 
+	 * @param index the index of the entry to be removed
+	 * 
+	 * @throws Exception if the index is invalid
+	 */
+	public void removeEntry(int index) throws Exception {
+		try {
+			clients.remove(index);
+			servers.remove(index);
+			secrets.remove(index);
+			ipAddresses.remove(index);
+			providers.remove(index);
+		} catch(Exception e) {
+			throw e;
+		}
+		
+		writeToFile();
+	}
+	
+	/**
+	 * Checks to see if an entry is already present
+	 * 
+	 * @param provider cellular provider for which this secret applies
+	 * @param client client/username for this secret
+	 * @param server server ip for which this entry requires
+	 * @param secret secret/password for this account
+	 * @param ipAddress ipaddress for this account
+	 * @return boolean
+	 * 		true - entry found
+	 * 		false - entry not found
+	 */
+	public boolean checkForEntry(String provider, String client, String server, String secret, String ipAddress) {
+		for(int i=0; i<providers.size(); ++i) {
+			if(((String)(providers.get(i))).compareTo(provider) == 0) {
+				//found the provider so check everything else
+				if(((String)(clients.get(i))).compareTo(client) == 0 &&
+						((String)(servers.get(i))).compareTo(server) == 0 &&
+						((String)(secrets.get(i))).compareTo(secret) == 0 &&
+						((String)(ipAddresses.get(i))).compareTo(ipAddress) == 0) {
+					return true;
+				}
+			}
+		}
+		
+		//since we got here we didn't find a match
+		return false;
+	}
+	   
+    /**
+     * Return the secret as a string, given the other parameters.  Return null if not found.
+     * 
+     * @param provider cellular provider for which this secret applies
+     * @param client client/username for this secret
+     * @param server server ip for which this entry requires
+     * @param ipAddress ipaddress for this account
+     * @return String
+     */
+    public String getSecret(String provider, String client, String server, String ipAddress) {
+        String secret = null;
+        
+        for(int i=0; i<providers.size(); ++i) {
+            if(providers.get(i).equals(provider)) {
+                //found the provider so check everything else
+                if(clients.get(i).equals(client) &&
+                        servers.get(i).equals(server) &&
+                        ipAddresses.get(i).equals(ipAddress)) {
+                    secret = secrets.get(i);
+                    break;
+                }
+            }
+        }
+        
+        return secret;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PppUtil.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PppUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f4f9f238ec24dcb1be1a889439ccd3852d138ce
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/PppUtil.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PppUtil {
+    
+    /*
+     * Parse ppp peer filename.
+     */
+    public static Map<String, String> parsePeerFilename(String filename) {        
+        Map<String, String> props = new HashMap<String, String>();
+        
+        String[] parts = filename.split("_");
+        switch (parts.length) {
+        case 1:
+        	// Example: HE910 --> serial modem
+        	props.put("model", parts[0]);
+        	props.put("modemId", parts[0]);
+        	break;
+        case 2:
+        	// Example: HE910_1-3.4 --> usb modem
+        	props.put("model", parts[0]);
+        	props.put("modemId", parts[1]);
+        	break;
+        }
+        return props;
+    }
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/WpaSupplicantUtil.java b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/WpaSupplicantUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b1daaabfb0196a72a0a8592acb9afc108fba5d2
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/java/org/eclipse/kura/net/admin/visitor/linux/util/WpaSupplicantUtil.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.net.admin.visitor.linux.util;
+
+public class WpaSupplicantUtil {
+    
+    public static final int MODE_INFRA = 0;
+    public static final int MODE_IBSS = 1;
+    public static final int MODE_AP = 2;
+    
+    public static int convChannelToFrequency(int channel) {
+    	int frequency = -1;
+    	if ((channel >= 1) && (channel <=13)) {
+    		frequency = 2407 + channel * 5;
+    	}
+    	return frequency;
+    }
+    
+    public static int convFrequencyToChannel(int mhz) {        
+        int channel = (mhz - 2407)/5;
+        return channel;
+    }
+
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/org/eclipse/kura/net/admin/messages/NetworkAdminConfigurationMessagesBundle.properties b/kura/org.eclipse.kura.net.admin/src/main/resources/org/eclipse/kura/net/admin/messages/NetworkAdminConfigurationMessagesBundle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1031dbf7a721ee203432ea802c445a1f184f1c4c
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/org/eclipse/kura/net/admin/messages/NetworkAdminConfigurationMessagesBundle.properties
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+PLATFORM_INTERFACES=Network Interfaces available on the platform.
+CONFIG_DRIVER=The driver to use with this interface.
+CONFIG_MTU=The Maximum Transition Unit (MTU) for this interface.
+CONFIG_AUTOCONNECT=Whether or not the interface will automatically start at boot time.
+CONFIG_IPV4_DHCP_CLIENT_ENABLED=Whether or not to use DHCP to configure this interface.
+CONFIG_IPV4_ADDRESS=If not using DHCP, the IPv4 network address to use for this interface.
+CONFIG_IPV4_PREFIX=If not using DHCP, the IPv4 network prefix to use for this interface.
+CONFIG_IPV4_GATEWAY=If not using DHCP, the IPv4 network prefix to use for this interface.
+CONFIG_DNS_SERVERS=A comma separated list of DNS servers to use for this interface.
+CONFIG_WINS_SERVERS=A comma separated list of WINS servers to use for this interface.
+CONFIG_IPV4_DHCP_SERVER_ENABLED=Whether or not to enable a DHCP server on this interface.
+CONFIG_IPV4_DHCP_SERVER_DEFAULT_LEASE_TIME=If DHCP server is enabled, the default DHCP lease time for DHCP clients.
+CONFIG_IPV4_DHCP_SERVER_MAX_LEASE_TIME=If DHCP server is enabled, the maximum DHCP lease time for DHCP clients.
+CONFIG_IPV4_DHCP_SERVER_PREFIX=If DHCP server is enabled, the IPv4 network prefix to use for the DHCP server.
+CONFIG_IPV4_DHCP_SERVER_RANGE_START=If DHCP server is enabled, the starting IPv4 address to provide to DHCP clients.
+CONFIG_IPV4_DHCP_SERVER_RANGE_END=If DHCP server is enabled, the ending IPv4 address to provide to DHCP clients.
+CONFIG_IPV4_DHCP_SERVER_PASS_DNS=Whether or not to pass DNS servers to DHCP clients.
+CONFIG_IPV4_DHCP_SERVER_NAT_ENABLED=Whether or not connecting clients should be able to access addresses on the gateway's WAN interface (e.g. usually the Internet).
+
+USB_PORT=READ ONLY - The USB port this network interface is on.
+USB_MANUFACTURER=READ ONLY - The USB device's manufacturer name.
+USB_PRODUCT=READ ONLY - The USB device's product name.
+USB_MANUFACTURER_ID=READ ONLY - The USB device's manufacture (vendor) ID.
+USB_PRODUCT_ID=READ ONLY - The USB device's product ID.
+
+# Wifi
+CONFIG_WIFI_MODE=The selected mode of the wifi network - either 'master' (Access Point Mode), 'managed' (Client Mode), or 'ad-hoc'.
+
+CONFIG_WIFI_ADHOC_SSID=The Service Set ID (SSID) or Access Point Name to use for the wifi network.
+CONFIG_WIFI_ADHOC_HARDWARE_MODE=The Hardware Mode of the wireless interface.
+CONFIG_WIFI_ADHOC_RADIO_MODE=The Radio Mode of the wireless interface.
+CONFIG_WIFI_ADHOC_SECURITY_TYPE=The security mode to use for the interface - either WPA, WPA2, WEP, or NONE.
+CONFIG_WIFI_ADHOC_PASSPHRASE=The security passphrase or password to use if security it enabled.
+CONFIG_WIFI_ADHOC_CHANNEL=The wifi channel to use.
+
+CONFIG_WIFI_INFRA_SSID=The Service Set ID (SSID) or Access Point Name to use for the wifi network.
+CONFIG_WIFI_INFRA_HARDWARE_MODE=The Hardware Mode of the wireless interface.
+CONFIG_WIFI_INFRA_RADIO_MODE=The Radio Mode of the wireless interface.
+CONFIG_WIFI_INFRA_SECURITY_TYPE=The security mode to use for the interface - either WPA, WPA2, WEP, or NONE.
+CONFIG_WIFI_INFRA_PASSPHRASE=The security passphrase or password to use if security it enabled.
+CONFIG_WIFI_INFRA_CHANNEL=The wifi channel to use.
+CONFIG_WIFI_INFRA_PAIRWISE_CIPHERS="Pariwise Ciphers."
+CONFIG_WIFI_INFRA_GROUP_CIPHERS="Group Ciphers."
+
+CONFIG_WIFI_MASTER_SSID=The Service Set ID (SSID) or Access Point Name to use for the wifi network.
+CONFIG_WIFI_MASTER_BROADCAST_ENABLED=Whether or not to broadcast the APN name for this wireless network if in master mode.
+CONFIG_WIFI_MASTER_HARDWARE_MODE=The Hardware Mode of the wireless interface.
+CONFIG_WIFI_MASTER_RADIO_MODE=The Radio Mode of the wireless interface.
+CONFIG_WIFI_MASTER_SECURITY_TYPE=The security mode to use for the interface - either WPA, WPA2, WEP, or NONE.
+CONFIG_WIFI_MASTER_PASSPHRASE=The security passphrase or password to use if security it enabled.
+CONFIG_WIFI_MASTER_CHANNEL=The wifi channel to use.
+
+WIFI_CAPABILITIES=The capabilities supported by this interface
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_master_wpa2_psk b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_master_wpa2_psk
new file mode 100644
index 0000000000000000000000000000000000000000..6822f0ea40ecc46bcf93de7887aa30f572526abf
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_master_wpa2_psk
@@ -0,0 +1,53 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WPA settings. We'll use stronger WPA2
+# bit0 = WPA
+# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
+wpa=2
+
+# Preshared key of between 8-63 ASCII characters.
+# If you define the key in here, make sure that the file is not readable
+# by anyone but root. Alternatively you can use a separate file for the
+# key; see original hostapd.conf for more information.
+#example TheKeyMyCatalystUSES!1
+wpa_passphrase=KURA_PASSPHRASE
+
+# Key management algorithm. In this case, a simple pre-shared key (PSK)
+wpa_key_mgmt=WPA-PSK
+
+# The cipher suite to use. We want to use stronger CCMP cipher.
+wpa_pairwise=CCMP
+
+# Change the broadcasted/multicasted keys after this many seconds.
+wpa_group_rekey=600
+
+# Change the master key after this many seconds. Master key is used as a basis
+# (source) for the encryption keys.
+wpa_gmk_rekey=86400
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_master_wpa_psk b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_master_wpa_psk
new file mode 100644
index 0000000000000000000000000000000000000000..f4046ccd6234f946ec58f5e858ea42d925719854
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_master_wpa_psk
@@ -0,0 +1,53 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WPA settings. We'll use stronger WPA2
+# bit0 = WPA
+# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
+wpa=1
+
+# Preshared key of between 8-63 ASCII characters.
+# If you define the key in here, make sure that the file is not readable
+# by anyone but root. Alternatively you can use a separate file for the
+# key; see original hostapd.conf for more information.
+#example TheKeyMyCatalystUSES!1
+wpa_passphrase=KURA_PASSPHRASE
+
+# Key management algorithm. In this case, a simple pre-shared key (PSK)
+wpa_key_mgmt=WPA-PSK
+
+# The cipher suite to use. We want to use stronger CCMP cipher.
+wpa_pairwise=CCMP TKIP
+
+# Change the broadcasted/multicasted keys after this many seconds.
+wpa_group_rekey=600
+
+# Change the master key after this many seconds. Master key is used as a basis
+# (source) for the encryption keys.
+wpa_gmk_rekey=86400
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_no_security b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_no_security
new file mode 100644
index 0000000000000000000000000000000000000000..49c9732a057f67fa712336afd1b996c3bf27b2fd
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_no_security
@@ -0,0 +1,29 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_wep b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_wep
new file mode 100644
index 0000000000000000000000000000000000000000..3d7281fc5682b2b5d0d5427c0e0a51c2ea153f15
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/hostapd.conf_wep
@@ -0,0 +1,34 @@
+# /etc/hostapd/hostapd.conf
+
+#example: wlan0
+interface=KURA_INTERFACE
+#example: nl80211
+driver=KURA_DRIVER
+
+# SSID to use. This will be the "name" of the accesspoint
+#example: catalyst
+ssid=KURA_ESSID
+
+# basic operational settings
+#example: g
+hw_mode=KURA_HW_MODE
+
+wme_enabled=KURA_WME_ENABLED
+ieee80211n=KURA_IEEE80211N
+ht_capab=KURA_HTCAPAB
+
+#example: 1
+channel=KURA_CHANNEL
+
+# Logging and debugging settings: more of this in original config file
+logger_syslog=-1
+logger_syslog_level=2
+logger_stdout=-1
+logger_stdout_level=2
+dump_file=/tmp/hostapd.dump
+
+# WEP KEY The key length should be 5, 13, or 16 characters, or 10, 26, or 32
+# digits, depending on whether 40-bit (64-bit), 104-bit (128-bit), or
+# 128-bit (152-bit) WEP is used.
+#example: 123456789a
+wep_key0=KURA_WEP_KEY
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf
new file mode 100644
index 0000000000000000000000000000000000000000..890bef49564feec61a5fd551cd58b5957008c2ee
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf
@@ -0,0 +1,3 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_open b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_open
new file mode 100644
index 0000000000000000000000000000000000000000..70bb7048a7453e6b37b63d0c1105beaffc6b7e6a
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_open
@@ -0,0 +1,12 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+ap_scan=2
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    key_mgmt=NONE
+    frequency=KURA_FREQUENCY
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep
new file mode 100644
index 0000000000000000000000000000000000000000..5165a9be34128cdfedaec5bb4232ad4657475adf
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_wep
@@ -0,0 +1,13 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+ap_scan=2
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    key_mgmt=NONE
+    frequency=KURA_FREQUENCY
+    wep_key0=KURA_WEP_KEY
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa
new file mode 100644
index 0000000000000000000000000000000000000000..c75f6044080f7909804febe26f8e20899eaf5841
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_adhoc_wpa
@@ -0,0 +1,16 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+ap_scan=2
+network={
+    mode=KURA_MODE
+    proto=WPA
+    ssid="KURA_ESSID"
+    key_mgmt=WPA-NONE
+    group=TKIP
+    frequency=KURA_FREQUENCY
+    psk="KURA_PASSPHRASE"
+    pairwise=KURA_PAIRWISE
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_open b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_open
new file mode 100644
index 0000000000000000000000000000000000000000..ce0ab8a51f488d434374e6c05752faa627b67257
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_open
@@ -0,0 +1,13 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    scan_ssid=1
+    key_mgmt=NONE
+    scan_freq=KURA_SCANFREQ
+    bgscan="KURA_BGSCAN"
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_wep b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_wep
new file mode 100644
index 0000000000000000000000000000000000000000..c9f3759a8192cb2d6fed3fb064b3104e71f5cf10
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_wep
@@ -0,0 +1,14 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+network={
+	mode=KURA_MODE
+    ssid="KURA_ESSID"
+    scan_ssid=1
+    key_mgmt=NONE
+    wep_key0=KURA_WEP_KEY
+	scan_freq=KURA_SCANFREQ
+    bgscan="KURA_BGSCAN"
+}
diff --git a/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_wpa b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_wpa
new file mode 100644
index 0000000000000000000000000000000000000000..efd0e9adfc7a0f024f7c6ad6eadc11e42769ecfb
--- /dev/null
+++ b/kura/org.eclipse.kura.net.admin/src/main/resources/wifi/wpasupplicant.conf_wpa
@@ -0,0 +1,17 @@
+# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
+ctrl_interface=/var/run/wpa_supplicant
+ctrl_interface_group=wheel
+
+# home network; allow all valid ciphers
+network={
+    mode=KURA_MODE
+    ssid="KURA_ESSID"
+    scan_ssid=1
+    key_mgmt=WPA-PSK
+    psk="KURA_PASSPHRASE"
+    proto=KURA_PROTO
+    pairwise=KURA_PAIRWISE
+    group=KURA_GROUP
+    scan_freq=KURA_SCANFREQ
+    bgscan="KURA_BGSCAN"
+}
diff --git a/kura/org.eclipse.kura.protocol.can.test/.gitignore b/kura/org.eclipse.kura.protocol.can.test/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4dc009173e3ce627304ae5e580bd7236029a1157
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/kura/org.eclipse.kura.protocol.can.test/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.protocol.can.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..b1ad891b7d598dd203d5fe99dfb3d07917c980e2
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.protocol.can.test
+Bundle-SymbolicName: org.eclipse.kura.protocol.can.test;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Unit-Test: true
+Import-Package: 
+ org.eclipse.kura.protocol.can; version="[0.2,1.0)",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.osgi.framework;version="1.4.0",
+ org.osgi.service.component;version="1.0.0",
+ org.osgi.service.event;version="1.3.0",
+ org.slf4j;version="1.6.4"
+Service-Component: OSGI-INF/*.xml
+Bundle-ClassPath: .
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.junit;bundle-version="4.10.0",
+ org.eclipse.kura.test;bundle-version="0.2.0"
diff --git a/kura/org.eclipse.kura.protocol.can.test/OSGI-INF/can.xml b/kura/org.eclipse.kura.protocol.can.test/OSGI-INF/can.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9e5c3fab536586aa85715a041413f337165e1c88
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/OSGI-INF/can.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+               name="org.eclipse.kura.protocol.can.test.CanSocketTest"
+               enabled="true" 
+               immediate="true" 
+               modified="updated">
+   <implementation class="org.eclipse.kura.protocol.can.test.CanSocketTest"/>
+   <service>
+      <provide interface="org.eclipse.kura.protocol.can.test.CanSocketTest"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.protocol.can.test.CanSocketTest"/>
+
+    <reference name="CloudService"
+              policy="static"
+              bind="setCloudService"       
+              unbind="unsetCloudService"       
+              cardinality="1..1" 
+              interface="org.eclipse.kura.cloud.CloudService"/>
+   <reference name="CanConnectionService"
+              bind="setCanConnectionService"
+              unbind="unsetCanConnectionService"
+              cardinality="1..1"
+              policy="static"
+              interface="org.eclipse.kura.protocol.can.CanConnectionService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.protocol.can.test/OSGI-INF/metatype/org.eclipse.kura.protocol.can.test.CanSocketTest.xml b/kura/org.eclipse.kura.protocol.can.test/OSGI-INF/metatype/org.eclipse.kura.protocol.can.test.CanSocketTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..864ab3b622475fa4863f4dcdbdf47dd9c5ae5bf1
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/OSGI-INF/metatype/org.eclipse.kura.protocol.can.test.CanSocketTest.xml
@@ -0,0 +1,406 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.protocol.can.test.CanSocketTest"
+         name="Can network test" 
+         description="Can network example application.">
+              
+        <AD id="can.name"
+            name="can.name"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="can0"
+            description="CAN socket Name."/>
+        
+        <AD id="can.identifier"
+            name="can.identifier"
+            type="Integer"
+            cardinality="0"
+            required="false"
+            default="0"
+            description="Can device identifier."/>
+            
+        <AD id="compressor.id"  
+            name="compressor.id"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="1"
+            min="1"
+            max="4" 
+            description="DnAirMaxi compressor ID."/>
+        
+        <AD id="poll.interval"  
+            name="poll.interval"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="1" 
+            min = "0"
+            description="Poll interval [s]"/>
+
+        <AD id="average.time"  
+            name="average.time"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="60" 
+            min = "0"
+            description="The averaging time for time series (temperatures and pressures) [s]. 0 disables averaging."/>
+
+        <AD id="publish.on.change"  
+            name="publish.on.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Publish only when a quantity changes."/>
+
+        <AD id="compressor.temperature.enable"  
+            name="compressor.temperature.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="compressor.pressure.enable"  
+            name="compressor.pressure.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="compressor.load.enable"  
+            name="compressor.load.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="compressor.status.enable"  
+            name="compressor.status.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+            
+        <AD id="dryer.temperature.enable"  
+            name="dryer.temperature.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring an publishing the quantity."/>
+
+        <AD id="dryer.status.enable"  
+            name="dryer.status.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+        
+        <AD id="error.enable"  
+            name="error.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+       
+        <AD id="input.enable"  
+            name="input.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+       
+        <AD id="output.enable"  
+            name="output.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+        
+        <AD id="oil.filter.remaining.time.enable"  
+            name="oil.filter.remaining.time.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+        
+        <AD id="air.filter.remaining.time.enable"  
+            name="air.filter.remaining.time.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+        
+        <AD id="dryer.filter.remaining.time.enable"  
+            name="dryer.filter.remaining.time.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="disoil.filter.remaining.time.enable"  
+            name="disoil.filter.remaining.time.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="oil.remaining.time.enable"  
+            name="oil.remaining.time.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="next.service.enable"  
+            name="next.service.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="temperature.unit.enable"  
+            name="temperature.unit.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="pressure.min.enable"  
+            name="pressure.min.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="pressure.max.enable"  
+            name="pressure.max.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="pressure.unit.enable"  
+            name="pressure.unit.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="total.hours.enable"  
+            name="total.hours.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+       
+        <AD id="load.hours.enable"  
+            name="load.hours.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="serial.number.enable"  
+            name="serial.number.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="product.code.enable"  
+            name="product.code.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+ 
+        <AD id="production.week.enable"  
+            name="production.week.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="production.year.enable"  
+            name="production.year.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="error.history.enable"  
+            name="error.history.enable"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Enables monitoring and publishing the quantity."/>
+ 
+        <AD id="compressor.temperature.change"  
+            name="compressor.temperature.change"
+            type="Short"
+            cardinality="0" 
+            required="true"
+            default="32767" 
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+
+        <AD id="compressor.pressure.change"  
+            name="compressor.pressure.change"
+            type="Short"
+            cardinality="0" 
+            required="true"
+            default="32767" 
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+
+        <AD id="dryer.temperature.change"  
+            name="dryer.temperature.change"
+            type="Short"
+            cardinality="0" 
+            required="true"
+            default="32767" 
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+
+        <AD id="compressor.status.change"  
+            name="compressor.status.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+            
+        <AD id="compressor.load.change"  
+            name="compressor.load.change"
+            type="Short"
+            cardinality="0" 
+            required="true"
+            default="32767" 
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+        
+        <AD id="dryer.status.change"  
+            name="dryer.status.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="error.change"  
+            name="error.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="input.change"  
+            name="input.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="output.change"  
+            name="output.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="true" 
+            description="Enables monitoring and publishing the quantity."/>
+
+        <AD id="air.filter.remaining.time.change"  
+            name="air.filter.remaining.time.change"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2147483647"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+
+        <AD id="oil.filter.remaining.time.change"  
+            name="oil.filter.remaining.time.change"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2147483647"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+
+        <AD id="dryer.filter.remaining.time.change"  
+            name="dryer.filter.remaining.time.change"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2147483647"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+            
+        <AD id="oil.remaining.time.change"  
+            name="oil.remaining.time.change"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2147483647"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+            
+        <AD id="disoil.filter.remaining.time.change"  
+            name="disoil.filter.remaining.time.change"
+            type="Integer"
+            cardinality="0" 
+            required="true"
+            default="2147483647"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+            
+        <AD id="total.hours.change"  
+            name="total.hours.change"
+            type="Long"
+            cardinality="0" 
+            required="true"
+            default="9223372036854775807"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+      
+        <AD id="load.hours.change"  
+            name="load.hours.change"
+            type="Long"
+            cardinality="0" 
+            required="true"
+            default="9223372036854775807"
+            description="The minimum change (absolute value) in the quantity causing a message to be published."/>
+
+        <AD id="error.history.change"  
+            name="error.history.change"
+            type="Boolean"
+            cardinality="0" 
+            required="true"
+            default="false" 
+            description="Enables monitoring and publishing the quantity."/>
+    </OCD>
+    <Designate pid="org.eclipse.kura.protocol.can.test.CanSocketTest">
+        <Object ocdref="org.eclipse.kura.protocol.can.test.CanSocketTest"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.protocol.can.test/build.properties b/kura/org.eclipse.kura.protocol.can.test/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..23d91bb3b3fc104ff424dd0ed13dbc6c6a1bc091
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/build.properties
@@ -0,0 +1,11 @@
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+additional.bundles = slf4j.api,\
+                     org.junit,\
+                     org.eclipse.kura.test,\
+                     org.eclipse.kura.api,\
+                     org.eclipse.kura.protocol.can
+
diff --git a/kura/org.eclipse.kura.protocol.can.test/pom.xml b/kura/org.eclipse.kura.protocol.can.test/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8d8e7e070a0a93c7db96bdab04e754d8f834c3ae
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/pom.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.protocol.can.test</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-test-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+    <build>
+    <plugins>
+            <plugin>
+                    <groupId>org.eclipse.tycho</groupId>
+                    <artifactId>tycho-packaging-plugin</artifactId>
+                    <version>${tycho-version}</version>
+                    <configuration>
+                            <format>'${kura.build.version}'</format>
+                    </configuration>
+                    <executions>
+                            <execution>
+                                    <phase>package</phase>
+                                    <id>package-plugin</id>
+                                    <goals>
+                                            <goal>package-plugin</goal>
+                                    </goals>
+                                    <configuration>
+                                            <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                    </configuration>
+                            </execution>
+                    </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.eclipse.tycho</groupId>
+                <artifactId>tycho-surefire-plugin</artifactId>
+                <version>${tycho-version}</version>
+                <configuration>
+                    <providerHint>junit4</providerHint>
+<!--                                         
+                    <testSuite>org.eclipse.kura.core.test</testSuite>
+                    <testClass>org.eclipse.kura.core.test.AllCoreTests</testClass>
+                    <testClass>org.eclipse.kura.core.test.CloudDeploymentHandlerTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.CloudServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.CommURITest</testClass>
+                    <testClass>org.eclipse.kura.core.test.ComponentConfigurationImplTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.ConfigurationServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.NetUtilTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.NetworkServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.SystemAdminServiceTest</testClass>
+                    <testClass>org.eclipse.kura.core.test.SystemServiceTest</testClass>
+ -->                    
+		    <!-- Don't run tests in parallel because it breaks them
+                    <parallel>both</parallel>
+		    -->
+
+                    <useUnlimitedThreads>true</useUnlimitedThreads>
+                    <argLine>-Dequinox.ds.print=true -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Deurotech.framework.mode=emulator -Dkura.configuration=file:../org.eclipse.kura.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties  -Dlog4j.configuration=file:../org.eclipse.kura.emulator/src/main/resources/log4j.properties</argLine>
+
+		    <!-- This can be uncommented to debug the test in the event of a failure by telneting to port 5002 and seeing the state of the OSGi runtime 		    
+                    <appArgLine>-consoleLog -console 5002 -noExit</appArgLine>
+            -->
+		    <bundleStartLevel>
+			<bundle>
+			    <id>org.eclipse.equinox.ds</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.console</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.gogo.shell</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.gogo.command</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.gogo.runtime</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.core.contenttype</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.core.jobs</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.core.runtime</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.io</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.app</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.cm</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.common</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.event</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.metatype</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.preferences</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.registry</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.util</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.osgi.services</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.osgi.util</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.hamcrest.core</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>osgi.cmpn</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.equinox.launcher</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.soda.dk.comm</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>javax.usb.api</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>slf4j.api</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.servicemix.bundles.protobuf-java</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>mqtt-client</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.hsqldb.hsqldb</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.junit</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.commons.io</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>javax.servlet</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.dependencymanager</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.apache.felix.deploymentadmin</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.api</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.core</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.deployment.agent</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+			<bundle>
+			    <id>org.eclipse.kura.emulator</id>
+			    <level>4</level>
+			    <autoStart>true</autoStart>
+			</bundle>
+		    </bundleStartLevel>
+                    <dependencies>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.ds</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.console</artifactId>
+                        </dependency>       
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.gogo.shell</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.gogo.command</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.gogo.runtime</artifactId>
+                        </dependency>                        
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.core.contenttype</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.core.jobs</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.core.runtime</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.io</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.app</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.cm</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.common</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.event</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.metatype</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.preferences</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.registry</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.util</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.osgi</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.osgi.services</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.osgi.util</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.hamcrest.core</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>osgi.cmpn</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.equinox.launcher</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.eclipse.soda.dk.comm</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>javax.usb.api</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>slf4j.api</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.servicemix.bundles.protobuf-java</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>mqtt-client</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.hsqldb.hsqldb</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.junit</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.commons.io</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>javax.servlet</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>log4j</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>log4j.apache-log4j-extras</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.dependencymanager</artifactId>
+                        </dependency>
+                        <dependency>
+                            <type>p2-installable-unit</type>
+                            <artifactId>org.apache.felix.deploymentadmin</artifactId>
+                        </dependency>
+                        <dependency>
+                            <artifactId>org.eclipse.kura.api</artifactId>
+                        </dependency>
+                        <dependency>
+                            <artifactId>org.eclipse.kura.core</artifactId>
+                        </dependency>
+                        <dependency>
+                            <artifactId>org.eclipse.kura.deployment.agent</artifactId>
+                        </dependency>
+                        <dependency>
+                            <artifactId>org.eclipse.kura.emulator</artifactId>
+                        </dependency>
+                        <dependency>
+                            <artifactId>org.eclipse.kura.test</artifactId>
+                        </dependency>
+                    </dependencies>
+                </configuration>
+            </plugin>
+        </plugins>
+    <pluginManagement>
+    	<plugins>
+    		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+    		<plugin>
+    			<groupId>org.eclipse.m2e</groupId>
+    			<artifactId>lifecycle-mapping</artifactId>
+    			<version>1.0.0</version>
+    			<configuration>
+    				<lifecycleMappingMetadata>
+    					<pluginExecutions>
+    						<pluginExecution>
+    							<pluginExecutionFilter>
+    								<groupId>org.eclipse.tycho</groupId>
+    								<artifactId>
+    									tycho-compiler-plugin
+    								</artifactId>
+    								<versionRange>
+    									[0.20.0,)
+    								</versionRange>
+    								<goals>
+    									<goal>compile</goal>
+    								</goals>
+    							</pluginExecutionFilter>
+    							<action>
+    								<ignore></ignore>
+    							</action>
+    						</pluginExecution>
+    						<pluginExecution>
+    							<pluginExecutionFilter>
+    								<groupId>org.eclipse.tycho</groupId>
+    								<artifactId>
+    									tycho-packaging-plugin
+    								</artifactId>
+    								<versionRange>
+    									[0.20.0,)
+    								</versionRange>
+    								<goals>
+    									<goal>build-qualifier</goal>
+    									<goal>validate-version</goal>
+    									<goal>validate-id</goal>
+    								</goals>
+    							</pluginExecutionFilter>
+    							<action>
+    								<ignore></ignore>
+    							</action>
+    						</pluginExecution>
+    					</pluginExecutions>
+    				</lifecycleMappingMetadata>
+    			</configuration>
+    		</plugin>
+    	</plugins>
+    </pluginManagement>
+    </build>
+</project>
+
diff --git a/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CanSocketTest.java b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CanSocketTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..087bf43a6e577ed4225c3b374abe120d99d02aed
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CanSocketTest.java
@@ -0,0 +1,865 @@
+package org.eclipse.kura.protocol.can.test;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.message.KuraPayload;
+import org.junit.Test;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.kura.protocol.can.CanConnectionService;
+import org.eclipse.kura.protocol.can.CanMessage;
+
+
+public class CanSocketTest extends TestCase implements ConfigurableComponent, CloudClientListener {
+	private static final Logger s_logger = LoggerFactory.getLogger(CanSocketTest.class);
+
+	// Cloud Application identifier
+	private static final String APP_ID = "CanSocketTest";
+
+
+	// Default MQTT Quality of Service
+	private static final int DFLT_QOS = 0;
+
+	// Default MQTT retain flag
+	private static final boolean DFLT_RETAIN = false;	
+
+	// Cloud Application semantic topics
+	private static final String SEMANTIC_TOPIC_DEFAULT = "default";
+	private static final String SEMANTIC_TOPIC_TIME_SERIES = "series";
+	private static final String SEMANTIC_TOPIC_IO = "io";
+	private static final String SEMANTIC_TOPIC_STATUS = "status";
+	private static final String SEMANTIC_TOPIC_ERROR = "err";
+
+
+	// Metric names for compressor status
+	private static final String METRIC_NAME_COMPRESSOR_PRESSURE = "p_c";
+	private static final String METRIC_NAME_COMPRESSOR_AVG_PRESSURE = "pavg_c";
+	private static final String METRIC_NAME_COMPRESSOR_TEMPERATURE = "T_c";
+	private static final String METRIC_NAME_COMPRESSOR_AVG_TEMPERATURE = "Tavg_c";
+	private static final String METRIC_NAME_DRYER_TEMPERATURE = "T_d";
+	private static final String METRIC_NAME_DRYER_AVG_TEMPERATURE = "Tavg_d";
+	private static final String METRIC_NAME_DRYER_STATUS = "st_d";
+	private static final String METRIC_NAME_INPUT_BITMAP = "in";
+	private static final String METRIC_NAME_OUTPUT_BITMAP = "out";
+	private static final String METRIC_NAME_COMPRESSOR_STATUS = "st_c";
+	private static final String METRIC_NAME_COMPRESSOR_LOAD = "ld_c";
+	private static final String METRIC_NAME_TOTAL_HOURS = "toth";
+	private static final String METRIC_NAME_LOAD_HOURS = "ldh";
+	private static final String METRIC_NAME_CURRENT_ERROR_STATUS = "err";
+	private static final String METRIC_NAME_PRESSURE_UNIT = "pu";
+	private static final String METRIC_NAME_TEMPERATURE_UNIT = "Tu";
+	private static final String METRIC_NAME_SERIAL_NUMBER = "ser";
+	private static final String METRIC_NAME_PRODUCTION_WEEK = "prodw";
+	private static final String METRIC_NAME_PRODUCTION_YEAR = "prody";
+	private static final String METRIC_NAME_PRODUCT_CODE = "prodc";
+	private static final String METRIC_NAME_NEXT_SERVICE = "nsrv";
+	private static final String METRIC_NAME_AIR_FILTER_REMAINING_TIME = "afrt";
+	private static final String METRIC_NAME_OIL_FILTER_REMAINING_TIME = "ofrt";
+	private static final String METRIC_NAME_OIL_REMAINING_TIME = "ort";
+	private static final String METRIC_NAME_DISOIL_FILTER_REMAINING_TIME = "dort";
+	private static final String METRIC_NAME_DRYER_FILTER_REMAINING_TIME = "dfrt";
+	private static final String METRIC_NAME_MAX_PRESSURE = "pmax";
+	private static final String METRIC_NAME_MIN_PRESSURE = "pmin";
+
+
+	// Configuration property names for compressor status
+	private static final String CONF_NAME_COMPRESSOR_PRESSURE_ENABLE = "compressor.pressure.enable";
+	private static final String CONF_NAME_COMPRESSOR_PRESSURE_CHANGE = "compressor.pressure.change";
+	private static final String CONF_NAME_COMPRESSOR_TEMPERATURE_ENABLE = "compressor.temperature.enable";
+	private static final String CONF_NAME_COMPRESSOR_TEMPERATURE_CHANGE = "compressor.temperature.change";
+	private static final String CONF_NAME_DRYER_TEMPERATURE_ENABLE = "dryer.temperature.enable";
+	private static final String CONF_NAME_DRYER_TEMPERATURE_CHANGE = "dryer.temperature.change";
+	private static final String CONF_NAME_DRYER_STATUS_ENABLE = "dryer.status.enable";
+	private static final String CONF_NAME_DRYER_STATUS_CHANGE = "dryer.status.change";
+	private static final String CONF_NAME_INPUT_BITMAP_ENABLE = "input.enable";
+	private static final String CONF_NAME_INPUT_BITMAP_CHANGE = "input.change";
+	private static final String CONF_NAME_OUTPUT_BITMAP_ENABLE = "output.enable";
+	private static final String CONF_NAME_OUTPUT_BITMAP_CHANGE = "output.change";
+	private static final String CONF_NAME_COMPRESSOR_STATUS_ENABLE = "compressor.status.enable";
+	private static final String CONF_NAME_COMPRESSOR_STATUS_CHANGE = "compressor.status.change";
+	private static final String CONF_NAME_COMPRESSOR_LOAD_ENABLE = "compressor.load.enable";
+	private static final String CONF_NAME_COMPRESSOR_LOAD_CHANGE = "compressor.load.change";
+	private static final String CONF_NAME_TOTAL_HOURS_ENABLE = "total.hours.enable";
+	private static final String CONF_NAME_TOTAL_HOURS_CHANGE = "total.hours.change";
+	private static final String CONF_NAME_LOAD_HOURS_ENABLE = "load.hours.enable";
+	private static final String CONF_NAME_LOAD_HOURS_CHANGE = "load.hours.change";
+	private static final String CONF_NAME_CURRENT_ERROR_STATUS_ENABLE = "error.enable";
+	private static final String CONF_NAME_CURRENT_ERROR_STATUS_CHANGE = "error.change";
+	private static final String CONF_NAME_PRESSURE_UNIT_ENABLE = "pressure.unit.enable";
+	private static final String CONF_NAME_TEMPERATURE_UNIT_ENABLE = "temperature.unit.enable";
+	private static final String CONF_NAME_SERIAL_NUMBER_ENABLE = "serial.number.enable";
+	private static final String CONF_NAME_PRODUCTION_WEEK_ENABLE = "production.week.enable";
+	private static final String CONF_NAME_PRODUCTION_YEAR_ENABLE = "production.year.enable";
+	private static final String CONF_NAME_PRODUCT_CODE_ENABLE = "product.code.enable";
+	private static final String CONF_NAME_NEXT_SERVICE_ENABLE = "next.service.enable";
+	private static final String CONF_NAME_AIR_FILTER_REMAINING_TIME_ENABLE = "air.filter.remaining.time.enable";
+	private static final String CONF_NAME_AIR_FILTER_REMAINING_TIME_CHANGE = "air.filter.remaining.time.change";
+	private static final String CONF_NAME_OIL_FILTER_REMAINING_TIME_ENABLE = "oil.filter.remaining.time.enable";
+	private static final String CONF_NAME_OIL_FILTER_REMAINING_TIME_CHANGE = "oil.filter.remaining.time.change";
+	private static final String CONF_NAME_OIL_REMAINING_TIME_ENABLE = "oil.remaining.time.enable";
+	private static final String CONF_NAME_OIL_REMAINING_TIME_CHANGE = "oil.remaining.time.change";
+	private static final String CONF_NAME_DISOIL_FILTER_REMAINING_TIME_ENABLE = "disoil.filter.remaining.time.enable";
+	private static final String CONF_NAME_DISOIL_FILTER_REMAINING_TIME_CHANGE = "disoil.filter.remaining.time.change";
+	private static final String CONF_NAME_DRYER_FILTER_REMAINING_TIME_ENABLE = "dryer.filter.remaining.time.enable";
+	private static final String CONF_NAME_DRYER_FILTER_REMAINING_TIME_CHANGE = "dryer.filter.remaining.time.change";
+	private static final String CONF_NAME_MAX_PRESSURE_ENABLE = "pressure.max.enable";
+	private static final String CONF_NAME_MIN_PRESSURE_ENABLE = "pressure.min.enable";
+
+	// Configuration property names for compressor error history
+	private static final String CONF_NAME_ERROR_HISTORY_ENABLE = "error.history.enable";
+	private static final String CONF_NAME_ERROR_HISTORY_CHANGE = "error.history.change";
+
+	// Configuration property names for various timings
+	private static final String CONF_NAME_PUBLISH_ON_CHANGE = "publish.on.change";
+	private static final String CONF_NAME_POLL_INTERVAL = "poll.interval";	
+	private static final String CONF_NAME_AVERAGE_INTERVAL = "average.time";
+
+	private CanConnectionService 	m_canConnection;
+	private CloudService            m_cloudService;
+	private CloudClient 			m_cloudAppClient=null;
+	private Map<String,Object>   	m_properties;
+	private Thread 					m_pollThread;
+	private boolean 				thread_done = false;
+	private String					m_ifName;
+	private int 					m_canId;
+	private int						m_orig;
+	private int	nbFrame = 0;
+	private int	nbdecod = 0;
+	private byte indice = 0;
+	private int  idToReceive;
+	private int  idReceived;
+	private long start;
+	private CompressorStatus status = new CompressorStatus();
+	private short maxPressure = -0x7FFF;
+	private short minPressure = 0x7FFF;
+
+	private CompressorStatus m_lastCompressorStatus;
+	private CompressorError[] m_lastErrorHistory;
+
+	private int m_compressorSumOfTemperatures;
+	private int m_compressorSumOfPressures;
+	private int m_dryerSumOfTemperatures;
+	private int m_numOfPoints;
+
+	private short m_compressorAvgTemperature;
+	private short m_compressorAvgPressure;
+	private short m_dryerAvgTemperature;
+	private int m_pollInterval=1000;
+
+	public void setCloudService(CloudService cloudService) {
+		this.m_cloudService = cloudService;
+	}
+
+	public void unsetCloudService(CloudService cloudService) {
+		this.m_cloudService = null;
+	}
+
+	public void setCanConnectionService(CanConnectionService canConnection) {
+		this.m_canConnection = canConnection;
+	}
+
+	public void unsetCanConnectionService(CanConnectionService canConnection) {
+		this.m_canConnection = null;
+	}
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) {
+		m_properties = properties;
+		s_logger.info("activating can test");
+		 for (Map.Entry<String,Object> m: ((Map<String,Object>) m_properties).entrySet())
+	     	 System.out.println(m.getKey() + " = " + m.getValue().toString());
+
+		m_ifName="can0";
+		m_canId=-1;
+		m_orig =-1;
+		
+		m_compressorSumOfPressures = 0;
+		m_compressorSumOfTemperatures = 0;
+		m_dryerSumOfTemperatures = 0;
+		m_numOfPoints = 0;
+		
+		m_lastErrorHistory = null;
+		m_lastCompressorStatus = null;
+		
+		start = System.currentTimeMillis();
+		if(m_properties!=null){
+			if(m_properties.get("can.name") != null) 
+				m_ifName = (String) m_properties.get("can.name");
+			if(m_properties.get("can.identifier") != null) 
+				m_canId = (Integer) m_properties.get("can.identifier");
+		}
+
+		if(m_cloudAppClient==null) {
+			// Acquire a Cloud Application Client for this Application 
+			s_logger.info("Getting CloudApplicationClient for {}...", APP_ID);
+			try {
+				m_cloudAppClient = m_cloudService.newCloudClient(APP_ID);
+			} catch (KuraException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			m_cloudAppClient.addCloudClientListener(this);
+		}
+
+		if(m_pollThread!=null){
+			m_pollThread.interrupt();
+			try {
+				m_pollThread.join(100);
+			} catch (InterruptedException e) {
+				// Ignore
+			}
+			m_pollThread=null;
+		}
+
+		testSendImpl(m_ifName,m_canId,0);
+		m_pollThread = new Thread(new Runnable() {		
+			@Override
+			public void run() {
+				if(m_canConnection!=null){
+					while(!thread_done){
+						thread_done=doCanTest();
+					}
+				}
+			}
+		});
+		m_pollThread.start();	
+	}
+
+
+	protected void deactivate(ComponentContext componentContext) {
+		if(m_pollThread!=null){
+			m_pollThread.interrupt();
+			try {
+				m_pollThread.join(100);
+			} catch (InterruptedException e) {
+				// Ignore
+			}
+		}
+		m_pollThread=null;
+		// Releasing the CloudApplicationClient
+		s_logger.info("Releasing CloudApplicationClient for {}...", APP_ID);
+		m_cloudAppClient.release();
+	}
+
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.debug("updated...");		
+		m_properties = properties;
+		 for (Map.Entry<String,Object> m: ((Map<String,Object>) m_properties).entrySet())
+	     	 System.out.println(m.getKey() + " = " + m.getValue().toString());
+		if(m_properties!=null){
+			if(m_properties.get("can.name") != null) 
+				m_ifName = (String) m_properties.get("can.name");
+			if(m_properties.get("can.identifier") != null) 
+				m_canId = (Integer) m_properties.get("can.identifier");
+			if(m_properties.get(CONF_NAME_POLL_INTERVAL) != null) {
+				m_pollInterval=(Integer)m_properties.get(CONF_NAME_POLL_INTERVAL)*1000;
+				s_logger.debug("sleep for "+m_pollInterval);
+			}
+			if(m_pollThread!=null){
+				m_pollThread.interrupt();
+				try {
+					m_pollThread.join(100);
+				} catch (InterruptedException e) {
+					// Ignore
+				}
+				m_pollThread=null;
+			}
+
+			testSendImpl(m_ifName,m_canId,0);
+			m_pollThread = new Thread(new Runnable() {		
+				@Override
+				public void run() {
+					if(m_canConnection!=null){
+						while(!thread_done){
+							thread_done=doCanTest();
+						}
+					}
+				}
+			});
+			m_pollThread.start();	
+		}
+	}
+	
+	@Test
+	public void testDummy() {
+		assertTrue(true);
+	}
+
+	public boolean doCanTest() {
+		byte[] b; 
+		CanMessage cm;
+		int index=0;
+		if(m_orig>=0){
+			try {
+				testSendImpl(m_ifName,m_canId,m_orig);
+				cm = m_canConnection.receiveCanMessage(idToReceive,0x7FF);
+			} catch (Exception e) {
+				s_logger.warn("CanConnection Crash!");			
+				e.printStackTrace();
+				return true;
+			}
+		}
+		else{
+			try {
+				long elapsed = System.currentTimeMillis()-start;
+				if(elapsed>1000){
+					s_logger.debug("timeout m_orig="+m_orig);
+					testSendImpl(m_ifName,m_canId,m_orig);
+					start = System.currentTimeMillis();
+				}
+				cm = m_canConnection.receiveCanMessage(-1,0xF);
+			} catch (Exception e) {
+				s_logger.warn("CanConnection Crash!");			
+				e.printStackTrace();
+				return true;
+			}
+		}
+
+		b = cm.getData();
+		if(b!=null){
+			nbFrame++;
+			StringBuilder sb = new StringBuilder("received : ");
+			for(int i=0; i<b.length; i++){
+				sb.append(b[i]);
+				sb.append(";");
+			}
+			int id = cm.getCanId();
+			idReceived = id;
+			int code = (id >> 8);
+			m_orig = (id >> 4)& 0xF;
+			int dest = (id & 0xF);
+			//s_logger.debug("id="+String.format("%03x", idToReceive)+"H"+" : "+sb);
+			if(code==5){
+				//s_logger.debug("id="+String.format("%03x", cm.getCanId())+"H"+" : "+sb);
+				if(b.length==6){
+					start = System.currentTimeMillis();
+					nbdecod++;
+					index = (int)b[0]+((int)b[1]<<8);
+					int val1 = (int)b[2]+((int)b[3]<<8);
+					int val2 = (int)b[4]+((int)b[5]<<8);
+					//						s_logger.debug("sendCanMessage on "+m_ifName+" canId = "+String.format("%03x", (0x500 + (m_canId << 4) + m_orig))+"H  (code="+indice+")");
+					//						s_logger.debug("Total nb frames = "+nbFrame+" decoded="+nbdecod+" id="+String.format("%03x", cm.getCanId())+"H"+" : "+sb);
+					//						s_logger.debug("indice="+index+"  data1="+val1+"  data2="+val2);
+					switch(index){
+					case 0:
+						status.setCompressorPressure(ProtocolUtils.getSigned16(b, 2));
+						status.setCompressorTemperature(ProtocolUtils.getSigned16(b, 4));
+						s_logger.debug("Pressure = "+status.getCompressorPressure()+"  Temperature = "+status.getCompressorTemperature());
+						break;
+					case 1:
+						status.setDryerTemperature(ProtocolUtils.getSigned16(b, 2));
+						status.setDryerStatus(ProtocolUtils.getUnsigned8(b, 4));
+						s_logger.debug("Dryer temp = "+status.getDryerTemperature()+"  dryer status = "+status.getDryerStatus());
+						break;
+					case 2:
+						status.setInputBitmap(ProtocolUtils.getUnsigned16(b, 2));
+						status.setOutputBitmap(ProtocolUtils.getUnsigned8(b, 4));
+						s_logger.debug("Inp bitmap = "+status.getInputBitmap()+"  outp bitmap = "+status.getOutputBitmap());
+						break;
+					case 3:
+						status.setCompressorStatus(ProtocolUtils.getUnsigned8(b, 2));
+						status.setCompressorLoad(ProtocolUtils.getUnsigned8(b, 4));
+						s_logger.debug("Comp status = "+status.getCompressorStatus()+"  comp load = "+status.getCompressorLoad());
+						break;
+					case 4:
+						status.setTotalHours(ProtocolUtils.getUnsigned16(b, 2));
+						status.setLoadHours(ProtocolUtils.getUnsigned16(b, 4));
+						s_logger.debug("Total hr = "+status.getTotalHours()+"  load hr = "+status.getLoadHours());
+						break;
+					case 5:
+						status.setCurrentErrorStatus(ProtocolUtils.getUnsigned8(b, 3));
+						s_logger.debug("Error status = "+status.getCurrentErrorStatus());
+						break;
+					case 6:
+						status.setPressureUnit(ProtocolUtils.getUnsigned8(b, 2));
+						status.setTemperatureUnit(ProtocolUtils.getUnsigned8(b, 4));
+						s_logger.debug("Unit P = "+status.getPressureUnit()+"  unit T = "+status.getTemperatureUnit());
+						break;
+					case 7:
+						status.setSerialNumber(ProtocolUtils.getUnsigned16(b, 2));
+						status.setProductionWeek(ProtocolUtils.getUnsigned8(b, 4));
+						s_logger.debug("Serial num = "+status.getSerialNumber()+"  Prod week = "+status.getProductionWeek());
+						break;
+					case 8:
+						status.setProductionYear(ProtocolUtils.getUnsigned8(b, 2));
+						status.setProductCode(ProtocolUtils.getUnsigned8(b, 4));
+						s_logger.debug("Year prod = "+status.getProductionYear()+"  Product code = "+status.getProductCode());
+						break;
+					case 12:
+						status.setNextService(ProtocolUtils.getUnsigned8(b, 2));
+						status.setAirFilterRemainingTime(ProtocolUtils.getUnsigned16(b, 4));
+						s_logger.debug("Next service = "+status.getNextService()+"  Air filter time = "+status.getAirFilterRemainingTime());
+						break;
+					case 13:
+						status.setOilFilterRemainingTime(ProtocolUtils.getUnsigned16(b, 2));
+						status.setOilRemainingTime(ProtocolUtils.getUnsigned16(b, 4));
+						s_logger.debug("Oil Filter time = "+status.getOilFilterRemainingTime()+"  oil time = "+status.getOilRemainingTime());
+						break;
+					case 14:
+						status.setDisoilFilterRemainingTime(ProtocolUtils.getUnsigned16(b, 2));
+						status.setDryerFilterRemainingTime(ProtocolUtils.getUnsigned16(b, 4));
+						s_logger.debug("Disoil Filter time = "+status.getDisoilFilterRemainingTime()+"  dryer filter time = "+status.getDryerFilterRemainingTime());
+						break;
+					case 15:
+						status.setMaxPressure(ProtocolUtils.getSigned16(b, 2));
+						status.setMinPressure(ProtocolUtils.getSigned16(b, 4));
+						s_logger.debug("MinPress = "+status.getMinPressure()+"  MaxPress = "+status.getMaxPressure());
+						break;
+					}
+				}
+			}
+			else{
+				long elapsed = System.currentTimeMillis()-start;
+				if(elapsed>10000){
+					s_logger.debug("id="+String.format("%03x", cm.getCanId())+"H"+" : "+sb);
+					start = System.currentTimeMillis();
+				}
+			}
+			if(indice>14){ 
+				indice=0;
+				handleCompressorData(status, null, false);
+				try {
+					Thread.sleep(m_pollInterval);
+				} catch (InterruptedException e) {
+					//e.printStackTrace();
+				}
+			}
+		}
+		else{
+			System.out.println("receive=null");
+		}			
+		return false;
+	}
+
+
+
+	public void testSendImpl(String ifName, int orig, int dest) {
+		try {
+			if((m_canConnection==null)||(orig<0)) 
+				return;
+			int id = 0x500 + (orig << 4) + dest;
+			idToReceive = 0x500 + (dest << 4) + orig;
+			byte btest[] = new byte[2];
+			btest[0]=indice;
+			btest[1]=0;
+			m_canConnection.sendCanMessage(ifName, id, btest);
+			long elapsed = System.currentTimeMillis()-start;
+			//if(elapsed>10000)
+			//s_logger.debug("sendCanMessage on "+ifName+" canId = "+String.format("%03x", id)+"H  (code="+indice+")");
+			indice++;
+			//if(indice>14) indice=0;
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onConnectionLost() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		// TODO Auto-generated method stub
+
+	}
+
+	private synchronized void handleCompressorData(CompressorStatus status,
+			CompressorError[] errorHistory,
+			boolean averagingIntervalElapsed) {
+
+		// Allocate a new payload
+		KuraPayload payload = new KuraPayload();
+		payload.setTimestamp(new Date());
+
+		Boolean changed = false;
+		Set<String> topics = new HashSet<String>();
+
+		//
+		// Process the compressor status
+		s_logger.info(CONF_NAME_COMPRESSOR_PRESSURE_ENABLE+m_properties.get(CONF_NAME_COMPRESSOR_PRESSURE_ENABLE));
+		Boolean enabled = (Boolean) m_properties.get(CONF_NAME_COMPRESSOR_PRESSURE_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_COMPRESSOR_PRESSURE, Integer.valueOf(status.getCompressorPressure()));
+
+			Short confChange = (Short) m_properties.get(CONF_NAME_COMPRESSOR_PRESSURE_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getCompressorPressure() - status.getCompressorPressure()) > confChange) {
+				changed = true;
+			}
+		}
+
+		s_logger.info(CONF_NAME_COMPRESSOR_TEMPERATURE_ENABLE+m_properties.get(CONF_NAME_COMPRESSOR_TEMPERATURE_ENABLE));
+		enabled = (Boolean) m_properties.get(CONF_NAME_COMPRESSOR_TEMPERATURE_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_COMPRESSOR_TEMPERATURE, Integer.valueOf(status.getCompressorTemperature()));
+
+			Short confChange = (Short) m_properties.get(CONF_NAME_COMPRESSOR_TEMPERATURE_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getCompressorTemperature() - status.getCompressorTemperature()) > confChange) {
+				changed = true;
+			}
+
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_DRYER_TEMPERATURE_ENABLE);
+		if (enabled) {			
+			payload.addMetric(METRIC_NAME_DRYER_TEMPERATURE, Integer.valueOf(status.getDryerTemperature()));
+
+			Short confChange = (Short) m_properties.get(CONF_NAME_DRYER_TEMPERATURE_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getDryerTemperature() - status.getDryerTemperature()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_DRYER_STATUS_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_DRYER_STATUS, Integer.valueOf(status.getDryerStatus()));
+
+			Boolean confChange = (Boolean)m_properties.get(CONF_NAME_DRYER_STATUS_CHANGE);
+			if (confChange) {
+				if (m_lastCompressorStatus == null ||
+						m_lastCompressorStatus.getDryerStatus() != status.getDryerStatus()) {
+					topics.add(SEMANTIC_TOPIC_STATUS);
+					changed = true;
+				}
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_INPUT_BITMAP_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_INPUT_BITMAP, status.getInputBitmap());
+
+			Boolean confChange = (Boolean)m_properties.get(CONF_NAME_INPUT_BITMAP_CHANGE);
+			if (confChange) {
+				if (m_lastCompressorStatus == null ||
+						m_lastCompressorStatus.getInputBitmap() != status.getInputBitmap()) {
+					topics.add(SEMANTIC_TOPIC_IO);
+					changed = true;
+				}
+			}			
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_OUTPUT_BITMAP_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_OUTPUT_BITMAP, Integer.valueOf(status.getOutputBitmap()));
+
+			Boolean confChange = (Boolean)m_properties.get(CONF_NAME_OUTPUT_BITMAP_CHANGE);
+			if (confChange) {
+				if (m_lastCompressorStatus == null ||
+						m_lastCompressorStatus.getOutputBitmap() != status.getOutputBitmap()) {
+					topics.add(SEMANTIC_TOPIC_IO);
+					changed = true;
+				}
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_COMPRESSOR_STATUS_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_COMPRESSOR_STATUS, Integer.valueOf(status.getCompressorStatus()));
+
+			Boolean confChange = (Boolean)m_properties.get(CONF_NAME_COMPRESSOR_STATUS_CHANGE);
+			if (confChange) {
+				if (m_lastCompressorStatus == null ||
+						m_lastCompressorStatus.getCompressorStatus() != status.getCompressorStatus()) {
+					topics.add(SEMANTIC_TOPIC_STATUS);
+					changed = true;
+				}
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_COMPRESSOR_LOAD_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_COMPRESSOR_LOAD, Integer.valueOf(status.getCompressorLoad()));
+
+			Short confChange = (Short) m_properties.get(CONF_NAME_COMPRESSOR_LOAD_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getCompressorLoad() - status.getCompressorLoad()) > confChange) {
+				changed = true;
+			}
+
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_TOTAL_HOURS_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_TOTAL_HOURS, status.getTotalHours());
+
+			Long confChange = (Long) m_properties.get(CONF_NAME_TOTAL_HOURS_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getTotalHours() - status.getTotalHours()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_LOAD_HOURS_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_LOAD_HOURS, status.getLoadHours());
+
+			Long confChange = (Long) m_properties.get(CONF_NAME_LOAD_HOURS_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getLoadHours() - status.getLoadHours()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_CURRENT_ERROR_STATUS_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_CURRENT_ERROR_STATUS, Integer.valueOf(status.getCurrentErrorStatus()));
+
+			Boolean confChange = (Boolean)m_properties.get(CONF_NAME_CURRENT_ERROR_STATUS_CHANGE);
+			if (confChange) {
+				if (m_lastCompressorStatus == null ||
+						m_lastCompressorStatus.getCurrentErrorStatus() != status.getCurrentErrorStatus()) {
+					topics.add(SEMANTIC_TOPIC_ERROR);
+					changed = true;
+				}
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_PRESSURE_UNIT_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_PRESSURE_UNIT, Integer.valueOf(status.getPressureUnit()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_TEMPERATURE_UNIT_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_TEMPERATURE_UNIT, Integer.valueOf(status.getTemperatureUnit()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_SERIAL_NUMBER_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_SERIAL_NUMBER, status.getSerialNumber());
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_PRODUCTION_WEEK_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_PRODUCTION_WEEK, Integer.valueOf(status.getProductionWeek()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_PRODUCTION_YEAR_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_PRODUCTION_YEAR, Integer.valueOf(status.getProductionYear()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_PRODUCT_CODE_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_PRODUCT_CODE, Integer.valueOf(status.getProductCode()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_NEXT_SERVICE_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_NEXT_SERVICE, Integer.valueOf(status.getNextService()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_AIR_FILTER_REMAINING_TIME_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_AIR_FILTER_REMAINING_TIME, status.getAirFilterRemainingTime());
+
+			Integer confChange = (Integer) m_properties.get(CONF_NAME_AIR_FILTER_REMAINING_TIME_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getAirFilterRemainingTime() - status.getAirFilterRemainingTime()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_OIL_FILTER_REMAINING_TIME_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_OIL_FILTER_REMAINING_TIME, status.getOilFilterRemainingTime());
+
+			Integer confChange = (Integer) m_properties.get(CONF_NAME_OIL_FILTER_REMAINING_TIME_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getOilFilterRemainingTime() - status.getOilFilterRemainingTime()) > confChange) {
+				changed = true;
+			}
+
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_OIL_REMAINING_TIME_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_OIL_REMAINING_TIME, status.getOilRemainingTime());
+
+			Integer confChange = (Integer) m_properties.get(CONF_NAME_OIL_REMAINING_TIME_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getOilRemainingTime() - status.getOilRemainingTime()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_DISOIL_FILTER_REMAINING_TIME_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_DISOIL_FILTER_REMAINING_TIME, status.getDisoilFilterRemainingTime());
+
+			Integer confChange = (Integer) m_properties.get(CONF_NAME_DISOIL_FILTER_REMAINING_TIME_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getDisoilFilterRemainingTime() - status.getDisoilFilterRemainingTime()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_DRYER_FILTER_REMAINING_TIME_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_DRYER_FILTER_REMAINING_TIME, status.getDryerFilterRemainingTime());
+
+			Integer confChange = (Integer) m_properties.get(CONF_NAME_DRYER_FILTER_REMAINING_TIME_CHANGE);
+			if (m_lastCompressorStatus == null || 
+					Math.abs(m_lastCompressorStatus.getDryerFilterRemainingTime() - status.getDryerFilterRemainingTime()) > confChange) {
+				changed = true;
+			}
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_MAX_PRESSURE_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_MAX_PRESSURE, Integer.valueOf(status.getMaxPressure()));
+		}
+
+		enabled = (Boolean) m_properties.get(CONF_NAME_MIN_PRESSURE_ENABLE);
+		if (enabled) {
+			payload.addMetric(METRIC_NAME_MIN_PRESSURE, Integer.valueOf(status.getMinPressure()));
+		}
+
+		//
+		// Process the compressor error history
+		enabled = (Boolean) m_properties.get(CONF_NAME_ERROR_HISTORY_ENABLE);
+		if ((enabled)&&(errorHistory!=null)) {
+			Boolean confChange = (Boolean) m_properties.get(CONF_NAME_ERROR_HISTORY_CHANGE);
+			if (confChange) {
+				if (m_lastErrorHistory == null) {
+					changed = true;
+				} else {
+					for (int i = 0; i < errorHistory.length; i++) {
+						if (m_lastErrorHistory[i].getCode() != errorHistory[i].getCode() ||
+								m_lastErrorHistory[i].getDay() != errorHistory[i].getDay() ||
+								m_lastErrorHistory[i].getMonth() != errorHistory[i].getMonth() ||
+								m_lastErrorHistory[i].getYear() != errorHistory[i].getYear()) {
+
+							s_logger.info("Error history changed {}", Arrays.toString(errorHistory));
+
+							topics.add(SEMANTIC_TOPIC_ERROR);
+							changed = true;
+
+							// TODO what metrics to publish?
+
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		// Publish by default
+		boolean doPublish = true;
+
+		Boolean publishOnChange = (Boolean) m_properties.get(CONF_NAME_PUBLISH_ON_CHANGE);
+		if (publishOnChange) {
+			doPublish = changed;
+		}
+
+		Integer averageInterval = (Integer) m_properties.get(CONF_NAME_AVERAGE_INTERVAL);
+		if (averageInterval != 0) {
+			if (averagingIntervalElapsed && m_numOfPoints > 0) {
+				s_logger.info("Average interval elapsed");
+
+				m_compressorAvgPressure =(short) ((double) m_compressorSumOfPressures / (double) m_numOfPoints);
+				m_compressorAvgTemperature =(short) ((double) m_compressorSumOfTemperatures / (double) m_numOfPoints);
+				m_dryerAvgTemperature =(short) ((double) m_dryerSumOfTemperatures / (double) m_numOfPoints);
+
+				s_logger.info("Average commpressor pressure {}", m_compressorAvgPressure);
+				s_logger.info("Average commpressor temperature {}", m_compressorAvgTemperature);
+				s_logger.info("Average dryer temperature {}", m_dryerAvgTemperature);
+
+
+				m_compressorSumOfPressures = 0;
+				m_compressorSumOfTemperatures = 0;
+				m_dryerSumOfTemperatures = 0;
+				m_numOfPoints = 0;
+
+				topics.add(SEMANTIC_TOPIC_TIME_SERIES);
+
+				doPublish = true;
+			} else {
+				m_compressorSumOfPressures += status.getCompressorPressure();
+				m_compressorSumOfTemperatures += status.getCompressorTemperature();
+				m_dryerSumOfTemperatures += status.getDryerTemperature();
+				m_numOfPoints++;				
+			}
+
+			enabled = (Boolean) m_properties.get(CONF_NAME_COMPRESSOR_PRESSURE_ENABLE);
+			if (enabled) {
+				payload.addMetric(METRIC_NAME_COMPRESSOR_AVG_PRESSURE, Integer.valueOf(m_compressorAvgPressure));
+			}
+
+			enabled = (Boolean) m_properties.get(CONF_NAME_COMPRESSOR_TEMPERATURE_ENABLE);
+			if (enabled) {
+				payload.addMetric(METRIC_NAME_COMPRESSOR_AVG_TEMPERATURE, Integer.valueOf(m_compressorAvgTemperature));
+			}
+
+			enabled = (Boolean) m_properties.get(CONF_NAME_DRYER_TEMPERATURE_ENABLE);
+			if (enabled) {
+				payload.addMetric(METRIC_NAME_DRYER_AVG_TEMPERATURE, Integer.valueOf(m_dryerAvgTemperature));
+			}
+		}
+
+		if (doPublish) {
+
+			if (topics.isEmpty()) {
+				topics.add(SEMANTIC_TOPIC_DEFAULT);
+			}
+
+			for (String topic : topics) {
+				s_logger.info("Publishing on topic: {}", topic);
+
+				// Try to publish the message
+				try {
+					m_cloudAppClient.publish(topic, payload, DFLT_QOS, DFLT_RETAIN);
+				} catch (Throwable t) {
+					s_logger.error("Cannot publish topic: {}", topic);
+				}
+			}
+		}
+
+		m_lastCompressorStatus = status;
+		m_lastErrorHistory = errorHistory;
+	}
+}
diff --git a/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CompressorError.java b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CompressorError.java
new file mode 100644
index 0000000000000000000000000000000000000000..95196f9edd97f91f8eaa2311e7131f8fdf00fa78
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CompressorError.java
@@ -0,0 +1,38 @@
+package org.eclipse.kura.protocol.can.test;
+
+public class CompressorError {
+	private short code; /* 8 bit unsigned */
+	private short day; /* 8 bit unsigned */
+	private short month; /* 8 bit unsigned */
+	private short year; /* 8 bit unsigned */
+	
+	public short getCode() {
+		return code;
+	}
+	public void setCode(short code) {
+		this.code = code;
+	}
+	public short getDay() {
+		return day;
+	}
+	public void setDay(short day) {
+		this.day = day;
+	}
+	public short getMonth() {
+		return month;
+	}
+	public void setMonth(short month) {
+		this.month = month;
+	}
+	public short getYear() {
+		return year;
+	}
+	public void setYear(short year) {
+		this.year = year;
+	}
+	@Override
+	public String toString() {
+		return "CompressorError [code=" + code + ", day=" + day + ", month="
+				+ month + ", year=" + year + "]";
+	}
+}
diff --git a/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CompressorStatus.java b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CompressorStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..896de5f02e9ab9c87698bd3457df612dcdb00829
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/CompressorStatus.java
@@ -0,0 +1,253 @@
+package org.eclipse.kura.protocol.can.test;
+
+public class CompressorStatus {
+		
+	private short compressorPressure; /* 16 bit signed */
+	private short compressorTemperature; /* 16 bit signed */
+	private short dryerTemperature; /* 16 bit signed */
+	private short dryerStatus; /* 8 bit unsigned */
+	private int inputBitmap; /* 16 bit unsigned */
+	private short outputBitmap; /* 8 bit unsigned */
+	private short compressorStatus; /* 8 bit unsigned */
+	private short compressorLoad; /* 8 bit unsigned */
+	private long totalHours; /* 32 bit unsigned */
+	private long loadHours; /* 32 bit unsigned */
+	private short currentErrorStatus; /* 8 bit unsigned */
+	private short pressureUnit; /* 8 bit unsigned */
+	private short temperatureUnit;  /* 8 bit unsigned */
+	private int serialNumber; /* 16 bit unsigned */
+	private short productionWeek; /* 8 bit unsigned */
+	private short productionYear; /* 8 bit unsigned */
+	private short productCode;  /* 8 bit unsigned */
+	private short nextService; /* 8 bit unsigned */
+	private int airFilterRemainingTime; /* 16 bit unsigned */
+	private int oilFilterRemainingTime; /* 16 bit unsigned */
+	private int oilRemainingTime; /* 16 bit unsigned */
+	private int disoilFilterRemainingTime; /* 16 bit unsigned */
+	private int dryerFilterRemainingTime; /* 16 bit unsigned */
+	private short maxPressure; /* 16 bit signed */
+	private short minPressure; /* 16 bit signed */
+	
+	public short getCompressorPressure() {
+		return compressorPressure;
+	}
+
+	public void setCompressorPressure(short compressorPressure) {
+		this.compressorPressure = compressorPressure;
+	}
+	
+	public short getCompressorTemperature() {
+		return compressorTemperature;
+	}
+
+	public void setCompressorTemperature(short compressorTemperature) {
+		this.compressorTemperature = compressorTemperature;
+	}
+
+	public short getDryerTemperature() {
+		return dryerTemperature;
+	}
+
+	public void setDryerTemperature(short dryerTemperature) {
+		this.dryerTemperature = dryerTemperature;
+	}
+
+	public short getDryerStatus() {
+		return dryerStatus;
+	}
+
+	public void setDryerStatus(short dryerStatus) {
+		this.dryerStatus = dryerStatus;
+	}
+
+	public int getInputBitmap() {
+		return inputBitmap;
+	}
+
+	public void setInputBitmap(int inputBitmap) {
+		this.inputBitmap = inputBitmap;
+	}
+
+	public short getOutputBitmap() {
+		return outputBitmap;
+	}
+
+	public void setOutputBitmap(short outputBitmap) {
+		this.outputBitmap = outputBitmap;
+	}
+
+	public short getCompressorStatus() {
+		return compressorStatus;
+	}
+
+	public void setCompressorStatus(short compressorStatus) {
+		this.compressorStatus = compressorStatus;
+	}
+
+	public short getCompressorLoad() {
+		return compressorLoad;
+	}
+
+	public void setCompressorLoad(short compressorLoad) {
+		this.compressorLoad = compressorLoad;
+	}
+
+	public long getTotalHours() {
+		return totalHours;
+	}
+
+	public void setTotalHours(long totalHours) {
+		this.totalHours = totalHours;
+	}
+
+	public long getLoadHours() {
+		return loadHours;
+	}
+
+	public void setLoadHours(long loadHours) {
+		this.loadHours = loadHours;
+	}
+
+	public short getCurrentErrorStatus() {
+		return currentErrorStatus;
+	}
+
+	public void setCurrentErrorStatus(short currentErrorStatus) {
+		this.currentErrorStatus = currentErrorStatus;
+	}
+
+	public short getPressureUnit() {
+		return pressureUnit;
+	}
+
+	public void setPressureUnit(short pressureUnit) {
+		this.pressureUnit = pressureUnit;
+	}
+
+	public short getTemperatureUnit() {
+		return temperatureUnit;
+	}
+
+	public void setTemperatureUnit(short temperatureUnit) {
+		this.temperatureUnit = temperatureUnit;
+	}
+
+	public int getSerialNumber() {
+		return serialNumber;
+	}
+
+	public void setSerialNumber(int serialNumber) {
+		this.serialNumber = serialNumber;
+	}
+	
+	public short getProductionWeek() {
+		return productionWeek;
+	}
+
+	public void setProductionWeek(short productionWeek) {
+		this.productionWeek = productionWeek;
+	}
+
+	public short getProductionYear() {
+		return productionYear;
+	}
+
+	public void setProductionYear(short productionYear) {
+		this.productionYear = productionYear;
+	}
+	
+	public short getProductCode() {
+		return productCode;
+	}
+
+	public void setProductCode(short productCode) {
+		this.productCode = productCode;
+	}
+
+	public short getNextService() {
+		return nextService;
+	}
+
+	public void setNextService(short nextService) {
+		this.nextService = nextService;
+	}
+
+	public int getAirFilterRemainingTime() {
+		return airFilterRemainingTime;
+	}
+
+	public void setAirFilterRemainingTime(int airFilterRemainingTime) {
+		this.airFilterRemainingTime = airFilterRemainingTime;
+	}
+
+	public int getOilFilterRemainingTime() {
+		return oilFilterRemainingTime;
+	}
+
+	public void setOilFilterRemainingTime(int oilFilterRemainingTime) {
+		this.oilFilterRemainingTime = oilFilterRemainingTime;
+	}
+
+	public int getOilRemainingTime() {
+		return oilRemainingTime;
+	}
+
+	public void setOilRemainingTime(int oilRemainingTime) {
+		this.oilRemainingTime = oilRemainingTime;
+	}
+
+	public int getDisoilFilterRemainingTime() {
+		return disoilFilterRemainingTime;
+	}
+
+	public void setDisoilFilterRemainingTime(int disoilFilterRemainingTime) {
+		this.disoilFilterRemainingTime = disoilFilterRemainingTime;
+	}
+
+	public int getDryerFilterRemainingTime() {
+		return dryerFilterRemainingTime;
+	}
+
+	public void setDryerFilterRemainingTime(int dryerFilterRemainingTime) {
+		this.dryerFilterRemainingTime = dryerFilterRemainingTime;
+	}
+
+	public short getMaxPressure() {
+		return maxPressure;
+	}
+
+	public void setMaxPressure(short maxPressure) {
+		this.maxPressure = maxPressure;
+	}
+
+	public short getMinPressure() {
+		return minPressure;
+	}
+
+	public void setMinPressure(short minPressure) {
+		this.minPressure = minPressure;
+	}
+
+	@Override
+	public String toString() {
+		return "CompressorStatus [compressorPressure=" + compressorPressure
+				+ ", compressorTemperature=" + compressorTemperature
+				+ ", dryerTemperature=" + dryerTemperature + ", dryerStatus="
+				+ dryerStatus + ", inputBitmap=" + inputBitmap
+				+ ", outputBitmap=" + outputBitmap + ", compressorStatus="
+				+ compressorStatus + ", compressorLoad=" + compressorLoad
+				+ ", totalHours=" + totalHours + ", loadHours=" + loadHours
+				+ ", currentErrorStatus=" + currentErrorStatus
+				+ ", pressureUnit=" + pressureUnit + ", temperatureUnit="
+				+ temperatureUnit + ", serialNumber=" + serialNumber
+				+ ", productionWeek=" + productionWeek + ", productionYear="
+				+ productionYear + ", productCode=" + productCode
+				+ ", nextService=" + nextService + ", airFilterRemainingTime="
+				+ airFilterRemainingTime + ", oilFilterRemainingTime="
+				+ oilFilterRemainingTime + ", oilRemainingTime="
+				+ oilRemainingTime + ", disoilFilterRemainingTime="
+				+ disoilFilterRemainingTime + ", dryerFilterRemainingTime="
+				+ dryerFilterRemainingTime + ", maxPressure=" + maxPressure
+				+ ", minPressure=" + minPressure + "]";
+	}
+}
diff --git a/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/ProtocolUtils.java b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/ProtocolUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ce4106407fbf2fdf7d16d04f95a7ba0fbf32027
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can.test/src/main/java/org/eclipse/kura/protocol/can/test/ProtocolUtils.java
@@ -0,0 +1,36 @@
+package org.eclipse.kura.protocol.can.test;
+
+public class ProtocolUtils {
+	
+	public static byte getSigned8(byte[] buf, int offset) {
+		return buf[offset];
+	}
+	
+	public static short getUnsigned8(byte[] buf, int offset) {
+		return (short) (buf[offset] & 0xff);
+	}
+    
+	public static short getSigned16(byte[] buf, int offset) {
+		short t = (short) ((buf[offset] & 0xff) |
+				           (buf[offset+1] & 0xff) << 8);
+		return t;
+    }
+    
+	public static int getUnsigned16(byte[] buf, int offset) {
+		short t = getSigned16(buf, offset);
+		return t & 0xffff;
+    }
+    
+	public static int getSigned32(byte[] buf, int offset) {
+		int i = (buf[offset] & 0xff) |
+				(buf[offset+1] & 0xff) << 8 |
+				(buf[offset+2] & 0xff) << 16 |
+				(buf[offset+3] & 0xff) << 24;
+		return i;
+    }
+    
+	public static long getUnsigned32(byte[] buf, int offset) {
+		int i = getSigned32(buf, offset);
+		return i & 0xffffffffL;
+    }
+}
diff --git a/kura/org.eclipse.kura.protocol.can/.gitignore b/kura/org.eclipse.kura.protocol.can/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c51d662f10f82bc703b531b489ef7a8fc8ef6aa5
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/.gitignore
@@ -0,0 +1,3 @@
+/target
+/bin
+/lib
diff --git a/kura/org.eclipse.kura.protocol.can/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.protocol.can/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..fce60110a0722fffaca2dde591374f4d35a13dfa
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.protocol.can
+Bundle-SymbolicName: org.eclipse.kura.protocol.can;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.cm;version="1.4.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io,
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.protocol.can; version="0.2.0"
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .,
+ lib/libsocket-can-java-1.0.0.jar
diff --git a/kura/org.eclipse.kura.protocol.can/OSGI-INF/canconnection.xml b/kura/org.eclipse.kura.protocol.can/OSGI-INF/canconnection.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e48cb57b8f4d2d57b67b68e2d9f46eafbd30c7df
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/OSGI-INF/canconnection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" enabled="true" immediate="true" name="org.eclipse.kura.protocol.can.CanConnectionServiceImpl">
+   <implementation class="org.eclipse.kura.protocol.can.CanConnectionServiceImpl"/>
+   <service>
+      <provide interface="org.eclipse.kura.protocol.can.CanConnectionService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.protocol.can.CanConnectionService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.protocol.can/build.properties b/kura/org.eclipse.kura.protocol.can/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..99b7012b7556ab99cb98ec3d335b5855888f95bd
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/build.properties
@@ -0,0 +1,9 @@
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               lib/
+additional.bundles = slf4j.api,\
+                     org.eclipse.equinox.io,\
+                     org.eclipse.kura.api
diff --git a/kura/org.eclipse.kura.protocol.can/pom.xml b/kura/org.eclipse.kura.protocol.can/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f80a30ac8ec129b8ec233fbf854c0c895366ee0f
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/pom.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.protocol.can</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>de.entropia</groupId>
+			<artifactId>libsocket-can-java</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<version>2.1</version>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>process-resources</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>lib</outputDirectory>
+							<excludeGroupIds>p2.eclipse-plugin,org.eclipse.kura</excludeGroupIds>
+							<excludeTransitive>true</excludeTransitive>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+			<plugin>
+				<artifactId>maven-clean-plugin</artifactId>
+				<version>2.4.1</version>
+				<configuration>
+					<verbose>true</verbose>
+					<filesets>
+						<fileset>
+							<directory>lib</directory>
+							<followSymlinks>false</followSymlinks>
+							<!-- <includes> <include>abc</include> </includes> -->
+						</fileset>
+					</filesets>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-packaging-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<format>'${kura.build.version}'</format>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<id>package-plugin</id>
+						<goals>
+							<goal>package-plugin</goal>
+						</goals>
+						<configuration>
+							<finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings 
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.eclipse.tycho
+										</groupId>
+										<artifactId>
+											tycho-compiler-plugin
+										</artifactId>
+										<versionRange>
+											[0.20.0,)
+										</versionRange>
+										<goals>
+											<goal>compile</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.eclipse.tycho
+										</groupId>
+										<artifactId>
+											tycho-packaging-plugin
+										</artifactId>
+										<versionRange>
+											[0.20.0,)
+										</versionRange>
+										<goals>
+											<goal>
+												validate-version
+											</goal>
+											<goal>
+												validate-id
+											</goal>
+											<goal>
+												build-qualifier
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.apache.maven.plugins
+										</groupId>
+										<artifactId>
+											maven-dependency-plugin
+										</artifactId>
+										<versionRange>
+											[2.1,)
+										</versionRange>
+										<goals>
+											<goal>copy-dependencies</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore />
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+</project>
diff --git a/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanConnectionService.java b/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanConnectionService.java
new file mode 100644
index 0000000000000000000000000000000000000000..067439038ee7fa5f487c39ba6efb7a3dbb177f57
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanConnectionService.java
@@ -0,0 +1,37 @@
+package org.eclipse.kura.protocol.can;
+
+import java.io.IOException;
+
+import org.eclipse.kura.KuraException;
+
+/**
+ * This is the primary control class for a CAN network interface.
+ */
+
+public interface CanConnectionService {
+
+	/**
+	 * Sends an array of bytes on a CAN socket
+	 * 
+	 * @param ifName		the name of the socket (eg "can0")
+	 * @param canId			can identifier, must be unique
+	 * @param message		the array of bytes to send to the socket
+	 * @throws KuraException
+	 * @throws IOException
+	 */
+	public void sendCanMessage(String ifName, int canId,  byte[] message) throws KuraException, IOException;
+	
+	/**
+	 * Reads frames that are waiting on socket CAN (all interfaces) and returns an array
+	 * if canId is correct.
+	 * <p>
+	 * A filter can be defined to receive only frames for the id we are interested in. If the can_id param is set to -1, 
+	 * no filter is applied.  	
+	 * @param can_id		id to be filtered
+	 * @param can_mask		mask to be applied to the id
+	 * @return				CanMessage = canId and an array of bytes buffered on the socket if any
+	 * @throws KuraException
+	 * @throws IOException
+	 */
+	public CanMessage receiveCanMessage(int can_id, int can_mask) throws KuraException, IOException;
+}
diff --git a/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanConnectionServiceImpl.java b/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanConnectionServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a33ca0a1c27f615a1fdecc2d6e225e33592f4f2f
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanConnectionServiceImpl.java
@@ -0,0 +1,74 @@
+package org.eclipse.kura.protocol.can;
+
+import java.io.IOException;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import de.entropia.can.CanSocket;
+import de.entropia.can.CanSocket.CanFrame;
+import de.entropia.can.CanSocket.CanId;
+import de.entropia.can.CanSocket.CanInterface;
+import de.entropia.can.CanSocket.Mode;
+
+
+public class CanConnectionServiceImpl implements CanConnectionService, ConfigurableComponent {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(CanConnectionServiceImpl.class);
+	
+	protected void activate(ComponentContext componentContext) {
+		s_logger.info("activating CanConnectionService");
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+	}
+	
+	@Override
+	public void sendCanMessage(String ifName, int canId, byte[] message)
+			throws KuraException, IOException {
+		if(message.length>8)
+			throw new KuraException(KuraErrorCode.INTERNAL_ERROR, "CAN send : Incorrect frame length");
+			
+    	try {
+			CanSocket socket = new CanSocket(Mode.RAW);
+			socket.setLoopbackMode(false);
+			CanInterface canif = new CanInterface(socket, ifName);
+			socket.bind(canif);
+			socket.send(new CanFrame(canif, new CanId(canId), message));
+			//s_logger.debug("message sent on " + ifName);
+			socket.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw e;
+		}
+	}
+
+	@Override
+	public CanMessage receiveCanMessage(int can_id, int can_mask) throws KuraException, IOException {
+		try {
+			CanSocket socket = new CanSocket(Mode.RAW);
+			socket.setLoopbackMode(false);
+			socket.bind(CanSocket.CAN_ALL_INTERFACES);
+			if(can_id>=0){
+				socket.setCanFilter(can_id, can_mask);
+			}
+			CanFrame cf = socket.recv();
+			CanId ci = cf.getCanId();
+			//s_logger.debug(cf.toString());
+			CanMessage cm = new CanMessage();
+			cm.setCanId(ci.getCanId_SFF());
+			cm.setData(cf.getData());
+			socket.close();
+			return cm;
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanMessage.java b/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanMessage.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8f6351e07d3039dffd243fe7118136c29943ac1
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/src/main/java/org/eclipse/kura/protocol/can/CanMessage.java
@@ -0,0 +1,23 @@
+package org.eclipse.kura.protocol.can;
+
+public class CanMessage {
+	private int m_canId;
+    private byte[] m_data;
+
+	public byte[] getData() {
+		return m_data;
+	}
+
+	public void setData(byte[] data) {
+		this.m_data = data;
+	}
+
+	public int getCanId() {
+		return m_canId;
+	}
+
+	public void setCanId(int canId) {
+		this.m_canId = canId;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.protocol.can/src/main/resources/org.eclipse.kura.protocol.can.dpp b/kura/org.eclipse.kura.protocol.can/src/main/resources/org.eclipse.kura.protocol.can.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..56d52d92a4565118d519c6b88d0cb81eecf0b0e1
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.can/src/main/resources/org.eclipse.kura.protocol.can.dpp
@@ -0,0 +1,20 @@
+#Deployment Plugin Project File
+#Tue Jan 28 09:39:51 PST 2014
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.protocol.can_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.protocol.can.dp
+build.location=
+bundles.0.bundle_path=<.>/.project
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.protocol.can.jar
+bundles.0.symbolic_name=org.eclipse.kura.protocol.can
+bundles.0.version=2.0.0
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.protocol.can
+headers.version=1.0.0
+resources.count=0
+
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/.gitignore b/kura/org.eclipse.kura.protocol.modbus.test/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.protocol.modbus.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..2a3f0ba16cc512001f80a81ac8c5b16f861fba82
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.protocol.modbus.test
+Bundle-SymbolicName: org.eclipse.kura.protocol.modbus.test;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Unit-Test: true
+Import-Package: org.eclipse.kura.protocol.modbus; version="[0.2,1.0)",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.clock; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.eclipse.kura.watchdog; version="[0.2,1.0)",
+ org.osgi.framework;version="1.4.0",
+ org.osgi.service.component;version="1.0.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io;version="1.0.0",
+ org.slf4j;version="1.6.4"
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/OSGI-INF/metatype/org.eclipse.kura.protocol.modbus.test.ModbusManager.xml b/kura/org.eclipse.kura.protocol.modbus.test/OSGI-INF/metatype/org.eclipse.kura.protocol.modbus.test.ModbusManager.xml
new file mode 100644
index 0000000000000000000000000000000000000000..24f419f84b2a3a1c578db9969015ce1bd127bee3
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/OSGI-INF/metatype/org.eclipse.kura.protocol.modbus.test.ModbusManager.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<MetaData xmlns="http://www.osgi.org/xmlns/metatype/v1.2.0" localization="en_us">
+    <OCD id="org.eclipse.kura.protocol.modbus.test.ModbusManager"
+         name="ModbusManager" 
+         description="Modbus protocol example application, connecting a Modbus PLC to the Eurotech Cloud.">
+              
+        <Icon resource="http://sphotos-a.xx.fbcdn.net/hphotos-ash4/p480x480/408247_10151040905591065_1989684710_n.jpg" size="32"/>
+        
+        <AD id="serialMode"
+            name="serialMode"
+            type="String"
+            cardinality="0"
+            required="false"
+            default="RS232"
+            description="Serial Mode (RS232 or RS485), or TCP for TCP-encapsulated Modbus.">
+            <Option label="RS-232" value="RS232"/>
+            <Option label="RS-485" value="RS485"/>
+            <Option label="TCP" value="ETHERTCP"/>
+		</AD>
+        
+        <AD id="port"
+            name="port"
+            type="String"
+            cardinality="0"
+            required="true"
+            default="/dev/ttyUSB0"
+            description="Serial Port Name (such as /dev/ttyUSB0), or TCP Port (such as 3040)"/>
+        
+        <AD id="ipAddress"  
+            name="ipAddress"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="" 
+            description="IP address of Modbus server (TCP mode only)."/>
+
+        <AD id="baudRate"  
+            name="baudRate"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="9600" 
+            description="The baud rate of the serial connection.">
+            <Option label="110" value="110"/>
+            <Option label="300" value="300"/>
+            <Option label="600" value="600"/>
+            <Option label="1200" value="1200"/>
+            <Option label="2400" value="2400"/>
+            <Option label="4800" value="4800"/>
+            <Option label="9600" value="9600"/>
+            <Option label="14400" value="14400"/>
+            <Option label="19200" value="19200"/>
+            <Option label="28800" value="28800"/>
+            <Option label="38400" value="38400"/>
+            <Option label="56000" value="56000"/>
+            <Option label="57600" value="57600"/>
+            <Option label="115200" value="115200"/>
+            <Option label="128000" value="128000"/>
+            <Option label="153600" value="153600"/>
+            <Option label="230400" value="230400"/>
+            <Option label="256000" value="256000"/>
+            <Option label="460800" value="460800"/>
+            <Option label="921600" value="921600"/>
+		</AD>
+
+        <AD id="bitsPerWord"  
+            name="bitsPerWord"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="8" 
+            description="The number of bits per word or the 'data bits' for the serial connection.">
+            <Option label="5" value="5"/>
+            <Option label="6" value="6"/>
+            <Option label="7" value="7"/>
+            <Option label="8" value="8"/>
+		</AD>
+
+        <AD id="stopBits"  
+            name="stopBits"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="1" 
+            description="The stop bits for the serial connection.">
+            <Option label="1" value="1"/>
+            <Option label="2" value="2"/>
+            <Option label="1.5" value="3"/>
+        </AD>
+
+        <AD id="parity"  
+            name="parity"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="0" 
+            description="The parity for the serial connection.">
+            <Option label="None" value="0"/>
+            <Option label="Odd" value="1"/>
+            <Option label="Even" value="2"/>
+            <Option label="Mark" value="3"/>
+            <Option label="Space" value="4"/>
+        </AD>
+
+        <AD id="publishTopic"  
+            name="publishTopic"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="eurotech/demo" 
+            description="The topic to publish data to the Cloud."/>
+
+        <AD id="controlTopic"  
+            name="controlTopic"
+            type="String"
+            cardinality="0" 
+            required="false"
+            default="eurotech/demo"
+            description="The base control topic to receive controls from the Cloud."/>
+
+        <AD id="pollInterval"  
+            name="pollInterval"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="500" 
+            description="Interval in milliseconds between 2 polls of the modbus device."/>
+
+        <AD id="publishInterval"  
+            name="publishInterval"
+            type="String"
+            cardinality="0" 
+            required="true"
+            default="180" 
+            description="Interval in seconds between 2 mqtt publishes when modbus device is idle."/>
+    </OCD>
+    <Designate pid="org.eclipse.kura.protocol.modbus.test.ModbusManager">
+        <Object ocdref="org.eclipse.kura.protocol.modbus.test.ModbusManager"/>
+    </Designate>
+</MetaData>
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/OSGI-INF/modbusmanager.xml b/kura/org.eclipse.kura.protocol.modbus.test/OSGI-INF/modbusmanager.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d5062da23e62ea9d6d824f2934402a52142f3233
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/OSGI-INF/modbusmanager.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+               name="org.eclipse.kura.protocol.modbus.test.ModbusManager"
+               enabled="true" 
+               immediate="true" 
+               modified="updated">
+   <implementation class="org.eclipse.kura.protocol.modbus.test.ModbusManager"/>
+   <service>
+      <provide interface="org.eclipse.kura.protocol.modbus.test.ModbusManager"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.protocol.modbus.test.ModbusManager"/>
+
+   <reference bind="setModbusProtocolDeviceService" 
+    		  cardinality="1..1" 
+    		  interface="org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService" 
+    		  name="ModbusProtocolDeviceService" 
+    		  policy="static" 
+    		  unbind="unsetModbusProtocolDeviceService"/>
+   <reference bind="setCloudService" 
+    		  cardinality="1..1" 
+    		  interface="org.eclipse.kura.cloud.CloudService" 
+    		  name="CloudService" 
+    		  policy="static" 
+    		  unbind="unsetCloudService"/>
+   <reference bind="setSystemService" 
+   			  cardinality="1..1" 
+   			  interface="org.eclipse.kura.system.SystemService" 
+   			  name="SystemService" 
+   			  policy="static" 
+   			  unbind="unsetSystemService"/>
+   <reference name="WatchdogService"
+              bind="setWatchdogService"
+              unbind="unsetWatchdogService"
+              cardinality="1..1"
+              policy="static"
+              interface="org.eclipse.kura.watchdog.WatchdogService"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/about.html b/kura/org.eclipse.kura.protocol.modbus.test/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/about_files/epl-v10.html b/kura/org.eclipse.kura.protocol.modbus.test/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/build.properties b/kura/org.eclipse.kura.protocol.modbus.test/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..22a4a8c9c180c3f4c9d9a4136b71ef73cc0e353e
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about_files/,\
+               about.html
+additional.bundles = slf4j.api,\
+                     org.eclipse.kura.test
+src.includes = about.html,\
+               about_files/
+
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/org.eclipse.kura.protocol.modbus.test.dpp b/kura/org.eclipse.kura.protocol.modbus.test/org.eclipse.kura.protocol.modbus.test.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..45865c3795e726e67b43efc4eb5d4597d372f0f7
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/org.eclipse.kura.protocol.modbus.test.dpp
@@ -0,0 +1,20 @@
+#Deployment Plugin Project File
+#Wed Mar 12 13:56:36 CDT 2014
+build.ant.name=<.>/org.eclipse.kura.protocol.modbus.test_build.xml
+build.dp.file=<.>/org.eclipse.kura.protocol.modbus.test.dp
+build.location=
+bundles.0.bundle_path=<.>/target/org.eclipse.kura.protocol.modbus.test-0.2.0-SNAPSHOT.jar
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.protocol.modbus.test-0.2.0-SNAPSHOT.jar
+bundles.0.symbolic_name=org.eclipse.kura.protocol.modbus.test;singleton\:\=true
+bundles.0.version=0.2.0.201403121333
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.protocol.modbus.test
+headers.version=1.0.0
+resources.count=0
+
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/pom.xml b/kura/org.eclipse.kura.protocol.modbus.test/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ff19ad23c53fab4a467b8899942cc3db87061cc3
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.protocol.modbus.test</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.protocol.modbus.test/src/main/java/org/eclipse/kura/protocol/modbus/test/ModbusManager.java b/kura/org.eclipse.kura.protocol.modbus.test/src/main/java/org/eclipse/kura/protocol/modbus/test/ModbusManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..2308ccbad48ab14bdbdfc5acd20039b08d6891a3
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus.test/src/main/java/org/eclipse/kura/protocol/modbus/test/ModbusManager.java
@@ -0,0 +1,729 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.protocol.modbus.test;
+
+
+import java.lang.Thread.State;
+import java.util.Date;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudClientListener;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.configuration.ConfigurableComponent;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService;
+import org.eclipse.kura.protocol.modbus.ModbusProtocolErrorCode;
+import org.eclipse.kura.protocol.modbus.ModbusProtocolException;
+import org.eclipse.kura.protocol.modbus.ModbusTransmissionMode;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.watchdog.CriticalComponent;
+import org.eclipse.kura.watchdog.WatchdogService;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ModbusManager implements ConfigurableComponent, CriticalComponent, CloudClientListener{
+
+	private static final Logger s_logger = LoggerFactory.getLogger(ModbusManager.class);
+
+	private Thread 						m_thread;
+	private boolean						m_threadShouldStop;
+	private Map<String,Object>    		m_properties;
+	private CloudService                m_cloudService;
+	private SystemService 		        m_systemService;	
+	private ModbusProtocolDeviceService m_protocolDevice;
+	private CloudClient 				m_cloudAppClient=null;
+	private WatchdogService		   		m_watchdogService;
+
+	private int pollInterval;	//milliseconds
+	private int publishInterval;	//seconds
+	private boolean initLeds;
+	private boolean clientIsConnected = false;
+	private boolean configured;
+	private boolean metricsChanged;
+	private static boolean[] lastDigitalInputs = new boolean[8];
+	private static boolean[] lastDigitalOutputs = new boolean[6];
+	private static int[] lastAnalogInputs = new int[8];
+	private static boolean iJustConnected = false;
+	private long publishTime = 0L;	
+
+	private static boolean doConnection = true;
+	
+	private static Properties modbusProperties;
+	private static boolean wdConfigured = false;
+	private static boolean connectionFailed = false;
+
+	public void setModbusProtocolDeviceService(ModbusProtocolDeviceService modbusService) {
+		this.m_protocolDevice = modbusService;
+	}
+	
+	public void unsetModbusProtocolDeviceService(ModbusProtocolDeviceService modbusService) {
+		this.m_protocolDevice = null;
+	}
+
+	public void setCloudService(CloudService cloudService) {
+		this.m_cloudService = cloudService;
+	}		// install event listener for serial ports
+
+	public void unsetCloudService(CloudService cloudService) {
+		this.m_cloudService = null;
+	}
+
+	public void setSystemService(SystemService sms) {
+		this.m_systemService = sms;
+	}	
+	
+	public void unsetSystemService(SystemService sms) {
+		this.m_systemService = null;
+	}
+	
+	public void setWatchdogService(WatchdogService watchdogService) {
+		this.m_watchdogService = watchdogService;
+	}
+	
+	public void unsetWatchdogService(WatchdogService watchdogService) {
+		this.m_watchdogService = null;
+	}
+
+	protected void activate(ComponentContext componentContext, Map<String,Object> properties) {
+		m_properties = properties;
+		configured = false;
+		
+		modbusProperties = getModbusProperties();
+		pollInterval = Integer.valueOf(modbusProperties.getProperty("pollInterval")).intValue();
+		publishInterval = Integer.valueOf(modbusProperties.getProperty("publishInterval")).intValue();
+		
+		m_threadShouldStop=false;
+		m_thread = new Thread(new Runnable() {		
+			@Override
+			public void run() {
+				Thread.currentThread().setName(getClass().getSimpleName());
+				doModbusPollWork();
+			}
+		});
+		m_thread.start();
+		
+		s_logger.info("ModbusManager activated");
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		s_logger.info("Modbus deactivate");
+		m_watchdogService.unregisterCriticalService(this);
+		m_threadShouldStop=true;
+		while(m_thread.getState()!=State.TERMINATED){
+			try {
+				Thread.sleep(100);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		s_logger.info("Modbus polling thread killed");
+		
+		if(m_protocolDevice!=null)
+			m_protocolDevice.disconnect();
+		doConnection=true;
+		configured = false;
+	}
+	
+	public void updated(Map<String,Object> properties)
+	{
+		s_logger.info("updated...");		
+		m_properties = properties;
+		modbusProperties = getModbusProperties();
+		pollInterval = Integer.valueOf(modbusProperties.getProperty("pollInterval")).intValue();
+		publishInterval = Integer.valueOf(modbusProperties.getProperty("publishInterval")).intValue();
+		configured=false;
+	}	
+	
+	private boolean doConnectionWork() {
+		String topic = null;
+		try {
+			// wait for a valid topic configured
+			if(modbusProperties==null){
+				return true;
+			}
+
+			topic = modbusProperties.getProperty("controlTopic");
+			if(topic==null){
+				return true;
+			}
+			
+			if(m_cloudAppClient==null) {
+				// Attempt to get Master Client reference
+				s_logger.debug("Getting Cloud Client");
+				try {
+					m_cloudAppClient = m_cloudService.newCloudClient("ModbusManager");
+					m_cloudAppClient.addCloudClientListener(this);
+				} catch (KuraException e) {
+					s_logger.debug("Cannot get a Cloud Client");
+					e.printStackTrace();
+				}
+				
+			}
+
+			//s_logger.debug("Checking for an active MQtt connection...");
+			clientIsConnected = m_cloudAppClient.isConnected(); 
+
+			if(!clientIsConnected) {
+				s_logger.debug("Waiting for Cloud Client to connect");
+				return true;
+			}
+
+		} catch (Exception e) {
+			s_logger.debug("Cloud client is not yet available..");
+			return true;
+		}
+
+		// Successfully connected - kill the thread
+		s_logger.info("Successfully connected the Cloud Client");
+		try {
+			iJustConnected = true;
+			m_cloudAppClient.controlSubscribe(topic + "/led/#", 0);
+			m_cloudAppClient.controlSubscribe(topic + "/resetcnt/#", 0);
+			m_cloudAppClient.controlSubscribe(topic + "/alarm", 0);
+			
+			String assetIdEth0 = m_systemService.getPrimaryMacAddress();
+			m_cloudAppClient.subscribe("RulesAssistant/"+ topic + "/led/#",0);
+			m_cloudAppClient.subscribe("RulesAssistant/"+ topic + "/resetcnt/#",0);
+			m_cloudAppClient.subscribe("RulesAssistant/"+ topic + "/alarm",0);
+			s_logger.info("Successfully subscribed with assetIdEth0="+assetIdEth0);
+		} catch (KuraException e) {
+			s_logger.debug("Error issuing MQTT subscription");
+			e.printStackTrace();
+			return true;
+		}
+		
+		return false;
+	}
+
+	private void doModbusPollWork() {
+		while(!m_threadShouldStop){
+			if(modbusProperties!=null){
+				// Establish the MQTT connection		
+				if(doConnection)
+					doConnection=doConnectionWork();
+
+				if(!configured) {
+					initLeds = false;
+					try {
+						if(!connectionFailed)
+							s_logger.debug("configureDevice");
+						configureDevice();
+						connectionFailed=false;
+					} catch(ModbusProtocolException e) {
+						if(!connectionFailed)
+							s_logger.warn("The modbus port is not yet available");
+						connectionFailed=true;
+					}
+				}
+
+				if(configured) {
+					try {
+						if (!initLeds) {
+							initializeLeds();
+						}
+						if(initLeds){
+							if (!wdConfigured){
+								if(m_watchdogService!=null){
+									m_watchdogService.registerCriticalService(this);
+									//m_watchdogService.startWatchdog();
+									wdConfigured=true;
+								}
+							}
+
+							performPoll();
+						}
+					} catch (ModbusProtocolException e) {
+						if(e.getCode()==ModbusProtocolErrorCode.NOT_CONNECTED){
+							s_logger.error("Error on modbus polling, closing connection ");
+							configured=false;
+						}
+						else
+							s_logger.error("Error on modbus polling : "+e.getCode());
+					}
+				}
+			}
+			try {
+				Thread.sleep(pollInterval);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private void configureDevice() throws ModbusProtocolException {
+		if(m_protocolDevice!=null){
+			m_protocolDevice.disconnect();
+
+			m_protocolDevice.configureProtocol(getProtocolProperties());
+			m_protocolDevice.configureConnection(modbusProperties);
+
+			configured = true;
+		}
+	}
+
+	
+	private Properties getModbusProperties() {
+		Properties prop = new Properties();
+
+		if(m_properties!=null){
+			String portName = null;
+			String serialMode = null;
+			String baudRate = null;
+			String bitsPerWord = null;
+			String stopBits = null;
+			String parity = null;
+			String ptopic = null;
+			String ctopic = null;
+			String ipAddress = null;
+			String pollInt= null;
+			String pubInt= null;
+			if(m_properties.get("port") != null) portName 			= (String) m_properties.get("port");
+			if(m_properties.get("serialMode") != null) serialMode 	= (String) m_properties.get("serialMode");
+			if(m_properties.get("baudRate") != null) baudRate 		= (String) m_properties.get("baudRate");
+			if(m_properties.get("bitsPerWord") != null) bitsPerWord = (String) m_properties.get("bitsPerWord");
+			if(m_properties.get("stopBits") != null) stopBits 		= (String) m_properties.get("stopBits");
+			if(m_properties.get("parity") != null) parity 			= (String) m_properties.get("parity");
+			if(m_properties.get("publishTopic") != null) ptopic		= (String) m_properties.get("publishTopic");
+			if(m_properties.get("controlTopic") != null) ctopic		= (String) m_properties.get("controlTopic");
+			if(m_properties.get("ipAddress") != null) ipAddress		= (String) m_properties.get("ipAddress");
+			if(m_properties.get("pollInterval") != null) pollInt	= (String) m_properties.get("pollInterval");
+			if(m_properties.get("publishInterval") != null) pubInt	= (String) m_properties.get("publishInterval");
+			
+			if(portName==null) //portName="/dev/ttyUSB0";
+				return null;		
+			if(baudRate==null) baudRate="9600";
+			if(stopBits==null) stopBits="1";
+			if(parity==null) parity="0";
+			if(bitsPerWord==null) bitsPerWord="8";
+			if(ptopic==null) ptopic="eurotech/demo";
+			if(ctopic==null) ctopic="eurotech/demo";
+			if(pollInt==null) pollInt="500";
+			if(pubInt==null) pubInt="180";
+			
+			if(serialMode!=null) {
+				if(serialMode.equalsIgnoreCase("RS232") || serialMode.equalsIgnoreCase("RS485")) {
+					prop.setProperty("connectionType", "SERIAL");
+					prop.setProperty("serialMode", serialMode);
+					prop.setProperty("port", portName);
+					prop.setProperty("exclusive", "false");
+					prop.setProperty("mode", "0");
+					prop.setProperty("baudRate", baudRate);
+					prop.setProperty("stopBits", stopBits);
+					prop.setProperty("parity", parity);
+					prop.setProperty("bitsPerWord", bitsPerWord);
+				} else {
+					prop.setProperty("connectionType", "ETHERTCP");
+					prop.setProperty("ipAddress", ipAddress);
+					prop.setProperty("port", portName);
+				}
+			}
+			prop.setProperty("publishTopic", ptopic);
+			prop.setProperty("controlTopic", ctopic);
+			prop.setProperty("pollInterval", pollInt);
+			prop.setProperty("publishInterval", pubInt);
+
+			return prop;
+		} else {
+			return null;
+		}
+	}
+
+	private Properties getProtocolProperties() {
+		Properties prop = new Properties();
+
+		prop.setProperty("unitName", "Demo");
+		prop.setProperty("unitAddress", "1");
+		prop.setProperty("txMode", ModbusTransmissionMode.RTU);
+		prop.setProperty("respTimeout", "1000");
+
+		return prop;
+	}
+
+	public int bcd2Dec(int bcdVal) {
+		byte bcd = (byte)bcdVal;
+	    int decimal =	(bcd & 0x000F) + 
+	    				(((int)bcd & 0x000F0) >> 4)*10 +
+	    				(((int)bcd & 0x00F00) >> 8)*100 +
+	    				(((int)bcd & 0x0F000) >> 12)*1000 +
+	    				(((int)bcd & 0xF0000) >> 16)*10000;
+    				
+	    return decimal;
+	}
+
+	private void performPoll()throws ModbusProtocolException {
+		KuraPayload payload = new KuraPayload();
+
+		metricsChanged=false;
+
+		int it4=0;
+		int it5=0;
+		int it6=0;
+		boolean[] digitalInputs;
+
+		digitalInputs = m_protocolDevice.readDiscreteInputs(2048, 8);
+
+		payload.addMetric("t3", new Boolean(digitalInputs[2]));
+		if((digitalInputs[2] != lastDigitalInputs[2]) || iJustConnected){
+			metricsChanged=true;
+			s_logger.info("t3=" + digitalInputs[2]);
+		}
+		lastDigitalInputs[2] = digitalInputs[2];
+
+		payload.addMetric("t4", new Boolean(digitalInputs[3]));
+		if(digitalInputs[3])it4=1; 
+		payload.addMetric("it4", new Integer(it4));
+		if((digitalInputs[3] != lastDigitalInputs[3]) || iJustConnected){
+			s_logger.info("t4=" + digitalInputs[3]);
+			metricsChanged=true;
+		}
+		lastDigitalInputs[3] = digitalInputs[3];
+
+		payload.addMetric("t5", new Boolean(digitalInputs[4]));
+		if(digitalInputs[4])it5=1; 
+		payload.addMetric("it5", new Integer(it5));
+		if((digitalInputs[4] != lastDigitalInputs[4]) || iJustConnected){
+			s_logger.info("t5=" + digitalInputs[4]);
+			metricsChanged=true;
+		}
+		lastDigitalInputs[4] = digitalInputs[4];
+
+		payload.addMetric("t6", new Boolean(digitalInputs[5]));
+		if(digitalInputs[5])it6=1; 
+		payload.addMetric("it6", new Integer(it6));
+		if((digitalInputs[5] != lastDigitalInputs[5]) || iJustConnected){
+			s_logger.info("t6=" + digitalInputs[5]);
+			metricsChanged=true;
+		}
+		lastDigitalInputs[5] = digitalInputs[5];
+
+		int[] analogInputs = m_protocolDevice.readInputRegisters(512, 8);
+
+		int c3 = bcd2Dec(analogInputs[2]);
+		payload.addMetric("c3", new Integer(c3));
+		if((c3 != lastAnalogInputs[2]) || iJustConnected){
+			s_logger.info("c3=" + c3);
+			metricsChanged=true;
+		}
+		lastAnalogInputs[2] = c3;
+
+		int qc = bcd2Dec(analogInputs[7]);
+		payload.addMetric("qc", new Integer(qc));
+		if((qc != lastAnalogInputs[7]) || iJustConnected){
+			s_logger.info("qc=" + qc);
+			metricsChanged=true;
+		}
+		lastAnalogInputs[7] = qc;
+
+		// LEDs 
+		boolean[] digitalOutputs = m_protocolDevice.readCoils(2048, 6); 
+
+		payload.addMetric("LED1", new Boolean(digitalOutputs[0])); 
+		if((digitalOutputs[0] != lastDigitalOutputs[0]) || iJustConnected){
+			s_logger.info("LED1=" + digitalOutputs[0]); 
+			metricsChanged=true; 
+		}
+		lastDigitalOutputs[0] = digitalOutputs[0]; 
+
+		payload.addMetric("LED2", new Boolean(digitalOutputs[1])); 
+		if((digitalOutputs[1] != lastDigitalOutputs[1]) || iJustConnected){
+			s_logger.info("LED2=" + digitalOutputs[1]); 
+			metricsChanged=true; 
+		}
+		lastDigitalOutputs[1] = digitalOutputs[1]; 
+
+		payload.addMetric("LED3", new Boolean(digitalOutputs[2])); 
+		if((digitalOutputs[2] != lastDigitalOutputs[2]) || iJustConnected){
+			s_logger.info("LED3=" + digitalOutputs[2]); 
+			metricsChanged=true; 
+		}
+		lastDigitalOutputs[2] = digitalOutputs[2]; 
+
+		payload.addMetric("LED4red", new Boolean(digitalOutputs[3])); 
+		if((digitalOutputs[3] != lastDigitalOutputs[3]) || iJustConnected){
+			s_logger.info("LED4red=" + digitalOutputs[3]); 
+			metricsChanged=true; 
+		}
+		lastDigitalOutputs[3] = digitalOutputs[3]; 
+
+		payload.addMetric("LED4green", new Boolean(digitalOutputs[4])); 
+		if((digitalOutputs[4] != lastDigitalOutputs[4]) || iJustConnected){
+			s_logger.info("LED4green=" + digitalOutputs[4]); 
+			metricsChanged=true; 
+		}
+		lastDigitalOutputs[4] = digitalOutputs[4]; 
+
+		payload.addMetric("LED4blue", new Boolean(digitalOutputs[5])); 
+		if((digitalOutputs[5] != lastDigitalOutputs[5]) || iJustConnected){
+			s_logger.info("LED4blue=" + digitalOutputs[5]); 
+			metricsChanged=true; 
+		}
+		lastDigitalOutputs[5] = digitalOutputs[5];
+
+		// refresh Watchdog 
+		if (wdConfigured){
+			if(m_watchdogService!=null){
+				m_watchdogService.checkin(this);
+			}
+		}
+
+
+		if (clientIsConnected) {
+			iJustConnected = false;
+			// publish data
+			long now = System.currentTimeMillis();
+			if(metricsChanged || ((now - publishTime) > (publishInterval*1000L)) ){
+				try {
+					String topic = modbusProperties.getProperty("publishTopic");
+					if (metricsChanged) {
+						s_logger.info("One of the metrics changed");
+					}
+					Date pubDate = new Date();
+					payload.setTimestamp(pubDate);
+
+					s_logger.info("Publishing on topic: " + topic);
+					if(m_cloudAppClient!=null)
+						m_cloudAppClient.publish(topic, payload, 0, false);
+					publishTime = System.currentTimeMillis();
+
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+				metricsChanged=false;
+			}
+		}
+	}
+	
+	private void initializeLeds() throws ModbusProtocolException {
+		s_logger.debug("Initializing LEDs");	// once on startup, turn on each light
+		for( int led = 1; led <= 6; led++)
+		{
+			TurnOnLED( led, true);
+			try {
+				Thread.sleep(200);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			TurnOnLED( led, false);
+		}			
+		initLeds = true;
+	}
+
+	
+	public void TurnOnLED(int LED, boolean On)throws ModbusProtocolException
+	{
+		boolean TurnON = true;
+		boolean TurnOFF = false;
+		try
+		{
+			switch(LED) {
+			case 1:		s_logger.debug("Setting LED" + LED + " to " + On);
+						break;
+			case 2:		s_logger.debug("Setting LED" + LED + " to " + On);
+						break;
+			case 3:		s_logger.debug("Setting LED" + LED + " to " + On);
+						break;
+			case 4:		s_logger.debug("Setting LED4 red to " + On);
+						break;
+			case 5:		s_logger.debug("Setting LED4 green to " + On);
+						break;
+			case 6:		s_logger.debug("Setting LED4 blue to " + On);
+						break;
+			default:	s_logger.warn("Error in TurnOnLED - LED " + LED + " is not valid.");
+						break;
+			}
+			m_protocolDevice.writeSingleCoil( 2047 + LED, On?TurnON:TurnOFF);
+		}
+		catch (ModbusProtocolException e) {
+			throw(e);
+		}
+	}
+	
+	
+	@Override
+	public void onControlMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		s_logger.debug("EDC control message received on topic: " + appTopic);
+		ProcessKuraPayload(deviceId, appTopic, msg, qos, retain);
+	}
+
+	@Override
+	public void onMessageArrived(String deviceId, String appTopic,
+			KuraPayload msg, int qos, boolean retain) {
+		s_logger.debug("EDC message received on topic: " + appTopic);
+		ProcessKuraPayload(deviceId, appTopic, msg, qos, retain) ;
+	}
+
+	@Override
+	public void onConnectionLost() {
+		s_logger.debug("Connection Lost");
+	}
+
+	@Override
+	public void onConnectionEstablished() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onMessagePublished(int messageId, String appTopic) {
+		// TODO Auto-generated method stub		
+	}
+
+	@Override
+	public void onMessageConfirmed(int messageId, String appTopic) {
+		// TODO Auto-generated method stub		
+	}
+
+	
+	public void ProcessKuraPayload(String assetId, String topic, KuraPayload msg, int qos, boolean retained) 
+	{
+		Object[] Names = msg.metricNames().toArray();
+		Properties props = new Properties();
+		
+		for( int index = 0; index < Names.length; index++)
+		{
+			String key = (String)Names[index];
+			String value = (String)msg.getMetric(key);
+			props.put(key, value);
+		}
+		ProcessPayload(props, topic);
+	}
+
+	public void ProcessBytePayload(String assetId, String topic, byte[] payload, int qos, boolean retain) {
+		String pload = new String(payload);
+		StringTokenizer tok = new StringTokenizer(pload, ":");
+		Properties props = new Properties();
+
+		while(tok.hasMoreElements()) {
+			String key = tok.nextToken();
+			String value = tok.nextToken();
+			props.put(key, value);
+		}
+		ProcessPayload(props, topic);
+	}
+
+	
+	// main routine to process various control topics from EDC or byte payload format
+	public void ProcessPayload(Properties props, String topic) {
+		String controlTopic = modbusProperties.getProperty("controlTopic");
+
+		if (topic.contains(controlTopic + "/led")) {
+			s_logger.debug("topic contains '" + controlTopic + "/led' ");
+			ProcessLEDMessage( topic.substring(topic.indexOf("led/") + 4), props);
+
+		} else if(topic.contains(controlTopic + "/resetcnt")) {
+			s_logger.debug("topic contains '" + controlTopic + "/resetcnt' ");
+			ProcessResetMessage( topic.substring(topic.indexOf("resetcnt/") + 9), props);
+			
+		} else if(topic.contains(controlTopic + "/alarm")) {
+			s_logger.warn("topic contains '" + controlTopic + "/alarm' ");
+			ProcessAlarmMessage( props );
+		}
+	}
+
+	// handle LED controls
+	public void ProcessLEDMessage( String LED, Properties props)
+	{
+		try {
+			if (LED.equals("1")) {
+				TurnOnLED( 1, Boolean.parseBoolean((String)props.get("light")));
+			} else if (LED.equals("2")) {
+				TurnOnLED( 2, Boolean.parseBoolean((String)props.get("light")));
+			} else if (LED.equals("3")) {
+				TurnOnLED( 3, Boolean.parseBoolean((String)props.get("light")));
+
+			} else if (LED.equals("4")) {
+				Object value = null;
+				if((value = props.get("red")) != null) 
+					TurnOnLED( 4, Boolean.parseBoolean((String)value));
+				if((value = props.get("green")) != null)
+					TurnOnLED( 5, Boolean.parseBoolean((String)value));
+				if((value = props.get("blue")) != null)
+					TurnOnLED( 6, Boolean.parseBoolean((String)value));
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	// reset counter values
+	public void ProcessResetMessage( String counter, Properties props)
+	{
+		try {
+			if(counter.equals("c3"))
+				clearCounter( 3, Boolean.parseBoolean((String)props.get("value")));
+			if(counter.equals("c4"))
+				clearCounter( 4, Boolean.parseBoolean((String)props.get("value")));
+			if(counter.equals("c5"))
+				clearCounter( 5, Boolean.parseBoolean((String)props.get("value")));
+			if(counter.equals("c6"))
+				clearCounter( 6, Boolean.parseBoolean((String)props.get("value")));
+			if(counter.equals("qc"))
+				clearCounter( 12, Boolean.parseBoolean((String)props.get("value")));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public void clearCounter(int counter, boolean On)
+	{
+		boolean TurnON = true;
+		boolean TurnOFF = false;
+		try
+		{
+			switch(counter) {
+			case 3:		s_logger.debug("Counter c3 reset " + On);
+						break;
+			case 4:		s_logger.debug("Counter c4 reset " + On);
+						break;
+			case 5:		s_logger.debug("Counter c5 reset " + On);
+						break;
+			case 6:		s_logger.debug("Counter c6 reset " + On);
+						break;
+			case 12:	s_logger.debug("Counter qc reset " + On);
+						break;
+			default:	s_logger.warn("Error in clearCounter - Counter " + counter + " is not valid.");
+						break;
+			}
+			m_protocolDevice.writeSingleCoil( 3072 + counter, On?TurnON:TurnOFF);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public void ProcessAlarmMessage( Properties props)
+	{
+//		String sirenStr = (String)props.get("siren");
+//		if(sirenStr.equals("true")) {
+//			siren.startSiren();
+//		} else {
+//		}
+	}
+
+	@Override
+	public String getCriticalComponentName() {
+		return "ModbusManager";
+	}
+
+	@Override
+	public int getCriticalComponentTimeout() {
+		return pollInterval*2; // return double of the pollInterval
+	}
+	
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/.gitignore b/kura/org.eclipse.kura.protocol.modbus/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/kura/org.eclipse.kura.protocol.modbus/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.protocol.modbus/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..4dd636619550829ff218c7f309f9a34a8bf8e851
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/META-INF/MANIFEST.MF
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.protocol.modbus
+Bundle-SymbolicName: org.eclipse.kura.protocol.modbus;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,0.3)",
+ org.eclipse.kura.comm; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,0.3)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ javax.comm;version="1.2.0",
+ javax.microedition.io;resolution:=optional,
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.cm;version="1.4.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.service.io,
+ org.osgi.util.measurement;version="1.0.1",
+ org.osgi.util.position;version="1.0.1",
+ org.osgi.util.tracker;version="1.5.1",
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.protocol.modbus; version="0.2.0"
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Bundle-Classpath: .
+
diff --git a/kura/org.eclipse.kura.protocol.modbus/OSGI-INF/modbusProtocolDevice.xml b/kura/org.eclipse.kura.protocol.modbus/OSGI-INF/modbusProtocolDevice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..330660a8c6171874f61a9a6e245ac36fc3b118ce
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/OSGI-INF/modbusProtocolDevice.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.protocol.modbus.ModbusProtocolDevice">
+   <implementation class="org.eclipse.kura.protocol.modbus.ModbusProtocolDevice"/>
+   <service>
+      <provide interface="org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService"/>
+   </service>
+   <property name="service.pid" value="org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService"/>
+   
+   <reference bind="setConnectionFactory" 
+   			  cardinality="1..1" 
+   			  interface="org.osgi.service.io.ConnectionFactory" 
+   			  name="ConnectionFactory" 
+   			  policy="static" 
+   			  unbind="unsetConnectionFactory"/>
+   			  
+   <reference name="UsbService"
+              bind="setUsbService"
+              unbind="unsetUsbService"
+              cardinality="1..1"
+              policy="static"
+              interface="org.eclipse.kura.usb.UsbService"/>              
+</scr:component>
diff --git a/kura/org.eclipse.kura.protocol.modbus/about.html b/kura/org.eclipse.kura.protocol.modbus/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.protocol.modbus/about_files/epl-v10.html b/kura/org.eclipse.kura.protocol.modbus/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.protocol.modbus/build.properties b/kura/org.eclipse.kura.protocol.modbus/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..af7aca9d6509c18840328cade76c339239147e7b
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/build.properties
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = slf4j.api,\
+                     org.eclipse.equinox.io
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.protocol.modbus/pom.xml b/kura/org.eclipse.kura.protocol.modbus/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..75af5bf6262ee4cd4f769b965848d7f4c37001db
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.protocol.modbus</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/Crc16.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/Crc16.java
new file mode 100644
index 0000000000000000000000000000000000000000..aaed2ad0a78d0b25ae8a8a2943d603402dc5f92e
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/Crc16.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.protocol.modbus;
+
+/* 
+ * Copyright � 2009 Eurotech Inc. All rights reserved.
+ */
+
+/**
+ * Used to calculate the CRC-16 (cyclical redundancy check) for an array of bytes.
+ */
+public class Crc16 {
+	private Crc16(){};
+
+	/**
+	 * calculate the crc for the passed buffer
+	 * 
+	 * @param buff	byte array to calculate CRC of
+	 * @param buffLen  number of bytes in array to calculate against
+	 * @param crcSeed  starting seed for CRC calculation
+	 * @return	CRC16 as calculated for buff
+	 */
+	public static int getCrc16( byte[] buff, int buffLen, int crcSeed)
+	{
+		int hi,lo,tmp;
+		  
+		lo = crcSeed & 0x0ff;
+		hi = (crcSeed >> 8) & 0x0ff;
+		  
+		for(int i=0;i<buffLen;i++)
+		{
+			tmp = (lo ^ buff[i]) & 0x0ff;
+		    lo = hi ^ abCrcTbl2[tmp];
+		    hi = abCrcTbl1[tmp];
+		}
+		return (lo + (hi << 8)); 
+	}
+
+	private final static int[] abCrcTbl1 =	{
+		0x000, 0x0C0, 0x0C1, 0x001, 0x0C3, 0x003, 0x002, 0x0C2,
+		0x0C6, 0x006, 0x007, 0x0C7, 0x005, 0x0C5, 0x0C4, 0x004,
+		0x0CC, 0x00C, 0x00D, 0x0CD, 0x00F, 0x0CF, 0x0CE, 0x00E,
+		0x00A, 0x0CA, 0x0CB, 0x00B, 0x0C9, 0x009, 0x008, 0x0C8,
+		0x0D8, 0x018, 0x019, 0x0D9, 0x01B, 0x0DB, 0x0DA, 0x01A,
+		0x01E, 0x0DE, 0x0DF, 0x01F, 0x0DD, 0x01D, 0x01C, 0x0DC,
+		0x014, 0x0D4, 0x0D5, 0x015, 0x0D7, 0x017, 0x016, 0x0D6,
+		0x0D2, 0x012, 0x013, 0x0D3, 0x011, 0x0D1, 0x0D0, 0x010,
+		0x0F0, 0x030, 0x031, 0x0F1, 0x033, 0x0F3, 0x0F2, 0x032,
+		0x036, 0x0F6, 0x0F7, 0x037, 0x0F5, 0x035, 0x034, 0x0F4,
+		0x03C, 0x0FC, 0x0FD, 0x03D, 0x0FF, 0x03F, 0x03E, 0x0FE,
+		0x0FA, 0x03A, 0x03B, 0x0FB, 0x039, 0x0F9, 0x0F8, 0x038,
+		0x028, 0x0E8, 0x0E9, 0x029, 0x0EB, 0x02B, 0x02A, 0x0EA,
+		0x0EE, 0x02E, 0x02F, 0x0EF, 0x02D, 0x0ED, 0x0EC, 0x02C,
+		0x0E4, 0x024, 0x025, 0x0E5, 0x027, 0x0E7, 0x0E6, 0x026,
+		0x022, 0x0E2, 0x0E3, 0x023, 0x0E1, 0x021, 0x020, 0x0E0,
+		0x0A0, 0x060, 0x061, 0x0A1, 0x063, 0x0A3, 0x0A2, 0x062,
+		0x066, 0x0A6, 0x0A7, 0x067, 0x0A5, 0x065, 0x064, 0x0A4,
+		0x06C, 0x0AC, 0x0AD, 0x06D, 0x0AF, 0x06F, 0x06E, 0x0AE,
+		0x0AA, 0x06A, 0x06B, 0x0AB, 0x069, 0x0A9, 0x0A8, 0x068,
+		0x078, 0x0B8, 0x0B9, 0x079, 0x0BB, 0x07B, 0x07A, 0x0BA,
+		0x0BE, 0x07E, 0x07F, 0x0BF, 0x07D, 0x0BD, 0x0BC, 0x07C,
+		0x0B4, 0x074, 0x075, 0x0B5, 0x077, 0x0B7, 0x0B6, 0x076,
+		0x072, 0x0B2, 0x0B3, 0x073, 0x0B1, 0x071, 0x070, 0x0B0,
+		0x050, 0x090, 0x091, 0x051, 0x093, 0x053, 0x052, 0x092,
+		0x096, 0x056, 0x057, 0x097, 0x055, 0x095, 0x094, 0x054,
+		0x09C, 0x05C, 0x05D, 0x09D, 0x05F, 0x09F, 0x09E, 0x05E,
+		0x05A, 0x09A, 0x09B, 0x05B, 0x099, 0x059, 0x058, 0x098,
+		0x088, 0x048, 0x049, 0x089, 0x04B, 0x08B, 0x08A, 0x04A,
+		0x04E, 0x08E, 0x08F, 0x04F, 0x08D, 0x04D, 0x04C, 0x08C,
+		0x044, 0x084, 0x085, 0x045, 0x087, 0x047, 0x046, 0x086,
+		0x082, 0x042, 0x043, 0x083, 0x041, 0x081, 0x080, 0x040
+	};
+
+	private final static int[] abCrcTbl2 =	{
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x00, 0x0C1, 0x081, 0x40, 0x01, 0x0C0, 0x080, 0x41,
+		0x01, 0x0C0, 0x080, 0x41, 0x00, 0x0C1, 0x081, 0x40
+	};
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusCommEvent.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusCommEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..64713f88247502d77bd40d04724cafd38adb597e
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusCommEvent.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.protocol.modbus;
+
+/**
+ * The ModbusCommEvent class contains the values returned by Modbus functions 11(0x0B)
+ *  and 12(0x0C).
+ *  <p>
+ *  <li>status : two-bytes status word, 0xFFFF if a busy condition exists, 0 otherwise
+ *  <li>eventCount : event counter incremented for each successful message completion
+ *  <li>messageCount : quantity of messages processed since last restart
+ *  <li>events[] : 0 to 64 bytes, each byte corresponding to the status of one Modbus 
+ *  send or receive operation, byte 0 is the most recent event.
+ */
+public class ModbusCommEvent {
+	private int status;
+	private int eventCount;
+	private int messageCount;
+	private int[] events;
+
+	public ModbusCommEvent(){
+		status=0;
+		eventCount=0;
+		messageCount=0;
+		events=null;
+	}
+	public int getStatus() {
+		return status;
+	}
+	public void setStatus(int status) {
+		this.status = status;
+	}
+	public int getEventCount() {
+		return eventCount;
+	}
+	public void setEventCount(int eventCount) {
+		this.eventCount = eventCount;
+	}
+	public int getMessageCount() {
+		return messageCount;
+	}
+	public void setMessageCount(int messageCount) {
+		this.messageCount = messageCount;
+	}
+	public int[] getEvents() {
+		return events;
+	}
+	public void setEvents(int[] events) {
+		this.events = events;
+	}
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusDataOrder.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusDataOrder.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d942fc2b4f16afff5ef94cae4167a97f3008f33
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusDataOrder.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.protocol.modbus;
+/**
+ * This static class defines the possible byte organization in
+ * the data stream sent and received.  The Modbus protocol only 
+ * defines one analog data type (16 bit) and only one format
+ * for that data in the stream (big endian).  Manufactures of
+ * various "Modbus compatible" field devices have extend and
+ * modified the size and arrangementof the data in the stream.  Data units may now be 16 or
+ * 32 bit sized and may be in a variety of byte arrangements.
+ * <p>
+ * In the definitions below, the character arrangement making up the definition
+ * field value actually represent the ordering of the bytes in the 
+ * stream.  For a hexadecimal number 0x01020304, the '1' is the 0x01
+ * byte, '2' is the 0x02 byte, '3' is the 0x03 byte and '4' is the 0x04.
+ * <p>
+ * The Field values, not the field names should be used in configuration files. 
+ * 
+ * @author matt.demaree
+ *
+ */
+public class ModbusDataOrder {
+	/**
+	 * 
+	 */
+	private ModbusDataOrder(){};
+	/**
+	 * booleans do not have a specified data order
+	 */
+	public static final String MODBUS_BOOLEAN_ORDER="none";
+	/**
+	 * this is the Modbus default (note only 16 bit or 2 byte data)
+	 */
+	public static final String MODBUS_WORD_ORDER_BIG_ENDIAN="12";
+	public static final String MODBUS_WORD_ORDER_LITTLE_ENDIAN="21";
+	/**
+	 * this is the most common 32 bit arrangement used by many devices
+	 */
+	public static final String MODBUS_LONG_ORDER_BIG_BIG_ENDIAN="1234";
+	public static final String MODBUS_LONG_ORDER_BIG_LITTLE_ENDIAN="2143";
+	public static final String MODBUS_LONG_ORDER_LITTLE_BIG_ENDIAN="3412";
+	public static final String MODBUS_LONG_ORDER_LITTLE_LITTLE_ENDIAN="4321";
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusFunctionCodes.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusFunctionCodes.java
new file mode 100644
index 0000000000000000000000000000000000000000..36f984e018f98d548d9ce875acc08a1875943d18
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusFunctionCodes.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.protocol.modbus;
+/**
+ * supported modbus commands
+ * @author matt.demaree
+ *
+ */
+public class ModbusFunctionCodes {
+	/**
+	 * 
+	 */
+	private ModbusFunctionCodes(){};
+	public static final int READ_COIL_STATUS=1;
+	public static final int READ_INPUT_STATUS=2;
+	public static final int READ_HOLDING_REGS=3;
+	public static final int READ_INPUT_REGS=4;
+	public static final int FORCE_SINGLE_COIL=5;
+	public static final int PRESET_SINGLE_REG=6;
+	public static final int READ_EXCEPTION_STATUS=7;
+	public static final int GET_COMM_EVENT_COUNTER=11;
+	public static final int GET_COMM_EVENT_LOG=12;
+	public static final int FORCE_MULTIPLE_COILS=15;
+	public static final int PRESET_MULTIPLE_REGS=16;
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolDevice.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..f10b5950c9bcda5600b8861a71f03407644f7806
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolDevice.java
@@ -0,0 +1,1510 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2012 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.protocol.modbus;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.kura.KuraConnectionStatus;
+import org.eclipse.kura.comm.CommConnection;
+import org.eclipse.kura.comm.CommURI;
+import org.eclipse.kura.position.NmeaPosition;
+import org.eclipse.kura.usb.UsbService;
+import org.eclipse.kura.usb.UsbTtyDevice;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.io.ConnectionFactory;
+import org.osgi.util.position.Position;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Modbus protocol implements a subset of the Modbus standard command set.
+ * It also provides for the extension of some data typing to allow register
+ * pairings to hold 32 bit data (see the configureDataMap for more detail).
+ * <p>
+ * The protocol supports RTU and ASCII mode operation.
+ * 
+ */
+public class ModbusProtocolDevice implements ModbusProtocolDeviceService {
+	private static final Logger s_logger = LoggerFactory.getLogger(ModbusProtocolDevice.class);
+	
+	private ConnectionFactory 	   m_connectionFactory;
+	private UsbService			   m_usbService;
+	
+	static final String PROTOCOL_NAME = "modbus";
+	public static final String PROTOCOL_CONNECTION_TYPE_SERIAL = "SERIAL";
+	public static final String SERIAL_232 = "RS232";
+	public static final String SERIAL_485 = "RS485";
+	public static final String PROTOCOL_CONNECTION_TYPE_ETHER_TCP = "ETHERTCP";
+	private String unitName = 	PROTOCOL_NAME;
+	private int 				m_respTout;
+	private int 				m_txMode;
+	private int 				m_unitAddr;
+	private boolean				m_serial485 = false;
+	private boolean 			m_protConfigd = false;
+	private boolean 			m_connConfigd = false;
+	private String 				m_connType = null;
+	private Communicate 		m_comm;
+	private static Properties 	m_modbusProperties=null;
+	
+	public void setConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = connectionFactory;
+	}
+	
+	public void unsetConnectionFactory(ConnectionFactory connectionFactory) {
+		this.m_connectionFactory = null;
+	}
+	
+	public void setUsbService(UsbService usbService) {
+		this.m_usbService = usbService;
+	}
+	
+	public void unsetUsbService(UsbService usbService) {
+		this.m_usbService = null;
+	}
+
+	private boolean serialPortExists(){
+		if(m_modbusProperties==null)
+			return false;
+		
+		String portName = m_modbusProperties.getProperty("port");
+		if(portName != null) {
+			if(portName.contains("/dev/")) {
+				File f = new File(portName);
+				if(f.exists()) {
+					return true;
+				}
+			} else {
+				List<UsbTtyDevice> utd=m_usbService.getUsbTtyDevices();	
+				if(utd!=null){
+					for (UsbTtyDevice u : utd) {
+						if(portName.equals(u.getUsbPort())) {
+							// replace device number with tty 
+							portName = u.getDeviceNode();
+							m_modbusProperties.setProperty("port", portName);
+							return true;
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------	
+	protected void activate(ComponentContext componentContext) 
+	{
+		s_logger.info("activate...");
+	}
+		
+	protected void deactivate(ComponentContext componentContext) 
+	{
+		s_logger.info("deactivate...");
+		disconnect();
+	}
+	
+	/**
+	 * modbus protocol configuration. Required properties for the modbus
+	 * protocol configuration are:
+	 * <table border="1">
+	 * <tr>
+	 * <th>Key</th><th>Description</th>
+	 * </tr>
+	 * <tr>
+	 * <td>unitName</td><td>Name to be returned by toString</td>
+	 * </tr>
+	 * <tr>
+	 * <td>unitAddress</td><td>Modbus address of the unit (1-255) </td>
+	 * </tr>
+	 * <tr>
+	 * <td>txMode</td><td>Must be set to "RTU" or "ASCII"</td>
+	 * </tr>
+	 * <tr>
+	 * <td>respTimeout</td><td>maximum time, in milliseconds, to wait for a
+	 * response to a command </td>
+	 * </tr>
+	 * </table>
+	 */
+	public void configureProtocol(Properties protocolConfig)
+			throws ModbusProtocolException {
+		String unitAddress;
+		String txMode;
+		String respTimeout;
+
+		if ((m_protConfigd)
+				|| ((unitName = protocolConfig.getProperty("unitName")) == null)
+				|| ((unitAddress = protocolConfig.getProperty("unitAddress")) == null)
+				|| ((txMode = protocolConfig.getProperty("txMode")) == null)
+				|| ((respTimeout = protocolConfig.getProperty("respTimeout")) == null))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+		m_unitAddr = Integer.parseInt(unitAddress);
+		if ((m_unitAddr < 1) || (m_unitAddr > 255))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+		if(txMode.equals(ModbusTransmissionMode.RTU)) m_txMode = ModbusTransmissionMode.RTU_MODE;
+		else if(txMode.equals(ModbusTransmissionMode.ASCII)) m_txMode = ModbusTransmissionMode.ASCII_MODE;
+		else throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION); 
+		m_respTout = Integer.parseInt(respTimeout);
+		if (m_respTout < 0)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+		m_protConfigd = true;
+	}
+
+	/**
+	 * two connection types are available, PROTOCOL_CONNECTION_TYPE_SERIAL (SERIAL MODE 232 or 485)
+	 * and
+	 * PROTOCOL_CONNECTION_TYPE_ETHER_TCP. The required properties for the
+	 * connection will vary with each connection.
+	 * <p>
+	 * <h4>PROTOCOL_CONNECTION_TYPE_SERIAL</h4>
+	 * see {@link org.eclipse.kura.comm.CommConnection CommConnection} package for more
+	 * detail.
+	 * <table border="1">
+	 * <tr>
+	 * <th>Key</th>
+	 * <th>Description</th>
+	 * </tr>
+	 * <tr>
+	 * <td>connectionType</td>
+	 * <td>"SERIAL" (from PROTOCOL_CONNECTION_TYPE_SERIAL). This parameter
+	 * indicates the connection type for the configuration. See
+	 * {@link org.eclipse.kura.comm.CommConnection CommConnection} for more details on serial
+	 * port configuration.
+	 * </tr>
+	 * <tr>
+	 * <td>port</td>
+	 * <td>the actual device port, such as "/dev/ttyUSB0" in linux</td>
+	 * </tr>
+	 * <tr>
+	 * <td>serialMode</td>
+	 * <td>SERIAL_232 or SERIAL_485</td>
+	 * </tr>
+	 * <tr>
+	 * <td>baudRate</td>
+	 * <td>baud rate to be configured for the port</td>
+	 * </tr>
+	 * <tr>
+	 * <td>stopBits</td>
+	 * <td>number of stop bits to be configured for the port</td>
+	 * </tr>
+	 * <tr>
+	 * <td>parity</td>
+	 * <td>parity mode to be configured for the port</td>
+	 * </tr>
+	 * <tr>
+	 * <td>bitsPerWord</td>
+	 * <td>only RTU mode supported, bitsPerWord must be 8</td>
+	 * </tr>
+	 * </table>
+	 * <p>
+	 * <h4>PROTOCOL_CONNECTION_TYPE_ETHER_TCP</h4>
+	 * The Ethernet mode merely opens a socket and sends the full RTU mode
+	 * Modbus packet over that socket connection and expects to receive a full
+	 * RTU mode Modbus response, including the CRC bytes.
+	 * <table border="1">
+	 * <tr>
+	 * <th>Key</th>
+	 * <th>Description</th>
+	 * </tr>
+	 * <tr>
+	 * <td>connectionType</td>
+	 * <td>"ETHERTCP" (from PROTOCOL_CONNECTION_TYPE_ETHER_TCP). This parameter
+	 * indicates the connection type for the configurator.
+	 * </tr>
+	 * <tr>
+	 * <td>ipAddress</td>
+	 * <td>the 4 octet IP address of the field device (xxx.xxx.xxx.xxx)</td>
+	 * </tr>
+	 * <tr>
+	 * <td>port</td>
+	 * <td>port on the field device to connect to</td>
+	 * </tr>
+	 * </table>
+	 */
+	public void configureConnection(Properties connectionConfig)
+			throws ModbusProtocolException {
+		if ((m_connType = connectionConfig.getProperty("connectionType")) == null)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+
+		m_modbusProperties=connectionConfig;
+		
+		if (m_connConfigd) {
+			m_comm.disconnect();
+			m_comm = null;
+			m_connConfigd = false;
+		}
+
+		if (m_connType.equals(PROTOCOL_CONNECTION_TYPE_SERIAL)){
+			if(!serialPortExists())
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_AVAILABLE);
+			m_comm = new SerialCommunicate(m_connectionFactory, connectionConfig);
+		}
+		else if (m_connType.equals(PROTOCOL_CONNECTION_TYPE_ETHER_TCP))
+			m_comm = new EthernetCommunicate(m_connectionFactory, connectionConfig);
+		else
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+
+		m_connConfigd = true;
+	}
+
+	/**
+	 * get the unit name registered for this instance
+	 * 
+	 * @return unitName
+	 */
+	public String toString() {
+		return unitName;
+	}
+
+	/**
+	 * get the name "modbus" for this protocol
+	 * 
+	 * @return "modbus"
+	 */
+	public String getProtocolName() {
+		return "modbus";
+	}
+
+	/**
+	 * Modbus unit addresses must always be in the range of 1-255
+	 * 
+	 * @return unit address (1-255) as a string
+	 */
+	public String getUnitAddress() {
+		return String.valueOf(m_unitAddr);
+	}
+
+	public void connect() throws ModbusProtocolException {
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+		m_comm.connect();
+	}
+
+	public void disconnect() {
+		if (m_connConfigd){
+			m_comm.disconnect();
+			m_comm = null;
+			m_connConfigd = false;
+			s_logger.info("Serial comm disconnected");
+		}
+		m_protConfigd=false;
+	}
+
+	public int getConnectStatus() {
+		if (!m_connConfigd)
+			return KuraConnectionStatus.NEVERCONNECTED;
+		return m_comm.getConnectStatus();
+	}
+
+
+	/**
+	 * The only constructor must be the configuration mechanism
+	 */
+	abstract private class Communicate {
+		abstract public void connect();
+
+		abstract public void disconnect();
+
+		abstract public int getConnectStatus();
+
+		abstract public byte[] msgTransaction(byte[] msg)
+				throws ModbusProtocolException;
+	}
+
+	/**
+	 * Installation of a serial connection to communicate, using javax.comm.SerialPort 
+	 * <p>
+	 * <table border="1">
+	 * <tr>
+	 * <th>Key</th>
+	 * <th>Description</th>
+	 * </tr>
+	 * <tr>
+	 * <td>port</td>
+	 * <td>the actual device port, such as "/dev/ttyUSB0" in linux</td>
+	 * </tr>
+	 * <tr>
+	 * <td>serialMode</td>
+	 * <td>SERIAL_232 or SERIAL_485</td>
+	 * </tr>
+	 * <tr>
+	 * <td>baudRate</td>
+	 * <td>baud rate to be configured for the port</td>
+	 * </tr>
+	 * <tr>
+	 * <td>stopBits</td>
+	 * <td>number of stop bits to be configured for the port</td>
+	 * </tr>
+	 * <tr>
+	 * <td>parity</td>
+	 * <td>parity mode to be configured for the port</td>
+	 * </tr>
+	 * <tr>
+	 * <td>bitsPerWord</td>
+	 * <td>only RTU mode supported, bitsPerWord must be 8</td>
+	 * </tr>
+	 * </table>
+	 * see {@link org.eclipse.kura.comm.CommConnection CommConnection} package for more
+	 * detail.
+	 */
+	private final class SerialCommunicate extends Communicate {
+		
+		InputStream in;
+		OutputStream out;
+		CommConnection conn=null;
+
+		FileWriter gpioModeSwitch;
+
+		public SerialCommunicate(ConnectionFactory connFactory, Properties connectionConfig)
+				throws ModbusProtocolException {
+			s_logger.debug("Configure serial connection");
+			
+			
+			String sPort;
+			String sBaud;
+			String sStop;
+			String sParity;
+			String sBits;				
+			String gpioSwitchPin = null;
+			String gpioRsModePin = null;
+
+			if (((sPort = connectionConfig.getProperty("port")) == null)
+					|| ((sBaud = connectionConfig.getProperty("baudRate")) == null)
+					|| ((sStop = connectionConfig.getProperty("stopBits")) == null)
+					|| ((sParity = connectionConfig.getProperty("parity")) == null)
+					|| ((sBits = connectionConfig.getProperty("bitsPerWord")) == null))
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+			
+			int baud = Integer.valueOf(sBaud).intValue();
+			int stop = Integer.valueOf(sStop).intValue();
+			int parity = Integer.valueOf(sParity).intValue();
+			int bits = Integer.valueOf(sBits).intValue();
+			if(connectionConfig.getProperty("serialMode")!=null){
+				m_serial485=(connectionConfig.getProperty("serialMode")==SERIAL_485);
+				if(m_serial485){
+					if (((gpioSwitchPin = connectionConfig.getProperty("serialGPIOswitch"))==null)
+						|| ((gpioRsModePin = connectionConfig.getProperty("serialGPIOrsmode"))==null))
+					throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+				}
+			}
+
+			String uri = new CommURI.Builder(sPort)
+									.withBaudRate(baud)
+									.withDataBits(bits)
+									.withStopBits(stop)
+									.withParity(parity)
+									.withTimeout(2000)
+									.build().toString();
+
+			try {
+				conn = (CommConnection) connFactory.createConnection(uri, 1, false);
+			} catch (IOException e1) {
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.CONNECTION_FAILURE,e1);
+			}
+			if(m_serial485){
+				setupSerialGpio(gpioRsModePin, gpioSwitchPin);
+			}
+
+			// get the streams
+			try {
+				in = conn.openInputStream();
+				out = conn.openOutputStream();
+			} catch (Exception e) {
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.CONNECTION_FAILURE,e);
+			}
+		}
+
+		/**
+		 * Initializes the GPIO Serial Ports to RS485 mode with output direction.
+		 * Communication can then be switched to RX or TX.
+		 * @param gpioRsMode
+		 * @param gpioSwitch
+		 * @throws ModbusProtocolException 
+		 */
+		private void setupSerialGpio(String gpioRsMode, String gpioSwitch) throws ModbusProtocolException {
+			final String[] requiredGpio = {
+					gpioRsMode, /* port 3 RS mode */
+					gpioSwitch /* port TX<->RX switch */
+			};
+
+			for (String gpio : requiredGpio) {
+				File gpioFile = new File("/sys/class/gpio/" + gpio);
+				if (!gpioFile.exists()) {
+					// # Pin is not exported, so do it now
+					FileWriter fwExport = null;
+					try {
+						fwExport = new FileWriter(new File("/sys/class/gpio/export"));
+						// write only the PIN number
+						fwExport.write(gpio.replace("gpio", ""));
+						fwExport.flush();
+						s_logger.debug("Exported GPIO {}", gpio);
+
+					} catch (IOException e) {
+						s_logger.error("Exporting Error", e);
+					} finally {
+						try {
+							fwExport.close();
+						} catch (IOException e) {
+							s_logger.error("Error closing export file");
+						}
+					}
+					// wait a little after exporting
+					try {
+						Thread.sleep(100);
+					} catch (InterruptedException e) {
+						Thread.currentThread().interrupt();
+					}
+				};
+
+
+				// After exporting the pin, set the direction to "out"
+				FileWriter fwDirection = null;
+				try {
+					fwDirection = new FileWriter(new File("/sys/class/gpio/" + gpio + "/direction"));
+					fwDirection.write("out");
+					fwDirection.flush();
+					s_logger.debug("Direction GPIO {}", gpio);
+
+				} catch (IOException e) {
+					s_logger.error("Direction Error", e);
+				} finally {
+					try {
+						fwDirection.close();
+					} catch (IOException e) {
+						s_logger.error("Error closing export file");
+					}
+				}
+				
+				//Switch to RS485 mode
+				FileWriter fwValue = null;
+				try {
+					fwValue = new FileWriter(new File("/sys/class/gpio/" + gpio + "/value"));
+					fwValue.write("1");
+					fwValue.flush();
+					s_logger.debug("Value GPIO {}", gpio);
+
+				} catch (IOException e) {
+					s_logger.error("Value Error", e);
+				} finally {
+					try {
+						fwValue.close();
+					} catch (IOException e) {
+						s_logger.error("Error closing value file");
+					}
+				}
+
+			}
+
+		}
+		
+		/**
+		 * Sets the GPIO Serial port to Transmit mode. Data can be written to OutputStream.
+		 * @throws InterruptedException 
+		 */
+		private void switchTX() throws ModbusProtocolException {
+			try {
+				gpioModeSwitch.write("1");
+				gpioModeSwitch.flush();
+				try {
+					Thread.sleep(10);
+				} catch (InterruptedException e) {
+					throw new ModbusProtocolException(ModbusProtocolErrorCode.CONNECTION_FAILURE,"switchTX interrupted");
+				}
+			} catch (IOException e) {
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.CONNECTION_FAILURE,"switchTX IOException "+e.getMessage());
+			}
+		}
+
+		/**
+		 * Sets the GPIO Serial port to Receive mode. Data can be read from InputStream.
+		 * @throws InterruptedException 
+		 */
+		private void switchRX() throws ModbusProtocolException {
+			try {
+				gpioModeSwitch.write("0");
+				gpioModeSwitch.flush();
+				try {
+					Thread.sleep(10);
+				} catch (InterruptedException e) {
+					throw new ModbusProtocolException(ModbusProtocolErrorCode.CONNECTION_FAILURE,"switchRX interrupted");
+				}
+			} catch (IOException e) {
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.CONNECTION_FAILURE,"switchRX IOException "+e.getMessage());
+			}
+		}
+
+		public void connect() {
+			/*
+			 * always connected
+			 */
+		}
+
+		public void disconnect() {
+			if (conn!=null) {
+				try {
+					conn.close();
+					s_logger.debug("Serial connection closed");
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				conn = null;
+			}
+			if(m_serial485){
+				if (gpioModeSwitch != null) {
+					try {
+						gpioModeSwitch.close();
+					} catch (IOException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+
+		public int getConnectStatus() {
+			return KuraConnectionStatus.CONNECTED;
+		}
+
+		private byte asciiLrcCalc(byte[] msg, int len){
+			char[] ac=new char[2];
+			ac[0]=(char) msg[len-4]; ac[1]=(char) msg[len - 3];
+			String s=new String(ac);
+			byte lrc=(byte) Integer.parseInt(s,16);
+			return lrc;
+		}
+		
+		private int binLrcCalc(byte[] msg){
+			int llrc=0;
+			for(int i=0; i<msg.length; i++) 
+				llrc+=(int)msg[i] & 0xff;
+			llrc = (llrc ^ 0xff) + 1;
+			byte lrc=(byte)(llrc & 0x0ff);
+			return llrc;
+		}
+		
+		/**
+		 * convertCommandToAscii: convert a binary command into a standard Modbus
+		 * ASCII frame 
+		 */
+		private byte[] convertCommandToAscii(byte[] msg){
+			int lrc=binLrcCalc(msg);
+			
+			char[] hexArray = "0123456789ABCDEF".toCharArray();
+			byte[] ab=new byte[msg.length*2 + 5];
+			ab[0]=':';
+			int v;
+			for(int i=0; i<msg.length; i++){
+				v=msg[i] & 0xff;
+				ab[i*2 + 1] = (byte) hexArray[v >>> 4];
+				ab[i*2 + 2] = (byte) hexArray[v & 0x0f];
+			}
+			v=lrc & 0x0ff;
+			ab[ab.length-4]=(byte) hexArray[v >>> 4];
+			ab[ab.length-3]=(byte) hexArray[v & 0x0f];
+			ab[ab.length-2]=13;
+			ab[ab.length-1]=10;
+			return ab;
+		}
+
+		/**
+		 * convertAsciiResponseToBin: convert a standard Modbus frame to
+		 * byte array 
+		 */
+		private byte[] convertAsciiResponseToBin(byte[] msg, int len){
+			int l = (len-5)/2;
+			byte[] ab=new byte[l];
+			char[] ac=new char[2];
+			String s=new String(msg);
+			for(int i=0; i<l; i++){
+				ac[0]=(char) msg[i*2 + 1]; ac[1]=(char) msg[i*2 + 2];
+				s=new String(ac);
+				ab[i]=(byte) Integer.parseInt(s,16);
+			}
+			return ab;
+		}
+		
+		/**
+		 * msgTransaction must be called with a byte array having two extra
+		 * bytes for the CRC. It will return a byte array of the response to the
+		 * message. Validation will include checking the CRC and verifying the
+		 * command matches.
+		 */
+		public byte[] msgTransaction(byte[] msg)
+				throws ModbusProtocolException {
+			
+			byte[] cmd = null;
+
+			if(m_txMode == ModbusTransmissionMode.RTU_MODE){
+				cmd = new byte[msg.length+2];
+				for(int i=0; i<msg.length; i++)
+					cmd[i]=msg[i];
+				// Add crc calculation to end of message
+				int crc = Crc16.getCrc16(msg, msg.length, 0x0ffff);
+				cmd[msg.length] = (byte) crc;
+				cmd[msg.length + 1] = (byte) (crc >> 8);
+			}
+			else if(m_txMode == ModbusTransmissionMode.ASCII_MODE){
+				cmd=convertCommandToAscii(msg);
+			}
+
+			// Send the message
+			try {
+				synchronized (out) {
+					synchronized (in) {
+						// flush input
+						if(m_serial485)
+							switchRX();
+						while (in.available() > 0)
+							in.read();
+						// send all data
+						if(m_serial485)
+							switchTX();
+						out.write(cmd, 0, cmd.length);
+						out.flush();
+						//outputStream.waitAllSent(respTout);
+
+						// wait for and process response
+						if(m_serial485)
+							switchRX();
+						byte[] response = new byte[262]; // response buffer
+						int respIndex = 0;
+						int minimumLength = 5; // default minimum message length
+						if(m_txMode == ModbusTransmissionMode.ASCII_MODE)
+							minimumLength = 11;
+						int timeOut = m_respTout;
+						for (int maxLoop = 0; maxLoop < 1000; maxLoop++) {
+							boolean endFrame=false;
+							//while (respIndex < minimumLength) {
+							while (!endFrame) {
+								long start = System.currentTimeMillis();
+								while(in.available()==0) {								
+									try {
+										Thread.sleep(5);	// avoid a high cpu load
+									} catch (InterruptedException e) {
+										throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE, "Thread interrupted");
+									}
+
+									long elapsed = System.currentTimeMillis()-start;
+									if( elapsed > timeOut) {
+										String failMsg = "Recv timeout";
+										s_logger.warn(failMsg+" : "+elapsed+" minimumLength="+minimumLength+" respIndex="+respIndex);
+										throw new ModbusProtocolException(ModbusProtocolErrorCode.RESPONSE_TIMEOUT, failMsg);
+									}
+								}
+								// address byte must match first
+								if (respIndex == 0) {
+									if(m_txMode == ModbusTransmissionMode.ASCII_MODE){
+										if ((response[0] = (byte) in.read()) == ':')
+											respIndex++;
+									}
+									else{
+										if ((response[0] = (byte) in.read()) == msg[0])
+											respIndex++;
+									}
+								} else
+									response[respIndex++] = (byte) in.read();
+
+								if(m_txMode == ModbusTransmissionMode.RTU_MODE){
+									timeOut = 100; // move to character timeout
+									if(respIndex >= minimumLength)
+										endFrame=true;
+								}
+								else{
+									if((response[respIndex-1]==10)&&(response[respIndex-2]==13))
+										endFrame=true;
+								}
+							}
+							// if ASCII mode convert response
+							if(m_txMode == ModbusTransmissionMode.ASCII_MODE){
+								byte lrcRec = asciiLrcCalc(response,respIndex);
+								response=convertAsciiResponseToBin(response,respIndex);
+								byte lrcCalc = (byte)binLrcCalc(response);
+								if(lrcRec!=lrcCalc)
+									throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,"Bad LRC");
+							}
+							
+							// Check first for an Exception response
+							if ((response[1] & 0x80) == 0x80) {
+								if ((m_txMode == ModbusTransmissionMode.ASCII_MODE)||(Crc16.getCrc16(response, 5, 0xffff) == 0))
+									throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,
+											"Exception response = "+ Byte.toString(response[2]));
+							} else {
+								// then check for a valid message
+								switch (response[1]) {
+								case ModbusFunctionCodes.FORCE_SINGLE_COIL:
+								case ModbusFunctionCodes.PRESET_SINGLE_REG:
+								case ModbusFunctionCodes.FORCE_MULTIPLE_COILS:
+								case ModbusFunctionCodes.PRESET_MULTIPLE_REGS:
+									if (respIndex < 8)
+										// wait for more data
+										minimumLength = 8;
+									else if ((m_txMode == ModbusTransmissionMode.ASCII_MODE)||
+											(Crc16.getCrc16(response, 8, 0xffff) == 0)) {
+										byte[] ret = new byte[6];
+										for (int i = 0; i < 6; i++)
+											ret[i] = response[i];
+										return ret;
+									}
+									break;
+								case ModbusFunctionCodes.READ_COIL_STATUS:
+								case ModbusFunctionCodes.READ_INPUT_STATUS:
+								case ModbusFunctionCodes.READ_INPUT_REGS:
+								case ModbusFunctionCodes.READ_HOLDING_REGS:									
+									int byteCnt;
+									if ((m_txMode == ModbusTransmissionMode.ASCII_MODE))
+										byteCnt= (response[2] & 0xff) + 3;
+									else
+										byteCnt= (response[2] & 0xff) + 5;
+									if (respIndex < byteCnt)
+										// wait for more data
+										minimumLength = byteCnt;
+									else if ((m_txMode == ModbusTransmissionMode.ASCII_MODE)||
+											(Crc16.getCrc16(response, byteCnt,0xffff) == 0)) {
+										byte[] ret = new byte[byteCnt];
+										for (int i = 0; i < byteCnt; i++)
+											ret[i] = response[i];
+										return ret;
+									}
+								}
+							}
+
+							/*
+							 * if required length then must have failed, drop
+							 * first byte and try again
+							 */
+							if (respIndex >= minimumLength) {
+								respIndex--;
+								for (int i = 0; i < respIndex; i++)
+									response[i] = response[i + 1];
+								minimumLength = 5; // reset minimum length
+							}
+						}
+					}
+				}
+			} catch (IOException e) {
+				//e.printStackTrace();
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,e.getMessage());
+			}
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,
+					"Too much activity on recv line");
+		}
+	}
+
+	/**
+	 * Installation of an ethernet connection to communicate 
+	 */
+	private final class EthernetCommunicate extends Communicate {
+		InputStream inputStream;
+		OutputStream outputStream;
+		Socket socket;
+		int port;
+		String ipAddress;
+		boolean connected = false;
+
+		public EthernetCommunicate(ConnectionFactory connFactory, Properties connectionConfig)
+				throws ModbusProtocolException {
+			s_logger.debug("Configure TCP connection");
+			String sPort;
+
+			if (((sPort = connectionConfig.getProperty("port")) == null)
+					|| ((ipAddress = connectionConfig.getProperty("ipAddress")) == null))
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_CONFIGURATION);
+			port = Integer.valueOf(sPort).intValue();
+			m_connConfigd = true;
+			socket = new Socket();
+		}
+
+		public void connect() {
+			if (!m_connConfigd) {
+				s_logger.error("Can't connect, port not configured");
+			} else {
+				if (!connected) {
+					try {
+						socket = new Socket(ipAddress, port);
+						try {
+							inputStream = socket.getInputStream();
+							outputStream = socket.getOutputStream();
+							connected = true;
+							s_logger.info("TCP connected");
+						} catch (IOException e) {
+							disconnect();
+							s_logger.error("Failed to get socket streams: " + e);
+						}
+					} catch (IOException e) {
+						s_logger.error("Failed to connect to remote: " + e);
+					}
+				}
+			}
+		}
+
+		public void disconnect() {
+			if (m_connConfigd) {
+				if (connected) {
+					try {
+						if (!socket.isInputShutdown())
+							socket.shutdownInput();
+						if (!socket.isOutputShutdown())
+							socket.shutdownOutput();
+						socket.close();
+					} catch (IOException eClose) {
+						s_logger.error("Error closing TCP: "
+								+ eClose);
+					}
+					inputStream = null;
+					outputStream = null;
+					connected = false;
+					socket = null;
+				}
+			}
+		}
+
+		public int getConnectStatus() {
+			if (connected)
+				return KuraConnectionStatus.CONNECTED;
+			else if (m_connConfigd)
+				return KuraConnectionStatus.DISCONNECTED;
+			else
+				return KuraConnectionStatus.NEVERCONNECTED;
+		}
+
+		public byte[] msgTransaction(byte[] msg)
+				throws ModbusProtocolException {
+			byte[] cmd = null;
+
+			if(m_txMode == ModbusTransmissionMode.RTU_MODE){
+				cmd = new byte[msg.length+2];
+				for(int i=0; i<msg.length; i++)
+					cmd[i]=msg[i];
+				// Add crc calculation to end of message
+				int crc = Crc16.getCrc16(msg, msg.length, 0x0ffff);
+				cmd[msg.length] = (byte) crc;
+				cmd[msg.length + 1] = (byte) (crc >> 8);
+			}
+			else 				
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.METHOD_NOT_SUPPORTED,"Only RTU over TCP/IP supported");
+
+
+			// Check connection status and connect
+			connect();
+			if (!connected)
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,
+						"Cannot transact on closed socket");
+
+			// Send the message
+			try {
+				// flush input
+				while (inputStream.available() > 0)
+					inputStream.read();
+				// send all data
+				outputStream.write(cmd, 0, cmd.length);
+				outputStream.flush();
+			} catch (IOException e) {
+				// Assume this means the socket is closed...make sure it is
+				s_logger.error("Socket disconnect in send: " + e);
+				disconnect();
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,"Send failure: "
+						+ e.getMessage());
+			}
+
+			// wait for and process response
+			byte[] response = new byte[262]; // response buffer
+			int respIndex = 0;
+			int minimumLength = 5; // default minimum message length
+			while (true) {
+				while (respIndex < minimumLength) {
+					try {
+						socket.setSoTimeout(m_respTout);
+						int resp = inputStream.read(response, respIndex,
+								minimumLength - respIndex);
+						if (resp > 0) {
+							respIndex += resp;
+						} else {
+							s_logger.error("Socket disconnect in recv");
+							disconnect();
+							throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,"Recv failure");
+						}
+					} catch (SocketTimeoutException e) {
+						String failMsg = "Recv timeout";
+						s_logger.warn(failMsg);
+						throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,failMsg);
+					} catch (IOException e) {
+						s_logger.error("Socket disconnect in recv: " + e);
+						disconnect();
+						throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,
+								"Recv failure");
+					}
+				}
+
+				// Check first for an Exception response
+				if ((response[1] & 0x80) == 0x80) {
+					if (Crc16.getCrc16(response, 5, 0xffff) == 0)
+						throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,
+								"Resp exception = "
+										+ Byte.toString(response[2]));
+				} else {
+					// then check for a valid message
+					switch (response[1]) {
+					case ModbusFunctionCodes.FORCE_SINGLE_COIL:
+					case ModbusFunctionCodes.PRESET_SINGLE_REG:
+					case ModbusFunctionCodes.FORCE_MULTIPLE_COILS:
+					case ModbusFunctionCodes.PRESET_MULTIPLE_REGS:
+						if (respIndex < 8)
+							// wait for more data
+							minimumLength = 8;
+						else if (Crc16.getCrc16(response, 8, 0xffff) == 0) {
+							byte[] ret = new byte[8];
+							for (int i = 0; i < 8; i++)
+								ret[i] = response[i];
+							return ret;
+						}
+						break;
+					case ModbusFunctionCodes.READ_COIL_STATUS:
+					case ModbusFunctionCodes.READ_INPUT_STATUS:
+					case ModbusFunctionCodes.READ_INPUT_REGS:
+					case ModbusFunctionCodes.READ_HOLDING_REGS:
+						int byteCnt = (response[2] & 0xff) + 5;
+						if (respIndex < byteCnt)
+							// wait for more data
+							minimumLength = byteCnt;
+						else if (Crc16.getCrc16(response, byteCnt, 0xffff) == 0) {
+							byte[] ret = new byte[byteCnt];
+							for (int i = 0; i < byteCnt; i++)
+								ret[i] = response[i];
+							return ret;
+						}
+					}
+				}
+
+				/*
+				 * if required length then must have failed, drop first byte and
+				 * try again
+				 */
+				if (respIndex >= minimumLength)
+					throw new ModbusProtocolException(ModbusProtocolErrorCode.TRANSACTION_FAILURE,
+							"Error in recv");
+			}
+		}
+	}
+
+	@Override
+	public Position getPosition() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public NmeaPosition getNmeaPosition() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	public boolean[] readCoils(int dataAddress, int count)
+			throws ModbusProtocolException {
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+		
+		boolean[] ret = new boolean[count];
+		int index = 0;
+
+		byte[] resp;
+		/*
+		 * construct the command issue and get results
+		 */
+		byte[] cmd = new byte[6];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.READ_COIL_STATUS;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = (byte) (count / 256);
+		cmd[5] = (byte) (count % 256);
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if ((resp.length < 3) || (resp.length < ((resp[2] & 0xff) + 3)))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		if ((resp[2] & 0xff) == ((count + 7) / 8)) {
+			byte mask = 1;
+			int byteOffset = 3;
+			for (int j = 0; j < count; j++, index++) {
+				// get this point's value
+				if ((resp[byteOffset] & mask) == mask)
+					ret[index] = true;
+				else
+					ret[index] = false;
+				// advance the mask and offset index
+				if ((mask <<= 1) == 0) {
+					mask = 1;
+					byteOffset++;
+				}
+			}
+		} else
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_ADDRESS);
+		
+		return ret;
+	}
+
+	public boolean[] readDiscreteInputs(int dataAddress, int count)
+			throws ModbusProtocolException {
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+		
+		boolean[] ret = new boolean[count];
+		int index = 0;
+
+		byte[] resp;
+		/*
+		 * construct the command issue and get results
+		 */
+		byte[] cmd = new byte[6];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.READ_INPUT_STATUS;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = (byte) (count / 256);
+		cmd[5] = (byte) (count % 256);
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if ((resp.length < 3) || (resp.length < ((resp[2] & 0xff) + 3)))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		if ((resp[2] & 0xff) == ((count + 7) / 8)) {
+			byte mask = 1;
+			int byteOffset = 3;
+			for (int j = 0; j < count; j++, index++) {
+				// get this point's value
+				if ((resp[byteOffset] & mask) == mask)
+					ret[index] = true;
+				else
+					ret[index] = false;
+				// advance the mask and offset index
+				if ((mask <<= 1) == 0) {
+					mask = 1;
+					byteOffset++;
+				}
+			}
+		} else
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_ADDRESS);
+		
+		return ret;
+	}
+
+	public void writeSingleCoil(int dataAddress, boolean data)
+			throws ModbusProtocolException{
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+
+		byte[] resp;
+
+		byte[] cmd = new byte[6];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = ModbusFunctionCodes.FORCE_SINGLE_COIL;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = (data == true) ? (byte) 0xff : (byte) 0;
+		cmd[5] = 0;
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response
+		 */
+		if (resp.length < 6)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		for (int i = 0; i < 6; i++)
+			if (cmd[i] != resp[i])
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+
+	}
+
+	public void writeMultipleCoils(int dataAddress, boolean[] data)
+			throws ModbusProtocolException{
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+
+		/*
+		 * write multiple boolean values
+		 */
+		int localCnt = data.length;
+		int index = 0;
+		byte[] resp;
+		/*
+		 * construct the command, issue and verify response
+		 */
+		int dataLength = (localCnt + 7) / 8;
+		byte[] cmd = new byte[dataLength + 7];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = ModbusFunctionCodes.FORCE_MULTIPLE_COILS;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = (byte) (localCnt / 256);
+		cmd[5] = (byte) (localCnt % 256);
+		cmd[6] = (byte) dataLength;
+
+		// put the data on the command
+		byte mask = 1;
+		int byteOffset = 7;
+		cmd[byteOffset] = 0;
+		for (int j = 0; j < localCnt; j++, index++) {
+			// get this point's value
+			if (data[index])
+				cmd[byteOffset] += mask;
+			// advance the mask and offset index
+			if ((mask <<= 1) == 0) {
+				mask = 1;
+				byteOffset++;
+				cmd[byteOffset] = 0;
+			}
+		}
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response
+		 */
+		if (resp.length < 6)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		for (int j = 0; j < 6; j++)
+			if (cmd[j] != resp[j])
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+	}
+
+	public int[] readHoldingRegisters(int dataAddress, int count)
+			throws ModbusProtocolException {
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+
+		int[] ret = new int[count];
+		int index = 0;
+
+		byte[] resp;
+		/*
+		 * construct the command issue and get results, putting the results
+		 * away at index and then incrementing index for the next command
+		 */
+		byte[] cmd = new byte[6];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.READ_HOLDING_REGS;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = 0;
+		cmd[5] = (byte) count;
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if ((resp.length < 3) || (resp.length < ((resp[2] & 0xff) + 3)))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		if ((resp[2] & 0xff) == (count * 2)) {
+			int byteOffset = 3;
+			for (int j = 0; j < count; j++, index++) {
+				int val = resp[byteOffset
+				               + (ModbusDataOrder.MODBUS_WORD_ORDER_BIG_ENDIAN.charAt(0) - '1')] & 0xff;
+				val <<= 8;
+				val += resp[byteOffset
+				            + (ModbusDataOrder.MODBUS_WORD_ORDER_BIG_ENDIAN.charAt(1) - '1')] & 0xff;
+
+				ret[index] = val;
+
+				byteOffset += 2;
+			}
+		} else
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_ADDRESS);
+		return ret;
+	}
+
+	public int[] readInputRegisters(int dataAddress, int count)
+			throws ModbusProtocolException {
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+
+		int[] ret = new int[count];
+		int index = 0;
+
+		byte[] resp;
+		/*
+		 * construct the command issue and get results, putting the results
+		 * away at index and then incrementing index for the next command
+		 */
+		byte[] cmd = new byte[6];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.READ_INPUT_REGS;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = 0;
+		cmd[5] = (byte) count;
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if ((resp.length < 3) || (resp.length < ((resp[2] & 0xff) + 3)))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		if ((resp[2] & 0xff) == (count * 2)) {
+			int byteOffset = 3;
+			for (int j = 0; j < count; j++, index++) {
+				int val = resp[byteOffset
+				               + (ModbusDataOrder.MODBUS_WORD_ORDER_BIG_ENDIAN.charAt(0) - '1')] & 0xff;
+				val <<= 8;
+				val += resp[byteOffset
+				            + (ModbusDataOrder.MODBUS_WORD_ORDER_BIG_ENDIAN.charAt(1) - '1')] & 0xff;
+
+				ret[index] = val;
+
+				byteOffset += 2;
+			}
+		} else
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_ADDRESS);
+		return ret;
+	}
+
+	public void writeSingleRegister(int dataAddress, int data)
+			throws ModbusProtocolException{
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+
+		byte[] cmd = new byte[6];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = ModbusFunctionCodes.PRESET_SINGLE_REG;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = (byte) (data >> 8);
+		cmd[5] = (byte) data;
+
+		/*
+		 * send the message and get the response
+		 */
+		byte[] resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response
+		 */
+		if (resp.length < 6)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		for (int i = 0; i < 6; i++)
+			if (cmd[i] != resp[i])
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+	}
+
+	public void writeMultipleRegister(int dataAddress, int[] data)
+			throws ModbusProtocolException{
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+
+		int localCnt = data.length;
+		/*
+		 * construct the command, issue and verify response
+		 */
+		int dataLength = localCnt * 2;
+		byte[] cmd = new byte[dataLength + 7];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = ModbusFunctionCodes.PRESET_MULTIPLE_REGS;
+		cmd[2] = (byte) (dataAddress / 256);
+		cmd[3] = (byte) (dataAddress % 256);
+		cmd[4] = (byte) (localCnt / 256);
+		cmd[5] = (byte) (localCnt % 256);
+		cmd[6] = (byte) dataLength;
+
+		// put the data on the command
+		int byteOffset = 7;
+		int index = 0;
+		for (int j = 0; j < localCnt; j++, index++) {
+			cmd[byteOffset + (ModbusDataOrder.MODBUS_WORD_ORDER_BIG_ENDIAN.charAt(0) - '1')] = (byte) (data[index] >> 8);
+			cmd[byteOffset + (ModbusDataOrder.MODBUS_WORD_ORDER_BIG_ENDIAN.charAt(1) - '1')] = (byte) data[index];
+
+			byteOffset += 2;
+		}
+
+		/*
+		 * send the message and get the response
+		 */
+		byte[] resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response
+		 */
+		if (resp.length < 6)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		for (int j = 0; j < 6; j++)
+			if (cmd[j] != resp[j])
+				throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+	}
+
+	public boolean[] readExceptionStatus()
+			throws ModbusProtocolException {
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+		
+		boolean[] ret = new boolean[8];
+		int index = 0;
+
+		byte[] resp;
+		/*
+		 * construct the command issue and get results
+		 */
+		byte[] cmd = new byte[2];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.READ_EXCEPTION_STATUS;
+
+		/*
+		 * send the message and get the response
+		 */
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if (resp.length < 3)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		byte mask = 1;
+		for (int j = 0; j < 8; j++, index++) {
+			// get this point's value
+			if ((resp[2] & mask) == mask)
+				ret[index] = true;
+			else
+				ret[index] = false;
+			// advance the mask and offset index
+			if ((mask <<= 1) == 0) {
+				mask = 1;
+			}
+		}
+
+		return ret;
+	}
+	
+	public ModbusCommEvent getCommEventCounter()
+			throws ModbusProtocolException {
+		ModbusCommEvent mce = new ModbusCommEvent();
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+		
+		/*
+		 * construct the command issue and get results
+		 */
+		byte[] cmd = new byte[2];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.GET_COMM_EVENT_COUNTER;
+
+		/*
+		 * send the message and get the response
+		 */
+		byte[] resp;
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if (resp.length < 6)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		int val = resp[2] & 0xff;
+		val <<= 8;
+		val += resp[3] & 0xff;
+		mce.setStatus(val);
+		val = resp[4] & 0xff;
+		val <<= 8;
+		val += resp[5] & 0xff;
+		mce.setEventCount(val);
+		
+		return mce;
+	}
+
+	public ModbusCommEvent getCommEventLog()
+			throws ModbusProtocolException {
+		ModbusCommEvent mce = new ModbusCommEvent();
+		if (!m_connConfigd)
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.NOT_CONNECTED);
+		
+		/*
+		 * construct the command issue and get results
+		 */
+		byte[] cmd = new byte[2];
+		cmd[0] = (byte) m_unitAddr;
+		cmd[1] = (byte) ModbusFunctionCodes.GET_COMM_EVENT_LOG;
+
+		/*
+		 * send the message and get the response
+		 */
+		byte[] resp;
+		resp = m_comm.msgTransaction(cmd);
+
+		/*
+		 * process the response (address & CRC already confirmed)
+		 */
+		if ((resp.length < ((resp[2] & 0xff) + 3))||((resp[2] & 0xff)>64+7))
+			throw new ModbusProtocolException(ModbusProtocolErrorCode.INVALID_DATA_TYPE);
+		int val = resp[3] & 0xff;
+		val <<= 8;
+		val += resp[4] & 0xff;
+		mce.setStatus(val);
+		
+		val = resp[5] & 0xff;
+		val <<= 8;
+		val += resp[6] & 0xff;
+		mce.setEventCount(val);
+		
+		val = resp[7] & 0xff;
+		val <<= 8;
+		val += resp[8] & 0xff;
+		mce.setMessageCount(val);
+		
+		int count=(resp[2] & 0xff)-4;
+		int[] events=new int[count];
+		for (int j = 0; j < count; j++) {
+				int bval = resp[9+j] & 0xff;
+				events[j] = bval;
+		}
+		mce.setEvents(events);
+		
+		return mce;
+	}
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolDeviceService.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolDeviceService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3cc3cc7493de032bc6929b6fb28589d92a5e2c6
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolDeviceService.java
@@ -0,0 +1,381 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.protocol.modbus;
+
+import java.util.Properties;
+
+import org.eclipse.kura.position.NmeaPosition;
+import org.osgi.util.position.Position;
+
+
+/**
+ * OSGI service providing a connection to a device via Serial link (RS232/RS485) or Ethernet using Modbus protocol.
+ * This service implements a subset of Modbus Application Protocol as defined by Modbus Organization : 
+ * http://www.modbus.org/specs.php.<br>
+ * For the moment in Ethernet mode, only RTU over TCP/IP is supported
+ * <p>
+ * Function codes implemented are :
+ * <li> 01 (0x01) readCoils(int dataAddress, int count) : Read 1 to 2000 max contiguous status of coils from the attached field device. 
+ * It returns an array of booleans representing the requested data points.</li><br>
+ * <li> 02 (0x02) readDiscreteInputs(int dataAddress, int count) : Read 1 to 2000 max contiguous status of discrete inputs 
+ * from the attached field device. It returns an array of booleans representing the requested data points.</li><br>
+ * <li> 03 (0x03) readHoldingRegisters(int dataAddress, int count) : Read contents of 1 to 125 max contiguous block of holding 
+ * registers from the attached field device. It returns an array of int representing the requested data points 
+ * (data registers on 2 bytes).</li><br>
+ * <li> 04 (0x04) readInputRegisters(int dataAddress, int count) : Read contents of 1 to 125 max contiguous block of input registers
+ *  from the attached field device. It returns an array of int representing the requested data points (data registers on 2 bytes).</li><br>
+ * <li> 05 (0x05) writeSingleCoil(int dataAddress, boolean data) : Write a single output to either ON or OFF in the attached field 
+ * device.</li><br>
+ * <li> 06 (0x06) writeSingleRegister(int dataAddress, int data) : write a single holding register in the attached field 
+ * device.</li><br>
+ * <li> 07 (0x07) readExceptionStatus() : read the content of 8 Exception Status outputs in the field
+ * device.</li><br>
+ * <li> 11 (0x0B) getCommEventCounter() : Get a status word and an event count from the field
+ * device.</li><br>
+ * <li> 12 (0x0C) getCommEventLog() : Get a status word, an event count, a message count and a list of event bytes from the field
+ * device.</li><br>
+ * <li> 15 (0x0F) writeMultipleCoils(int dataAddress, boolean[] data) : Write multiple coils in a sequence of coils to either 
+ * ON or OFF in the attached field device.</li><br>
+ * <li> 16 (0x10) writeMultipleRegister(int dataAddress, int[] data) : write a block of contiguous registers (1 to 123) in the attached 
+ * field device.</li>
+ */
+
+public interface ModbusProtocolDeviceService {
+
+	/**
+	 * name of this service
+	 */
+	public static final String SERVICE_NAME = ModbusProtocolDeviceService.class
+			.getName();
+	
+	/**
+	 * returns the unit name given in the configureProtocol call. Prior to
+	 * configuration, this method will return the built-in name of the protocol,
+	 * the same as returned by getProtocolName.
+	 * 
+	 * @return assigned unit name
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString();
+
+	/**
+	 * returns the protocol name for the specific protocol implemented. This
+	 * name should follow Java member naming conventions, so the first (or only)
+	 * part of the name should be all lower case, all subsequent parts to the
+	 * name should begin with an upper case and continue with lower case.
+	 * 
+	 * @return name following the above rules
+	 */
+	public String getProtocolName();
+
+	/**
+	 * this returns the address given the RTU in the configureProtocol. Until
+	 * configured, this returns an empty string. The address is returned as a
+	 * string rather than an integer or other number as some protocols may have
+	 * multi-part addresses or addresses that contain non-numeric parts.
+	 * 
+	 * @return address of physical device this instance represents
+	 */
+	public String getUnitAddress();
+
+	/**
+	 * Required properties for modbus protocol configuration. 
+	 * 
+	 * @param protocolConfig
+	 * (key/value pairing directly from configuration file)<br>
+	 * <li>unitName : Name to be returned by toString
+	 * <li>unitAddress : Modbus address of the unit (1-255)
+	 * <li>txMode : Must be set to "RTU" or "ASCII"
+	 * <li>respTimeout : maximum time, in milliseconds, to wait for a
+	 * response to a command 
+	 * @throws ModbusProtocolException(INVALID_CONFIGURATION)
+	 *             unspecified problem with the configuration
+	 */
+	public void configureProtocol(Properties protocolConfig)
+			throws ModbusProtocolException;
+
+	/**
+	 * Configure access to the physical device. 
+	 * 
+	 * @param connectionConfig 
+	 * (key/value pairing directly from configuration file)<br>
+	 * <li>connectionType : PROTOCOL_CONNECTION_TYPE_SERIAL("SERIAL") or PROTOCOL_CONNECTION_TYPE_ETHER_TCP("ETHERTCP")<br>
+	 * <br>
+	 * for SERIAL mode :
+	 * <li>port : Name of the port ("/dev/ttyUSB0")
+	 * <li>baudRate : baudrate 
+	 * <li>stopBits : number of stopbits 
+	 * <li>parity : parity mode (0=none, 1=odd, 2=even)
+	 * <li>bitsPerWord : number of bits per word 
+	 * <li>serialMode : Serial Mode : SERIAL_232("RS232") or SERIAL_485("RS485").<br>
+	 * if SERIAL_485
+	 * <li>serialGPIOswitch : pin number as a filename in "/sys/class/gpio/"
+	 * <li>serialGPIOrsmode : pin number as a filename in "/sys/class/gpio/" 
+	 * <br><br>
+	 * for ETHERNET mode :
+	 * <li>port : TCP port to be used
+	 * <li>ipAddress : the 4 octet IP address of the field device (xxx.xxx.xxx.xxx)
+	 * @throws ModbusProtocolException(INVALID_CONFIGURATION)
+	 *             unspecified problem with the configuration
+	 */
+	public void configureConnection(Properties connectionConfig)
+			throws ModbusProtocolException;
+
+	/**
+	 * for expedience, can test the status of the connection prior to attempting
+	 * a command. A connection status of <b>CONNECTED</b> does not assure that a
+	 * subsequent command will succeed.
+	 * <p>
+	 * All protocols must implement this method.
+	 * 
+	 * @return current connection status as defined in
+	 *         {@link KuraConnectionStatus KuraConnectionStatus}.
+	 */
+	public int getConnectStatus();
+
+	/**
+	 * attempt to connect to the field device using the provided configuration.
+	 * Attempts to connect before configuring the connection or any issues with
+	 * connecting to the field device will result in an exception being thrown.
+	 * This includes things like a networking failure in the case of a protocol
+	 * configured to access the field device of a network.
+	 * <p>
+	 * Refer to {@link #getConnectStatus() getConnectStatus} to determine if the
+	 * connection is completed.
+	 * <p>
+	 * All protocols must implement this method.
+	 * 
+	 * @throws ModbusProtocolException(INVALID_CONFIGURATION)
+	 *             this operates on the basic assumption that access to a device
+	 *             should exist, if the device is unreachable, it is interpreted
+	 *             as a failure of the configuration.
+	 */
+	public void connect() throws ModbusProtocolException;
+
+	/**
+	 * attempt to disconnect from the field device. This should close any port
+	 * used exclusively for this protocol to talk with its attached device.
+	 * Attempting to close an already closed connection is not invalid.
+	 * <p>
+	 * All protocols must implement this method.
+	 * 
+	 * @see #getConnectStatus()
+	 */
+	public void disconnect();
+
+	/**
+	 * <b>Modbus function 01</b><br>
+	 * Read 1 to 2000 contiguous status of coils from the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            starting address
+	 * @param count
+	 *            quantity of coils
+	 * @return an array of booleans representing the requested data points.
+	 *         <b>true</b> for a given point if the point is set, <b>false</b>
+	 *         otherwise.
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public boolean[] readCoils(int dataAddress, int count)
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 02</b><br>
+	 * Read 1 to 2000 contiguous status of discrete inputs from the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            starting address
+	 * @param count
+	 *            quantity of inputs
+	 * @return an array of booleans representing the requested data points.
+	 *         <b>true</b> for a given point if the point is set, <b>false</b>
+	 *         otherwise.
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public boolean[] readDiscreteInputs(int dataAddress, int count)
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 05</b><br>
+	 * write a single output to either ON or OFF in the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            Output address.
+	 * @param data
+	 *            Output value (boolean) to write. 	 
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public void writeSingleCoil(int dataAddress, boolean data)
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 15 (0x0F)</b><br>
+	 * write multiple coils in a sequence of coils to either ON or OFF in the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            Starting Output address.
+	 * @param data
+	 *            Outputs value (array of boolean) to write. 	 
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public void writeMultipleCoils(int dataAddress, boolean[] data)
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 03</b><br>
+	 * Read contents of 1 to 125 contiguous block of holding registers from the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            starting address
+	 * @param count
+	 *            quantity of registers (maximum 0x7D)
+	 * @return an array of int representing the requested data points (data registers on 2 bytes).
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public int[] readHoldingRegisters(int dataAddress, int count)
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 04</b><br>
+	 * Read contents of 1 to 125 contiguous block of input registers from the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            starting address
+	 * @param count
+	 *            quantity of registers (maximum 0x7D)
+	 * @return an array of int representing the requested data points (data registers on 2 bytes).
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public int[] readInputRegisters(int dataAddress, int count)
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 06</b><br>
+	 * write a single holding register in the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            Output address.
+	 * @param data
+	 *            Output value (2 bytes) to write. 	 
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public void writeSingleRegister(int dataAddress, int data)
+			throws ModbusProtocolException;
+
+	/**
+	 * <b>Modbus function 07</b><br>
+	 * read the content of 8 Exception Status outputs in the field device.
+	 * <p>
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public boolean[] readExceptionStatus()
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 11 (0x0B)</b><br>
+	 * Get a status word and an event count from the device.<br>
+	 * Return values in a ModbusCommEvent.
+	 * @see ModbusCommEvent.
+	 * <p>
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public ModbusCommEvent getCommEventCounter()
+			throws ModbusProtocolException;
+	
+	/**
+	 * <b>Modbus function 12 (0x0C)</b><br>
+	 * Get a status word, an event count, a message count and a list of event bytes
+	 * from the device.<br>
+	 * Return values in a ModbusCommEvent.
+	 * @see ModbusCommEvent.
+	 * <p>
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public ModbusCommEvent getCommEventLog()
+			throws ModbusProtocolException;	
+	/**
+	 * <b>Modbus function 16 (0x10)</b><br>
+	 * write a block of contiguous registers (1 to 123) in the attached field device.
+	 * <p>
+	 * @param dataAddress
+	 *            Output address.
+	 * @param data
+	 *            Registers value (array of int converted in 2 bytes values) to write. 	 
+	 * @throws ModbusProtocolException(NOT_CONNECTED)
+	 *             current connection is in a status other than <b>CONNECTED</b>
+	 * @throws ModbusProtocolException(TRANSACTION_FAILURE)
+	 *             should include a protocol specific message to help clarify
+	 *             the cause of the exception
+	 */
+	public void writeMultipleRegister(int dataAddress, int[] data)
+			throws ModbusProtocolException;
+	
+	/**
+	 * Return OSGI Position of the device
+	 * <p>
+	 * @see Position
+	 */
+	public Position getPosition();
+
+	/**
+	 * Return NMEA Position of the device
+	 * <p>
+	 * @see NmeaPosition
+	 */
+	public NmeaPosition getNmeaPosition();
+
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolErrorCode.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolErrorCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..99cf52754ae89b2ac6a60d0270fbc1700d7db157
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolErrorCode.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.protocol.modbus;
+
+/**
+ * ProtocolErrorCode holds the enumeration of valid error codes for the exception message. For each defined enum value, a corresponding message should be defined in the properties bundle named:
+ * ProtocolExceptionMessagesBundle.properties.
+ * 
+ * 
+ */
+public enum ModbusProtocolErrorCode {
+
+	INVALID_CONFIGURATION,
+	INVALID_DATA_ADDRESS,
+	INVALID_DATA_TYPE,
+	INVALID_DATA_LENGTH,
+	METHOD_NOT_SUPPORTED, 
+	NOT_AVAILABLE,
+	NOT_CONNECTED,
+	CONNECTION_FAILURE,
+	TRANSACTION_FAILURE,
+	RESPONSE_TIMEOUT;
+
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolException.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolException.java
new file mode 100644
index 0000000000000000000000000000000000000000..01e2bf9f183c9ebca9e159a0549451ef17c38d57
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusProtocolException.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.protocol.modbus;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The ProtocolException class is the superclass of all errors and exceptions in the Kura Protocol project. It extends the JDK Exception class by requesting its invokers to provide an error code when
+ * building its instances. The code is one value of ProtocolErrorCode enum; the code is used to document the possible error conditions generated by the platform as well as to identify the localized
+ * exception messages to be reported. Exceptions messages are stored in the ProtocolExceptionMessagesBundle Properties Bundle and they are keyed on the exception code.
+ * 
+ * 
+ */
+public class ModbusProtocolException extends Exception {
+
+	private static final long serialVersionUID = -6155136065068974723L;
+
+	private static final String PROTOCOL_GENERIC_MESSAGES_PATTERN = "Generic Error - {0}: {1} {2} {3} {4} {5}";
+	private static final String PROTOCOL_EXCEPTION_MESSAGES_BUNDLE = "org.eclipse.kura.protocol.messages.ProtocolExceptionMessagesBundle";
+
+	private static final Logger s_logger = LoggerFactory.getLogger(ModbusProtocolException.class);
+
+	protected ModbusProtocolErrorCode m_code;
+	private Object[] m_arguments;
+	private String m_complement;
+
+	@SuppressWarnings("unused")
+	private ModbusProtocolException() {
+		super();
+	}
+
+	@SuppressWarnings("unused")
+	private ModbusProtocolException(String message) {
+		super(message);
+	}
+
+	@SuppressWarnings("unused")
+	private ModbusProtocolException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	@SuppressWarnings("unused")
+	private ModbusProtocolException(Throwable t) {
+		super(t);
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public ModbusProtocolException(ModbusProtocolErrorCode code) {
+		m_code = code;
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode and an optional complement string
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public ModbusProtocolException(ModbusProtocolErrorCode code, String complement) {
+		m_code = code;
+		m_complement = complement;
+	}
+
+	/**
+	 * Builds a new EdcException instance based on the supplied EdcErrorCode, an optional Throwable cause, and optional arguments for the associated exception message.
+	 * 
+	 * @param code
+	 * @param t
+	 * @param arguments
+	 */
+	public ModbusProtocolException(ModbusProtocolErrorCode code, Throwable cause, Object... arguments) {
+		super(cause);
+
+		m_code = code;
+		m_arguments = arguments;
+	}
+
+	public ModbusProtocolErrorCode getCode() {
+		return m_code;
+	}
+
+	public String getMessage() {
+		return getLocalizedMessage(Locale.US);
+	}
+
+	public String getLocalizedMessage() {
+		return getLocalizedMessage(Locale.getDefault());
+	}
+
+	private String getLocalizedMessage(Locale locale) {
+
+		String pattern = getMessagePattern(locale, m_code);
+		String message = MessageFormat.format(pattern, m_arguments)+" "+m_complement;
+		return message;
+	}
+
+	private String getMessagePattern(Locale locale, ModbusProtocolErrorCode code) {
+
+		//
+		// Load the message pattern from the bundle
+		String messagePattern = null;
+		ResourceBundle resourceBundle = null;
+		try {
+			
+			resourceBundle = ResourceBundle.getBundle(PROTOCOL_EXCEPTION_MESSAGES_BUNDLE, locale);
+			messagePattern = resourceBundle.getString(code.name());
+			if (messagePattern == null) {
+				s_logger.warn("Could not find Exception Messages for Locale {} and code {}", locale, code);
+			}
+		} catch (MissingResourceException mre) {
+			// log the failure to load a message bundle
+			s_logger.warn("Could not load Exception Messages Bundle for Locale {}", locale);
+		}
+
+		//
+		// If no bundle or code in the bundle is found, use a generic message
+		if (messagePattern == null) {
+			// build a generic message format
+			messagePattern = MessageFormat.format(PROTOCOL_GENERIC_MESSAGES_PATTERN, code.name());
+		}
+
+		return messagePattern;
+	}
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusTransmissionMode.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusTransmissionMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..04e70feb5daabb7eb49365b6385e64f9e7bff959
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ModbusTransmissionMode.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.protocol.modbus;
+/**
+ * This static class is provided only for completeness.  Currently the
+ * Modbus protocol only supports RTU mode communications.
+ * <p>
+ * The Field values, not the field names should be used in configuration files. 
+ * 
+ *
+ */
+public class ModbusTransmissionMode {
+	/**
+	 * 
+	 */
+	private ModbusTransmissionMode(){};
+	public static final String RTU="RTU";
+	public static final String ASCII="ASCII";
+	public static final int RTU_MODE=0;
+	public static final int ASCII_MODE=1;
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ProtocolPrimitiveDataTypes.java b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ProtocolPrimitiveDataTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..9612fcaab20ccb2b801cb5fdcff44767860ea253
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/java/org/eclipse/kura/protocol/modbus/ProtocolPrimitiveDataTypes.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/*
+* Copyright (c) 2011 Eurotech Inc. All rights reserved.
+*/
+
+package org.eclipse.kura.protocol.modbus;
+/**
+ * This class is used to enumerate the Java primitive data types.
+ * @author matt.demaree
+ *
+ */
+public class ProtocolPrimitiveDataTypes {
+	/**
+	 * 
+	 */
+	private ProtocolPrimitiveDataTypes(){};
+	/**
+	 * defined for completeness, typically never used
+	 */
+	public static final String TYPE_VOID="VOID";
+	/**
+	 * a primitive data type of boolean (1 bit)
+	 */
+	public static final String TYPE_BOOLEAN="BOOL";
+	/**
+	 * a primitive data type of character (8 bits)
+	 */
+	public static final String TYPE_CHAR="CHAR";
+	/**
+	 * a primitive data type of byte (8 bits)
+	 */
+	public static final String TYPE_BYTE="BYTE";
+	/**
+	 * a primitive data type of short int (16 bits)
+	 */
+	public static final String TYPE_SHORT="SHORT";
+	/**
+	 * a primitive data type of int, limited to the range 0 to 65535 inclusive
+	 */
+	public static final String TYPE_UNSIGNED_SHORT="USHORT";
+	/**
+	 * a primitive data type of int (32 bits)
+	 */
+	public static final String TYPE_INT="INT";
+	/**
+	 * a primitive data type of long, limited to the range 0 to 4294967295 inclusive
+	 */
+	public static final String TYPE_UNSIGNED_INT="UINT";
+	/**
+	 * a primitive data type of long (64 bits)
+	 */
+	public static final String TYPE_LONG="LONG";
+	/**
+	 * a primitive data type of 32 bit floating point
+	 */
+	public static final String TYPE_FLOAT="FLOAT";
+	/**
+	 * a primitive data type of 64 bit floating point
+	 */
+	public static final String TYPE_DOUBLE="DOUBLE";
+	/**
+	 * something other than one of the primitive data types
+	 */
+	public static final String TYPE_CLASS="CLASS";
+}
diff --git a/kura/org.eclipse.kura.protocol.modbus/src/main/resources/org.eclipse.kura.protocol.modbus.dpp b/kura/org.eclipse.kura.protocol.modbus/src/main/resources/org.eclipse.kura.protocol.modbus.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..e0b422bb7ccf45d324f292542289c70580166bce
--- /dev/null
+++ b/kura/org.eclipse.kura.protocol.modbus/src/main/resources/org.eclipse.kura.protocol.modbus.dpp
@@ -0,0 +1,20 @@
+#Deployment Plugin Project File
+#Wed Mar 12 13:49:19 CDT 2014
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.protocol.modbus_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.protocol.modbus.dp
+build.location=
+bundles.0.bundle_path=<.>/target/org.eclipse.kura.protocol.modbus-0.2.0-SNAPSHOT.jar
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.protocol.modbus-0.2.0-SNAPSHOT.jar
+bundles.0.symbolic_name=org.eclipse.kura.protocol.modbus;singleton\:\=true
+bundles.0.version=0.2.0.201403121333
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.protocol.modbus
+headers.version=1.0.0
+resources.count=0
+
diff --git a/kura/org.eclipse.kura.qa/about.html b/kura/org.eclipse.kura.qa/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.qa/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.qa/about_files/epl-v10.html b/kura/org.eclipse.kura.qa/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.qa/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.qa/pom.xml b/kura/org.eclipse.kura.qa/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3a3b06c3a5d9ff3f4aad5a0d6f6bedb081682d8f
--- /dev/null
+++ b/kura/org.eclipse.kura.qa/pom.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>kura</artifactId>
+    <groupId>org.eclipse.kura</groupId>
+    <version>0.7.0</version>
+    <relativePath>../pom_pom.xml</relativePath>
+  </parent>
+
+	<artifactId>org.eclipse.kura.qa</artifactId>
+	<version>0.7.0</version>
+	<name>org.eclipse.kura.qa</name>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.eclipse.kura</groupId>
+			<artifactId>distrib</artifactId>
+			<version>0.7.0</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-deploy-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.3</version>
+				<dependencies>
+					<dependency>
+						<groupId>org.apache.ant</groupId>
+						<artifactId>ant-jsch</artifactId>
+						<version>1.7.1</version>
+					</dependency>
+					<dependency>
+						<groupId>com.jcraft</groupId>
+						<artifactId>jsch</artifactId>
+						<version>0.1.41</version>
+					</dependency>
+				</dependencies>
+				<executions>
+					<execution>
+						<phase>deploy</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<scp
+									file="${project.build.directory}/../src/main/resources/start_kura_test.sh"
+									todir="${pdx.everyware.helios.username}@${pdx.everyware.url}:/tmp"
+									port="${pdx.everyware.helios.port}" password="${pdx.everyware.helios.passwd}" />
+
+								<scp
+									file="${project.build.directory}/../../distrib/target/kura-wrl-4.3_2.0.0.zip"
+									todir="${pdx.everyware.helios.username}@${pdx.everyware.url}:/tmp"
+									port="${pdx.everyware.helios.port}" password="${pdx.everyware.helios.passwd}" />
+
+								<sshexec host="${pdx.everyware.url}" port="${pdx.everyware.helios.port}"
+									username="${pdx.everyware.helios.username}" password="${pdx.everyware.helios.passwd}"
+									trust="true" command="sh /tmp/start_kura_test.sh" />
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/kura/org.eclipse.kura.qa/src/main/resources/start_kura_test.sh b/kura/org.eclipse.kura.qa/src/main/resources/start_kura_test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..23bf173d679d5e74c6b583bd23fdcd048f39542c
--- /dev/null
+++ b/kura/org.eclipse.kura.qa/src/main/resources/start_kura_test.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+
+#set the path
+export PATH=$PATH:/opt/jvm/bin
+
+#clean up old runs
+cd /tmp/
+killall java
+rm -fr kura
+rm kura.log
+rm kura_test_report.txt
+rm -fr kura-wrl-4.3_1.0.0-SNAPSHOT
+
+#start the test
+unzip kura-wrl-4.3_1.0.0-SNAPSHOT.zip
+cd kura-wrl-4.3_1.0.0-SNAPSHOT
+nohup bin/start_kura.sh &>/tmp/kura.log &
diff --git a/kura/org.eclipse.kura.test.helloworld/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.test.helloworld/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..c2bb085568a1ed79d60c91ada6b1151acb07b8a1
--- /dev/null
+++ b/kura/org.eclipse.kura.test.helloworld/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Kura Test Hello World
+Bundle-SymbolicName: org.eclipse.kura.test.helloworld;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Import-Package: org.osgi.service.component;version="1.2.0",
+ org.slf4j;version="1.6.4"
diff --git a/kura/org.eclipse.kura.test.helloworld/OSGI-INF/helloworld.xml b/kura/org.eclipse.kura.test.helloworld/OSGI-INF/helloworld.xml
new file mode 100644
index 0000000000000000000000000000000000000000..36caf63429286af89dd59948f06dd3601a63a479
--- /dev/null
+++ b/kura/org.eclipse.kura.test.helloworld/OSGI-INF/helloworld.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2013 Eurotech and/or its affiliates
+
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+       Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
+	name="org.eclipse.kura.test.helloworld.HelloWorld"
+	activate="activate"
+	deactivate="deactivate" 
+	enabled="true"
+    immediate="true">
+   <implementation class="org.eclipse.kura.test.helloworld.HelloWorld"/>
+   <property name="service.pid" type="String" value="org.eclipse.kura.test.helloworld.HelloWorld"/>
+</scr:component>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.test.helloworld/build.properties b/kura/org.eclipse.kura.test.helloworld/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..685198fc06c74e2e5d40fc964ae6e37b7bd298db
--- /dev/null
+++ b/kura/org.eclipse.kura.test.helloworld/build.properties
@@ -0,0 +1,9 @@
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+additional.bundles = slf4j.api,\
+                     org.eclipse.osgi,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.osgi.util
diff --git a/kura/org.eclipse.kura.test.helloworld/pom.xml b/kura/org.eclipse.kura.test.helloworld/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..15959c1a865a5a9b3d60ccefc28d66fadc9d482d
--- /dev/null
+++ b/kura/org.eclipse.kura.test.helloworld/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.test.helloworld</artifactId>
+	<version>0.7.0</version>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.18.1,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										validate-id
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
diff --git a/kura/org.eclipse.kura.test.helloworld/src/main/java/org/eclipse/kura/test/helloworld/HelloWorld.java b/kura/org.eclipse.kura.test.helloworld/src/main/java/org/eclipse/kura/test/helloworld/HelloWorld.java
new file mode 100644
index 0000000000000000000000000000000000000000..ccc0ab7aad82dddd0e3413500ff9235d4e1e603c
--- /dev/null
+++ b/kura/org.eclipse.kura.test.helloworld/src/main/java/org/eclipse/kura/test/helloworld/HelloWorld.java
@@ -0,0 +1,26 @@
+package org.eclipse.kura.test.helloworld;
+
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HelloWorld {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(HelloWorld.class);
+	
+	private static final String APP_ID = HelloWorld.class.getName();
+	
+	// ----------------------------------------------------------------
+    //
+    // Activation APIs
+    //
+    // ----------------------------------------------------------------
+
+	protected void activate(ComponentContext componentContext) {
+		 s_logger.info("Bundle " + APP_ID + " has started");
+	}
+	
+	protected void deactivate(ComponentContext componentContext) {
+		s_logger.info("Deactivating " + APP_ID + " ...");
+	}
+}
diff --git a/kura/org.eclipse.kura.test.helloworld/src/main/resources/org.eclipse.kura.test.helloworld.dpp b/kura/org.eclipse.kura.test.helloworld/src/main/resources/org.eclipse.kura.test.helloworld.dpp
new file mode 100644
index 0000000000000000000000000000000000000000..26ef07b1a197619e76e339dc557f472439690946
--- /dev/null
+++ b/kura/org.eclipse.kura.test.helloworld/src/main/resources/org.eclipse.kura.test.helloworld.dpp
@@ -0,0 +1,20 @@
+#Deployment Plugin Project File
+#Wed Jul 16 14:21:53 CDT 2014
+build.ant.name=<.>/src/main/resources/org.eclipse.kura.test.helloworld_build.xml
+build.dp.file=<.>/target/org.eclipse.kura.test.helloworld.dp
+build.location=
+bundles.0.bundle_path=/home/ibinshtok/eurotechdev/kuradev/workspace/plugins/org.eclipse.kura.test.helloworld_1.0.0.201407161421.jar
+bundles.0.customizer=false
+bundles.0.headers.count=0
+bundles.0.missing=false
+bundles.0.name=bundles/org.eclipse.kura.test.helloworld_1.0.0.201407161421.jar
+bundles.0.symbolic_name=org.eclipse.kura.test.helloworld;singleton\:\=true
+bundles.0.version=1.0.0.201407161421
+bundles.count=1
+certificates.count=0
+general.signbundles=false
+headers.other.headers=
+headers.symbolic.name=org.eclipse.kura.test.helloworld
+headers.version=1.0.0
+resources.count=0
+
diff --git a/kura/org.eclipse.kura.test/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..f8e14437cb5763843cdae2e84cd7b53233ad8265
--- /dev/null
+++ b/kura/org.eclipse.kura.test/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.test
+Bundle-SymbolicName: org.eclipse.kura.test;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Import-Package: junit.framework,
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,1.0)",
+ org.eclipse.kura.message; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.osgi.framework.console;version="1.1.0",
+ org.junit,
+ org.osgi.framework;version="1.5.0",
+ org.osgi.service.cm;version="1.4.0",
+ org.osgi.service.component;version="1.2.0",
+ org.osgi.util.tracker;version="1.5.1",
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.test.annotation; version="0.2.0"
diff --git a/kura/org.eclipse.kura.test/OSGI-INF/test.xml b/kura/org.eclipse.kura.test/OSGI-INF/test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1d5fc175d585f6f3f4e3afc784dd6ce2c708ad74
--- /dev/null
+++ b/kura/org.eclipse.kura.test/OSGI-INF/test.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+               name="org.eclipse.kura.test.RemoteTargetTest"
+               modified="updated">
+   <implementation class="org.eclipse.kura.test.RemoteTargetTest"/>
+   <reference bind="setSystemService" cardinality="1..1" interface="org.eclipse.kura.system.SystemService" name="SystemService" policy="static" unbind="unsetSystemService"/>
+   <reference bind="setCloudService" cardinality="1..1" interface="org.eclipse.kura.cloud.CloudService" name="CloudService" policy="static" unbind="unsetCloudService"/>
+   <reference bind="setConfigAdmin" cardinality="1..1" interface="org.osgi.service.cm.ConfigurationAdmin" name="ConfigurationAdmin" policy="static" unbind="unsetConfigAdmin"/>
+</scr:component>
diff --git a/kura/org.eclipse.kura.test/about.html b/kura/org.eclipse.kura.test/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.test/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.test/about_files/epl-v10.html b/kura/org.eclipse.kura.test/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.test/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.test/build.properties b/kura/org.eclipse.kura.test/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0fccb52bf36f1fb3f68f331a9104965aa305ecde
--- /dev/null
+++ b/kura/org.eclipse.kura.test/build.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/
+additional.bundles = org.eclipse.osgi,\
+                     org.eclipse.equinox.ds,\
+                     org.eclipse.osgi.services,\
+                     org.eclipse.kura.api,\
+                     org.eclipse.equinox.cm,\
+                     slf4j.api
+src.includes = about.html,\
+               about_files/
+
diff --git a/kura/org.eclipse.kura.test/pom.xml b/kura/org.eclipse.kura.test/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f813588e97b7806f483eac4647fcfa2ee18e2de1
--- /dev/null
+++ b/kura/org.eclipse.kura.test/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../manifest_pom.xml</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.kura.test</artifactId>
+	<packaging>eclipse-plugin</packaging>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+        <build>
+                <plugins>
+                        <plugin>
+                                <groupId>org.eclipse.tycho</groupId>
+                                <artifactId>tycho-packaging-plugin</artifactId>
+                                <version>${tycho-version}</version>
+                                <configuration>
+                                        <format>'${kura.build.version}'</format>
+                                </configuration>
+                                <executions>
+                                        <execution>
+                                                <phase>package</phase>
+                                                <id>package-plugin</id>
+                                                <goals>
+                                                        <goal>package-plugin</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+                </plugins>
+                <pluginManagement>
+                	<plugins>
+                		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                		<plugin>
+                			<groupId>org.eclipse.m2e</groupId>
+                			<artifactId>lifecycle-mapping</artifactId>
+                			<version>1.0.0</version>
+                			<configuration>
+                				<lifecycleMappingMetadata>
+                					<pluginExecutions>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-compiler-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>compile</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                						<pluginExecution>
+                							<pluginExecutionFilter>
+                								<groupId>
+                									org.eclipse.tycho
+                								</groupId>
+                								<artifactId>
+                									tycho-packaging-plugin
+                								</artifactId>
+                								<versionRange>
+                									[0.20.0,)
+                								</versionRange>
+                								<goals>
+                									<goal>
+                										validate-id
+                									</goal>
+                									<goal>
+                										validate-version
+                									</goal>
+                									<goal>
+                										build-qualifier
+                									</goal>
+                								</goals>
+                							</pluginExecutionFilter>
+                							<action>
+                								<ignore></ignore>
+                							</action>
+                						</pluginExecution>
+                					</pluginExecutions>
+                				</lifecycleMappingMetadata>
+                			</configuration>
+                		</plugin>
+                	</plugins>
+                </pluginManagement>
+        </build>
+</project>
+
diff --git a/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/RemoteTargetTest.java b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/RemoteTargetTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c61724c43971a6471d175a56624a16006d8742e9
--- /dev/null
+++ b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/RemoteTargetTest.java
@@ -0,0 +1,242 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.test;
+
+import java.util.Dictionary;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.cloud.CloudClient;
+import org.eclipse.kura.cloud.CloudService;
+import org.eclipse.kura.message.KuraPayload;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+import org.eclipse.osgi.framework.console.CommandProvider;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.util.tracker.BundleTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RemoteTargetTest {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(RemoteTargetTest.class);
+
+	private static final String TEST_HEADER = "Unit-Test";
+
+	private SystemService m_systemService;
+	private CloudService m_cloudService;
+	private CloudClient  m_cloudClient;
+	
+	private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
+
+	private ConfigurationAdmin m_configAdmin;
+	private BundleTracker bundleTracker;
+	private TestExtender testExtender;
+
+	public void setSystemService(SystemService systemService) {
+		m_systemService = systemService;
+	}
+	
+	public void unsetSystemService(SystemService systemService) {
+		m_systemService = null;
+	}
+	
+	public void setCloudService(CloudService cloudService) {
+		m_cloudService = cloudService;
+		try {
+			m_cloudClient  = cloudService.newCloudClient("RemoteTargetTest");
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public void unsetCloudService(CloudService cloudService) {
+		m_cloudService = null;
+	}
+	
+	public void setConfigAdmin(ConfigurationAdmin configAdmin) {
+		m_configAdmin = configAdmin;
+	}
+	
+	public void unsetConfigAdmin(ConfigurationAdmin configAdmin) {
+		m_configAdmin = configAdmin;
+	}
+
+	protected void activate(final ComponentContext componentContext) 
+	{
+		// 
+		// if we are running in the Eclipse JUnit Plugin Test, 
+		// then we are running in emulator mode and therefore we 
+		// will leverage the JUnit runner available in Eclipse PDE.
+		if (!"emulator".equals(System.getProperty("org.eclipse.kura.mode"))) {
+			scheduler.submit(new Runnable() {
+				public void run() {
+					runTests(componentContext);
+				}
+			});
+		}
+	}
+	
+	private void runTests(ComponentContext componentContext) {
+		s_logger.debug("m_systemService.getPlatform(): " + m_systemService.getPlatform());
+		testExtender = new TestExtender(m_systemService.getPlatform(), componentContext.getBundleContext());
+
+		bundleTracker = new BundleTracker(componentContext.getBundleContext(), Bundle.RESOLVED|Bundle.ACTIVE|Bundle.INSTALLED, testExtender);
+		bundleTracker.open();
+
+		Bundle[] currentBundles = bundleTracker.getBundles();
+		if(currentBundles != null) {
+			Bundle netAdminBundle = null;
+			
+			for(Bundle bundle : bundleTracker.getBundles()) {
+				if("org.eclipse.kura.net.admin".equals(bundle.getSymbolicName())) {
+					netAdminBundle = bundle;
+					
+					s_logger.debug("Disabling network admin bundle");
+					try {
+						netAdminBundle.stop();
+					} catch (BundleException e) {
+						s_logger.warn("Could not stop net admin bundle", e);
+					}
+				}
+			}
+			
+			s_logger.debug("Starting tests");
+			startingTests();
+			
+			for(Bundle bundle : currentBundles) {
+				if(isTestFragment(bundle)) {
+					testExtender.addBundle(bundle.getBundleId(), bundle);
+					
+					if(isAutoTestEnabled(bundle)) {
+						testExtender.test(bundle.getBundleId());
+					}
+				}
+			}
+			
+			finishedTests();
+			
+			if(netAdminBundle != null) {
+				s_logger.debug("Re-enabling network admin bundle");
+				try {
+					netAdminBundle.start();
+				} catch (BundleException e) {
+					s_logger.warn("Could not start net admin bundle", e);
+				}
+			}
+			
+			s_logger.warn("Tests finished - shutting down");
+			System.exit(0);
+		}
+			
+		componentContext.getBundleContext().registerService(CommandProvider.class.getName(), new KuraTestCommandProvider(), null);
+	}
+
+	protected void deactivate(ComponentContext componentContext) {
+
+	}
+
+	public static final boolean isTestFragment(Bundle bundle) {
+		String header = bundle.getHeaders().get(TEST_HEADER) + "";
+		String fragment = bundle.getHeaders().get(org.osgi.framework.Constants.FRAGMENT_HOST) + "";
+		return (!"null".equals(header) && !"null".equals(fragment));
+	}
+
+	public static final boolean isAutoTestEnabled(Bundle bundle) {
+		return "true".equals(bundle.getHeaders().get(TEST_HEADER) + "");
+	}
+
+	public class KuraTestCommandProvider implements CommandProvider {
+		public Object _test(CommandInterpreter intp) {
+			String nextArgument = intp.nextArgument();
+			testExtender.test(Long.parseLong(nextArgument));
+			return null;
+		}
+
+		public Object _testall(CommandInterpreter intp) {       
+			testExtender.testAll();
+			return null;
+		}
+
+		public Object _helpTest(CommandInterpreter intp) {
+			String help = getHelp();
+			System.out.println(help);
+			return null;
+		}	   
+
+		@Override
+		public String getHelp() {
+			StringBuilder buffer = new StringBuilder();
+			buffer.append("---Testing commands---\n\t");
+			buffer.append("test [bundle id] - test bundle fragment id\n\t");
+			buffer.append("testall - test all fragments\n\t");
+			buffer.append("help - Print this help\n");
+			return buffer.toString();
+		}
+	}
+	
+	private void startingTests() {
+		//hijack the settings
+		try {
+			Configuration mqttConfig = m_configAdmin.getConfiguration("org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport");
+			Dictionary<String, Object> mqttProps = mqttConfig.getProperties();
+			mqttProps.put("broker-url", "mqtt://broker-sandbox.everyware-cloud.com:1883/");
+			mqttProps.put("topic.context.account-name", "EDC-KURA-CI");
+			mqttProps.put("username", "EDC-KURA-CI");
+			mqttProps.put("password", "PYtv3?s@");
+			mqttConfig.update(mqttProps);
+			
+			Configuration dataConfig = m_configAdmin.getConfiguration("org.eclipse.kura.data.DataService");
+			Dictionary<String, Object> dataProps = dataConfig.getProperties();
+			dataProps.put("connect.auto-on-startup", true);
+			dataConfig.update(dataProps);
+		} catch(Exception e) {
+			e.printStackTrace();
+			s_logger.error("Failed to reconfigure the broker settings - failing out");
+			System.exit(-1);
+		}
+		
+		//wait for connection?
+		while(!m_cloudService.isConnected()) {
+			s_logger.warn("waiting for the cloud client to connect");
+			try {Thread.sleep(1000);} catch(Exception e) {e.printStackTrace();}
+		}
+
+		KuraPayload payload = new KuraPayload(); 
+		try {
+			m_cloudClient.publish("test/start", payload, 1, false);
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void finishedTests() {
+		//wait for connection??
+		while(!m_cloudService.isConnected()) {
+			s_logger.warn("waiting for the cloud client to connect");
+			try {Thread.sleep(1000);} catch(Exception e) {e.printStackTrace();}
+		}
+		
+		KuraPayload payload = new KuraPayload(); 
+		try {
+			m_cloudClient.publish("test/finished", payload, 1, false);
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/Test.java b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/Test.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8725fa9870dfaac69b780f4b975dca2fedf09dc
--- /dev/null
+++ b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/Test.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.test;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Test {
+	private Method m_beforeClass;
+	private Method m_afterClass;
+	private Method m_before;
+	private Method m_after;
+	private List<Method> tests;
+	
+	public Test() {
+		tests = new ArrayList<Method>();
+	}
+	
+	public Method getBeforeClass() {
+		return m_beforeClass;
+	}
+	
+	public void setBeforeClass(Method beforeClass) {
+		m_beforeClass = beforeClass;
+	}
+	
+	public Method getAfterClass() {
+		return m_afterClass;
+	}
+	
+	public void setAfterClass(Method afterClass) {
+		m_afterClass = afterClass;
+	}
+	
+	public Method getBefore() {
+		return m_before;
+	}
+	
+	public void setBefore(Method before) {
+		m_before = before;
+	}
+	
+	public Method getAfter() {
+		return m_after;
+	}
+	
+	public void setAfter(Method after) {
+		m_after = after;
+	}
+	
+	public List<Method> getTests() {
+		return tests;
+	}
+	
+	public void addTest(Method method) {
+		tests.add(method);
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/TestExtender.java b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/TestExtender.java
new file mode 100644
index 0000000000000000000000000000000000000000..27cd743a92d5bec94166e017e1be6187b91318ab
--- /dev/null
+++ b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/TestExtender.java
@@ -0,0 +1,242 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.test;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.kura.test.annotation.TestTarget;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.util.tracker.BundleTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class TestExtender implements BundleTrackerCustomizer<Object> {
+	
+	private static final Logger s_logger = LoggerFactory.getLogger(TestExtender.class);
+
+	private static final String KURA_TEST_REPORT_FILENAME = "/tmp/kura_test_report.txt";
+	
+	private Map<Long, Bundle> m_bundles;
+	private BundleContext 	  m_bundleContext;
+	private BufferedWriter    m_reportWriter;
+	private String 			  m_platform;
+	
+	public TestExtender(String platform, BundleContext bundleContext) {
+		m_bundles = new HashMap<Long, Bundle>();
+		m_bundleContext = bundleContext;
+		m_platform = platform;
+		
+		(new File(KURA_TEST_REPORT_FILENAME)).delete();
+	}
+	
+	void addBundle(long bundleId, Bundle bundle) {
+		m_bundles.put(bundleId, bundle);
+	}
+	
+	public void testAll() {
+		Set<Map.Entry<Long, Bundle>> entrySet = m_bundles.entrySet();
+		s_logger.debug("Testing all bundles");
+		for (Entry<Long, Bundle> entry : entrySet) {            
+			test(entry.getKey());
+		}
+	}
+	
+	public void test(long bundleId) {
+		s_logger.debug("Testing bundle: " + bundleId);
+		
+		List<Class> testClazzs = getTestClass(m_bundles.get(bundleId));
+		for (Class clazz : testClazzs) {
+	          try {
+	        	  if(!clazz.isInterface()) {
+	        		  s_logger.debug("Testing CLASS in bundle with ID: " + bundleId + "  : ["+clazz.getName()+"]");
+	        		  Test inspectClass = inspectClass(clazz);
+	        		  testClass(clazz.getName(), inspectClass, clazz.newInstance());
+	        	  }
+	          } catch (Exception ex) {
+	        	  ex.printStackTrace();
+	          }
+	      }
+	}
+	
+	public Class loadClass(String clazz, Bundle bundleHost) {
+		try {
+			Class loadClass = bundleHost.loadClass(clazz);
+			s_logger.debug("Loaded class: " + loadClass);
+			return loadClass;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	public Bundle getHostBundle(Bundle bundle) {
+		String fragment = bundle.getHeaders().get(org.osgi.framework.Constants.FRAGMENT_HOST) + "";
+		Bundle[] bundles = m_bundleContext.getBundles();
+		for (Bundle ibundle : bundles) {
+			if (ibundle.getSymbolicName().equals(fragment)) {
+				s_logger.debug("Host bundle is: " + ibundle.getSymbolicName());
+				return ibundle;
+			}
+		}
+		throw new RuntimeException();
+	}
+
+	public List<Class> getTestClass(Bundle bundle) {
+		try {
+			List<Class> clazzs = new ArrayList<Class>();
+			Enumeration entrs = bundle.findEntries("/", "*Test.class", true);
+			if (entrs == null || !entrs.hasMoreElements()) {
+				return Collections.EMPTY_LIST;
+			}
+			Bundle hostBundle = getHostBundle(bundle);
+			while (entrs.hasMoreElements()) {
+				URL e = (URL) entrs.nextElement();
+				String file = e.getFile();
+	
+				String className = file.replaceAll("/", ".").replaceAll(".class", "").replaceFirst(".", "");   
+				if(className.startsWith("bin.src.main.java.")) {
+					className = className.substring(18);
+				} else if(className.startsWith("targetes.")) {
+					className = className.substring(9);
+				}
+				s_logger.debug("Trying to load class: " + className);
+				Class clazz = loadClass(className, hostBundle);
+				s_logger.debug("Adding test class: " + clazz);
+				clazzs.add(clazz);
+			}
+			return clazzs;
+		} catch(Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	public Test inspectClass(Class clazz) {
+		Test test = new Test();
+		Method[] declaredMethods = clazz.getDeclaredMethods();
+		for (Method method : declaredMethods) {
+
+			if (method.isAnnotationPresent(org.junit.BeforeClass.class)) {
+				s_logger.debug("Adding before class: " + method);
+				test.setBeforeClass(method);
+			}
+			if (method.isAnnotationPresent(org.junit.AfterClass.class)) {
+				s_logger.debug("Adding after class: " + method);
+				test.setAfterClass(method);
+			}
+			if (method.isAnnotationPresent(org.junit.Before.class)) {
+				s_logger.debug("Adding before: " + method);
+				test.setBefore(method);
+			}
+			if (method.isAnnotationPresent(org.junit.After.class)) {
+				s_logger.debug("Adding after: " + method);
+				test.setAfter(method);
+			}
+			if (method.isAnnotationPresent(org.junit.Test.class)) {
+
+				if(method.isAnnotationPresent(TestTarget.class)) {
+					TestTarget testTargetAnnotation = method.getAnnotation(TestTarget.class);
+					String[] potentialPlatforms = testTargetAnnotation.targetPlatforms();
+					for(String potentialPlatform : potentialPlatforms) {
+						if(potentialPlatform.equals(TestTarget.PLATFORM_ALL) || potentialPlatform.equals(m_platform)) {
+							s_logger.debug("TestTarget found " + potentialPlatform + " - Adding test: " + method);
+							test.addTest(method);
+							break;
+						}
+					}
+				} else {
+					s_logger.debug("No TestTarget Annotation present - Adding test: " + method);
+					test.addTest(method);
+				}
+			}
+		}
+		return test;
+	}
+
+	public void testClass(String className, Test testClass, Object object) {
+		try {
+			try {
+				if (testClass.getBeforeClass() != null) {
+					testClass.getBeforeClass().invoke(object, new Object[0]);
+				}
+				
+				m_reportWriter = new BufferedWriter(new FileWriter(new File(KURA_TEST_REPORT_FILENAME), true));
+
+				List<Method> tests = testClass.getTests();
+				for (Method method : tests) {
+					try {
+						if (testClass.getBefore() != null) {
+							testClass.getBefore().invoke(object, new Object[0]);
+						}
+						
+						try {
+							method.invoke(object, new Object[0]);
+							s_logger.info("Method : [ " + className + "." + method.getName() + " ] PASS");
+							
+							m_reportWriter.write("Method : [ " + className + "." + method.getName()+" ] PASS\n");
+							m_reportWriter.flush();
+						} catch (Exception ex) {
+							s_logger.error("Method : [ " + className + "." + method.getName() + " ] FAIL", ex);
+							m_reportWriter = new BufferedWriter(new FileWriter(new File(KURA_TEST_REPORT_FILENAME), true));
+							m_reportWriter.write("Method : [ " + className + "." + method.getName() + " ] FAIL\n");
+							m_reportWriter.flush();
+						}
+					} finally {
+						if (testClass.getAfter() != null) {
+							testClass.getAfter().invoke(object, new Object[0]);
+						}
+					}
+				}
+			} finally {
+				if (testClass.getAfterClass() != null) {
+					testClass.getAfterClass().invoke(object, new Object[0]);
+				}
+				
+				m_reportWriter.close();
+			}
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+	
+	@Override
+	public Object addingBundle(Bundle bundle, BundleEvent event) {
+		s_logger.debug("Tracker - Adding Bundle: " + bundle.getSymbolicName());
+		return bundle;
+	}
+
+	@Override
+	public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
+		s_logger.debug("Tracker - Modified Bundle: " + bundle.getSymbolicName());
+	}
+
+	@Override
+	public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
+		s_logger.debug("Tracker - Removed Bundle: " + bundle.getSymbolicName());
+	}
+}
diff --git a/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/annotation/TestTarget.java b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/annotation/TestTarget.java
new file mode 100644
index 0000000000000000000000000000000000000000..09931ae9300604b336401ba9a344d81aa17d75d1
--- /dev/null
+++ b/kura/org.eclipse.kura.test/src/org/eclipse/kura/test/annotation/TestTarget.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.test.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TestTarget {
+	
+	public static final String PLATFORM_ALL = "PLATFORM_ALL";
+	
+	public static final String PLATFORM_DURACOR = "duracor";
+	public static final String PLATFORM_DYNACOR = "dynacor";
+	public static final String PLATFORM_HELIOS = "helios";
+	public static final String PLATFORM_MGW = "Mini-Gateway";
+	public static final String PLATFORM_RASPBERRY_PI = "Raspberr-Pi";
+	public static final String PLATFORM_RELIAGATE = "reliagate";
+
+	public String[] targetPlatforms();
+}
diff --git a/kura/org.eclipse.kura.web/.gitignore b/kura/org.eclipse.kura.web/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..d39b4dde1efb1908e2582dd00ee87e7fae70658a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/.gitignore
@@ -0,0 +1,17 @@
+bin
+target
+src/main/webapp/WEB-INF/lib
+src/main/webapp/denali/denali.nocache.js
+src/main/webapp/denali/gwt-log-triangle-10x10.png
+src/main/webapp/denali/gwt/standard/*
+src/main/webapp/denali/.junit*
+src/main/webapp/denali/*.gwt.rpc
+src/main/webapp/WEB-INF/deploy/denali/rpcPolicyManifest/manifest.txt
+denali/*
+src/main/webapp/com.eurotech.framework.web.denaliJUnit/*
+src/main/webapp/WEB-INF/deploy/*
+src/main/gwt-unitCache
+src/main/webapp/gxt/css
+src/main/webapp/gxt/images
+src/main/webapp/gxt/themes
+
diff --git a/kura/org.eclipse.kura.web/Denali OSGi OSX.launch b/kura/org.eclipse.kura.web/Denali OSGi OSX.launch
new file mode 100644
index 0000000000000000000000000000000000000000..6ad664683b80a5abeb4ece25e04a38ece9d59591
--- /dev/null
+++ b/kura/org.eclipse.kura.web/Denali OSGi OSX.launch	
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<setAttribute key="additional_plugins"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="true"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Denali OSGi OSX"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="featureDefaultLocation" value="workspace"/>
+<stringAttribute key="featurePluginResolution" value="workspace"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console -noserver"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8080 -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dosgi.noShutdown=true -Declipse.ignoreApp=true  -Dkura.framework.mode=emulator -Dkura.configuration=file:${git_work_tree}/kura/org.eclipse.kura.framework.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties -Dlog4j.configuration=file:${git_work_tree}/kura/org.eclipse.kura.framework.emulator/src/main/resources/log4j.properties -DDEBUG -DDEBUG_PATTERNS=org.appfuse -DDEBUG_VERBOSE=-1"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<setAttribute key="selected_features"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="javax.bluetooth@default:default,javax.comm@default:default,javax.servlet@default:default,javax.usb.api@default:default,javax.usb.common@default:default,log4j@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.net@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.felix.webconsole@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.paho.mqtt-client@default:default,org.hsqldb.hsqldb@default:default,org.json@default:default,org.knowhowlab.osgi.monitoradmin@default:default,org.tigris.mtoolkit.iagent.rpc@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="timestamp" value="1370436443112"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.kura.framework.api@default:default,org.eclipse.kura.framework.core@default:default,org.eclipse.kura.framework.deployment.agent@default:default,org.eclipse.kura.framework.deployment.customizer@default:default,org.eclipse.kura.framework.emulator@default:default,org.eclipse.kura.framework.protocol.pcn@default:default,org.eclipse.kura.framework.web@default:default"/>
+</launchConfiguration>
diff --git a/kura/org.eclipse.kura.web/Denali OSGi.launch b/kura/org.eclipse.kura.web/Denali OSGi.launch
new file mode 100644
index 0000000000000000000000000000000000000000..fe3df0280bcdf9418a95564869c66b813d097573
--- /dev/null
+++ b/kura/org.eclipse.kura.web/Denali OSGi.launch	
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<setAttribute key="additional_plugins"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="true"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Denali OSGi"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="featureDefaultLocation" value="workspace"/>
+<stringAttribute key="featurePluginResolution" value="workspace"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console -noserver"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.osgi.service.http.port=8080 -Dorg.osgi.framework.storage=/tmp/osgi/framework_storage -Dosgi.clean=true -Dosgi.noShutdown=true -Declipse.ignoreApp=true  -Dkura.framework.mode=emulator -Dkura.configuration=file:${git_work_tree}/kura/org.eclipse.kura.framework.emulator/src/main/resources/kura.properties -Ddpa.configuration=/tmp/kura/dpa.properties -Dlog4j.configuration=file:${git_work_tree}/kura/org.eclipse.kura.framework.emulator/src/main/resources/log4j.properties -DDEBUG -DDEBUG_PATTERNS=org.appfuse -DDEBUG_VERBOSE=-1"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<setAttribute key="selected_features"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="com.springsource.org.junit@default:default,javax.bluetooth@default:default,javax.comm@default:default,javax.servlet@default:default,javax.usb.api@default:default,javax.usb.common@default:default,log4j.apache-log4j-extras@default:false,log4j@default:default,mqtt-client@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.net@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.deploymentadmin@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.felix.webconsole@default:default,org.apache.servicemix.bundles.protobuf-java@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@default:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@default:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.io@default:default,org.eclipse.equinox.metatype@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hsqldb.hsqldb@default:default,org.json@default:default,org.knowhowlab.osgi.monitoradmin@default:default,org.tigris.mtoolkit.iagent.rpc@default:default,osgi.cmpn@default:default,slf4j.api@default:default,slf4j.log4j12@default:false"/>
+<stringAttribute key="timestamp" value="1378111143555"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.kura.framework.api@default:default,org.eclipse.kura.framework.core@default:default,org.eclipse.kura.framework.deployment.agent@default:default,org.eclipse.kura.framework.emulator@default:default,org.eclipse.kura.framework.web@default:default"/>
+</launchConfiguration>
diff --git a/kura/org.eclipse.kura.web/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.web/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..bf0f07dab60b266fdf42882363f58dbfdff36e5c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/META-INF/MANIFEST.MF
@@ -0,0 +1,85 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.kura.web
+Bundle-SymbolicName: org.eclipse.kura.web;singleton:=true
+Bundle-Version: 0.7.0
+Bundle-Vendor: EUROTECH
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Service-Component: OSGI-INF/*.xml
+Import-Package: 
+ com.allen_sauer.gwt.log.client,
+ com.allen_sauer.gwt.log.client.impl,
+ com.allen_sauer.gwt.log.client.util,
+ com.allen_sauer.gwt.log.client.util.impl,
+ com.allen_sauer.gwt.log.rebind,
+ com.allen_sauer.gwt.log.server,
+ com.allen_sauer.gwt.log.shared,
+ com.google.gwt.core.client,
+ com.google.gwt.dom.client,
+ com.google.gwt.event.dom.client,
+ com.google.gwt.i18n.client,
+ com.google.gwt.resources.client,
+ com.google.gwt.rpc.client,
+ com.google.gwt.rpc.client.ast,
+ com.google.gwt.rpc.client.impl,
+ com.google.gwt.rpc.linker,
+ com.google.gwt.rpc.rebind,
+ com.google.gwt.rpc.server,
+ com.google.gwt.uibinder.client,
+ com.google.gwt.user.client,
+ com.google.gwt.user.client.rpc,
+ com.google.gwt.user.client.rpc.core.java.lang,
+ com.google.gwt.user.client.rpc.core.java.math,
+ com.google.gwt.user.client.rpc.core.java.sql,
+ com.google.gwt.user.client.rpc.core.java.util,
+ com.google.gwt.user.client.rpc.core.java.util.logging,
+ com.google.gwt.user.client.rpc.impl,
+ com.google.gwt.user.client.ui,
+ com.google.gwt.user.linker.rpc,
+ com.google.gwt.user.rebind.rpc,
+ com.google.gwt.user.server.rpc,
+ com.google.gwt.user.server.rpc.impl,
+ javax.security.auth,
+ javax.servlet;version="2.6.0",
+ javax.servlet.http;version="2.6.0",
+ javax.xml.bind,
+ org.apache.commons.fileupload;version="1.2.2",
+ org.apache.commons.fileupload.disk;version="1.2.2",
+ org.apache.commons.fileupload.servlet;version="1.2.2",
+ org.apache.commons.io;version="1.4.0",
+ org.eclipse.kura; version="[0.2,1.0)",
+ org.eclipse.kura.cloud; version="[0.2,1.0)",
+ org.eclipse.kura.comm; version="[0.2,1.0)",
+ org.eclipse.kura.command; version="[0.2,1.0)",
+ org.eclipse.kura.configuration; version="[0.2,1.0)",
+ org.eclipse.kura.configuration.metatype; version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration; version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration.metatype; version="[0.2,1.0)",
+ org.eclipse.kura.core.configuration.util; version="[0.2,1.0)",
+ org.eclipse.kura.core.net.util; version="[0.2,1.0)",
+ org.eclipse.kura.core.util; version="[0.2,1.0)",
+ org.eclipse.kura.crypto; version="[0.2,1.0)",
+ org.eclipse.kura.data; version="[0.2,1.0)",
+ org.eclipse.kura.db; version="[0.2,1.0)",
+ org.eclipse.kura.deployment.agent; version="[0.2,1.0)",
+ org.eclipse.kura.net; version="[0.2,1.0)",
+ org.eclipse.kura.net.dhcp; version="[0.2,1.0)",
+ org.eclipse.kura.net.firewall; version="[0.2,1.0)",
+ org.eclipse.kura.net.modem; version="[0.2,1.0)",
+ org.eclipse.kura.net.wifi; version="[0.2,1.0)",
+ org.eclipse.kura.position; version="[0.2,1.0)",
+ org.eclipse.kura.system; version="[0.2,1.0)",
+ org.eclipse.kura.usb; version="[0.2,1.0)",
+ org.eclipse.kura.watchdog; version="[0.2,1.0)",
+ org.osgi.framework,
+ org.osgi.service.deploymentadmin,
+ org.osgi.service.http,
+ org.osgi.util.measurement,
+ org.osgi.util.position;version="1.0.1",
+ org.slf4j;version="1.6.4"
+Export-Package: org.eclipse.kura.web,
+ org.eclipse.kura.web.server,
+ org.eclipse.kura.web.shared.service
+Bundle-ClassPath: ., 
+  lib/gxt-2.2.5.jar,
+  target/org.eclipse.kura.web-0.2.0-SNAPSHOT/WEB-INF/lib/gxt-2.2.5.jar
diff --git a/kura/org.eclipse.kura.web/OSGI-INF/web.xml b/kura/org.eclipse.kura.web/OSGI-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..49eb717e218593130ecc00e79d3d537df7975b92
--- /dev/null
+++ b/kura/org.eclipse.kura.web/OSGI-INF/web.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" 
+               name="org.eclipse.kura.web.Console">
+   <implementation class="org.eclipse.kura.web.Console"/>
+   <property name="servlet.alias.root" value="/denali"/>
+   <reference name="HttpService" 
+              bind="setHttpService"
+              unbind="unsetHttpService"
+              interface="org.osgi.service.http.HttpService"/>   
+   <reference name="SystemService" 
+              bind="setSystemService"
+              unbind="unsetSystemService"
+              interface="org.eclipse.kura.system.SystemService"/>   
+   <reference name="ConfigurationService" 
+              bind="setConfigurationService"
+              unbind="unsetConfigurationService"
+              interface="org.eclipse.kura.configuration.ConfigurationService"/>   
+   <reference name="DbService" 
+              bind="setDbService"
+              unbind="unsetDbService"
+              interface="org.eclipse.kura.db.DbService"/>
+   <reference name="CryptoService"
+   			  bind="setCryptoService"
+   			  unbind="unsetCryptoService"
+   			  interface="org.eclipse.kura.crypto.CryptoService"/>
+   <property name="app.root" type="String" value="/kura"/>   
+</scr:component>
diff --git a/kura/org.eclipse.kura.web/about.html b/kura/org.eclipse.kura.web/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.web/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/about_files/epl-v10.html b/kura/org.eclipse.kura.web/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/kura/org.eclipse.kura.web/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/build.properties b/kura/org.eclipse.kura.web/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f55755f066267f702eac452609151e5e381c4fc4
--- /dev/null
+++ b/kura/org.eclipse.kura.web/build.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+bin.includes = META-INF/,\
+               .,\
+               src/main/resources/,\
+               src/main/webapp/,\
+               OSGI-INF/,\
+               about.html,\
+               about_files/,\
+               target/org.eclipse.kura.web-2.1.0-SNAPSHOT/WEB-INF/lib/gxt-2.2.5.jar
+source.. = src/main/java/,\
+           src/main/generated/,\
+           src/main/resources/,\
+           target/generated-sources/gwt
+additional.bundles = org.eclipse.osgi.util,\
+                     org.eclipse.kura.core
+src.includes = about.html,\
+               about_files/
diff --git a/kura/org.eclipse.kura.web/pom.xml b/kura/org.eclipse.kura.web/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d78c052b95bee08f066c66c82ce0bd6f50fca41b
--- /dev/null
+++ b/kura/org.eclipse.kura.web/pom.xml
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<!-- POM file generated with GWT webAppCreator -->
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>kura</artifactId>
+		<version>0.7.0</version>
+		<relativePath>../pom_pom.xml</relativePath>
+	</parent>
+
+	<groupId>org.eclipse.kura</groupId>
+	<artifactId>org.eclipse.kura.web</artifactId>
+	<version>0.7.0</version>
+	<packaging>war</packaging>
+	<name>org.eclipse.kura.web</name>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+		<!-- Convenience property to set the GWT version -->
+		<gwtVersion>2.4.0</gwtVersion>
+		<!-- GWT needs at least java 1.5 -->
+		<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<!-- <dependency> <groupId>com.google.gwt</groupId> <artifactId>gwt-osgi</artifactId> 
+			<version>${gwtVersion}</version> <scope>runtime</scope> </dependency> <dependency> 
+			<groupId>com.google.gwt</groupId> <artifactId>gwt-servlet</artifactId> <version>${gwtVersion}</version> 
+			<scope>runtime</scope> </dependency> -->
+		<dependency>
+			<groupId>com.google.gwt</groupId>
+			<artifactId>gwt-user</artifactId>
+			<version>${gwtVersion}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.extjs</groupId>
+			<artifactId>gxt</artifactId>
+			<version>2.2.5</version>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.kura</groupId>
+			<artifactId>org.eclipse.kura.api</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.kura</groupId>
+			<artifactId>org.eclipse.kura.core</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.kura</groupId>
+			<artifactId>org.eclipse.kura.core.configuration</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.kura</groupId>
+			<artifactId>org.eclipse.kura.core.net</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.kura</groupId>
+			<artifactId>org.eclipse.kura.deployment.agent</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.allen-sauer.gwt.log</groupId>
+			<artifactId>gwt-log</artifactId>
+			<version>3.1.8</version>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<version>4.3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.compendium</artifactId>
+			<version>4.3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.7</version>
+			<scope>provided</scope>
+		</dependency>
+        <dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>1.6.4</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.6.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.1</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<!-- Generate compiled stuff in the folder used for developing mode -->
+		<outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-ssh</artifactId>
+				<version>1.0-beta-6</version>
+			</extension>
+		</extensions>
+ 		<plugins>
+<!--
+                    <plugin>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                            <executions>
+                                <execution>
+                                    <phase>install</phase>
+                                    <goals>
+                                        <goal>copy-dependencies</goal>
+                                    </goals>
+                                    <configuration>
+		                        <includeArtifactIds>gxt</includeArtifactIds>
+                                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                                    </configuration>
+                                </execution>
+                            </executions>
+                    </plugin>
+-->
+			<!-- Download GXT CSS -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>wagon-maven-plugin</artifactId>
+				<version>1.0-beta-3</version>
+				<executions>
+					<execution>
+						<id>gxt-resource-download</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>https://s3.amazonaws.com/esf-updates</url>
+							<fromFile>gxt_resources_2.3.1.tar.gz</fromFile>
+							<toDir>src/main/webapp/gxt</toDir>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.7</version>
+				<executions>
+					<execution>
+						<id>gxt-extract</id>
+						<phase>compile</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<target>
+								<untar src="src/main/webapp/gxt/gxt_resources_2.3.1.tar.gz"
+									   dest="src/main/webapp/gxt"
+									   compression="gzip" />
+							</target>
+						</configuration>
+					</execution>
+					<execution>
+						<id>gxt-archive-delete</id>
+						<phase>compile</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<target>
+								<delete file="src/main/webapp/gxt/gxt_resources_2.3.1.tar.gz" />
+							</target>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+					<groupId>org.codehaus.mojo</groupId>
+					<artifactId>properties-maven-plugin</artifactId>
+					<version>1.0-alpha-1</version>
+					<executions>
+							<execution>
+									<phase>compile</phase>
+									<goals>
+											<goal>read-project-properties</goal>
+									</goals>
+									<configuration>
+									<files>
+											<file>${basedir}/../distrib/build.properties</file>
+									</files>
+									</configuration>
+							 </execution>
+					</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-eclipse-plugin</artifactId>
+				<version>2.9</version>
+				<configuration>
+					<skip>false</skip>
+				</configuration>
+			</plugin>
+			<!-- Remove CSS on clean -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+			    <artifactId>maven-clean-plugin</artifactId>
+				<version>2.4.1</version>
+				<configuration>
+					<filesets>
+						<fileset>
+							<directory>src/main/webapp/gxt</directory>
+							<includes>
+								<include>**/*</include>
+							</includes>
+							<excludes>
+								<exclude>.gitkeep</exclude>
+							</excludes>
+							<followSymlinks>false</followSymlinks>
+						</fileset>
+						<fileset>
+							<directory>src/main/webapp/denali</directory>
+							<excludes>
+								<exclude>blank.html</exclude>
+								<exclude>clear.gif</exclude>
+								<exclude>hosted.html</exclude>
+							</excludes>
+						</fileset>
+						<fileset>
+							<directory>src/main/webapp/WEB-INF</directory>
+							<excludes>
+								<exclude>web.xml</exclude>
+							</excludes>
+						</fileset>
+					</filesets>
+				</configuration>
+			</plugin>
+			<!-- GWT Maven Plugin -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>gwt-maven-plugin</artifactId>
+				<version>2.4.0</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>compile</goal>
+							<goal>test</goal>
+							<goal>i18n</goal>
+							<goal>generateAsync</goal>
+						</goals>
+					</execution>
+				</executions>
+				<!-- Plugin configuration. There are many available options, see gwt-maven-plugin 
+					documentation at codehaus.org -->
+				<configuration>
+					<runTarget>denali.html</runTarget>
+					<hostedWebapp>${webappDirectory}</hostedWebapp>
+					<i18nMessagesBundle>org.eclipse.kura.web.client.messages.Messages</i18nMessagesBundle>
+					<i18nConstantsWithLookupBundle>org.eclipse.kura.web.client.messages.ValidationMessages</i18nConstantsWithLookupBundle>
+                    <webappDirectory>src/main/webapp</webappDirectory>
+				</configuration>
+			</plugin>
+
+			<!-- Copy static web files before executing gwt:run -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.1.1</version>
+				<executions>
+					<execution>
+						<phase>compile</phase>
+						<goals>
+							<goal>exploded</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<webappDirectory>${webappDirectory}</webappDirectory>
+					<archive>
+						<manifestFile>META-INF/MANIFEST.MF</manifestFile>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.4</version>
+				<executions>
+					<execution>
+						<id>buid-version-jar</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<configuration>
+							<finalName>${project.artifactId}_${project.version}.v${kura.build.version}</finalName>
+							<appendAssemblyId>false</appendAssemblyId>
+							<archive>
+								<manifestFile>META-INF/MANIFEST.MF</manifestFile>
+							</archive>
+							<descriptors>
+								<descriptor>src/main/assembly/bundle.xml</descriptor>
+							</descriptors>
+						</configuration>
+					</execution>
+					<execution>
+						<id>standard-jar</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<configuration>
+							<finalName>${project.artifactId}-${project.version}</finalName>
+							<appendAssemblyId>false</appendAssemblyId>
+							<archive>
+								<manifestFile>META-INF/MANIFEST.MF</manifestFile>
+							</archive>
+							<descriptors>
+								<descriptor>src/main/assembly/bundle.xml</descriptor>
+							</descriptors>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings 
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.codehaus.mojo</groupId>
+										<artifactId>gwt-maven-plugin</artifactId>
+										<versionRange>[2.4.0,)</versionRange>
+										<goals>
+											<goal>generateAsync</goal>
+											<goal>i18n</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.apache.maven.plugins</groupId>
+										<artifactId>maven-war-plugin</artifactId>
+										<versionRange>[2.1.1,)</versionRange>
+										<goals>
+											<goal>generateAsync</goal>
+											<goal>i18n</goal>
+											<goal>exploded</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.codehaus.mojo
+										</groupId>
+										<artifactId>
+											wagon-maven-plugin
+										</artifactId>
+										<versionRange>
+											[1.0-beta-3,)
+										</versionRange>
+										<goals>
+											<goal>download-single</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+								
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.apache.maven.plugins
+										</groupId>
+										<artifactId>
+											maven-antrun-plugin
+										</artifactId>
+										<versionRange>
+											[1.0-beta-3,)
+										</versionRange>
+										<goals>
+											<goal>run</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.codehaus.mojo
+										</groupId>
+										<artifactId>
+											properties-maven-plugin
+										</artifactId>
+										<versionRange>
+											[1.0-alpha-1,)
+										</versionRange>
+										<goals>
+											<goal>
+												read-project-properties
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+</project>
diff --git a/kura/org.eclipse.kura.web/src/main/assembly/bundle.xml b/kura/org.eclipse.kura.web/src/main/assembly/bundle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d11f67aaad546117f2a34caf0b82e683d325f0d1
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/assembly/bundle.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<assembly>
+    <id>bundle</id>
+    <formats>
+        <format>jar</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/</directory>
+            <outputDirectory></outputDirectory>
+            <includes>
+                <include>**</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/${project.name}-${project.version}/</directory>
+            <outputDirectory>www</outputDirectory>
+            <includes>
+                <include>denali.html</include>
+                <include>denali.css</include>
+                <include>denali/**</include>
+                <include>kura/**</include>
+                <include>gxt/**</include>
+				<include>eclipse/**</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>lib</directory>
+            <outputDirectory>lib</outputDirectory>
+            <includes>
+                <include>*</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/${project.name}-${project.version}/WEB-INF/lib/</directory>
+            <outputDirectory>lib</outputDirectory>
+            <includes>
+                <include>gxt-2.2.5.jar</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>OSGI-INF</directory>
+            <outputDirectory>OSGI-INF</outputDirectory>
+            <includes>
+                <include>*</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+</assembly>
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/AuthenticationManager.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/AuthenticationManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..da296207ca762d4429172309d391745942760acb
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/AuthenticationManager.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.eclipse.kura.crypto.CryptoService;
+import org.eclipse.kura.db.DbService;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+
+
+public class AuthenticationManager 
+{
+	private static final AuthenticationManager s_instance = new AuthenticationManager();
+	
+	private boolean   m_inited;
+	private DbService m_dbService;
+	
+	private AuthenticationManager() {
+		m_inited = false;
+	}
+
+	/**
+	 * Returns the singleton instance of AuthenticationManager. 
+	 * @return AuthenticationManager
+	 */
+	public static AuthenticationManager getInstance() {
+		return s_instance;
+	}
+
+
+	public synchronized void init(DbService dbService) 
+		throws SQLException 
+	{
+		if (!s_instance.m_inited) {
+			s_instance.m_dbService = dbService;
+			s_instance.initUserStore();
+			s_instance.m_inited = true;
+		}
+	}
+
+	
+	public boolean authenticate(String username, String password)
+		throws SQLException
+	{
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		ResultSet rs = null;
+		try {			
+			
+			CryptoService cryptoService = ServiceLocator.getInstance().getService(CryptoService.class);
+			conn = m_dbService.getConnection();
+			stmt = conn.prepareStatement("SELECT username FROM dn_user WHERE username = ? AND password = ?;");
+			stmt.setString(1, username);
+			stmt.setString(2, cryptoService.sha1Hash(password));
+			
+			rs = stmt.executeQuery();
+			if (rs != null && rs.next()) {
+				return true;
+			}			
+		}
+		catch (SQLException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			throw new SQLException(e);
+		}
+		finally {
+			m_dbService.close(rs);
+			m_dbService.close(stmt);
+			m_dbService.close(conn);
+		}
+		
+		return false;
+	}
+	
+	
+	public void changeAdminPassword(String newPassword)
+		throws SQLException
+	{
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			CryptoService cryptoService = ServiceLocator.getInstance().getService(CryptoService.class);
+			conn = m_dbService.getConnection();
+			stmt = conn.prepareStatement("UPDATE dn_user SET password = ? WHERE username = ?;");
+			stmt.setString(1, cryptoService.sha1Hash(newPassword));
+			stmt.setString(2, "admin");
+			
+			stmt.execute();
+			conn.commit();
+		}
+		catch (SQLException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			m_dbService.rollback(conn);
+			throw new SQLException(e);
+		}
+		finally {
+			m_dbService.close(stmt);
+			m_dbService.close(conn);
+		}
+	}
+	
+	
+	// -------------------------------------------------
+	//
+	//    Private methods
+	//
+	// -------------------------------------------------
+	
+	private synchronized void initUserStore() 
+		throws SQLException
+	{
+		execute("CREATE TABLE IF NOT EXISTS dn_user (username VARCHAR(255) PRIMARY KEY, password  VARCHAR(255) NOT NULL);");
+		checkAdminUser();
+	}
+
+
+    private synchronized void checkAdminUser() throws SQLException 
+    {
+    	boolean bAdminExists = false;
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		ResultSet rs = null;
+		try {			
+			
+			conn = m_dbService.getConnection();
+			stmt = conn.prepareStatement("SELECT username FROM dn_user WHERE username = ?;");
+			stmt.setString(1, "admin");
+			rs = stmt.executeQuery();
+
+			if (rs != null && rs.next()) {
+				bAdminExists = true;
+			}
+		}
+		catch (SQLException e) {
+			throw e;
+		}
+		finally {
+			m_dbService.close(rs);
+			m_dbService.close(stmt);
+			m_dbService.close(conn);
+		}		
+
+		if (!bAdminExists) {
+			createAdminUser();
+		}
+    }
+
+
+    private synchronized void createAdminUser() 
+    	throws SQLException 
+    {
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			CryptoService cryptoService = ServiceLocator.getInstance().getService(CryptoService.class);
+			conn = m_dbService.getConnection();
+			stmt = conn.prepareStatement("INSERT INTO dn_user (username, password) VALUES (?, ?);");
+			stmt.setString(1, "admin");
+			stmt.setString(2, cryptoService.sha1Hash("admin"));
+			
+			stmt.execute();
+		}
+		catch (SQLException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			throw new SQLException(e);
+		}
+		finally {
+			m_dbService.close(stmt);
+			m_dbService.close(conn);
+		}
+    }
+    
+    
+    private synchronized void execute(String sql) throws SQLException 
+    {
+		Connection conn = null;
+		PreparedStatement stmt = null;
+		try {			
+			
+			conn = m_dbService.getConnection();
+			stmt = conn.prepareStatement(sql);
+			stmt.execute();
+			conn.commit();
+		}
+		catch (SQLException e) {
+			m_dbService.rollback(conn);
+			throw e;
+		}
+		finally {
+			m_dbService.close(stmt);
+			m_dbService.close(conn);
+		}
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/Console.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/Console.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f1d2b4f18b9985a17c5c2410e58d2ed55cb686b
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/Console.java
@@ -0,0 +1,192 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web;
+
+import java.util.Map;
+
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.crypto.CryptoService;
+import org.eclipse.kura.db.DbService;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.web.server.GwtComponentServiceImpl;
+import org.eclipse.kura.web.server.GwtDeviceServiceImpl;
+import org.eclipse.kura.web.server.GwtNetworkServiceImpl;
+import org.eclipse.kura.web.server.GwtPackageServiceImpl;
+import org.eclipse.kura.web.server.GwtSettingServiceImpl;
+import org.eclipse.kura.web.server.GwtSnapshotServiceImpl;
+import org.eclipse.kura.web.server.GwtStatusServiceImpl;
+import org.eclipse.kura.web.server.servlet.DeviceSnapshotsServlet;
+import org.eclipse.kura.web.server.servlet.FileServlet;
+import org.eclipse.kura.web.server.servlet.SkinServlet;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.http.HttpContext;
+import org.osgi.service.http.HttpService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class Console 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(Console.class);
+
+	private static final String SERVLET_ALIAS_ROOT = "servlet.alias.root";
+	private static final String APP_ROOT		   = "app.root";
+
+	private static String        s_aliasRoot;
+	private static String		 s_appRoot;
+	private static BundleContext s_context;
+	
+	private DbService            m_dbService;
+	private HttpService          m_httpService;
+	
+	@SuppressWarnings("unused")
+	private SystemService        m_systemService;
+	@SuppressWarnings("unused")
+	private ConfigurationService m_configService;
+	@SuppressWarnings("unused")
+	private CryptoService		m_cryptoService;
+	
+	// ----------------------------------------------------------------
+	//
+	//   Dependencies
+	//
+	// ----------------------------------------------------------------
+
+	public void setHttpService(HttpService httpService) {
+		this.m_httpService = httpService;
+	}
+
+	public void unsetHttpService(HttpService httpService) {
+		this.m_httpService = null;
+	}
+
+	public void setDbService(DbService dbService) {
+		this.m_dbService = dbService;
+	}
+
+	public void unsetDbService(DbService dbService) {
+		this.m_dbService = null;
+	}
+
+	public void setSystemService(SystemService systemService) {
+		this.m_systemService = systemService;
+	}
+
+	public void unsetSystemService(SystemService systemService) {
+		this.m_systemService = null;
+	}
+	
+	public void setConfigurationService(ConfigurationService configService) {
+		this.m_configService = configService;
+	}
+
+	public void unsetConfigurationService(ConfigurationService configService) {
+		this.m_configService = null;
+	}
+	
+	public void setCryptoService(CryptoService cryptoService) {
+		this.m_cryptoService = cryptoService;
+	}
+
+	public void unsetCryptoService(CryptoService cryptoService) {
+		this.m_cryptoService = null;
+	}
+
+	
+	// ----------------------------------------------------------------
+	//
+	//   Activation APIs
+	//
+	// ----------------------------------------------------------------
+	
+	protected void activate(BundleContext context, Map<String,Object> properties)
+	{
+		try {
+			// Check if web interface is enabled.
+			Boolean webEnabled = Boolean.valueOf(m_systemService.getKuraWebEnabled());
+			
+			if (webEnabled) {
+				s_logger.info("activate...");
+				
+				s_context   = context;
+				s_aliasRoot = (String) properties.get(SERVLET_ALIAS_ROOT);
+				s_appRoot   = (String) properties.get(APP_ROOT);
+				String servletRoot = s_aliasRoot;
+	
+				// Initialize AuthenticationManager with DbService
+				AuthenticationManager authMgr = AuthenticationManager.getInstance();
+				authMgr.init(m_dbService);
+			
+				// Initialize HttpService
+				HttpContext httpCtx = new SecureBasicHttpContext(m_httpService.createDefaultHttpContext(), authMgr);	
+				m_httpService.registerResources("/", "www", httpCtx);
+				m_httpService.registerResources(s_appRoot, "www/denali.html", httpCtx);
+				m_httpService.registerResources(s_aliasRoot, "www"+s_aliasRoot, httpCtx);
+					
+				m_httpService.registerServlet(servletRoot+"/status",            new GwtStatusServiceImpl(),    null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/device",    		new GwtDeviceServiceImpl(),    null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/network",   		new GwtNetworkServiceImpl(),   null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/component", 		new GwtComponentServiceImpl(), null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/package",   		new GwtPackageServiceImpl(),   null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/snapshot",  		new GwtSnapshotServiceImpl(),  null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/setting",   		new GwtSettingServiceImpl(),   null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/file",      		new FileServlet(),             null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/device_snapshots", 	new DeviceSnapshotsServlet(),  null, httpCtx);
+				m_httpService.registerServlet(servletRoot+"/skin", 				new SkinServlet(),			   null, httpCtx);
+			}
+			else {
+				s_logger.info("Web interface disabled in Kura properties file.");
+			}
+		}
+		catch (Throwable t) {
+			s_logger.warn("Error Registering Web Resources", t);
+		}
+			
+		
+	}
+
+
+	protected void deactivate(BundleContext context) 
+	{
+		s_logger.info("deactivate...");
+		
+		s_context = null;
+		
+		String servletRoot = s_aliasRoot;
+		m_httpService.unregister("/");
+		m_httpService.unregister(s_appRoot);
+		m_httpService.unregister(s_aliasRoot);
+		m_httpService.unregister(servletRoot+"/status");
+		m_httpService.unregister(servletRoot+"/device");
+		m_httpService.unregister(servletRoot+"/network");
+		m_httpService.unregister(servletRoot+"/component");
+		m_httpService.unregister(servletRoot+"/package");
+		m_httpService.unregister(servletRoot+"/snapshot");
+		m_httpService.unregister(servletRoot+"/setting");
+		m_httpService.unregister(servletRoot+"/file");
+		m_httpService.unregister(servletRoot+"/device_snapshots");
+		m_httpService.unregister(servletRoot+"/skin");
+	}
+	
+	
+	public static BundleContext getBundleContext() {
+		return s_context;
+	}
+	
+	public static String getApplicationRoot() {
+		return s_appRoot;
+	}
+	
+	public static String getServletRoot() {
+		return s_aliasRoot;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/SecureBasicHttpContext.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/SecureBasicHttpContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d96bffe11bec2b63fa842ad80be93ae82f2aaf5
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/SecureBasicHttpContext.java
@@ -0,0 +1,179 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.StringTokenizer;
+
+import javax.security.auth.Subject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.xml.bind.DatatypeConverter;
+
+import org.osgi.service.http.HttpContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * HttpContext that delegates calls to getMimeType() and getResource(), but provides
+ * HTTP Basic authentication by authenticating a user against an LDAP directory. For 
+ * the request to be accepted, the user has to be a member of a privileged group.  
+ */
+public class SecureBasicHttpContext implements HttpContext 
+{    
+    // Logger
+	private static Logger s_logger = LoggerFactory.getLogger(SecureBasicHttpContext.class);
+        
+    /**
+     * The HttpContext where we delegate calls to getResource() and getMimeType()
+     */
+    private final HttpContext delegate;
+    private AuthenticationManager m_authMgr;
+    
+    public SecureBasicHttpContext(HttpContext delegate,
+    						      AuthenticationManager authMgr) {
+        this.delegate = delegate;
+        m_authMgr = authMgr;
+    }
+
+    public String getMimeType(String name) {
+        return delegate.getMimeType(name);
+    }
+
+    public URL getResource(String name) {
+        return delegate.getResource(name);
+    }
+
+    
+    /**
+     * Provides Basic authentication over HTTPS.
+     */
+    public boolean handleSecurity(HttpServletRequest request,
+            					  HttpServletResponse response) 
+        throws IOException 
+    {        
+    	// If a trailing "/" is used when accesssing the app, redirect
+    	if (request.getRequestURI().equals("/kura/")) {
+    		response.sendRedirect("/kura");
+    	}
+    	
+    	// If using root context, redirect
+    	if (request.getRequestURI().equals("/")) {
+    		response.sendRedirect("/kura");
+    	}
+    	
+    	HttpSession session = request.getSession(false);
+        if (session != null){
+        	String logout = (String)session.getAttribute("logout");
+        	if (logout != null) {
+        		session.removeAttribute("logout");
+        		session.invalidate();
+        		return failAuthorization(response);
+        	}
+        }
+    	
+    	String authHeader = request.getHeader("Authorization");
+        if (authHeader == null) {
+            s_logger.debug("Missing 'Authorization' HTTP header");
+            return failAuthorization(response);
+        }
+
+        StringTokenizer tokens = new StringTokenizer(authHeader);
+        String authScheme = tokens.nextToken();        
+        if (!"Basic".equals(authScheme)) {
+            s_logger.error("The authentication scheme is not 'Basic'");
+            return failAuthorization(response);
+        }
+
+        String base64 = tokens.nextToken();
+        String credentials = null;
+    	credentials = new String(DatatypeConverter.parseBase64Binary(base64));
+        
+        int colon = credentials.indexOf(':');
+        String userid = credentials.substring(0, colon);
+        String password = credentials.substring(colon + 1);
+        
+        Subject subject = login(request, userid, password);            
+        if (subject == null) {
+            return failAuthorization(response);
+        }
+        
+        request.setAttribute(HttpContext.REMOTE_USER, userid);
+        request.setAttribute(HttpContext.AUTHENTICATION_TYPE, request.getAuthType());
+        request.setAttribute(HttpContext.AUTHORIZATION, subject);
+        return true;
+    }
+
+    /**
+     * Sets the correct HTTP Header to indicate that a request has failed
+     * @param response
+     * @return always false
+     */
+    private boolean failAuthorization(HttpServletResponse response) {
+        response.setHeader("WWW-Authenticate", "Basic realm=\"Secure Area\"");
+        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        return false;
+    }
+
+    /**
+     * Authenticates a user against an LDAP directory if he does not have an active session.
+     * @param request
+     * @param userid
+     * @param password
+     * @return A Subject Object if the credentials are valid, null otherwise.
+     */
+    private Subject login(HttpServletRequest request, 
+    					  String userid,
+    					  String password) 
+    {
+        Subject subject = null;
+        HttpSession session = request.getSession(true);
+        subject = (Subject) session.getAttribute("subject");        
+        if (subject != null) {
+        	// The user has already been authenticated
+            return subject;
+        }
+
+        subject = authorize(userid, password);
+        session.setAttribute("subject", subject);
+        session.setAttribute("username", userid);
+        return subject;
+    }
+    
+    /**
+     * Authenticates a user against an SQL DB. The credentials have to be
+     * valid and the user has to be a member of a privileged group in order for him
+     * to be authorized
+     * 
+     * @param userid
+     * @param password
+     * @return An empty Subject if the user is authorized, null otherwise.
+     */
+    private Subject authorize(String userid, String password) 
+    {        
+    	s_logger.debug("Authenticating user [" + userid + "]");
+    	try {
+    		if (m_authMgr.authenticate(userid, password)) {
+                // TODO : We are temporarily returning an empty Subject, 
+                // but we should return something more significant
+            	return new Subject();    			
+    		}
+    	}
+    	catch (Exception e) {
+    		s_logger.error("Error during authentication", e);
+    	}
+        
+        return null;
+     }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/NorthView.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/NorthView.java
new file mode 100644
index 0000000000000000000000000000000000000000..765cf27364ea6dbd12d042e414fd400acc7b9c5c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/NorthView.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client;
+
+import org.eclipse.kura.web.client.util.UserAgentUtils;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.layout.TableData;
+import com.extjs.gxt.ui.client.widget.layout.TableLayout;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
+
+public class NorthView extends LayoutContainer 
+{
+
+	@SuppressWarnings("unused")
+	private GwtSession currentSession;
+	
+	public NorthView(GwtSession currentSession) {
+		this.currentSession = currentSession;
+		setId("north-panel-wrapper");
+	}
+	
+    protected void onRender(Element parent, int index) {
+    	
+        super.onRender(parent, index);
+        
+        ContentPanel panel = new ContentPanel();
+        panel.setBorders(true);
+        panel.setBodyBorder(false);
+        panel.setStyleAttribute("backgroundColor", "white");
+        panel.setHeaderVisible(false);
+        
+        TableLayout layout = new TableLayout(3);
+        layout.setWidth("100%");
+        panel.setLayout(layout);
+        
+        panel.add(getKuraHeader(), new TableData(Style.HorizontalAlignment.LEFT,  Style.VerticalAlignment.MIDDLE));
+        //panel.add(getWelcome(),        new TableData(Style.HorizontalAlignment.RIGHT, Style.VerticalAlignment.TOP));
+        
+        add(panel);
+    }
+    
+    private Widget getKuraHeader() {
+    	SimplePanel logo = new SimplePanel();
+    	if (!UserAgentUtils.isIE() || UserAgentUtils.getIEDocumentMode() > 8) {
+    		logo.setStyleName("headerLogo");
+    	} else {
+    		logo.setStyleName("headerLogo-ie8");
+    	}
+    	return logo;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/WestNavigationView.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/WestNavigationView.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d078169734a5f0da004559fbb0cc7693768720b
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/WestNavigationView.java
@@ -0,0 +1,337 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.kura.web.client.configuration.ServiceTree;
+import org.eclipse.kura.web.client.device.DevicePanel;
+import org.eclipse.kura.web.client.firewall.FirewallPanel;
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.network.NetworkPanel;
+import org.eclipse.kura.web.client.packages.PackagesPanel;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.settings.SettingsPanel;
+import org.eclipse.kura.web.client.status.StatusPanel;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.data.BaseModelData;
+import com.extjs.gxt.ui.client.data.BaseTreeModel;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.ModelIconProvider;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionEvent;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnData;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid;
+import com.extjs.gxt.ui.client.widget.treegrid.WidgetTreeGridCellRenderer;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+import com.google.gwt.user.client.ui.Widget;
+
+public class WestNavigationView extends LayoutContainer
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private GwtSession           m_currentSession;
+
+	private ContentPanel         m_centerPanel;
+
+	private ContentPanel 		 m_systemPanel;
+	private TreeStore<ModelData> m_systemStore;
+	private TreeGrid<ModelData>  m_systemTree;
+
+	private ServiceTree   		 m_servicesTree;
+	
+	private GwtSession           m_gwtSession;
+
+
+	public WestNavigationView(GwtSession currentSession, 
+							  ContentPanel center) 
+	{
+		m_gwtSession = currentSession;
+		m_centerPanel = center;
+		m_currentSession = currentSession;
+		setId("west-panel-wrapper");
+	}
+
+	
+	protected void onRender(Element parent, int index) 
+	{
+		super.onRender(parent, index);
+
+        final BorderLayout borderLayout = new BorderLayout();
+		setLayout(borderLayout);
+		setBorders(false);
+
+		// init the service tree first as it is referenced by many.
+		m_servicesTree = new ServiceTree(m_currentSession, m_centerPanel);
+		m_servicesTree.addListener(Events.Select, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				if (m_systemTree != null) {
+					m_systemTree.getSelectionModel().deselectAll();
+					m_systemTree.clearState();
+				}
+			}
+		});
+
+		//
+		// north - system panel
+		initSystemPanel();
+
+		//
+		// West Navigation
+        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 257);  
+        northData.setCollapsible(false);  
+        northData.setFloatable(false);  
+        northData.setHideCollapseTool(false);  
+        northData.setSplit(false);
+        northData.setMargins(new Margins(0, 0, 0, 0));
+        m_systemPanel.setId("nav-system-wrapper");
+        add(m_systemPanel, northData);
+		
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, 200);  
+        centerData.setCollapsible(false);  
+        centerData.setFloatable(false);  
+        centerData.setHideCollapseTool(false);  
+        centerData.setSplit(false);
+        centerData.setMargins(new Margins(0, 0, 0, 0));
+        m_servicesTree.setId("nav-services-wrapper");
+        add(m_servicesTree, centerData);
+
+		//
+		// center - settings panel
+	}
+
+
+	private void initSystemPanel() 
+	{
+		//
+		// System Panel 
+		m_systemPanel = new ContentPanel();
+		m_systemPanel.setBorders(false);
+		m_systemPanel.setBodyBorder(true);
+		m_systemPanel.setAnimCollapse(true);
+		m_systemPanel.setHeading(MSGS.system());		
+		m_systemPanel.setLayout( new FitLayout());
+
+		m_systemStore = new TreeStore<ModelData>();
+		m_systemStore.add(newItem("status", "Status", Resources.INSTANCE.information32()), false);
+	    m_systemStore.add(newItem("device",   MSGS.device(),   Resources.INSTANCE.router32()),   false);
+	    if (m_gwtSession.isNetAdminAvailable()) {
+	    	m_systemStore.add(newItem("network",  MSGS.network(),  Resources.INSTANCE.network32()),  false);
+	    	m_systemStore.add(newItem("firewall", MSGS.firewall(), Resources.INSTANCE.firewall32()), false);
+	    }
+		m_systemStore.add(newItem("packages", MSGS.packages(), Resources.INSTANCE.packages32()), false);
+		m_systemStore.add(newItem("settings", MSGS.settings(), Resources.INSTANCE.settings32()), false);
+
+		ColumnConfig name = new ColumnConfig("name", "Name", 100);
+		name.setRenderer(new WidgetTreeGridCellRenderer<ModelData>(){
+		    @Override
+		    public Widget getWidget(ModelData model, String property, ColumnData config, int rowIndex, int colIndex,
+		                            ListStore<ModelData> store, Grid<ModelData> grid) {	        
+		        Label label = new Label((String)model.get(property));
+		        label.setStyleAttribute("padding-left", "5px");
+		        return label;
+		    }
+	    });
+	    ColumnModel cm = new ColumnModel(Arrays.asList(name));
+
+	    m_systemTree = new TreeGrid<ModelData>(m_systemStore, cm);
+	    m_systemTree.setId("nav-system");
+	    m_systemTree.setBorders(false);
+	    m_systemTree.setHideHeaders(true);
+	    m_systemTree.setAutoExpandColumn("name");
+	    m_systemTree.getTreeView().setRowHeight(36);
+	    m_systemTree.setIconProvider( new ModelIconProvider<ModelData>() {
+			public AbstractImagePrototype getIcon(ModelData model) {
+				if (model.get("icon") != null) {
+					ImageResource ir = (ImageResource) model.get("icon");
+					return AbstractImagePrototype.create(ir);						
+				} else {
+					return null;
+				}
+			}
+		});
+		m_systemTree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
+		m_systemTree.getSelectionModel().addListener(Events.BeforeSelect, new Listener<BaseEvent>() {
+			@SuppressWarnings("unchecked")
+			public void handleEvent(BaseEvent be) {
+				
+				final BaseEvent theEvent = be;				
+				SelectionEvent<ModelData> se = (SelectionEvent<ModelData>) be;
+            	final ModelData selectedModel = se.getModel();
+            	if (selectedModel == null) return;
+            	//if (m_servicesTree != null && m_servicesTree.isDirty()) {
+            	if (isDirty(m_centerPanel)) {
+					// cancel the event first
+                	theEvent.setCancelled(true);
+                	
+                	// need to reselect the current entry
+                	// as the BeforeSelect event cleared it
+                	// we need to do this without raising events
+                	if (m_systemTree.getSelectionModel().getSelectedItem() != null) {
+	                	m_systemTree.getSelectionModel().setFiresEvents(false);
+	                	m_systemTree.getSelectionModel().select(false, m_systemTree.getSelectionModel().getSelectedItem());
+	                	m_systemTree.getSelectionModel().setFiresEvents(true);
+                	}
+            		
+        	    	MessageBox.confirm(MSGS.confirm(), 
+        	            	MSGS.deviceConfigDirty(),
+        	                new Listener<MessageBoxEvent>() {  
+        	                    public void handleEvent(MessageBoxEvent ce) {
+        	                        // if confirmed, delete
+        	                        Dialog  dialog = ce.getDialog(); 
+        	                        if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+        	                        	selectModelId(selectedModel);        	                        
+        	                        }
+        	                    }
+        	        });            		
+            	}
+            	else {
+            		selectModelId(selectedModel);
+            	}
+			}
+		});
+		m_systemPanel.add(m_systemTree);
+	}
+	
+	
+	private void selectModelId(ModelData selectedModel) 
+	{
+    	String selectedId = (String) selectedModel.get("id");
+    	if ("status".equals(selectedId)) {
+    		m_centerPanel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.information()));
+            m_centerPanel.setHeading("Status");
+            m_centerPanel.removeAll();                  
+            m_centerPanel.add(new StatusPanel(m_currentSession));
+            m_centerPanel.layout();
+    	}
+    	else if ("device".equals(selectedId)) {
+            m_centerPanel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.router()));
+            m_centerPanel.setHeading(MSGS.device());
+            m_centerPanel.removeAll();                  
+            m_centerPanel.add(new DevicePanel(m_currentSession));
+            m_centerPanel.layout();
+		}
+		else if ("network".equals(selectedId)) {
+			if (m_centerPanel != null) {
+				m_centerPanel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.network()));
+				m_centerPanel.setHeading(MSGS.network());
+				List<Component> comps = m_centerPanel.getItems();
+				if (comps != null && comps.size() > 0) {
+					m_centerPanel.removeAll();
+				}
+				m_centerPanel.add(new NetworkPanel(m_currentSession));
+				m_centerPanel.layout();
+			}
+		} 
+		else if ("firewall".equals(selectedId)) {
+			m_centerPanel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.firewall()));
+			m_centerPanel.setHeading(MSGS.firewall());
+			List<Component> comps = m_centerPanel.getItems();
+			if (comps != null && comps.size() > 0) {
+				m_centerPanel.removeAll();
+			}
+			m_centerPanel.add(new FirewallPanel(m_currentSession));
+			m_centerPanel.layout();
+		}
+		else if ("packages".equals(selectedId)) {
+			m_centerPanel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.packages()));
+			m_centerPanel.setHeading(MSGS.packages());
+			List<Component> comps = m_centerPanel.getItems();
+			if (comps != null && comps.size() > 0) {
+				m_centerPanel.removeAll();
+			}
+			m_centerPanel.add(new PackagesPanel(m_currentSession, m_servicesTree));	
+			m_centerPanel.layout();
+		}
+		else if ("settings".equals(selectedId)) {
+			m_centerPanel.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.settings()));
+			m_centerPanel.setHeading(MSGS.settings());
+			List<Component> comps = m_centerPanel.getItems();
+			if (comps != null && comps.size() > 0) {
+				m_centerPanel.removeAll();
+			}
+			m_centerPanel.add(new SettingsPanel(m_currentSession, m_servicesTree));	
+			m_centerPanel.layout();
+		}
+		
+		// set the right selection in the system tree 
+		// and clear the selection on the service tree
+		m_systemTree.clearState();
+		m_systemTree.getSelectionModel().setFiresEvents(false);
+		m_systemTree.getSelectionModel().deselectAll();
+		m_systemTree.getSelectionModel().select(false, selectedModel);
+		m_systemTree.getSelectionModel().setFiresEvents(true);
+		
+		m_servicesTree.clearState();
+		m_servicesTree.clearSelection();
+	}	
+
+	
+	private ModelData newItem(String id, String text, Object iconStyle) {
+		ModelData m = new BaseModelData();
+		m.set("id",   id);
+		m.set("name", text);
+		m.set("icon", iconStyle);
+		return m;
+	}
+
+
+		
+	@SuppressWarnings("unused")
+    private BaseTreeModel newTreeItem(String id, String text, Object icon) {
+		BaseTreeModel m = new BaseTreeModel();
+		m.set("id",   id);
+		m.set("name", text);
+		m.set("icon", icon);
+		return m;
+	}
+	
+	private boolean isDirty (ContentPanel centerPanel) {
+		List<Component>comps = centerPanel.getItems();
+		if (comps != null && comps.size() > 0) {
+			Component comp = comps.get(0);
+			if (comp instanceof NetworkPanel) {
+				return ((NetworkPanel)comp).isDirty();
+			}
+			if (comp instanceof FirewallPanel) {
+				return ((FirewallPanel)comp).isDirty();
+			}
+		}
+		return false;
+	}
+	
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/DeviceConfigPanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/DeviceConfigPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..1482f0d9e8fe1ca92e93abba2e949a6990dae8f9
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/DeviceConfigPanel.java
@@ -0,0 +1,1132 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.configuration;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.MessageUtils;
+import org.eclipse.kura.web.client.util.UserAgentUtils;
+import org.eclipse.kura.web.shared.model.GwtConfigComponent;
+import org.eclipse.kura.web.shared.model.GwtConfigParameter;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.Style.Orientation;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.core.El;
+import com.extjs.gxt.ui.client.core.XDOM;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ComponentPlugin;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.MultiField;
+import com.extjs.gxt.ui.client.widget.form.NumberField;
+import com.extjs.gxt.ui.client.widget.form.NumberPropertyEditor;
+import com.extjs.gxt.ui.client.widget.form.Radio;
+import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
+import com.extjs.gxt.ui.client.widget.form.TextArea;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.form.Validator;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NodeList;
+
+public class DeviceConfigPanel extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+ 
+    private GwtConfigComponent m_configComponent;
+    private FormPanel          m_actionFormPanel;
+    private FieldSet           m_actionFieldSet;
+
+    private ComponentPlugin    m_infoPlugin;
+    private ComponentPlugin    m_dirtyPlugin;
+    
+    public DeviceConfigPanel(GwtConfigComponent configComponent) {
+        
+    	super( new FitLayout());            
+        setScrollMode(Scroll.AUTO);
+        setBorders(false);
+    	setId("services-config-content-wrapper");
+        
+    	m_configComponent = configComponent;
+    	m_infoPlugin = new ComponentPlugin() {  
+    		public void init(Component component) {  
+    			component.addListener(Events.Render, new Listener<ComponentEvent>() {  
+    				public void handleEvent(ComponentEvent be) {  
+    					El elem = be.getComponent().el().findParent(".x-form-element", 3);
+    					if (elem != null) {
+    						// should style in external CSS  rather than directly  
+    						elem.appendChild(XDOM.create("<div style='color: #615f5f; padding: 1px 25px 5px 0px;'>" + be.getComponent().getData("text") + "</div>"));
+    					}
+    				}  
+    			});  
+    		}
+	    };            
+	    
+	    final DeviceConfigPanel thePanel = this;
+    	m_dirtyPlugin = new ComponentPlugin() {  
+    		public void init(Component component) {  
+    			component.addListener(Events.Change, new Listener<ComponentEvent>() {  
+    				public void handleEvent(ComponentEvent be) {  
+    					El elem = be.getComponent().el().findParent(".x-form-element", 7);
+    					if (elem != null) {
+	    					El dirtyIcon= elem.createChild("");
+	    					dirtyIcon.setStyleName("x-grid3-dirty-cell");
+	    					dirtyIcon.setStyleAttribute("top", "0");
+	    					dirtyIcon.setStyleAttribute("position", "absolute");
+	    					dirtyIcon.setSize(10, 10);
+	    					dirtyIcon.show();
+    					}    					
+    					thePanel.fireEvent(Events.Change);
+    				}  
+    			});  
+  	      	}  
+  	    };            
+
+	    paintConfig();
+    }
+    
+    
+    public boolean isValid() {
+        List<Component> fields = m_actionFieldSet.getItems();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field) {
+        		Field<?> field = (Field<?>) fields.get(i);
+        		if (!field.isValid()) {
+        			return false;
+        		}
+        	}
+        }
+        return true;
+    }
+
+
+    public boolean isDirty() {
+        List<Component> fields = m_actionFieldSet.getItems();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof MultiField) {
+	            MultiField<?> multiField = (MultiField<?>) fields.get(i);
+	            for (Field<?> field : multiField.getAll()) {
+		            if (field.isDirty()) {
+		                return true;
+		            }
+	            }        		
+        	}
+        	else if (fields.get(i) instanceof Field) {
+	            Field<?> field = (Field<?>) fields.get(i);
+	            if (field.isDirty()) {
+	                return true;
+	            }
+        	}
+        }
+        return false;
+    }
+
+    
+    public GwtConfigComponent getConfiguration() {
+    	return m_configComponent;
+    }
+    
+    
+    public GwtConfigComponent getUpdatedConfiguration() {
+        
+        List<Component> fields = m_actionFieldSet.getItems();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field<?>) {
+	            
+        		Field<?> field = (Field<?>) fields.get(i);
+        		String fieldName = field.getItemId();
+        		GwtConfigParameter param = m_configComponent.getParameter(fieldName);
+        		if (param == null) {
+        			System.err.println(field);
+        		}
+        		if (!(field instanceof MultiField) || (field instanceof RadioGroup)) {
+        			// get the updated values for the single field
+        			String value = getUpdatedFieldConfiguration(param, field);
+        			param.setValue(value);
+        		}
+        		else {
+        			
+        			// iterate over the subfields and extract each value
+        			List<String> multiFieldValues = new ArrayList<String>();
+        			MultiField<?>   multiField = (MultiField<?>) field;
+        			List<Field<?>> childFields = multiField.getAll(); 
+        			for (int j=0; j<childFields.size(); j++) {
+        				
+                		Field<?> childField = (Field<?>) childFields.get(j);
+        				String value = getUpdatedFieldConfiguration(param, childField);
+        				if (value != null) {
+        					multiFieldValues.add(value);
+        				}
+        			}
+        			param.setValues(multiFieldValues.toArray( new String[]{}));        			
+        		}
+        	}
+        }
+        return m_configComponent;
+    }
+
+
+	private String getUpdatedFieldConfiguration(GwtConfigParameter param, Field<?> field) 
+	{
+		Map<String, String> options = param.getOptions();   	
+		if (options != null && options.size() > 0) {	        		
+		    @SuppressWarnings("unchecked")
+		    SimpleComboValue<String> scv = (SimpleComboValue<String>) field.getValue();
+		    return options.get(scv.getValue());
+		}
+		else {
+		    switch (param.getType()) {
+		    case LONG:
+		    	NumberField longField = (NumberField) field;
+		        Number longNumber = longField.getValue();
+		        if(longNumber != null) {
+		        	return String.valueOf(longNumber.longValue());
+		        } else {
+		        	return null;
+		        }
+		        
+		    case DOUBLE:
+		    	NumberField doubleField = (NumberField) field;
+		        Number doubleNumber = doubleField.getValue();
+		        if(doubleNumber != null) {
+		        	return String.valueOf(doubleNumber.doubleValue());
+		        } else {
+		        	return null;
+		        }
+		        
+		    case FLOAT:
+		    	NumberField floatField = (NumberField) field;
+		        Number floatNumber = floatField.getValue();
+		        if(floatNumber != null) {
+		        	return String.valueOf(floatNumber.floatValue());
+		        } else {
+		        	return null;
+		        }
+		        
+		    case INTEGER:
+		    	NumberField integerField = (NumberField) field;
+		        Number integerNumber = integerField.getValue();
+		        if(integerNumber != null) {
+		        	return String.valueOf(integerNumber.intValue());
+		        } else {
+		        	return null;
+		        }
+		        
+		    case SHORT:
+		    	NumberField shortField = (NumberField) field;
+		        Number shortNumber = shortField.getValue();
+		        if(shortNumber != null) {
+		        	return String.valueOf(shortNumber.shortValue());
+		        } else {
+		        	return null;
+		        }
+		        
+		    case BYTE:
+		        NumberField byteField = (NumberField) field;
+		        Number byteNumber = byteField.getValue();
+		        if(byteNumber != null) {
+		        	return String.valueOf(byteNumber.byteValue());
+		        } else {
+		        	return null;
+		        }
+		        	
+		    case BOOLEAN:
+		    	RadioGroup radioGroup = (RadioGroup) field;
+		    	Radio radio = radioGroup.getValue();
+		    	String booleanValue = radio.getItemId(); 
+		    	return booleanValue;
+		    	
+		    case PASSWORD:
+			case CHAR:						
+		    case STRING:
+		    	return (String) field.getValue();
+		        
+		    default:
+		        break;
+		    }
+		}
+		return null;
+	}
+
+    
+    private void paintConfig() {
+        
+        LayoutContainer lcAction = new LayoutContainer();
+        lcAction.setLayout(new BorderLayout());
+        lcAction.setBorders(true);
+        lcAction.setSize(475, -1);
+        add(lcAction);
+        
+        // center panel: action form
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, .75F);
+        centerData.setSplit(false);  
+        centerData.setMargins(new Margins(0, 0, 0, 0));
+
+        FormData formData = new FormData("-20");
+        formData.setMargins(new Margins(0, 10, 0, 0));
+
+        if (!UserAgentUtils.isIE()) {
+            m_actionFormPanel = new FormPanel();
+            m_actionFormPanel.setId("config-panel-id");
+            m_actionFormPanel.setFrame(false);
+            m_actionFormPanel.setBodyBorder(false);
+            m_actionFormPanel.setHeaderVisible(false);
+            m_actionFormPanel.setLabelWidth(Constants.LABEL_WIDTH_CONFIG_FORM);
+            m_actionFormPanel.setStyleAttribute("padding", "0px");
+            m_actionFormPanel.setScrollMode(Scroll.AUTO);
+            m_actionFormPanel.setLayout(new FlowLayout());
+            m_actionFormPanel.addListener(Events.Render, new Listener<BaseEvent>() {
+    			public void handleEvent(BaseEvent be) {
+    				NodeList<Element> nl = m_actionFormPanel.getElement().getElementsByTagName("form");
+    				if (nl.getLength() > 0) {
+    					Element elemForm = nl.getItem(0);
+    					elemForm.setAttribute("autocomplete", "off");
+    					
+    				}
+    			}
+    		});
+            m_actionFormPanel.getElement().setAttribute("autocomplete", "off");
+        }
+        
+        m_actionFieldSet = new FieldSet();
+        m_actionFieldSet.setId("configuration-form");
+        m_actionFieldSet.setBorders(false);
+        m_actionFieldSet.setStyleAttribute("padding", "0px");
+        m_actionFieldSet.setScrollMode(Scroll.AUTO);
+        if (m_configComponent.getComponentDescription() != null &&
+            m_configComponent.getComponentDescription().trim().length() > 0) {
+        	m_actionFieldSet.addText(m_configComponent.getComponentDescription());
+        }
+        
+        FormLayout layout = new FormLayout();
+        layout.setLabelWidth(Constants.LABEL_WIDTH_CONFIG_FORM);
+        m_actionFieldSet.setLayout(layout);
+
+        Field<?> field = null;
+        for (GwtConfigParameter param : m_configComponent.getParameters()) {
+        	
+        	if (param.getCardinality() == 0 || param.getCardinality() == 1 || param.getCardinality() == -1) {
+        		field = paintConfigParameter(param);
+        	}
+        	else {
+        		field = paintMultiFieldConfigParameter(param);
+        	}
+            m_actionFieldSet.add(field, formData);
+        }
+        
+        if (!UserAgentUtils.isIE()) {
+            m_actionFormPanel.add(m_actionFieldSet, formData);
+            lcAction.add(m_actionFormPanel, centerData);
+        }
+        else {
+            lcAction.add(m_actionFieldSet, centerData);
+        }
+    }
+    
+    
+    private Field<?> paintMultiFieldConfigParameter(GwtConfigParameter param)
+    {
+    	@SuppressWarnings("rawtypes")
+		MultiField<?> multiField = new MultiField();
+        multiField.setName(param.getId());
+        multiField.setItemId(param.getId());
+        multiField.setFieldLabel(param.getName());
+        multiField.addPlugin(m_dirtyPlugin);
+        multiField.setOrientation(Orientation.VERTICAL);
+        if (param.isRequired()) {
+            multiField.setFieldLabel("* "+param.getName());
+        }
+        if (param.getDescription() != null && param.getDescription().length() > 0) {
+        	multiField.addPlugin(m_infoPlugin);
+        	multiField.setData("text", param.getDescription());  
+        }        
+        if (param.getMin() != null && param.getMin().equals(param.getMax())) {
+        	multiField.setReadOnly(true);
+        	multiField.setEnabled(false);
+        }
+        
+        Field<?>  field = null;
+        String    value = null;
+        String[] values = param.getValues();
+        for (int i=0; i<Math.min(param.getCardinality(), 10); i++) {
+
+        	// temporary set the param value to the current one in the array
+        	// use a value from the one passed in if we have it.
+        	value = null;
+        	if (values != null && i < values.length) {
+        		value = values[i];
+        	}        	
+        	param.setValue(value);
+        	field = paintConfigParameter(param);
+        	multiField.add(field);
+        }
+
+        // restore a null current value
+    	param.setValue(null);
+    	
+        return multiField;
+    }
+    
+    
+    private Field<?> paintConfigParameter(GwtConfigParameter param) 
+    {
+    	Field<?> field = null;
+    	Map<String, String> options = param.getOptions(); 
+    	if (options != null && options.size() > 0) {
+    		field = paintChoiceActionParameter(param);
+    	}
+    	else {
+    		String minValue = param.getMin();
+    		String maxValue = param.getMax();
+	    	switch (param.getType()) {
+	            case LONG:
+	            	field = paintNumberConfigParameter(param, new LongValidator(minValue, maxValue));
+	            	break;
+	            	
+	            case DOUBLE:
+	            	field = paintNumberConfigParameter(param, new DoubleValidator(minValue, maxValue));
+	            	break;
+	            	
+	            case FLOAT:
+	            	field = paintNumberConfigParameter(param, new FloatValidator(minValue, maxValue));
+	            	break;
+	            	
+	            case INTEGER:
+	            	field = paintNumberConfigParameter(param, new IntegerValidator(minValue, maxValue));
+	            	break;
+	                	
+				case SHORT:
+					field = paintNumberConfigParameter(param, new ShortValidator(minValue, maxValue));
+	            	break;
+
+				case BYTE:
+					field = paintNumberConfigParameter(param, new ByteValidator(minValue, maxValue));
+	            	break;
+
+				case BOOLEAN:
+					field = paintBooleanConfigParameter(param);
+	            	break;
+								
+	            case PASSWORD:
+	            	field = paintPasswordConfigParameter(param);
+	            	break;
+
+				case CHAR:
+					field = paintTextConfigParameter(param, new CharValidator(minValue, maxValue));
+	            	break;
+
+				default:
+				case STRING:
+					field = paintTextConfigParameter(param, new StringValidator(minValue, maxValue));
+	            	break;
+	    	}
+    	}
+    	
+    	field.setName(param.getId());
+    	field.setItemId(param.getId());
+    	field.getElement().setAttribute("autocomplete", "off");
+    	return field;
+    }
+
+
+    private Field<?> paintTextConfigParameter(GwtConfigParameter param, Validator validator) {    
+    	
+    	// FIXME: in some case we might need a TextArea for multi-line String values.
+    	// The trick is to put a tag in the parameter descriptor which we use
+    	// to render the TextField widget.
+    	// The tag is a sequence of at least five Zero Width Space characters
+    	// which are usually invisible.
+    	String description = param.getDescription();
+    	TextField<String> field;
+    	//if (description.endsWith("\u200B\u200B\u200B\u200B\u200B")) {
+    	if (description.contains("\u200B\u200B\u200B\u200B\u200B")) {
+    		field = new TextArea();
+    		field.setHeight(120);
+    	} else {
+    		field = new TextField<String>();
+    	}
+    	
+        //TextField<String> field = new TextField<String>();
+        field.setName(param.getId());
+        field.setValue((String) param.getValue());
+        field.setAllowBlank(true);
+        field.setFieldLabel(param.getName());
+        field.addPlugin(m_dirtyPlugin);
+        if (param.isRequired()) {
+            field.setAllowBlank(false);
+            field.setFieldLabel("* "+param.getName());
+        }        
+        if (param.getDescription() != null && param.getDescription().length() > 0) {
+        	field.addPlugin(m_infoPlugin);
+        	field.setData("text", param.getDescription());  
+        }        
+//        if (param.getDescription() != null) {
+//            field.setToolTip(param.getDescription());
+//        }
+        if (param.getMin() != null && param.getMin().equals(param.getMax())) {
+        	field.setReadOnly(true);
+        	field.setEnabled(false);
+        }
+        
+        if (param.getValue() != null) {
+            field.setValue((String) param.getValue());
+            field.setOriginalValue((String) param.getValue());
+        }        
+        if (validator != null && validator instanceof CharValidator) {
+        	field.setMaxLength(1);
+        	field.setValidator((CharValidator)validator);
+        }   
+        if (validator != null && validator instanceof StringValidator) {
+        	field.setValidator((StringValidator)validator);
+        }   
+        return field;
+    }
+    
+    
+    private Field<?> paintPasswordConfigParameter(GwtConfigParameter param) {           
+        TextField<String> field = new TextField<String>();
+        field.setName(param.getId());
+        field.setValue((String) param.getValue());
+        field.setAllowBlank(true);
+        field.setPassword(true);
+        field.setFieldLabel(param.getName());
+        field.addPlugin(m_dirtyPlugin);
+        if (param.isRequired()) {
+            field.setAllowBlank(false);
+            field.setFieldLabel("* "+param.getName());
+        }
+        if (param.getDescription() != null && param.getDescription().length() > 0) {
+        	field.addPlugin(m_infoPlugin);
+        	field.setData("text", param.getDescription());  
+        }        
+//        if (param.getDescription() != null) {
+//            field.setToolTip(param.getDescription());
+//        }
+        if (param.getMin() != null && param.getMin().equals(param.getMax())) {
+        	field.setReadOnly(true);
+        	field.setEnabled(false);
+        }
+        
+        if (param.getValue() != null) {
+            field.setValue((String) param.getValue());
+            field.setOriginalValue((String) param.getValue());
+        }
+        return field;
+    }
+
+    
+    private Field<?> paintNumberConfigParameter(GwtConfigParameter param, Validator validator) {
+        NumberField field = new NumberField();
+        field.setName(param.getId());
+        field.setAllowBlank(true);
+        field.setFieldLabel(param.getName());
+        field.addPlugin(m_dirtyPlugin);
+        if (validator != null) {
+        	field.setValidator(validator);
+        }
+        if (param.isRequired()) {
+            field.setAllowBlank(false);
+            field.setFieldLabel("* "+param.getName());
+        }
+        if (param.getDescription() != null && param.getDescription().length() > 0) {
+        	field.addPlugin(m_infoPlugin);
+        	field.setData("text", param.getDescription());  
+        }        
+//        if (param.getDescription() != null) {
+//            field.setToolTip(param.getDescription());
+//        }
+        if (param.getMin() != null && param.getMin().equals(param.getMax())) {
+        	field.setReadOnly(true);
+        	field.setEnabled(false);
+        }
+
+        switch (param.getType()) {
+        case LONG:
+            field.setPropertyEditorType(Long.class);
+            if (param.getValue() != null) {
+                field.setValue(Long.parseLong(param.getValue()));
+                field.setOriginalValue(Long.parseLong(param.getValue()));
+            }
+            break;
+        case DOUBLE:
+            field.setPropertyEditorType(Double.class);
+            if (param.getValue() != null) {
+                field.setValue(Double.parseDouble(param.getValue()));
+                field.setOriginalValue(Double.parseDouble(param.getValue()));
+            }
+            break;
+        case FLOAT:
+            field.setPropertyEditorType(Float.class);
+            if (param.getValue() != null) {
+                field.setValue(Float.parseFloat(param.getValue()));
+                field.setOriginalValue(Float.parseFloat(param.getValue()));
+            }
+            break;
+        case SHORT:
+            field.setPropertyEditorType(Short.class);
+            if (param.getValue() != null) {
+                field.setValue(Short.parseShort(param.getValue()));
+                field.setOriginalValue(Short.parseShort(param.getValue()));
+            }
+            break;
+        case BYTE:
+            field.setPropertyEditor( new BytePropertyEditor());
+            if (param.getValue() != null) {
+                field.setValue(Byte.parseByte(param.getValue()));
+                field.setOriginalValue(Byte.parseByte(param.getValue()));
+            }
+            break;
+		default:
+        case INTEGER:
+            field.setPropertyEditorType(Integer.class);
+            if (param.getValue() != null) {
+                field.setValue(Integer.parseInt(param.getValue()));
+                field.setOriginalValue(Integer.parseInt(param.getValue()));
+            }
+            break;
+        }
+        return field;
+    }
+
+    
+    private Field<?> paintChoiceActionParameter(GwtConfigParameter param) {
+        SimpleComboBox<String> field = new SimpleComboBox<String>();
+        field.setName(param.getId());
+        field.setEditable(false);
+        field.setAllowBlank(true);
+        field.setTriggerAction(TriggerAction.ALL);
+        field.setFieldLabel(param.getName());
+        field.setEditable(false);
+        field.addPlugin(m_dirtyPlugin);
+        if (param.isRequired()) {
+            field.setAllowBlank(false);
+            field.setFieldLabel("* "+param.getName());
+        }
+        if (param.getDescription() != null && param.getDescription().length() > 0) {
+        	field.addPlugin(m_infoPlugin);
+        	field.setData("text", param.getDescription());  
+        }        
+
+        if (param.getMin() != null && param.getMin().equals(param.getMax())) {
+        	field.setReadOnly(true);
+        	field.setEnabled(false);
+        }
+        
+        Map<String, String> oMap = param.getOptions();
+        Iterator<String> it = oMap.keySet().iterator();
+        while (it.hasNext()) {
+        	field.add(it.next());
+        }
+
+        if (param.getDefault() != null) {
+            //field.setSimpleValue((String) param.getDefault());
+        	field.setSimpleValue(getKeyFromValue(oMap, (String)param.getDefault()));
+        }
+        if (param.getValue() != null) {
+            //field.setSimpleValue((String) param.getValue());
+        	field.setSimpleValue(getKeyFromValue(oMap, (String)param.getValue()));
+        }
+        return field;
+    }
+    
+    private String getKeyFromValue (Map<String, String> m, String value) {
+    	String key = "";
+    	Iterator<Map.Entry<String, String>> it = m.entrySet().iterator();
+    	
+    	while (it.hasNext()) {
+    		Map.Entry<String, String> es = it.next();
+    		if (es.getValue().equals(value)) {
+    			key = es.getKey();
+    		}
+    	}
+    	return key;
+    }
+    
+    
+    private Field<?> paintBooleanConfigParameter(GwtConfigParameter param) {    
+
+    	Radio radioTrue = new Radio();  
+        radioTrue.setBoxLabel(MSGS.trueLabel());
+        radioTrue.setItemId("true");
+      
+        Radio radioFalse = new Radio();  
+        radioFalse.setBoxLabel(MSGS.falseLabel());  
+        radioFalse.setItemId("false");
+      
+        RadioGroup radioGroup = new RadioGroup();  
+        radioGroup.setName(param.getId());  
+        radioGroup.setItemId(param.getId());
+        radioGroup.setFieldLabel(param.getName());  
+        radioGroup.add(radioTrue);  
+        radioGroup.add(radioFalse);
+        if (param.isRequired()) {
+            radioGroup.setFieldLabel("* "+param.getName());
+        }
+        
+        radioGroup.addPlugin(m_dirtyPlugin);
+        if (param.getDescription() != null && param.getDescription().length() > 0) {
+        	radioGroup.addPlugin(m_infoPlugin);
+        	radioGroup.setData("text", param.getDescription());  
+        }        
+
+        boolean bool = Boolean.parseBoolean(param.getValue());
+        if (bool) {
+        	radioTrue.setValue(true);
+        	radioGroup.setOriginalValue(radioTrue);
+        }
+        else {
+        	radioFalse.setValue(true);
+        	radioGroup.setOriginalValue(radioFalse);
+        }
+        
+        return radioGroup;
+    }
+
+    
+    private static class IntegerValidator implements Validator
+    {
+    	private Integer m_minValue;
+    	private Integer m_maxValue;
+    	
+    	public IntegerValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Integer.valueOf(minValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Integer.valueOf(maxValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			Integer intValue = null;
+			try {
+				intValue = Integer.valueOf(value);
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (intValue != null) {				
+				if (m_minValue != null) {
+					if (intValue.intValue() < m_minValue.intValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.intValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (intValue.intValue() > m_maxValue.intValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.intValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+   
+
+    private static class LongValidator implements Validator
+    {
+    	private Long m_minValue;
+    	private Long m_maxValue;
+    	
+    	public LongValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Long.valueOf(minValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Long.valueOf(maxValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			Long longValue = null;
+			try {
+				longValue = Long.valueOf(value);
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (longValue != null) {				
+				if (m_minValue != null) {
+					if (longValue.longValue() < m_minValue.longValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.longValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (longValue.longValue() > m_maxValue.longValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.longValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+    
+    
+    private static class DoubleValidator implements Validator
+    {
+    	private Double m_minValue;
+    	private Double m_maxValue;
+    	
+    	public DoubleValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Double.valueOf(minValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Double.valueOf(maxValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+
+		public String validate(Field<?> field, String value) {
+			Double doubleValue = null;
+			try {
+				doubleValue = Double.valueOf(value);
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (doubleValue != null) {				
+				if (m_minValue != null) {
+					if (doubleValue.doubleValue() < m_minValue.doubleValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.doubleValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (doubleValue.doubleValue() > m_maxValue.doubleValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.doubleValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+
+    
+    private static class FloatValidator implements Validator
+    {
+    	private Float m_minValue;
+    	private Float m_maxValue;
+    	
+    	public FloatValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Float.valueOf(minValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Float.valueOf(maxValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			Float floatValue = null;
+			try {
+				floatValue = Float.valueOf(value);
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (floatValue != null) {				
+				if (m_minValue != null) {
+					if (floatValue.floatValue() < m_minValue.floatValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.floatValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (floatValue.floatValue() > m_maxValue.floatValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.floatValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+
+    
+    private static class ShortValidator implements Validator
+    {
+    	private Short m_minValue;
+    	private Short m_maxValue;
+    	
+    	public ShortValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Short.valueOf(minValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Short.valueOf(maxValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			Short shortValue = null;
+			try {
+				shortValue = Short.valueOf(value);
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (shortValue != null) {				
+				if (m_minValue != null) {
+					if (shortValue.shortValue() < m_minValue.shortValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.shortValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (shortValue.shortValue() > m_maxValue.shortValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.shortValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+
+
+    private static class ByteValidator implements Validator
+    {
+    	private Byte m_minValue;
+    	private Byte m_maxValue;
+    	
+    	public ByteValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Byte.valueOf(minValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Byte.valueOf(maxValue);
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			Byte byteValue = null;
+			try {
+				byteValue = Byte.valueOf(value);
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (byteValue != null) {				
+				if (m_minValue != null) {
+					if (byteValue.byteValue() < m_minValue.byteValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.byteValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (byteValue.byteValue() > m_maxValue.byteValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.byteValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+
+
+
+    private static class CharValidator implements Validator
+    {
+    	private Character m_minValue;
+    	private Character m_maxValue;
+    	
+    	public CharValidator(String minValue, String maxValue)
+    	{
+			m_minValue = null;
+			if (minValue != null) {
+	    		try {
+	    			m_minValue = Character.valueOf(minValue.charAt(0));
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}			
+			m_maxValue = null;
+			if (maxValue != null) {
+	    		try {
+	    			m_maxValue = Character.valueOf(maxValue.charAt(0));
+	    		}
+	    		catch (NumberFormatException nfe) {
+	    			FailureHandler.handle(nfe);
+	    		}
+			}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			Character charValue = null;
+			try {
+				charValue = Character.valueOf(value.charAt(0));
+			}
+    		catch (NumberFormatException nfe) {
+    			return nfe.getMessage();
+    		}
+			if (charValue != null) {				
+				if (m_minValue != null) {
+					if (charValue.charValue() < m_minValue.charValue()) {
+						return MessageUtils.get("configMinValue", m_minValue.charValue());
+					}
+				}
+				if (m_maxValue != null) {
+					if (charValue.charValue() > m_maxValue.charValue()) {
+						return MessageUtils.get("configMaxValue", m_maxValue.charValue());
+					}
+				}
+			}
+			return null;
+		}    	
+    }
+
+
+    private static class StringValidator implements Validator {
+
+    	private int m_minValue = 0;
+    	private int m_maxValue = 255;
+    	
+    	public StringValidator(String minValue, String maxValue) {
+    		if (minValue != null) {
+    			try {
+    				m_minValue = Integer.parseInt(minValue);
+    			}
+    			catch (NumberFormatException nfe) {
+    				FailureHandler.handle(nfe);
+    			}
+    		}
+    		if (maxValue != null) {
+    			try {
+    				m_maxValue = Integer.parseInt(maxValue);
+    			}
+    			catch (NumberFormatException nfe) {
+    				FailureHandler.handle(nfe);
+    			}
+    		}
+    	}
+    	
+		public String validate(Field<?> field, String value) {
+			if (value.length() > m_maxValue) {
+				return MessageUtils.get("configMaxValue", (m_maxValue + 1));
+			}
+			if (value.length() < m_minValue) {
+				return MessageUtils.get("configMinValue", m_minValue);
+			}
+			return null;
+		}
+    	
+    }
+
+    private static class BytePropertyEditor extends NumberPropertyEditor
+    {
+		@Override
+		public String getStringValue(Number value) {
+			return value.toString();
+		}
+
+		@Override
+		public Number convertStringValue(String value) {
+			return Byte.valueOf(value);
+		}
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/ServiceConfiguration.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/ServiceConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..75b96e79640500d12ac492a9acafecd38064a565
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/ServiceConfiguration.java
@@ -0,0 +1,250 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.configuration;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtConfigComponent;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtComponentService;
+import org.eclipse.kura.web.shared.service.GwtComponentServiceAsync;
+
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.Info;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class ServiceConfiguration extends LayoutContainer 
+{
+
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtComponentServiceAsync gwtComponentService = GWT.create(GwtComponentService.class);
+	
+	@SuppressWarnings("unused")
+	private GwtSession           m_currentSession;
+	private GwtConfigComponent   m_configComponent;
+	
+    private boolean    		     m_dirty;
+    private boolean              m_initialized;
+
+    private ServiceTree          m_serviceTree;
+    private DeviceConfigPanel    m_devConfPanel;
+
+    private ToolBar              m_toolBar;
+    private Button               m_apply;
+    private Button               m_reset;
+        
+    
+    public ServiceConfiguration(GwtSession currentSession,
+    						    GwtConfigComponent configComponent,
+    						    ServiceTree serviceTree)
+    {
+    	m_serviceTree     = serviceTree;
+    	m_currentSession  = currentSession;
+    	m_configComponent = configComponent;
+        m_dirty           = false;
+    	m_initialized     = false;    	
+    }
+    
+
+    public GwtConfigComponent getGwtConfigComponent()
+    {
+    	return m_configComponent;
+    }
+    
+
+    protected void onRender(Element parent, int index) 
+    {        
+        super.onRender(parent, index);        
+        setLayout(new FitLayout());
+        setBorders(false);
+        setId("services-config-panel-wrapper");
+        
+        // init components
+        initToolBar();
+        initConfigPanel();
+
+		ContentPanel devicesConfigurationPanel = new ContentPanel();
+		devicesConfigurationPanel.setBorders(false);
+		devicesConfigurationPanel.setBodyBorder(false);
+		devicesConfigurationPanel.setHeaderVisible(false);
+		devicesConfigurationPanel.setLayout( new FitLayout());
+		devicesConfigurationPanel.setScrollMode(Scroll.AUTO);
+        devicesConfigurationPanel.setTopComponent(m_toolBar);
+		devicesConfigurationPanel.add(m_devConfPanel);
+
+        add(devicesConfigurationPanel);
+        m_initialized = true;
+    }
+    
+    protected void onDetach()
+    {
+    	m_dirty = false;
+    }
+    
+    
+    private void initToolBar() 
+    {	
+        m_toolBar = new ToolBar();
+        m_toolBar.setBorders(true);
+        m_toolBar.setId("services-config-toolbar");
+        
+        m_apply = new Button(MSGS.apply(), 
+        		AbstractImagePrototype.create(Resources.INSTANCE.accept()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+                apply();
+            }
+        });
+
+        m_reset = new Button(MSGS.reset(), 
+        		AbstractImagePrototype.create(Resources.INSTANCE.cancel()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+                reset();
+            }
+        });
+
+        m_apply.setEnabled(false);
+        m_reset.setEnabled(false);
+
+        m_toolBar.add(m_apply);
+        m_toolBar.add(new SeparatorToolItem());
+        m_toolBar.add(m_reset);
+    }
+    
+    
+
+	private void initConfigPanel() 
+    {    
+		if (m_configComponent != null) {
+			
+			m_devConfPanel = new DeviceConfigPanel(m_configComponent);
+			m_devConfPanel.addListener(Events.Change, new Listener<BaseEvent>() {
+				public void handleEvent(BaseEvent be) {
+			        m_apply.setEnabled(true);
+			        m_reset.setEnabled(true);
+			        m_dirty = true;
+				}
+			});
+		}    	
+    }
+
+    
+    
+    // --------------------------------------------------------------------------------------
+    //
+    //    Device Configuration Management
+    //
+    // --------------------------------------------------------------------------------------    
+    
+	public boolean isDirty()
+	{
+		return m_dirty;
+	}
+
+	public void setDirty(boolean dirty)
+	{
+		m_dirty = dirty;
+	}
+
+	
+    public void refresh() {
+
+		if (m_dirty && m_initialized) {
+			
+			// clear the tree and disable the toolbar
+	        m_apply.setEnabled(false);
+	        m_reset.setEnabled(false);
+		}
+	}
+
+        
+    public void apply() 
+    {
+    	if (!m_devConfPanel.isValid()) {
+    		MessageBox mb = new MessageBox();
+    		mb.setIcon(MessageBox.ERROR);
+    		mb.setMessage(MSGS.deviceConfigError());
+    		mb.show();
+    		return;
+    	}
+    	
+        // ask for confirmation            
+    	String componentName = m_devConfPanel.getConfiguration().getComponentName();
+    	String message = MSGS.deviceConfigConfirmation(componentName);
+    	final boolean isCloudUpdate = "CloudService".equals(componentName);
+    	if (isCloudUpdate) {
+    		message = MSGS.deviceCloudConfigConfirmation(componentName);
+    	}    	
+        MessageBox.confirm(MSGS.confirm(), 
+        	message, 
+            new Listener<MessageBoxEvent>() {  
+                public void handleEvent(MessageBoxEvent ce) {
+                    
+                    // if confirmed, push the update
+                    // if confirmed, delete
+                    Dialog  dialog = ce.getDialog(); 
+                    if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+                    	
+                    	// start the configuration update
+                    	m_dirty = false;
+                    	m_devConfPanel.mask(MSGS.applying());
+                    	m_serviceTree.mask(MSGS.applying());
+                		final GwtConfigComponent configComponent = m_devConfPanel.getUpdatedConfiguration();
+						gwtComponentService.updateComponentConfiguration(configComponent, new AsyncCallback<Void>() {
+							public void onFailure(Throwable caught) {
+								m_devConfPanel.unmask();
+								m_serviceTree.unmask();
+								FailureHandler.handle(caught);  			                    
+								m_serviceTree.refreshServicePanel();
+							}            
+							public void onSuccess(Void arg0) {
+								Info.display(MSGS.info(), MSGS.deviceConfigApplied());
+								m_serviceTree.refreshServicePanel();
+								m_devConfPanel.unmask();
+								m_serviceTree.unmask();
+							}
+						});
+                    }
+                }
+        	});
+    }
+
+    
+    public void reset() {
+    	
+    	// refresh the list
+    	// and reselect the item
+    	m_serviceTree.refreshServicePanel();
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/ServiceTree.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/ServiceTree.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a1cf0d72a7a74b6d7e285c9910ceb655e11a4f9
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/configuration/ServiceTree.java
@@ -0,0 +1,385 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.configuration;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.ScaledAbstractImagePrototype;
+import org.eclipse.kura.web.shared.model.GwtConfigComponent;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtComponentService;
+import org.eclipse.kura.web.shared.service.GwtComponentServiceAsync;
+
+import com.extjs.gxt.ui.client.data.BaseTreeLoader;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.ModelIconProvider;
+import com.extjs.gxt.ui.client.data.ModelKeyProvider;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionEvent;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.util.IconHelper;
+import com.extjs.gxt.ui.client.util.Util;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnData;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.MarginData;
+import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid;
+import com.extjs.gxt.ui.client.widget.treegrid.WidgetTreeGridCellRenderer;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ServiceTree extends ContentPanel
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final GwtComponentServiceAsync gwtComponentService = GWT.create(GwtComponentService.class);
+
+	private GwtSession           m_currentSession;
+
+	private ContentPanel         m_centerPanel;
+	private ServiceConfiguration m_serviceConfiguration; 
+	
+    @SuppressWarnings("rawtypes")
+	private BaseTreeLoader       m_loader;
+
+	private TreeStore<ModelData> m_servicesStore; 
+	private TreeGrid<ModelData>  m_servicesTree;
+
+	
+    public ServiceTree(GwtSession currentSession,
+    				   ContentPanel centerPanel) 
+    {
+		m_currentSession = currentSession;    
+		m_centerPanel    = centerPanel;
+    }
+
+    
+	protected void onRender(Element parent, int index) 
+	{
+		super.onRender(parent, index);
+
+		setBorders(false);
+		setBodyBorder(true);
+		setAnimCollapse(true);
+		setHeaderVisible(true);
+		setHeading(MSGS.services());
+		setLayout( new FitLayout());
+		initServiceTree();
+		add(m_servicesTree, new MarginData(0, 0, 0, 0));
+	}
+	
+	
+	public boolean isDirty()
+	{
+		return (m_serviceConfiguration != null && m_serviceConfiguration.isDirty());
+	}
+	
+	
+	@SuppressWarnings("unchecked")
+	private void initServiceTree() 
+	{
+		//
+		// Service Tree
+        // loader and store
+        RpcProxy<List<GwtConfigComponent>> proxy = new RpcProxy<List<GwtConfigComponent>>() {  
+            @Override  
+            protected void load(Object loadConfig, final AsyncCallback<List<GwtConfigComponent>> callback) {
+            	gwtComponentService.findComponentConfigurations( new AsyncCallback<List<GwtConfigComponent>>() {
+					public void onFailure(Throwable caught) {
+						FailureHandler.handle(caught);
+					}
+					public void onSuccess(List<GwtConfigComponent> results) {
+						callback.onSuccess(results);
+					}
+				});
+            }
+        };
+
+        m_loader = new BaseTreeLoader<GwtConfigComponent>(proxy);        
+        m_servicesStore = new TreeStore<ModelData>(m_loader);
+        m_servicesStore.setKeyProvider( new ModelKeyProvider<ModelData>() {            
+            public String getKey(ModelData component) {
+            	if (component instanceof GwtConfigComponent) {
+            		return ((GwtConfigComponent) component).getComponentId();
+            	}
+                return component.toString();
+            }
+        });
+        
+        ColumnConfig name1 = new ColumnConfig("componentName", "Name", 100);
+        name1.setRenderer(new WidgetTreeGridCellRenderer<ModelData>(){
+            @Override
+            public Widget getWidget(ModelData model, String property, ColumnData config, int rowIndex, int colIndex,
+                                    ListStore<ModelData> store, Grid<ModelData> grid) {         
+                Label label = new Label((String)model.get(property));
+                label.setStyleAttribute("padding-left", "5px");
+                return label;
+            }
+        });
+        ColumnModel cm1 = new ColumnModel(Arrays.asList(name1));
+
+        m_servicesTree = new TreeGrid<ModelData>(m_servicesStore, cm1);
+        m_servicesTree.setId("nav-services");
+        m_servicesTree.setBorders(false);
+        m_servicesTree.setHideHeaders(true);
+        m_servicesTree.setAutoExpandColumn("componentName");
+        m_servicesTree.getTreeView().setRowHeight(36);
+        m_servicesTree.setIconProvider( new ModelIconProvider<ModelData>() {
+			public AbstractImagePrototype getIcon(ModelData model) {
+				if (model.get("componentIcon") != null) {										
+					String icon = (String) model.get("componentIcon");
+            		if ("CloudService".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.cloud32());
+            		}
+            		if ("DiagnosticsService".equals(icon)) {
+                        return AbstractImagePrototype.create(Resources.INSTANCE.diagnostics32());
+					} 
+            		else if ("ClockService".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.clock32());
+            		}
+            		else if ("DataService".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.databaseConnect32());
+            		}
+            		else if ("MqttDataTransport".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.mqtt32());
+            		}
+            		else if ("PositionService".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.gps32());
+            		}
+            		else if ("WatchdogService".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.dog32());
+            		}
+                    else if ("SslManagerService".equals(icon)) {
+                        return AbstractImagePrototype.create(Resources.INSTANCE.lock32());
+                    }
+            		else if ("VpnService".equals(icon)) {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.vpn32());
+            		}
+            		else if (icon != null && 
+            				(icon.toLowerCase().startsWith("http://") ||
+            			     icon.toLowerCase().startsWith("https://")) &&
+            				Util.isImagePath(icon)) {
+            			return new ScaledAbstractImagePrototype(IconHelper.createPath(icon, 32, 32));
+            		}
+            		else {
+            			return AbstractImagePrototype.create(Resources.INSTANCE.plugin32());
+            		}
+				} else {
+					return AbstractImagePrototype.create(Resources.INSTANCE.plugin32());
+				}
+			}
+        });
+        
+        //
+        // Selection Listener for the component
+        // make sure the form is not dirty before switching.
+        final ServiceTree theServiceTree = this;
+        m_servicesTree.getSelectionModel().addListener(Events.BeforeSelect, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {				
+				final BaseEvent theEvent = be;				
+            	SelectionEvent<ModelData> se = (SelectionEvent<ModelData>) be;                	
+            	final GwtConfigComponent componentToSwitchTo = (GwtConfigComponent) se.getModel();
+				if (m_serviceConfiguration != null && m_serviceConfiguration.isDirty()) {
+			        
+					// cancel the event first
+                	theEvent.setCancelled(true);
+                	
+                	// need to reselect the current entry
+                	// as the BeforeSelect event cleared it
+                	// we need to do this without raising events
+					m_servicesTree.getSelectionModel().setFiresEvents(false);
+					m_servicesTree.getSelectionModel().select(false, m_serviceConfiguration.getGwtConfigComponent());
+					m_servicesTree.getSelectionModel().setFiresEvents(true);
+
+                	// ask for confirmation before switching
+                	MessageBox.confirm(MSGS.confirm(), 
+			            	MSGS.deviceConfigDirty(),
+			                new Listener<MessageBoxEvent>() {  
+			                    public void handleEvent(MessageBoxEvent ce) {
+                                    // if confirmed, switch
+                                    Dialog  dialog = ce.getDialog(); 
+                                    if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+                            			List<Component> comps = m_centerPanel.getItems();
+                            			if (comps != null && comps.size() > 0) {
+                            				m_centerPanel.removeAll();
+                            			}
+                                		m_centerPanel.setHeading(componentToSwitchTo.getComponentName());
+                                		m_serviceConfiguration = new ServiceConfiguration(m_currentSession, componentToSwitchTo, theServiceTree);
+                                		m_centerPanel.add(m_serviceConfiguration);
+                                		m_centerPanel.layout();
+                                    	m_servicesTree.getSelectionModel().select(false, componentToSwitchTo);
+                                    	theServiceTree.fireEvent(Events.Select);
+                                    }
+			                    }
+			        });
+				}
+				else {
+
+					m_servicesTree.getSelectionModel().setFiresEvents(false);
+
+					List<Component> comps = m_centerPanel.getItems();
+					if (comps != null && comps.size() > 0) {
+						m_centerPanel.removeAll();
+					}
+            		m_centerPanel.setHeading(componentToSwitchTo.getComponentName());
+            		m_serviceConfiguration = new ServiceConfiguration(m_currentSession, componentToSwitchTo, theServiceTree);
+            		m_centerPanel.add(m_serviceConfiguration);
+            		m_centerPanel.layout();
+                	m_servicesTree.getSelectionModel().select(false, componentToSwitchTo);
+					
+                	m_servicesTree.getSelectionModel().setFiresEvents(true);
+                	theServiceTree.fireEvent(Events.Select);
+				}
+			}	
+        });
+        
+        //
+        // on selection, complete the switch
+//        final ServiceTree theServiceTree = this;
+//        m_servicesTree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
+//        m_servicesTree.getSelectionModel().addSelectionChangedListener( new SelectionChangedListener<ModelData>() {
+//            @Override
+//            public void selectionChanged(SelectionChangedEvent<ModelData> se) {
+//
+//            	GwtConfigComponent configComponent = (GwtConfigComponent) se.getSelectedItem();
+//            	if (configComponent != null) {            		
+//            		
+//            		m_centerPanel.removeAll();
+//            		
+//            		m_centerPanel.setHeading(configComponent.getComponentName());
+//            		m_serviceConfiguration = new ServiceConfiguration(m_currentSession, configComponent, theServiceTree);
+//            		m_centerPanel.add(m_serviceConfiguration);
+//            		m_centerPanel.layout();
+//            		
+//            		theServiceTree.fireEvent(Events.Select);
+//            	}
+//            }
+//        });
+        
+        m_loader.addLoadListener( new DataLoadListener(m_servicesTree, m_centerPanel));
+	}
+
+	
+	
+	
+	public void refreshServicePanel()
+	{
+		m_loader.load();
+	}
+	
+	
+	public void clearSelection()
+	{
+		m_servicesTree.getSelectionModel().deselectAll();
+	}
+	
+	
+	
+    // --------------------------------------------------------------------------------------
+    //
+    //    Data Load Listener
+    //
+    // --------------------------------------------------------------------------------------
+
+    private class DataLoadListener extends LoadListener
+    {
+    	private TreeGrid<ModelData> m_servicesTree; 
+        private GwtConfigComponent  m_selectedComponent;
+        private ContentPanel		m_centerPanel;
+
+        
+        public DataLoadListener(TreeGrid<ModelData> servicesTree, ContentPanel centerPanel) {
+        	m_servicesTree      = servicesTree;
+        	m_selectedComponent = null;
+        	m_centerPanel		= centerPanel;
+        }
+        
+        
+        public void loaderBeforeLoad(LoadEvent le) {
+        	m_servicesTree.mask(MSGS.loading());
+        	m_centerPanel.mask(MSGS.loading());
+        	m_selectedComponent = (GwtConfigComponent) m_servicesTree.getSelectionModel().getSelectedItem();
+        }
+        
+        
+        public void loaderLoad(LoadEvent le) 
+        {
+            m_servicesTree.unmask();
+            m_centerPanel.unmask();
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        	
+            if (m_selectedComponent != null) {
+            	boolean bSelectedComponent = false;
+            	ListStore<ModelData> store = m_servicesTree.getStore();
+            	for (ModelData md : store.getModels()) {            		
+            		GwtConfigComponent gwtConfigComp = (GwtConfigComponent) md;
+            		if (gwtConfigComp.getComponentId().equals(m_selectedComponent.getComponentId())) {
+                    	m_servicesTree.getSelectionModel().select(gwtConfigComp, false);
+                    	m_servicesTree.getView().focusRow(store.indexOf(gwtConfigComp));
+                    	bSelectedComponent = true;
+                    	break;            			
+            		}
+            	}
+            	if (!bSelectedComponent) {
+            		// select the first entry if we cannot carry it 
+            		// forward from the previous selection
+                	m_servicesTree.getSelectionModel().select(0, false);
+                	m_servicesTree.getView().focusRow(0);            		
+            	}
+            }
+        }
+
+        
+        public void loaderLoadException(LoadEvent le) 
+        {            
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+
+        	List<ModelData> comps = new ArrayList<ModelData>();
+    		GwtConfigComponent comp = new GwtConfigComponent();
+    		comp.setComponentId(MSGS.deviceNoDeviceSelected());
+    		comp.setComponentName(MSGS.deviceNoComponents());
+    		comp.setComponentDescription(MSGS.deviceNoConfigSupported());
+    		comps.add(comp);
+    		m_servicesStore.removeAll();
+    		m_servicesStore.add(comps, false);
+
+    		m_servicesTree.unmask();
+    		m_centerPanel.unmask();
+        }
+    }	
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/denali.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/denali.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac7ecf01cedab8a0710c400d96043453e34365da
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/denali.java
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.GXT;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.util.Theme;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.HorizontalPanel;
+import com.extjs.gxt.ui.client.widget.Viewport;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.TableData;
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.core.client.ScriptInjector;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.RootPanel;
+
+/**
+ * Entry point classes define <code>onModuleLoad()</code>.
+ */
+public class denali implements EntryPoint 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	//private final boolean VIEW_LOG = true;
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+
+	/**
+	 * Note, we defer all application initialization code to
+	 * {@link #onModuleLoad2()} so that the UncaughtExceptionHandler can catch
+	 * any unexpected exceptions.
+	 */
+	public void onModuleLoad() 
+	{
+		/*
+	     * Install an UncaughtExceptionHandler which will produce <code>FATAL</code> log messages
+	     */
+	    Log.setUncaughtExceptionHandler();
+
+	    /*
+	    // Disable the web UI log view unless VIEW_LOG is set to true
+	    if (!VIEW_LOG) {
+	    	Widget divLogger = Log.getLogger(DivLogger.class).getWidget();
+	    	divLogger.setVisible(false);
+	    }
+	    */
+		// use deferred command to catch initialization exceptions in
+		// onModuleLoad2
+		Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+			public void execute() {
+				onModuleLoad2();
+			}
+		});
+	}
+
+	
+	/**
+	 * This is the 'real' entry point method.
+	 */
+	public void onModuleLoad2() {
+
+		// set the default theme
+		GXT.setDefaultTheme(Theme.GRAY, true);
+		
+		// load custom CSS/JS
+    	loadCss("denali/skin/skin.css");
+    	ScriptInjector.fromUrl("skin/skin.js?v=1").inject(); // Make sure this request is not cached
+		
+		gwtDeviceService.findSystemProperties( new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {    				
+			public void onSuccess(ListLoadResult<GwtGroupedNVPair> results) {
+				
+				GwtSession gwtSession = new GwtSession();
+				
+				if (results != null) {
+					List<GwtGroupedNVPair> pairs = results.getData();
+					if (pairs != null) {
+						for (GwtGroupedNVPair pair : pairs) {
+							String name = pair.getName();
+							if (name != null && name.equals("kura.have.net.admin")) {
+								Boolean value = Boolean.valueOf(pair.getValue());
+								gwtSession.setNetAdminAvailable(value);
+							}
+							if (name != null && name.equals("kura.version")) {
+								gwtSession.setKuraVersion(pair.getValue());
+							}
+							if (name != null && name.equals("kura.os.version")) {
+								gwtSession.setOsVersion(pair.getValue());
+							}
+						}
+					}
+				}
+				
+				render(gwtSession);
+			}
+			
+			public void onFailure(Throwable caught) {
+				FailureHandler.handle(caught);
+				render( new GwtSession());
+			}
+		});
+	}
+	
+	private static native void loadCss(String url) /*-{
+		var l = $doc.createElement("link");
+		l.setAttribute("id", url);
+		l.setAttribute("rel", "stylesheet");
+		l.setAttribute("type", "text/css");
+		l.setAttribute("href", url + "?v=1"); // Make sure this request is not cached
+		$doc.getElementsByTagName("head")[0].appendChild(l);
+	}-*/;
+	
+    private void render(GwtSession gwtSession) 
+    {    	
+    	Log.debug("Beginning page render");
+    	
+        final Viewport viewport = new Viewport();
+        
+        final BorderLayout borderLayout = new BorderLayout();
+        viewport.setLayout(borderLayout);
+        viewport.setStyleAttribute("padding", "5px");
+        
+        //
+        // north
+        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 52);  
+        northData.setCollapsible(false);  
+        northData.setFloatable(false);  
+        northData.setHideCollapseTool(false);  
+        northData.setSplit(false);
+        northData.setMargins(new Margins(0, 0, 5, 0));  
+        viewport.add(new NorthView(gwtSession), northData);
+
+        //
+        // center
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);  
+        centerData.setMargins(new Margins(0));  
+
+        ContentPanel center = new ContentPanel();
+        center.setLayout(new FitLayout());
+        center.setBorders(false);
+        center.setBodyBorder(false);
+        center.setId("center-panel-wrapper");
+        viewport.add(center, centerData);
+        
+        //
+        // west
+        BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 180);  
+        westData.setSplit(true);  
+        westData.setCollapsible(true);  
+        westData.setMargins(new Margins(0,5,0,0));
+        WestNavigationView westView = new WestNavigationView(gwtSession, center);
+        viewport.add(westView, westData);
+
+        //
+        // south
+        BorderLayoutData southData = new BorderLayoutData(LayoutRegion.SOUTH, 18);  
+        southData.setCollapsible(false);  
+        southData.setFloatable(false);  
+        southData.setHideCollapseTool(false);  
+        southData.setSplit(false);
+        southData.setMargins(new Margins(3, 5, 0, 0));
+        
+        HorizontalPanel south = new HorizontalPanel();
+        south.setTableWidth("100%");
+        south.setId("south-panel-wrapper");
+        Label copyright = new Label(MSGS.copyright());
+        copyright.setStyleName("x-form-label");
+        TableData td = new TableData();
+        td.setHorizontalAlign(HorizontalAlignment.LEFT);
+        south.add(copyright, td);
+        
+        Label version = new Label(gwtSession.getKuraVersion());
+        version.setStyleName("x-form-label");
+        TableData tdVersion = new TableData();
+        tdVersion.setHorizontalAlign(HorizontalAlignment.RIGHT);
+        south.add(version, tdVersion);
+
+        viewport.add(south, southData);
+
+        //
+        // Initial Selection
+//        center.setIconAbstractImagePrototype.create(Resources.INSTANCE.alerts()));
+//        center.setHeading(MSGS.announcements());
+//        center.removeAll();                  
+//        center.add(new Overview(currentSession));
+//        center.layout();
+
+        //
+        // RootPanel
+        RootPanel.get().add(viewport);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/BundlesTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/BundlesTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ce59388dc9e181d8a6b242fd8a9eff3066ad8a2
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/BundlesTab.java
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridView;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+public class BundlesTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession      m_currentSession;
+    private boolean         m_initialized;
+	
+	private Grid<GwtGroupedNVPair> m_grid;
+	private ListStore<GwtGroupedNVPair> m_store;	
+	private BaseListLoader<ListLoadResult<GwtGroupedNVPair>> m_loader;	
+    
+	
+    public BundlesTab(GwtSession currentSession) {
+        m_currentSession = currentSession;
+    	m_initialized    = false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("device-bundles");
+
+        RpcProxy<ListLoadResult<GwtGroupedNVPair>> proxy = new RpcProxy<ListLoadResult<GwtGroupedNVPair>>() {  
+            @Override  
+            protected void load(Object loadConfig, final AsyncCallback<ListLoadResult<GwtGroupedNVPair>> callback) {
+            	gwtDeviceService.findBundles( new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {    				
+    				public void onSuccess(ListLoadResult<GwtGroupedNVPair> pairs) {
+    					callback.onSuccess(pairs);
+    				}    				
+    				public void onFailure(Throwable caught) {
+    					FailureHandler.handle(caught);
+    				}
+    			});
+            }
+        };
+
+        m_loader = new BaseListLoader<ListLoadResult<GwtGroupedNVPair>>(proxy);
+
+        m_store = new ListStore<GwtGroupedNVPair>(m_loader);  
+
+        ColumnConfig id  = new ColumnConfig("id",  MSGS.deviceBndId(), 10);  
+        ColumnConfig name  = new ColumnConfig("name",  MSGS.deviceBndName(), 50);  
+        ColumnConfig status = new ColumnConfig("statusLoc", MSGS.deviceBndState(), 20);  
+        ColumnConfig version = new ColumnConfig("version", MSGS.deviceBndVersion(), 20);  
+        
+        List<ColumnConfig> config = new ArrayList<ColumnConfig>();  
+        config.add(id);  
+        config.add(name);  
+        config.add(status);  
+        config.add(version);  
+
+        ColumnModel cm = new ColumnModel(config);    
+      
+        GridView view = new GridView();
+        view.setForceFit(true);
+        
+        m_grid = new Grid<GwtGroupedNVPair>(m_store, cm);  
+        m_grid.setView(view);
+        m_grid.setBorders(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+
+        add(m_grid);
+        m_initialized = true;
+    }
+    
+    
+	public void refresh() 
+	{
+		if (m_initialized) {
+			m_loader.load();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/CommandTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/CommandTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1464aa20d3344c761c11b61e8add8bcbff36e4d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/CommandTab.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FormEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.button.ButtonBar;
+import com.extjs.gxt.ui.client.widget.form.FileUploadField;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Encoding;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Method;
+import com.extjs.gxt.ui.client.widget.form.TextArea;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+public class CommandTab extends LayoutContainer {
+	
+	private static final Messages MSGS = GWT.create(Messages.class);
+	private static final String SERVLET_URL = "/" + GWT.getModuleName() + "/file/command";
+
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+	
+	@SuppressWarnings("unused")
+	private GwtSession			m_currentSession;
+	private LayoutContainer 	m_commandInput;
+	private FormPanel			m_formPanel;
+	private ButtonBar			m_buttonBar;
+	private Button				m_executeButton;
+	private Button				m_resetButton;
+	private LayoutContainer		m_commandOutput;
+	private TextArea			m_result;
+	private TextField<String>	m_commandField;
+	private FileUploadField		m_fileUploadField;
+	
+	public CommandTab(GwtSession currentSession) {
+		m_currentSession = currentSession;
+	}
+	
+	protected void onRender(Element parent, int index) {
+		super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("device-command");
+        
+        FormData formData = new FormData("100%");
+
+        //
+        // Command Form
+        //
+		m_formPanel = new FormPanel();
+		m_formPanel.setFrame(true);
+		m_formPanel.setHeaderVisible(false);
+		m_formPanel.setBorders(false);
+		m_formPanel.setBodyBorder(false);
+		m_formPanel.setAction(SERVLET_URL);
+		m_formPanel.setEncoding(Encoding.MULTIPART);
+		m_formPanel.setMethod(Method.POST);
+
+		m_formPanel.setButtonAlign(HorizontalAlignment.RIGHT);
+		m_buttonBar = m_formPanel.getButtonBar();
+		initButtonBar();
+		
+		m_formPanel.addListener(Events.Submit, new Listener<FormEvent>() {
+			public void handleEvent(FormEvent be) {
+				String htmlResult = be.getResultHtml();
+				if (htmlResult.startsWith("HTTP ERROR")) {
+					MessageBox.info(MSGS.information(), MSGS.fileUploadFailure() + "\n" + htmlResult, null);
+					m_commandInput.unmask();
+				}
+				else {
+					gwtDeviceService.executeCommand(m_commandField.getValue(), new AsyncCallback<String>() {
+						public void onFailure(Throwable caught) {
+							FailureHandler.handle(caught);
+							m_commandInput.unmask();
+						}
+
+						public void onSuccess(String result) {
+							m_result.clear();
+							m_result.setValue(result);
+							m_commandInput.unmask();
+						}
+					});
+				}
+			}
+		});
+		
+		//
+		// Command Output
+		//
+		m_commandOutput = new LayoutContainer();
+		m_commandOutput.setBorders(false);
+		m_commandOutput.setWidth("99.5%");
+		m_commandOutput.setLayout(new FitLayout());
+		        
+		m_result = new TextArea();
+		m_result.setBorders(false);
+		m_result.setReadOnly(true);
+		m_result.setEmptyText(MSGS.deviceCommandNoOutput());
+        m_commandOutput.add(m_result);
+        
+        //
+        // Input and Upload
+        //
+        m_commandField = new TextField<String>();
+		m_commandField.setName("command");
+		m_commandField.setAllowBlank(false);
+		m_commandField.setFieldLabel(MSGS.deviceCommandExecute());
+		m_formPanel.add(m_commandField, formData);
+
+		m_fileUploadField = new FileUploadField();
+		m_fileUploadField.setAllowBlank(true);
+		m_fileUploadField.setName("file");
+		m_fileUploadField.setFieldLabel("File");
+		m_formPanel.add(m_fileUploadField, formData);
+
+		m_commandInput = m_formPanel;
+		
+		// Main Panel
+		ContentPanel deviceCommandPanel = new ContentPanel();
+		deviceCommandPanel.setBorders(false);
+		deviceCommandPanel.setBodyBorder(false);
+		deviceCommandPanel.setHeaderVisible(false);
+		deviceCommandPanel.setScrollMode(Scroll.AUTO);
+		deviceCommandPanel.setLayout(new FitLayout());
+
+		deviceCommandPanel.setTopComponent(m_commandInput);
+		deviceCommandPanel.add(m_commandOutput);
+
+		add(deviceCommandPanel);
+	}
+	
+	private void initButtonBar() {
+		m_executeButton = new Button(MSGS.deviceCommandExecute());
+		m_executeButton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
+			@Override  
+			public void componentSelected(ButtonEvent ce) {
+				if (m_formPanel.isValid()) {
+					m_result.clear();
+					m_commandInput.mask(MSGS.waiting());
+		
+					m_formPanel.submit();
+				}
+			}
+		});
+
+		m_resetButton = new Button(MSGS.reset());
+		m_resetButton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+				m_formPanel.reset();
+            }
+        });
+
+		m_buttonBar.add(m_resetButton);
+		m_buttonBar.add(m_executeButton);
+    }
+	
+	public void refresh() {
+		m_commandInput.unmask();
+	}
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/DevicePanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/DevicePanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..ede25088fd55ada01237c6fdb5c163a37820a9f8
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/DevicePanel.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class DevicePanel extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+    @SuppressWarnings("unused")
+	private boolean                m_initialized;
+	private GwtSession             m_currentSession;
+
+	private DeviceTabs      m_deviceConfigTabs; 
+			
+    public DevicePanel(GwtSession currentSession) {
+    	m_currentSession  = currentSession;
+    	m_initialized     = false;
+    }
+
+    protected void onRender(Element parent, int index) {
+        
+        super.onRender(parent, index);
+        setId("device-panel-wrapper");
+        
+        m_deviceConfigTabs = new DeviceTabs(m_currentSession);
+        
+        BorderLayout borderLayout = new BorderLayout();
+        setLayout(borderLayout);
+        setBorders(true);
+
+        //
+        // north
+        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 10);  
+        northData.setMargins(new Margins(10, 25, 5, 25));
+        Label intro = new Label(MSGS.deviceIntro());
+        intro.setId("device-label");
+        add(intro, northData);
+
+        //
+        // center
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);  
+        centerData.setMargins(new Margins(10, 25, 25, 25));          
+        add(m_deviceConfigTabs, centerData);
+        addStyleName("device-panel-wrapper");
+                
+        m_initialized = true;
+    }    
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/DeviceTabs.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/DeviceTabs.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f88c86bbf3ffc8cf39830007a659965af191826
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/DeviceTabs.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.TabItem;
+import com.extjs.gxt.ui.client.widget.TabPanel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class DeviceTabs extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private GwtSession				m_currentSession;
+	
+	private TabPanel				m_tabsPanel;
+	private TabItem					m_tabProfile;
+	private TabItem					m_tabBundles;
+	private TabItem					m_tabThreads;
+	private TabItem					m_tabSysProps;
+	private TabItem					m_tabCommand;
+	
+	private ProfileTab				m_profileTab;
+	private BundlesTab		        m_bundlesTab;
+	private ThreadsTab		        m_threadsTab;
+	private SystemPropertiesTab		m_sysPropsTab;
+	private CommandTab				m_commandTab;
+	
+	public DeviceTabs(GwtSession currentSession) {	    
+		m_currentSession = currentSession;
+		m_profileTab  = new ProfileTab(m_currentSession);
+		m_bundlesTab  = new BundlesTab(m_currentSession);
+		m_threadsTab  = new ThreadsTab(m_currentSession);
+		m_sysPropsTab = new SystemPropertiesTab(m_currentSession);
+		m_commandTab  = new CommandTab(m_currentSession);
+	}
+
+
+	protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);
+        
+        setLayout(new FitLayout());
+        setId("device-tabs-wrapper");
+        
+        m_tabsPanel = new TabPanel();
+        m_tabsPanel.setPlain(true);
+        m_tabsPanel.setBorders(false);
+        m_tabsPanel.setStyleAttribute("padding-top", "5px");
+        
+        m_tabProfile = new TabItem(MSGS.deviceTabProfile());
+        m_tabProfile.setBorders(true);
+        m_tabProfile.setLayout(new FitLayout());
+        m_tabProfile.add(m_profileTab);
+        m_tabProfile.addListener(Events.Select, new Listener<ComponentEvent>() {  
+            public void handleEvent(ComponentEvent be) {  
+            	m_profileTab.refresh();
+            }  
+        });
+        m_tabsPanel.add(m_tabProfile);
+
+        m_tabBundles = new TabItem(MSGS.deviceTabBundles());
+        m_tabBundles.setBorders(true);
+        m_tabBundles.setLayout(new FitLayout());
+        m_tabBundles.add(m_bundlesTab);
+        m_tabBundles.addListener(Events.Select, new Listener<ComponentEvent>() {  
+            public void handleEvent(ComponentEvent be) {  
+            	m_bundlesTab.refresh();
+            }  
+        });
+        m_tabsPanel.add(m_tabBundles);
+
+        m_tabThreads = new TabItem(MSGS.deviceTabThreads());
+        m_tabThreads.setBorders(true);
+        m_tabThreads.setLayout(new FitLayout());
+        m_tabThreads.add(m_threadsTab);
+        m_tabThreads.addListener(Events.Select, new Listener<ComponentEvent>() {  
+            public void handleEvent(ComponentEvent be) {  
+            	m_threadsTab.refresh();
+            }  
+        });
+        m_tabsPanel.add(m_tabThreads);
+
+        m_tabSysProps = new TabItem(MSGS.deviceTabSystemProperties());
+        m_tabSysProps.setBorders(true);
+        m_tabSysProps.setLayout(new FitLayout());
+        m_tabSysProps.add(m_sysPropsTab);
+        m_tabSysProps.addListener(Events.Select, new Listener<ComponentEvent>() {  
+            public void handleEvent(ComponentEvent be) {  
+            	m_sysPropsTab.refresh();
+            }  
+        });
+        m_tabsPanel.add(m_tabSysProps);
+        
+        m_tabCommand = new TabItem(MSGS.deviceTabCommand());
+        m_tabCommand.setBorders(true);
+        m_tabCommand.setLayout(new FitLayout());
+        m_tabCommand.add(m_commandTab);
+        m_tabCommand.addListener(Events.Select, new Listener<ComponentEvent>() {
+        	public void handleEvent(ComponentEvent be) {
+        		m_commandTab.refresh();
+        	}
+        });
+        m_tabsPanel.add(m_tabCommand);
+
+        add(m_tabsPanel);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/ProfileTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/ProfileTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..4058bc427797e1b92a37ff88d628112153d0af18
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/ProfileTab.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.store.GroupingStore;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GroupingView;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+
+public class ProfileTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession      m_currentSession;
+
+    private boolean         m_initialized;
+	
+	private Grid<GwtGroupedNVPair> m_grid;
+	private GroupingStore<GwtGroupedNVPair> m_store;	
+	private BaseListLoader<ListLoadResult<GwtGroupedNVPair>> m_loader;
+    
+    public ProfileTab(GwtSession currentSession) {
+        m_currentSession = currentSession;
+    	m_initialized    = false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setBorders(false);
+        setId("device-profile");
+
+        RpcProxy<ListLoadResult<GwtGroupedNVPair>> proxy = new RpcProxy<ListLoadResult<GwtGroupedNVPair>>() {  
+            @Override  
+            protected void load(Object loadConfig, final AsyncCallback<ListLoadResult<GwtGroupedNVPair>> callback) {
+            	gwtDeviceService.findDeviceConfiguration( new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {    				
+    				public void onSuccess(ListLoadResult<GwtGroupedNVPair> pairs) {
+    					callback.onSuccess(pairs);
+    				}    				
+    				public void onFailure(Throwable caught) {
+    					FailureHandler.handle(caught);
+    				}
+    			});
+            }
+        };
+
+        m_loader = new BaseListLoader<ListLoadResult<GwtGroupedNVPair>>(proxy);
+
+        m_store = new GroupingStore<GwtGroupedNVPair>(m_loader);  
+        m_store.groupBy("groupLoc");  
+
+        ColumnConfig name  = new ColumnConfig("nameLoc", MSGS.devicePropName(), 50);  
+        ColumnConfig value = new ColumnConfig("value", MSGS.devicePropValue(), 50);  
+
+        List<ColumnConfig> config = new ArrayList<ColumnConfig>();  
+        config.add(name);  
+        config.add(value);  
+
+        ColumnModel cm = new ColumnModel(config);    
+        GroupingView view = new GroupingView();  
+        view.setShowGroupedColumn(false);  
+        view.setForceFit(true);  
+      
+        m_grid = new Grid<GwtGroupedNVPair>(m_store, cm);  
+        m_grid.setView(view);  
+        m_grid.setBorders(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+
+        add(m_grid);
+        m_initialized = true;
+    }
+    
+    
+	public void refresh() 
+	{
+		if (m_initialized) {			
+			m_loader.load();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/SystemPropertiesTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/SystemPropertiesTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ad3fed9276e2fd3f39070c4b2d3157ad8bef967
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/SystemPropertiesTab.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.store.GroupingStore;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GroupingView;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+
+public class SystemPropertiesTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession      m_currentSession;
+
+    private boolean         m_initialized;
+	
+	private Grid<GwtGroupedNVPair> m_grid;
+	private GroupingStore<GwtGroupedNVPair> m_store;	
+	private BaseListLoader<ListLoadResult<GwtGroupedNVPair>> m_loader;
+	
+    
+    public SystemPropertiesTab(GwtSession currentSession) {
+        m_currentSession = currentSession;
+    	m_initialized    = false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("device-system-properties");
+
+        RpcProxy<ListLoadResult<GwtGroupedNVPair>> proxy = new RpcProxy<ListLoadResult<GwtGroupedNVPair>>() {  
+            @Override  
+            protected void load(Object loadConfig, final AsyncCallback<ListLoadResult<GwtGroupedNVPair>> callback) {
+    			gwtDeviceService.findSystemProperties( new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {    				
+    				public void onSuccess(ListLoadResult<GwtGroupedNVPair> pairs) {
+    					callback.onSuccess(pairs);
+    				}    				
+    				public void onFailure(Throwable caught) {
+    					FailureHandler.handle(caught);
+    				}
+    			});
+            }
+        };
+
+        m_loader = new BaseListLoader<ListLoadResult<GwtGroupedNVPair>>(proxy);
+
+        m_store = new GroupingStore<GwtGroupedNVPair>(m_loader);  
+        m_store.groupBy("groupLoc");  
+
+        ColumnConfig name  = new ColumnConfig("name",  MSGS.devicePropName(), 50);  
+        ColumnConfig value = new ColumnConfig("value", MSGS.devicePropValue(), 50);  
+
+        List<ColumnConfig> config = new ArrayList<ColumnConfig>();  
+        config.add(name);  
+        config.add(value);  
+
+        ColumnModel cm = new ColumnModel(config);    
+        GroupingView view = new GroupingView();  
+        view.setShowGroupedColumn(false);  
+        view.setForceFit(true);  
+      
+        m_grid = new Grid<GwtGroupedNVPair>(m_store, cm);  
+        m_grid.setView(view);  
+        m_grid.setBorders(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        
+        add(m_grid);
+        m_initialized = true;
+    }
+    
+    
+	public void refresh() 
+	{
+		if (m_initialized) {
+			m_loader.load();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/ThreadsTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/ThreadsTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..d02773e4f496ac4551dcda0ad905d2951008f30e
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/device/ThreadsTab.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.device;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.store.GroupingStore;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GroupingView;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+
+public class ThreadsTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession      m_currentSession;
+
+    private boolean         m_initialized;
+	
+	private Grid<GwtGroupedNVPair> m_grid;
+	private GroupingStore<GwtGroupedNVPair> m_store;	
+	private BaseListLoader<ListLoadResult<GwtGroupedNVPair>> m_loader;	
+    
+    public ThreadsTab(GwtSession currentSession) {
+        m_currentSession = currentSession;
+    	m_initialized    = false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("device-threads");
+
+        RpcProxy<ListLoadResult<GwtGroupedNVPair>> proxy = new RpcProxy<ListLoadResult<GwtGroupedNVPair>>() {  
+            @Override  
+            protected void load(Object loadConfig, final AsyncCallback<ListLoadResult<GwtGroupedNVPair>> callback) {
+            	gwtDeviceService.findThreads( new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {    				
+    				public void onSuccess(ListLoadResult<GwtGroupedNVPair> pairs) {
+    					callback.onSuccess(pairs);
+    				}    				
+    				public void onFailure(Throwable caught) {
+    					FailureHandler.handle(caught);
+    				}
+    			});
+            }
+        };
+
+        m_loader = new BaseListLoader<ListLoadResult<GwtGroupedNVPair>>(proxy);
+
+        m_store = new GroupingStore<GwtGroupedNVPair>(m_loader);  
+        m_store.groupBy("group");  
+
+        ColumnConfig name  = new ColumnConfig("name",  MSGS.deviceThreadName(), 50);  
+        ColumnConfig value = new ColumnConfig("value", MSGS.deviceThreadInfo(), 50);  
+
+        List<ColumnConfig> config = new ArrayList<ColumnConfig>();  
+        config.add(name);  
+        config.add(value);  
+
+        ColumnModel cm = new ColumnModel(config);    
+        GroupingView view = new GroupingView();  
+        view.setShowGroupedColumn(false);  
+        view.setForceFit(true);  
+      
+        m_grid = new Grid<GwtGroupedNVPair>(m_store, cm);  
+        m_grid.setView(view);  
+        m_grid.setBorders(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+
+        add(m_grid);
+        m_initialized = true;
+    }
+    
+    
+	public void refresh() 
+	{
+		if (m_initialized) {
+			m_loader.load();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallButtonBar.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallButtonBar.java
new file mode 100644
index 0000000000000000000000000000000000000000..0eae39ab65dab005210c2be89fabd936739ebf72
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallButtonBar.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
+import org.eclipse.kura.web.shared.model.GwtFirewallPortForwardEntry;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.button.ButtonBar;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class FirewallButtonBar extends LayoutContainer
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession          m_currentSession;
+	private FirewallConfigTabs	m_firewallTabs;
+	
+	private ButtonBar m_buttonBar;
+	private Button    m_applyButton; 
+	
+	public FirewallButtonBar(GwtSession currentSession,
+						    FirewallConfigTabs firewallTabs)
+	{
+        m_currentSession = currentSession;
+        m_firewallTabs   = firewallTabs;
+		
+
+		m_firewallTabs.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				if(m_firewallTabs.isDirty()) {
+					m_buttonBar.enable();
+				} else {
+					m_buttonBar.disable();
+				}
+			}
+		});
+	}
+	
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        
+        m_buttonBar = new ButtonBar();
+        m_buttonBar.setHeight(20);
+        m_buttonBar.setAlignment(HorizontalAlignment.CENTER);
+        
+        m_applyButton = new Button(MSGS.firewallApply(),
+        		AbstractImagePrototype.create(Resources.INSTANCE.accept()),
+                new SelectionListener<ButtonEvent>() {
+            		@Override
+            		public void componentSelected(ButtonEvent ce) {
+            			Log.debug("about to updateDeviceFirewallOpenPorts() and updateDeviceFirewallPortForwards()");
+            			List<GwtFirewallOpenPortEntry> updatedOpenPortConf = m_firewallTabs.getUpdatedOpenPortConfiguration();
+            			List<GwtFirewallPortForwardEntry> updatedPortForwardConf = m_firewallTabs.getUpdatedPortForwardConfiguration();
+
+            			if(updatedOpenPortConf != null) {
+            				Log.debug("got updatedOpenPortConf: " + updatedOpenPortConf.size());
+	            			gwtNetworkService.updateDeviceFirewallOpenPorts(updatedOpenPortConf, new AsyncCallback<Void>() {
+	            				public void onSuccess(Void result) {
+									Log.debug("updated!");
+								}
+	            				
+								public void onFailure(Throwable caught) {
+									Log.debug("caught: " + caught.toString());
+									FailureHandler.handle(caught);
+								}
+	            			});
+            			}
+            			
+            			if(updatedPortForwardConf != null) {
+            				Log.debug("got updatedPortForwardConf: " + updatedPortForwardConf.size());
+	            			gwtNetworkService.updateDeviceFirewallPortForwards(updatedPortForwardConf, new AsyncCallback<Void>() {
+	            				public void onSuccess(Void result) {
+									Log.debug("updated!");
+								}
+	            				
+								public void onFailure(Throwable caught) {
+									Log.debug("caught: " + caught.toString());
+									FailureHandler.handle(caught);
+								}
+	            			});
+            			}
+            		}
+    	});
+        //m_applyButton.setWidth(100);
+        m_buttonBar.add(m_applyButton);
+        
+		m_buttonBar.enable();
+        add(m_applyButton);
+    }	
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallConfigTabs.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallConfigTabs.java
new file mode 100644
index 0000000000000000000000000000000000000000..354def7afa8a2d65d9e23224b4bff30686afae17
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallConfigTabs.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
+import org.eclipse.kura.web.shared.model.GwtFirewallPortForwardEntry;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.TabPanelEvent;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.TabItem;
+import com.extjs.gxt.ui.client.widget.TabPanel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class FirewallConfigTabs extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private GwtSession             m_currentSession;
+	
+	private TabPanel               m_tabsPanel;
+	private TabItem                m_tabOpenPortsConfig;
+	private TabItem                m_tabPortForwardingConfig;
+	
+	private OpenPortsConfigTab	    m_openPortsConfigTab;
+	private PortForwardingConfigTab m_portForwardingConfigTab;
+	
+	private Boolean					m_ignoreEvent;
+	
+	public FirewallConfigTabs(GwtSession currentSession) {
+		m_currentSession   = currentSession;
+		m_ignoreEvent = false;
+		
+		Log.debug("about to get the firewall configuration");
+		initTabs();
+	    
+	}
+	
+    private void initTabs()
+    {
+	    m_openPortsConfigTab = new OpenPortsConfigTab(m_currentSession);
+		if (m_tabOpenPortsConfig != null) {
+			m_tabOpenPortsConfig.add(m_openPortsConfigTab);
+			m_tabOpenPortsConfig.layout();
+		}
+
+		m_portForwardingConfigTab = new PortForwardingConfigTab(m_currentSession);
+		if (m_tabPortForwardingConfig != null) {
+			m_tabPortForwardingConfig.add(m_portForwardingConfigTab);
+			m_tabPortForwardingConfig.layout();
+		}
+    }
+    
+    public boolean isDirty() {
+    	
+    	if (m_openPortsConfigTab.isDirty()) {
+    		return true;
+    	}
+    	if (m_portForwardingConfigTab.isDirty()) {
+    		return true;
+    	}
+    	
+    	return false;
+    }
+    
+    public List<GwtFirewallOpenPortEntry> getUpdatedOpenPortConfiguration() {
+    	return m_openPortsConfigTab.getCurrentConfigurations();
+    }
+    
+    public List<GwtFirewallPortForwardEntry> getUpdatedPortForwardConfiguration() {
+    	return m_portForwardingConfigTab.getCurrentConfigurations();
+    }
+    
+    private void handleTabChangeEvent(boolean isDirty, final TabPanelEvent be) {
+    	if (m_ignoreEvent) {
+			m_ignoreEvent = false;
+			return;
+		}
+		if (isDirty) {
+			be.setCancelled(true);
+			MessageBox.confirm(MSGS.confirm(), 
+	            	MSGS.deviceConfigDirty(),
+	                new Listener<MessageBoxEvent>() {  
+	                    public void handleEvent(MessageBoxEvent ce) {
+	                        // if confirmed, delete
+	                        Dialog  dialog = ce.getDialog(); 
+	                        if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+	                        	m_ignoreEvent = true;
+	                        	m_tabsPanel.setSelection(be.getItem());
+	                        }
+	                    }
+	        });
+		}
+    }
+    
+    protected void onRender(Element parent, int index) {        
+    	super.onRender(parent, index);
+        
+    	setId("firewall-tabs-wrapper");
+        setLayout(new FitLayout());
+      
+        m_tabsPanel = new TabPanel();
+        m_tabsPanel.setPlain(true);
+        m_tabsPanel.setBorders(false);
+        m_tabsPanel.setStyleAttribute("padding-top", "5px");
+        
+        m_tabOpenPortsConfig = new TabItem(MSGS.firewallOpenPorts());
+        m_tabOpenPortsConfig.setBorders(true);
+        m_tabOpenPortsConfig.setLayout(new FitLayout());
+        m_tabOpenPortsConfig.add(m_openPortsConfigTab);
+        m_tabOpenPortsConfig.addListener(Events.BeforeSelect, new Listener<TabPanelEvent>() {
+			public void handleEvent(final TabPanelEvent be) {
+				handleTabChangeEvent(m_portForwardingConfigTab.isDirty(), be);
+			}
+        });
+        m_tabsPanel.add(m_tabOpenPortsConfig);
+        
+        m_tabPortForwardingConfig = new TabItem(MSGS.firewallPortForwarding());
+        m_tabPortForwardingConfig.setBorders(true);
+        m_tabPortForwardingConfig.setLayout(new FitLayout());
+        m_tabPortForwardingConfig.add(m_portForwardingConfigTab);
+        m_tabPortForwardingConfig.addListener(Events.BeforeSelect, new Listener<TabPanelEvent>() {
+			public void handleEvent(final TabPanelEvent be) {
+				handleTabChangeEvent(m_openPortsConfigTab.isDirty(), be);
+			}
+        });
+        m_tabsPanel.add(m_tabPortForwardingConfig);
+        
+        add(m_tabsPanel);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallPanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a124eaea5b45557c3e2d7980d70776240c1f79c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/FirewallPanel.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class FirewallPanel extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+    @SuppressWarnings("unused")
+	private boolean                m_initialized;
+	private GwtSession             m_currentSession;
+
+	private FirewallConfigTabs      m_firewallConfigTabs;
+			
+    public FirewallPanel(GwtSession currentSession) {
+    	m_currentSession  = currentSession;
+    	m_initialized     = false;    	
+
+    }
+    
+    public boolean isDirty() {
+    	if (m_firewallConfigTabs != null) {
+    		return m_firewallConfigTabs.isDirty();
+    	}
+    	else {
+    		return false;
+    	}
+    }
+
+    protected void onRender(Element parent, int index) {
+        
+        super.onRender(parent, index);
+        
+        m_firewallConfigTabs = new FirewallConfigTabs(m_currentSession);
+        
+        BorderLayout borderLayout = new BorderLayout();
+        setLayout(borderLayout);
+        setBorders(true);
+        setId("firewall-panel-wrapper");
+
+        //
+        // north
+        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 10);  
+        northData.setMargins(new Margins(10, 25, 5, 25));
+        Label intro = new Label(MSGS.firewallIntro());
+        intro.setId("firewall-label");
+        add(intro, northData);
+
+        //
+        // center
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);  
+        centerData.setMargins(new Margins(10, 25, 25, 25));          
+        add(m_firewallConfigTabs, centerData);
+                
+        m_initialized = true;
+    }    
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/OpenPortForm.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/OpenPortForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..4fe03cf229a4303c3f4c2ff4bff301ebc81af144
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/OpenPortForm.java
@@ -0,0 +1,349 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.TextFieldValidator;
+import org.eclipse.kura.web.client.util.TextFieldValidator.FieldType;
+import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
+import org.eclipse.kura.web.shared.model.GwtNetProtocol;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.data.ChangeEvent;
+import com.extjs.gxt.ui.client.data.ChangeListener;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FieldEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.Status;
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.LabelField;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class OpenPortForm extends Window {
+
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+    private static final int  LABEL_WIDTH_FORM = 190; 
+    
+    private GwtSession   				m_currentSession;
+    private GwtFirewallOpenPortEntry	m_newOpenPortEntry;
+    private GwtFirewallOpenPortEntry	m_existingOpenPortEntry;
+    private FormPanel    				m_formPanel;
+    private Status 					 	m_status;
+    private TextField<String> 			m_permittedInterfaceName;
+    private TextField<String> 			m_unpermittedInterfaceName;
+    private boolean						m_isCanceled;
+    
+    public OpenPortForm(GwtSession session) {
+        
+    	m_currentSession = session;
+    	m_existingOpenPortEntry = null;
+    	
+        setModal(true);
+        setSize(600, 500);
+        setLayout(new FitLayout());
+        setResizable(false);
+        String heading = MSGS.firewallOpenPortFormNew();
+        setHeading(heading);
+    }
+    
+    public OpenPortForm(GwtSession session, GwtFirewallOpenPortEntry existingEntry) {
+        this(session);
+        m_existingOpenPortEntry = existingEntry;
+        if (m_existingOpenPortEntry != null) {
+            setHeading(MSGS.firewallOpenPortFormUpdate(m_existingOpenPortEntry.getPort().toString()));
+        }
+    }
+    
+    public GwtFirewallOpenPortEntry getNewOpenPortEntry() {
+    	return m_newOpenPortEntry;
+    }
+
+    public GwtFirewallOpenPortEntry getExistingOpenPortEntry() {
+    	return m_existingOpenPortEntry;
+    }
+    
+    public boolean isCanceled() {
+    	return m_isCanceled;
+    }
+
+    protected void onRender(Element parent, int index) {
+        
+    	super.onRender(parent, index);
+    	setId("firewall-open-port-form-wrapper");
+    	
+        FormData formData = new FormData("-30");
+
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(true);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setScrollMode(Scroll.AUTOY);
+        m_formPanel.setLayout(new FlowLayout());
+
+        FieldSet fieldSet = new FieldSet();
+        fieldSet.setHeading(MSGS.firewallOpenPortFormInformation());
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        
+        //
+    	// port number
+        //
+        final LabelField portLabel = new LabelField();
+        portLabel.setName("portLabel");
+        portLabel.setFieldLabel(MSGS.firewallOpenPortFormPort());
+        portLabel.setLabelSeparator(":");
+        fieldSet.add(portLabel, formData);
+
+        final TextField<String> portField = new TextField<String>();
+        portField.setAllowBlank(false);
+        portField.setName("port");
+        portField.setFieldLabel(MSGS.firewallOpenPortFormPort());
+        portField.setValidator(new TextFieldValidator(portField, FieldType.NUMERIC));
+        fieldSet.add(portField, formData);
+        
+        //
+    	// protocol
+        //
+        final LabelField protocolLabel = new LabelField();
+        protocolLabel.setName("protocolLabel");
+        protocolLabel.setFieldLabel(MSGS.firewallOpenPortFormProtocol());
+        protocolLabel.setLabelSeparator(":");
+        fieldSet.add(protocolLabel, formData);
+
+        final SimpleComboBox<String> protocolCombo = new SimpleComboBox<String>();
+        protocolCombo.setName("protocolCombo");
+        protocolCombo.setFieldLabel(MSGS.firewallOpenPortFormProtocol());
+        protocolCombo.setEditable(false);
+        protocolCombo.setTypeAhead(true);  
+        protocolCombo.setTriggerAction(TriggerAction.ALL);
+        for (GwtNetProtocol protocol : GwtNetProtocol.values()) {
+        	protocolCombo.add(protocol.name());
+        }
+        protocolCombo.setSimpleValue(GwtNetProtocol.tcp.name());
+        fieldSet.add(protocolCombo, formData);
+        
+        //
+    	// permitted network
+        //        
+        final TextField<String> permittedNetworkField = new TextField<String>();
+        permittedNetworkField.setAllowBlank(true);
+        permittedNetworkField.setName("permittedNetwork");
+        permittedNetworkField.setFieldLabel(MSGS.firewallOpenPortFormPermittedNetwork());
+        permittedNetworkField.setValidator(new TextFieldValidator(permittedNetworkField, FieldType.NETWORK));
+        fieldSet.add(permittedNetworkField, formData);
+        
+        //
+    	// permitted network interface
+        //        
+        m_permittedInterfaceName = new TextField<String>();
+        m_permittedInterfaceName.setAllowBlank(true);
+        m_permittedInterfaceName.setName("permittedInterfaceName");
+        m_permittedInterfaceName.setFieldLabel(MSGS.firewallOpenPortFormPermittedInterfaceName());
+        m_permittedInterfaceName.setValidator(new TextFieldValidator(m_permittedInterfaceName, FieldType.ALPHANUMERIC));
+        m_permittedInterfaceName.setToolTip(MSGS.firewallOpenPortFormPermittedInterfaceToolTip());
+        m_permittedInterfaceName.addListener(Events.Change, new Listener<FieldEvent>() {
+			public void handleEvent(FieldEvent be) {
+				if (be.getValue() != null) {
+					m_unpermittedInterfaceName.disable();
+				}
+				else {
+					m_unpermittedInterfaceName.enable();
+				}
+			}
+        });
+        fieldSet.add(m_permittedInterfaceName, formData);
+        
+        //
+    	// unpermitted network interface
+        //        
+        m_unpermittedInterfaceName = new TextField<String>();
+        m_unpermittedInterfaceName.setAllowBlank(true);
+        m_unpermittedInterfaceName.setName("unpermittedInterfaceName");
+        m_unpermittedInterfaceName.setFieldLabel(MSGS.firewallOpenPortFormUnpermittedInterfaceName());
+        m_unpermittedInterfaceName.setValidator(new TextFieldValidator(m_unpermittedInterfaceName, FieldType.ALPHANUMERIC));
+        m_unpermittedInterfaceName.setToolTip(MSGS.firewallOpenPortFormUnpermittedInterfaceToolTip());
+        m_unpermittedInterfaceName.addListener(Events.Change, new Listener<FieldEvent>() {
+			public void handleEvent(FieldEvent be) {
+				if (be.getValue() != null) {
+					m_permittedInterfaceName.disable();
+				}
+				else {
+					m_permittedInterfaceName.enable();
+				}
+			}
+        });
+        fieldSet.add(m_unpermittedInterfaceName, formData);
+        
+        
+        //
+    	// permitted MAC
+        //
+        final TextField<String> permittedMacField = new TextField<String>();
+        permittedMacField.setAllowBlank(true);
+        permittedMacField.setName("permittedMac");
+        permittedMacField.setFieldLabel(MSGS.firewallOpenPortFormPermittedMac());
+        permittedMacField.setValidator(new TextFieldValidator(permittedMacField, FieldType.MAC_ADDRESS));
+        fieldSet.add(permittedMacField, formData);
+        
+        //
+    	// source port range
+        //
+        final TextField<String> sourcePortRangeField = new TextField<String>();
+        sourcePortRangeField.setAllowBlank(true);
+        sourcePortRangeField.setName("sourcePortRange");
+        sourcePortRangeField.setFieldLabel(MSGS.firewallOpenPortFormSourcePortRange());
+        sourcePortRangeField.setValidator(new TextFieldValidator(sourcePortRangeField, FieldType.PORT_RANGE));
+        fieldSet.add(sourcePortRangeField, formData);
+        
+        //add the fieldSet to the panel
+        m_formPanel.add(fieldSet);
+    	
+        //disable the labels
+    	portLabel.setVisible(false);
+    	protocolLabel.setVisible(false);
+    	
+		m_status = new Status();
+		m_status.setBusy(MSGS.waitMsg());
+		m_status.hide();
+		m_status.setAutoWidth(true);
+		
+		m_formPanel.setButtonAlign(HorizontalAlignment.LEFT);
+		m_formPanel.getButtonBar().add(m_status);
+		m_formPanel.getButtonBar().add(new FillToolItem());
+
+        m_formPanel.addButton(new Button(MSGS.submitButton(), new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+
+            	// make sure all visible fields are valid before performing the action
+            	for (Field<?> field : m_formPanel.getFields()) {
+            		if (field.isVisible() && !field.isValid()) {
+                		return;
+            		}
+            	}
+            	
+            	Log.debug("Open port fields are visible and valid...");
+
+            	//we need to add a new row to the open ports table
+            	if(m_existingOpenPortEntry == null) {
+            		//create a new entry
+            		m_newOpenPortEntry = new GwtFirewallOpenPortEntry();
+            		m_newOpenPortEntry.setPort(Integer.parseInt(portField.getValue()));
+            		m_newOpenPortEntry.setProtocol(protocolCombo.getValue().getValue());
+            		if(permittedNetworkField.getValue() != null) {
+            			m_newOpenPortEntry.setPermittedNetwork(permittedNetworkField.getValue());
+            		}
+            		else {
+            			m_newOpenPortEntry.setPermittedNetwork("0.0.0.0/0");
+            		}
+            		if(m_permittedInterfaceName.getValue() != null) {
+            			m_newOpenPortEntry.setPermittedInterfaceName(m_permittedInterfaceName.getValue());
+            		}
+            		if(m_unpermittedInterfaceName.getValue() != null) {
+            			m_newOpenPortEntry.setUnpermittedInterfaceName(m_unpermittedInterfaceName.getValue());
+            		}
+            		if(permittedMacField.getValue() != null) {
+            			m_newOpenPortEntry.setPermittedMAC(permittedMacField.getValue());
+            		}
+            		if(sourcePortRangeField.getValue() != null) {
+            			m_newOpenPortEntry.setSourcePortRange(sourcePortRangeField.getValue());
+            		}
+            	} else {
+            		//update the current entry
+            		m_existingOpenPortEntry = new GwtFirewallOpenPortEntry();
+            		m_existingOpenPortEntry.setPort(Integer.parseInt(portField.getValue()));
+            		m_existingOpenPortEntry.setProtocol(protocolCombo.getValue().getValue());
+            		if(permittedNetworkField.getValue() != null) {
+            			m_existingOpenPortEntry.setPermittedNetwork(permittedNetworkField.getValue());
+            		}
+            		else {
+            			m_existingOpenPortEntry.setPermittedNetwork("0.0.0.0/0");
+            		}
+            		if(m_permittedInterfaceName.getValue() != null) {
+            			m_existingOpenPortEntry.setPermittedInterfaceName(m_permittedInterfaceName.getValue());
+            		}
+            		if(m_unpermittedInterfaceName.getValue() != null) {
+            			m_existingOpenPortEntry.setUnpermittedInterfaceName(m_unpermittedInterfaceName.getValue());
+            		}
+            		if(permittedMacField.getValue() != null) {
+            			m_existingOpenPortEntry.setPermittedMAC(permittedMacField.getValue());
+            		}
+            		if(sourcePortRangeField.getValue() != null) {
+            			m_existingOpenPortEntry.setSourcePortRange(sourcePortRangeField.getValue());
+            		}
+            	}
+            	m_isCanceled = false;
+            	hide();
+            }
+        }));
+        
+        m_formPanel.addButton(new Button(MSGS.cancelButton(), new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	m_isCanceled = true;
+                hide();
+            }
+
+        }));
+        m_formPanel.setButtonAlign(HorizontalAlignment.CENTER);
+
+        // populate if necessary
+        if (m_existingOpenPortEntry != null) {
+        	
+        	portLabel.setValue(m_existingOpenPortEntry.getPort());
+        	portField.setValue(m_existingOpenPortEntry.getPort().toString());
+        	portField.setOriginalValue(m_existingOpenPortEntry.getPort().toString());
+        	
+        	protocolLabel.setValue(m_existingOpenPortEntry.getProtocol());
+        	protocolCombo.setSimpleValue(m_existingOpenPortEntry.getProtocol());
+        
+        	permittedNetworkField.setValue(m_existingOpenPortEntry.getPermittedNetwork());
+        	permittedNetworkField.setOriginalValue(m_existingOpenPortEntry.getPermittedNetwork());
+        	
+        	m_permittedInterfaceName.setValue(m_existingOpenPortEntry.getPermittedInterfaceName());
+        	m_permittedInterfaceName.setOriginalValue(m_existingOpenPortEntry.getPermittedInterfaceName());
+        	
+        	m_unpermittedInterfaceName.setValue(m_existingOpenPortEntry.getUnpermittedInterfaceName());
+        	m_unpermittedInterfaceName.setOriginalValue(m_existingOpenPortEntry.getUnpermittedInterfaceName());
+        	
+           	permittedMacField.setValue(m_existingOpenPortEntry.getPermittedMAC());
+           	permittedMacField.setOriginalValue(m_existingOpenPortEntry.getPermittedMAC());
+           	
+        	sourcePortRangeField.setValue(m_existingOpenPortEntry.getSourcePortRange());
+        	sourcePortRangeField.setOriginalValue(m_existingOpenPortEntry.getSourcePortRange());
+        }
+        
+        add(m_formPanel);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/OpenPortsConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/OpenPortsConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8986750968a8d6eeadb33740a1d72703a2e67f0
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/OpenPortsConfigTab.java
@@ -0,0 +1,477 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.SwappableListStore;
+import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.ModelKeyProvider;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class OpenPortsConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+
+    private GwtSession            m_currentSession;
+
+	private Grid<GwtFirewallOpenPortEntry>   m_grid;
+	private BaseListLoader<ListLoadResult<GwtFirewallOpenPortEntry>> m_openPortsLoader;
+	private GwtFirewallOpenPortEntry m_selectedEntry;
+	private boolean m_dirty;
+	
+	private ToolBar            m_openPortsToolBar;
+	private Button             m_newButton;
+	private Button             m_editButton;
+	private Button             m_deleteButton;
+	private Button				m_applyButton;
+	
+    public OpenPortsConfigTab(GwtSession currentSession) {
+    	m_currentSession = currentSession;
+    }
+
+	protected void onRender(final Element parent, int index) {
+		
+		super.onRender(parent, index);
+
+		m_dirty = false;
+		
+		//
+		// Borderlayout that expands to the whole screen
+		setLayout(new FitLayout());
+		setBorders(false);
+		setId("firewall-open-ports");
+		
+        LayoutContainer mf = new LayoutContainer();
+        mf.setLayout(new BorderLayout());
+		
+		//
+		// Center Panel: Open Ports Table
+		BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, 1F);
+		centerData.setMargins(new Margins(0, 0, 0, 0));
+		centerData.setSplit(true);  
+		centerData.setMinSize(0);
+		
+		ContentPanel openPortsTablePanel = new ContentPanel();
+		openPortsTablePanel.setBorders(false);
+		openPortsTablePanel.setBodyBorder(false);
+		openPortsTablePanel.setHeaderVisible(false);
+		openPortsTablePanel.setScrollMode(Scroll.AUTO);
+		openPortsTablePanel.setLayout(new FitLayout());
+		
+        initOpenPortsToolBar();
+        initOpenPortsGrid();
+        
+		openPortsTablePanel.setTopComponent(m_openPortsToolBar);
+		openPortsTablePanel.add(m_grid);
+		mf.add(openPortsTablePanel, centerData);
+		
+        add(mf);
+        refresh();
+	}
+	
+    public void refresh() {
+        m_openPortsLoader.load();                    
+    }
+    
+    public List<GwtFirewallOpenPortEntry> getCurrentConfigurations() {
+    	if(m_grid != null) {
+    		ListStore<GwtFirewallOpenPortEntry> store = m_grid.getStore();
+    		return store.getModels();
+    	} else {
+    		return null;
+    	}
+    }
+    
+    public boolean isDirty() {
+    	return m_dirty;
+    }
+	
+	private void initOpenPortsToolBar() {
+		
+		m_openPortsToolBar = new ToolBar();
+		m_openPortsToolBar.setId("firewall-open-ports-toolbar");
+		
+		m_applyButton = new Button(MSGS.firewallApply(),
+        		AbstractImagePrototype.create(Resources.INSTANCE.accept()),
+                new SelectionListener<ButtonEvent>() {
+            		@Override
+            		public void componentSelected(ButtonEvent ce) {
+            			Log.debug("about to updateDeviceFirewallOpenPorts() and updateDeviceFirewallPortForwards()");
+            			List<GwtFirewallOpenPortEntry> updatedOpenPortConf = getCurrentConfigurations();
+
+            			if(updatedOpenPortConf != null) {
+            				Log.debug("got updatedOpenPortConf: " + updatedOpenPortConf.size());
+            				mask(MSGS.applying());
+	            			gwtNetworkService.updateDeviceFirewallOpenPorts(updatedOpenPortConf, new AsyncCallback<Void>() {
+	            				public void onSuccess(Void result) {
+									Log.debug("updated!");
+									m_dirty = false;
+									m_applyButton.disable();
+									unmask();
+								}
+	            				
+								public void onFailure(Throwable caught) {
+									Log.debug("caught: " + caught.toString());
+									unmask();
+									FailureHandler.handle(caught);
+								}
+	            			});
+            			}
+            		}
+    	});
+		
+		m_applyButton.disable();
+		m_openPortsToolBar.add(m_applyButton);
+		m_openPortsToolBar.add(new SeparatorToolItem());
+		
+		//
+		// New Open Port Button
+		m_newButton = new Button(MSGS.newButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.add()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				final OpenPortForm openPortForm = new OpenPortForm(m_currentSession);
+				openPortForm.addListener(Events.Hide, new Listener<ComponentEvent>() {
+					public void handleEvent(ComponentEvent be) {
+						// add the new open port entry to the grid and select it
+						if (openPortForm.getNewOpenPortEntry() != null) {
+							if(!duplicateEntry(openPortForm.getNewOpenPortEntry())) {
+								m_grid.getStore().add(openPortForm.getNewOpenPortEntry());
+								if (!openPortForm.isCanceled()) {
+									m_applyButton.enable();
+									m_dirty = true;
+								}
+							} else {
+								MessageBox.alert(MSGS.firewallOpenPortFormError(), MSGS.firewallOpenPortFormDuplicate(), new Listener<MessageBoxEvent>() {  
+									public void handleEvent(MessageBoxEvent ce) {
+										//noop
+									}
+								});
+							}
+						}
+					}
+				});
+				openPortForm.show();
+			}
+
+		});
+		m_openPortsToolBar.add(m_newButton);
+		m_openPortsToolBar.add(new SeparatorToolItem());
+
+		//
+		// Edit Open Port Button
+		m_editButton = new Button(MSGS.editButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.edit()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				if (m_grid != null) {
+					final GwtFirewallOpenPortEntry openPortEntry = m_grid.getSelectionModel().getSelectedItem();
+					if (openPortEntry != null) {
+						if(openPortEntry.getPort().equals(22)) {
+							MessageBox.alert(MSGS.firewallOpenPortsCaution(), MSGS.firewallOpenPorts22(), new Listener<MessageBoxEvent>() {  
+								public void handleEvent(MessageBoxEvent ce) {
+									showEditOpenPort(openPortEntry);
+								}
+							});
+						} else if(openPortEntry.getPort().equals(80)) {
+							MessageBox.alert(MSGS.firewallOpenPortsCaution(), MSGS.firewallOpenPorts80(), new Listener<MessageBoxEvent>() {  
+								public void handleEvent(MessageBoxEvent ce) {
+									showEditOpenPort(openPortEntry);
+								}
+							});
+						} else {
+							showEditOpenPort(openPortEntry);
+						}
+					}
+				}
+			}
+
+		});
+		m_editButton.setEnabled(false);
+		m_openPortsToolBar.add(m_editButton);
+		m_openPortsToolBar.add(new SeparatorToolItem());
+
+	    
+		//
+		// Delete Open Port Entry Button
+		m_deleteButton = new Button(MSGS.deleteButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.delete()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				
+				if (m_grid != null) {
+					
+					final GwtFirewallOpenPortEntry openPortEntry = m_grid.getSelectionModel().getSelectedItem();
+					if (openPortEntry != null) {
+
+						if(openPortEntry.getPort().equals(22)) {
+							// ask for confirmation						
+							MessageBox.confirm(MSGS.confirm(), MSGS.firewallOpenPortDeleteConfirmation22(openPortEntry.getPort().toString()),
+								new Listener<MessageBoxEvent>() {  
+								    public void handleEvent(MessageBoxEvent ce) {
+								    	
+								    	Log.debug("Trying to delete: " + openPortEntry.getPort().toString());
+								    	Log.debug("Button " + ce.getButtonClicked().getText());
+								    	
+								    	if(ce.getButtonClicked().getText().equals("Yes")) {
+								    		m_grid.getStore().remove(openPortEntry);
+								    		m_applyButton.enable();
+								    		m_dirty = true;
+								    	}
+								    }
+								}
+							);
+						} else if(openPortEntry.getPort().equals(80)) {
+							// ask for confirmation						
+							MessageBox.confirm(MSGS.confirm(), MSGS.firewallOpenPortDeleteConfirmation80(openPortEntry.getPort().toString()),
+								new Listener<MessageBoxEvent>() {  
+								    public void handleEvent(MessageBoxEvent ce) {
+								    	
+								    	Log.debug("Trying to delete: " + openPortEntry.getPort().toString());
+								    	Log.debug("Button " + ce.getButtonClicked().getText());
+								    	
+								    	if(ce.getButtonClicked().getText().equals("Yes")) {
+								    		m_grid.getStore().remove(openPortEntry);
+								    		m_applyButton.enable();
+								    		m_dirty = true;
+								    	}
+								    }
+								}
+							);
+						} else {
+							// ask for confirmation						
+							MessageBox.confirm(MSGS.confirm(), MSGS.firewallOpenPortDeleteConfirmation(openPortEntry.getPort().toString()),
+								new Listener<MessageBoxEvent>() {  
+								    public void handleEvent(MessageBoxEvent ce) {
+								    	
+								    	Log.debug("Trying to delete: " + openPortEntry.getPort().toString());
+								    	Log.debug("Button " + ce.getButtonClicked().getText());
+								    	
+								    	if(ce.getButtonClicked().getText().equals("Yes")) {
+								    		m_grid.getStore().remove(openPortEntry);
+								    		m_applyButton.enable();
+								    		m_dirty = true;
+								    	}
+								    }
+								}
+							);
+						}
+					}
+				}
+			}
+		});
+		m_deleteButton.setEnabled(false);
+		m_openPortsToolBar.add(m_deleteButton);
+	}
+	
+	private void initOpenPortsGrid() {
+
+		//
+		// Column Configuration
+		ColumnConfig column = null;
+		List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
+		
+		column = new ColumnConfig("port", MSGS.firewallOpenPort(), 100);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("protocol", MSGS.firewallOpenPortProtocol(), 100);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+
+		column = new ColumnConfig("permittedNetwork", MSGS.firewallOpenPortPermittedNetwork(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("permittedInterfaceName", MSGS.firewallOpenPortPermittedInterfaceName(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("unpermittedInterfaceName", MSGS.firewallOpenPortUnpermittedInterfaceName(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("permittedMAC", MSGS.firewallOpenPortPermittedMac(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("sourcePortRange", MSGS.firewallOpenPortSourcePortRange(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+
+        // rpc data proxy  
+        RpcProxy<ListLoadResult<GwtFirewallOpenPortEntry>> proxy = new RpcProxy<ListLoadResult<GwtFirewallOpenPortEntry>>() {  
+          @Override  
+          protected void load(Object loadConfig, AsyncCallback<ListLoadResult<GwtFirewallOpenPortEntry>> callback) {  
+        	  gwtNetworkService.findDeviceFirewallOpenPorts(callback);
+          }  
+        };  
+        
+        m_openPortsLoader = new BaseListLoader<ListLoadResult<GwtFirewallOpenPortEntry>>(proxy);
+        m_openPortsLoader.setSortDir(SortDir.DESC);  
+        m_openPortsLoader.setSortField("port"); 
+        m_openPortsLoader.setRemoteSort(true);  
+        
+        SwappableListStore<GwtFirewallOpenPortEntry> m_store = new SwappableListStore<GwtFirewallOpenPortEntry>(m_openPortsLoader);
+        m_store.setKeyProvider( new ModelKeyProvider<GwtFirewallOpenPortEntry>() {            
+            public String getKey(GwtFirewallOpenPortEntry openPortEntry) {
+                return openPortEntry.getPort().toString();
+            }
+        });
+        
+        m_grid = new Grid<GwtFirewallOpenPortEntry>(m_store, new ColumnModel(configs));
+        m_grid.setBorders(false);
+        m_grid.setStateful(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        m_grid.setAutoExpandColumn("port");
+        m_grid.getView().setAutoFill(true);
+        //m_grid.getView().setEmptyText(MSGS.deviceTableNoDevices());
+
+        m_openPortsLoader.addLoadListener(new DataLoadListener(m_grid));
+
+        GridSelectionModel<GwtFirewallOpenPortEntry> selectionModel = new GridSelectionModel<GwtFirewallOpenPortEntry>();
+        selectionModel.setSelectionMode(SelectionMode.SINGLE);
+        m_grid.setSelectionModel(selectionModel);
+        m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtFirewallOpenPortEntry>() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent<GwtFirewallOpenPortEntry> se) {
+                m_selectedEntry = se.getSelectedItem();
+                if (m_selectedEntry != null) {
+                	m_editButton.setEnabled(true);
+                	m_deleteButton.setEnabled(true);
+                } else {
+                	m_editButton.setEnabled(false);
+                	m_deleteButton.setEnabled(false);                 
+                }
+            }
+        });
+	}
+	
+    private class DataLoadListener extends LoadListener
+    {
+        private Grid<GwtFirewallOpenPortEntry> m_grid;
+        private GwtFirewallOpenPortEntry       m_selectedEntry;
+
+        public DataLoadListener(Grid<GwtFirewallOpenPortEntry> grid) {
+            m_grid 			 = grid;
+            m_selectedEntry = null;
+        }
+        
+        public void loaderBeforeLoad(LoadEvent le) {
+        	m_selectedEntry = m_grid.getSelectionModel().getSelectedItem();
+        }
+        
+        public void loaderLoad(LoadEvent le) {
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        	
+            if (m_selectedEntry != null) {
+                ListStore<GwtFirewallOpenPortEntry> store = m_grid.getStore();
+                GwtFirewallOpenPortEntry modelEntry = store.findModel(m_selectedEntry.getPort().toString());
+                if (modelEntry != null) {
+                    m_grid.getSelectionModel().select(modelEntry, false);
+                    m_grid.getView().focusRow(store.indexOf(modelEntry));
+                }
+            }
+        }
+    }
+    
+    private boolean duplicateEntry(GwtFirewallOpenPortEntry openPortEntry) {
+    	List<GwtFirewallOpenPortEntry> entries = m_grid.getStore().getModels();
+    	if (entries != null && openPortEntry != null) {
+	    	for(GwtFirewallOpenPortEntry entry : entries) {
+	    		if (entry.getPort().equals(openPortEntry.getPort()) &&
+	    				entry.getPermittedNetwork().equals(openPortEntry.getPermittedNetwork())) {
+	    			return true;
+	    		}
+	    	}
+    	}
+    	
+    	return false;
+    }
+    
+    private void showEditOpenPort(final GwtFirewallOpenPortEntry openPortEntry) {
+    	final OpenPortForm openPortForm = new OpenPortForm(m_currentSession, m_grid.getSelectionModel().getSelectedItem());
+		openPortForm.addListener(Events.Hide, new Listener<ComponentEvent>() {
+			public void handleEvent(ComponentEvent be) {
+				if(!duplicateEntry(openPortForm.getNewOpenPortEntry())) {
+					m_grid.getStore().remove(openPortEntry);
+					m_grid.getStore().add(openPortForm.getExistingOpenPortEntry());
+					if (!openPortForm.isCanceled()) {
+						m_applyButton.enable();
+						m_dirty = true;
+					}
+				} else {
+					MessageBox.alert(MSGS.firewallOpenPortFormError(), MSGS.firewallOpenPortFormDuplicate(), new Listener<MessageBoxEvent>() {  
+						public void handleEvent(MessageBoxEvent ce) {
+							//noop
+						}
+					});
+				}
+			}
+		});
+		openPortForm.show();
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/PortForwardForm.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/PortForwardForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1697dcd8ec7ea72641c82651041bd896779c724
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/PortForwardForm.java
@@ -0,0 +1,329 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import org.eclipse.kura.web.client.util.TextFieldValidator;
+import org.eclipse.kura.web.client.util.TextFieldValidator.FieldType;
+import org.eclipse.kura.web.shared.model.GwtFirewallPortForwardEntry;
+import org.eclipse.kura.web.shared.model.GwtNetProtocol;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.Status;
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.LabelField;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class PortForwardForm extends Window {
+
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+    private static final int  LABEL_WIDTH_FORM = 190; 
+    
+    private GwtSession   				m_currentSession;
+    private GwtFirewallPortForwardEntry	m_newEntry;
+    private GwtFirewallPortForwardEntry	m_existingEntry;
+    private FormPanel    				m_formPanel;
+    private Status 					 	m_status;
+    private boolean						m_isCanceled;
+    
+    public PortForwardForm(GwtSession session) {
+        
+    	m_currentSession = session;
+    	m_existingEntry = null;
+    	
+        setModal(true);
+        setSize(600, 500);
+        setLayout(new FitLayout());
+        setResizable(false);
+        String heading = MSGS.firewallOpenPortFormNew();
+        setHeading(heading);
+    }
+    
+    public PortForwardForm(GwtSession session, GwtFirewallPortForwardEntry existingEntry) {
+        this(session);
+        m_existingEntry = existingEntry;
+        if (m_existingEntry != null) {
+            setHeading(MSGS.firewallPortForwardFormUpdate(m_existingEntry.getInPort().toString()));
+        }
+    }
+    
+    public GwtFirewallPortForwardEntry getNewPortForwardEntry() {
+    	return m_newEntry;
+    }
+
+    public GwtFirewallPortForwardEntry getExistingPortForwardEntry() {
+    	return m_existingEntry;
+    }
+    
+    public boolean isCanceled() {
+    	return m_isCanceled;
+    }
+
+    protected void onRender(Element parent, int index) {
+        
+    	super.onRender(parent, index);
+    	setId("firewall-port-forwarding-form");
+    	
+        FormData formData = new FormData("-30");
+
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(true);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setScrollMode(Scroll.AUTOY);
+        m_formPanel.setLayout(new FlowLayout());
+
+        FieldSet fieldSet = new FieldSet();
+        fieldSet.setHeading(MSGS.firewallPortForwardFormInformation());
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        
+        //
+    	// interface name
+        //
+        final LabelField interfaceNameLabel = new LabelField();
+        interfaceNameLabel.setName("interfaceNameLabel");
+        interfaceNameLabel.setFieldLabel(MSGS.firewallPortForwardFormInterfaceName());
+        interfaceNameLabel.setLabelSeparator(":");
+        fieldSet.add(interfaceNameLabel, formData);
+
+        final TextField<String> interfaceNameField = new TextField<String>();
+        interfaceNameField.setAllowBlank(false);
+        interfaceNameField.setName("interfaceName");
+        interfaceNameField.setFieldLabel(MSGS.firewallPortForwardFormInterfaceName());
+        interfaceNameField.setValidator(new TextFieldValidator(interfaceNameField, FieldType.ALPHANUMERIC));
+        fieldSet.add(interfaceNameField, formData);
+        
+        //
+    	// address
+        //
+        final LabelField addressLabel = new LabelField();
+        addressLabel.setName("addressLabel");
+        addressLabel.setFieldLabel(MSGS.firewallPortForwardFormAddress());
+        addressLabel.setLabelSeparator(":");
+        fieldSet.add(addressLabel, formData);
+
+        final TextField<String> addressField = new TextField<String>();
+        addressField.setAllowBlank(false);
+        addressField.setName("address");
+        addressField.setFieldLabel(MSGS.firewallPortForwardFormAddress());
+        addressField.setValidator(new TextFieldValidator(addressField, FieldType.IPv4_ADDRESS));
+        fieldSet.add(addressField, formData);
+
+        //
+    	// protocol
+        //
+        final LabelField protocolLabel = new LabelField();
+        protocolLabel.setName("protocolLabel");
+        protocolLabel.setFieldLabel(MSGS.firewallPortForwardFormProtocol());
+        protocolLabel.setLabelSeparator(":");
+        fieldSet.add(protocolLabel, formData);
+
+        final SimpleComboBox<String> protocolCombo = new SimpleComboBox<String>();
+        protocolCombo.setName("protocolCombo");
+        protocolCombo.setFieldLabel(MSGS.firewallPortForwardFormProtocol());
+        protocolCombo.setEditable(false);
+        protocolCombo.setTypeAhead(true);  
+        protocolCombo.setTriggerAction(TriggerAction.ALL);
+        for (GwtNetProtocol protocol : GwtNetProtocol.values()) {
+        	protocolCombo.add(protocol.name());
+        }
+        protocolCombo.setSimpleValue(GwtNetProtocol.tcp.name());
+        fieldSet.add(protocolCombo, formData);
+        
+        //
+    	// in port number
+        //
+        final LabelField inPortLabel = new LabelField();
+        inPortLabel.setName("inPortLabel");
+        inPortLabel.setFieldLabel(MSGS.firewallPortForwardFormInPort());
+        inPortLabel.setLabelSeparator(":");
+        fieldSet.add(inPortLabel, formData);
+
+        final TextField<String> inPortField = new TextField<String>();
+        inPortField.setAllowBlank(false);
+        inPortField.setName("inPort");
+        inPortField.setFieldLabel(MSGS.firewallPortForwardFormInPort());
+        inPortField.setValidator(new TextFieldValidator(inPortField, FieldType.NUMERIC));
+        fieldSet.add(inPortField, formData);
+        
+        //
+    	// out port number
+        //
+        final TextField<String> outPortField = new TextField<String>();
+        outPortField.setAllowBlank(false);
+        outPortField.setName("outPort");
+        outPortField.setFieldLabel(MSGS.firewallPortForwardFormOutPort());
+        outPortField.setValidator(new TextFieldValidator(outPortField, FieldType.NUMERIC));
+        fieldSet.add(outPortField, formData);
+        
+        //
+    	// permitted network
+        //        
+        final TextField<String> permittedNetworkField = new TextField<String>();
+        permittedNetworkField.setAllowBlank(true);
+        permittedNetworkField.setName("permittedNetwork");
+        permittedNetworkField.setFieldLabel(MSGS.firewallPortForwardFormPermittedNetwork());
+        permittedNetworkField.setValidator(new TextFieldValidator(permittedNetworkField, FieldType.NETWORK));
+        fieldSet.add(permittedNetworkField, formData);
+        
+        //
+    	// permitted MAC
+        //
+        final TextField<String> permittedMacField = new TextField<String>();
+        permittedMacField.setAllowBlank(true);
+        permittedMacField.setName("permittedMac");
+        permittedMacField.setFieldLabel(MSGS.firewallPortForwardFormPermittedMac());
+        permittedMacField.setValidator(new TextFieldValidator(permittedMacField, FieldType.MAC_ADDRESS));
+        fieldSet.add(permittedMacField, formData);
+        
+        //
+    	// source port range
+        //
+        final TextField<String> sourcePortRangeField = new TextField<String>();
+        sourcePortRangeField.setAllowBlank(true);
+        sourcePortRangeField.setName("sourcePortRange");
+        sourcePortRangeField.setFieldLabel(MSGS.firewallPortForwardFormSourcePortRange());
+        sourcePortRangeField.setValidator(new TextFieldValidator(sourcePortRangeField, FieldType.PORT_RANGE));
+        fieldSet.add(sourcePortRangeField, formData);
+        
+        //add the fieldSet to the panel
+        m_formPanel.add(fieldSet);
+    	
+        //disable the labels
+    	interfaceNameLabel.setVisible(false);
+    	addressLabel.setVisible(false);
+    	protocolLabel.setVisible(false);
+    	inPortLabel.setVisible(false);
+    	
+		m_status = new Status();
+		m_status.setBusy(MSGS.waitMsg());
+		m_status.hide();
+		m_status.setAutoWidth(true);
+		
+		m_formPanel.setButtonAlign(HorizontalAlignment.LEFT);
+		m_formPanel.getButtonBar().add(m_status);
+		m_formPanel.getButtonBar().add(new FillToolItem());
+
+        m_formPanel.addButton(new Button(MSGS.submitButton(), new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+
+            	// make sure all visible fields are valid before performing the action
+            	for (Field<?> field : m_formPanel.getFields()) {
+            		if (field.isVisible() && !field.isValid()) {
+                		return;
+            		}
+            	}
+
+            	//we need to add a new row to the open ports table
+            	if(m_existingEntry == null) {
+            		//create a new entry
+            		m_newEntry = new GwtFirewallPortForwardEntry();
+            		m_newEntry.setInterfaceName(interfaceNameField.getValue());
+            		m_newEntry.setAddress(addressField.getValue());
+            		m_newEntry.setProtocol(protocolCombo.getValue().getValue());
+            		m_newEntry.setInPort(Integer.parseInt(inPortField.getValue()));
+            		m_newEntry.setOutPort(Integer.parseInt(outPortField.getValue()));
+            		m_newEntry.setPermittedNetwork(permittedNetworkField.getValue());
+            		m_newEntry.setPermittedMAC(permittedMacField.getValue());
+            		m_newEntry.setSourcePortRange(sourcePortRangeField.getValue());
+            		
+            		if (m_newEntry.getPermittedMAC() != null) {
+                		MessageBox.alert(MSGS.firewallPortForwardFormNotification(), MSGS.firewallPortForwardFormNotificationMacFiltering(), null);
+                	}
+            	} else {
+            		//update the current entry
+            		m_existingEntry = new GwtFirewallPortForwardEntry();
+            		m_existingEntry.setInterfaceName(interfaceNameField.getValue());
+            		m_existingEntry.setAddress(addressField.getValue());
+            		m_existingEntry.setProtocol(protocolCombo.getValue().getValue());
+            		m_existingEntry.setInPort(Integer.parseInt(inPortField.getValue()));
+            		m_existingEntry.setOutPort(Integer.parseInt(outPortField.getValue()));
+            		m_existingEntry.setPermittedNetwork(permittedNetworkField.getValue());
+            		m_existingEntry.setPermittedMAC(permittedMacField.getValue());
+            		m_existingEntry.setSourcePortRange(sourcePortRangeField.getValue());
+            		
+            		if (m_existingEntry.getPermittedMAC() != null) {
+                		MessageBox.alert(MSGS.firewallPortForwardFormNotification(), MSGS.firewallPortForwardFormNotificationMacFiltering(), null);
+                	}
+            	}
+            	
+            	m_isCanceled = false;
+            	hide();
+            }
+        }));
+        
+        m_formPanel.addButton(new Button(MSGS.cancelButton(), new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	m_isCanceled = true;
+                hide();
+            }
+
+        }));
+        m_formPanel.setButtonAlign(HorizontalAlignment.CENTER);
+
+        // populate if necessary
+        if (m_existingEntry != null) {
+        	
+        	interfaceNameLabel.setValue(m_existingEntry.getInterfaceName());
+        	interfaceNameField.setValue(m_existingEntry.getInterfaceName());
+        	interfaceNameField.setOriginalValue(m_existingEntry.getInterfaceName());
+        	
+        	addressLabel.setValue(m_existingEntry.getAddress());
+        	addressField.setValue(m_existingEntry.getAddress());
+        	addressField.setOriginalValue(m_existingEntry.getAddress());
+        	
+        	protocolLabel.setValue(m_existingEntry.getProtocol());
+        	protocolCombo.setSimpleValue(m_existingEntry.getProtocol());
+        	
+        	inPortLabel.setValue(m_existingEntry.getInPort());
+        	inPortField.setValue(m_existingEntry.getInPort().toString());
+        	inPortField.setOriginalValue(m_existingEntry.getInPort().toString());
+        	
+        	outPortField.setValue(m_existingEntry.getOutPort().toString());
+        	outPortField.setOriginalValue(m_existingEntry.getOutPort().toString());
+        
+        	permittedNetworkField.setValue(m_existingEntry.getPermittedNetwork());
+        	permittedNetworkField.setOriginalValue(m_existingEntry.getPermittedNetwork());
+        	
+           	permittedMacField.setValue(m_existingEntry.getPermittedMAC());
+           	permittedMacField.setOriginalValue(m_existingEntry.getPermittedMAC());
+           	
+        	sourcePortRangeField.setValue(m_existingEntry.getSourcePortRange());
+        	sourcePortRangeField.setOriginalValue(m_existingEntry.getSourcePortRange());
+        }
+        
+        add(m_formPanel);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/PortForwardingConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/PortForwardingConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..6aa9c2c6903160cf5ad892361f40ce2a5c3327fd
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/firewall/PortForwardingConfigTab.java
@@ -0,0 +1,444 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.firewall;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.SwappableListStore;
+import org.eclipse.kura.web.shared.model.GwtFirewallPortForwardEntry;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.ModelKeyProvider;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class PortForwardingConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+
+    private GwtSession            m_currentSession;
+
+	private Grid<GwtFirewallPortForwardEntry>   m_grid;
+	private BaseListLoader<ListLoadResult<GwtFirewallPortForwardEntry>> m_loader;
+	private GwtFirewallPortForwardEntry m_selectedEntry;
+	private boolean m_dirty;
+	
+	private ToolBar            m_portForwardToolBar;
+	private Button             m_newButton;
+	private Button             m_editButton;
+	private Button             m_deleteButton;
+	private Button				m_applyButton;
+	
+    public PortForwardingConfigTab(GwtSession currentSession) {
+    	m_currentSession = currentSession;
+    }
+
+	protected void onRender(final Element parent, int index) {
+		
+		super.onRender(parent, index);
+
+		m_dirty = false;
+		
+		//
+		// Borderlayout that expands to the whole screen
+		setLayout(new FitLayout());
+		setBorders(false);
+		setId("firewall-port-forwarding");
+		
+        LayoutContainer mf = new LayoutContainer();
+        mf.setLayout(new BorderLayout());
+		
+		//
+		// Center Panel: Open Ports Table
+		BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, 1F);
+		centerData.setMargins(new Margins(0, 0, 0, 0));
+		centerData.setSplit(true);  
+		centerData.setMinSize(0);
+		
+		ContentPanel portForwardTablePanel = new ContentPanel();
+		portForwardTablePanel.setBorders(false);
+		portForwardTablePanel.setBodyBorder(false);
+		portForwardTablePanel.setHeaderVisible(false);
+		portForwardTablePanel.setScrollMode(Scroll.AUTO);
+		portForwardTablePanel.setLayout(new FitLayout());
+		
+		initToolBar();
+        initGrid();
+        
+        portForwardTablePanel.setTopComponent(m_portForwardToolBar);
+        portForwardTablePanel.add(m_grid);
+		mf.add(portForwardTablePanel, centerData);
+		
+        add(mf);
+        
+        refresh();
+	}
+	
+    public void refresh() {
+        m_loader.load();                    
+    }
+    
+    public List<GwtFirewallPortForwardEntry> getCurrentConfigurations() {
+    	if(m_grid != null) {
+    		ListStore<GwtFirewallPortForwardEntry> store = m_grid.getStore();
+    		return store.getModels();
+    	} else {
+    		return null;
+    	}
+    }
+    
+    public boolean isDirty() {
+    	return m_dirty;
+    }
+	
+	private void initToolBar() {
+		
+		m_portForwardToolBar = new ToolBar();
+		m_portForwardToolBar.setId("firewall-port-forwarding-toolbar");
+		
+		m_applyButton = new Button(MSGS.firewallApply(),
+        		AbstractImagePrototype.create(Resources.INSTANCE.accept()),
+                new SelectionListener<ButtonEvent>() {
+            		@Override
+            		public void componentSelected(ButtonEvent ce) {
+            			Log.debug("about to updateDeviceFirewallOpenPorts() and updateDeviceFirewallPortForwards()");
+            			List<GwtFirewallPortForwardEntry> updatedPortForwardConf = getCurrentConfigurations();
+
+            			if(updatedPortForwardConf != null) {
+            				Log.debug("got updatedPortForwardConf: " + updatedPortForwardConf.size());
+            				mask(MSGS.applying());
+	            			gwtNetworkService.updateDeviceFirewallPortForwards(updatedPortForwardConf, new AsyncCallback<Void>() {
+	            				public void onSuccess(Void result) {
+									Log.debug("updated!");
+									m_dirty = false;
+									unmask();
+								}
+	            				
+								public void onFailure(Throwable caught) {
+									Log.debug("caught: " + caught.toString());
+									unmask();
+									FailureHandler.handle(caught);
+								}
+	            			});
+            			}
+            		}
+    	});
+		
+		m_applyButton.disable();
+		m_portForwardToolBar.add(m_applyButton);
+		m_portForwardToolBar.add(new SeparatorToolItem());
+
+		//
+		// New Open Port Button
+		m_newButton = new Button(MSGS.newButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.add()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				final PortForwardForm portForwardForm = new PortForwardForm(m_currentSession);
+				portForwardForm.addListener(Events.Hide, new Listener<ComponentEvent>() {
+					public void handleEvent(ComponentEvent be) {
+						// add the new entry to the grid and select it
+						if (portForwardForm.getNewPortForwardEntry() != null) {
+							if(!duplicateEntry(portForwardForm.getNewPortForwardEntry())) {
+								m_grid.getStore().add(portForwardForm.getNewPortForwardEntry());
+								if (!portForwardForm.isCanceled()) {
+									m_applyButton.enable();
+									m_dirty = true;
+								}
+							} else {
+								MessageBox.alert(MSGS.firewallPortForwardFormError(), MSGS.firewallPortForwardFormDuplicate(), new Listener<MessageBoxEvent>() {  
+									public void handleEvent(MessageBoxEvent ce) {
+										//noop
+									}
+								});
+							}
+						}
+					}
+				});
+				portForwardForm.show();
+			}
+
+		});
+		m_portForwardToolBar.add(m_newButton);
+		m_portForwardToolBar.add(new SeparatorToolItem());
+
+		//
+		// Edit Open Port Button
+		m_editButton = new Button(MSGS.editButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.edit()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				if (m_grid != null) {
+					final GwtFirewallPortForwardEntry portForwardEntry = m_grid.getSelectionModel().getSelectedItem();
+					if (portForwardEntry != null) {
+						final PortForwardForm portForwardForm = new PortForwardForm(m_currentSession, m_grid.getSelectionModel().getSelectedItem());
+						portForwardForm.addListener(Events.Hide, new Listener<ComponentEvent>() {
+							public void handleEvent(ComponentEvent be) {
+								if(!duplicateEntry(portForwardForm.getNewPortForwardEntry())) {
+									m_grid.getStore().remove(portForwardEntry);
+									m_grid.getStore().add(portForwardForm.getExistingPortForwardEntry());
+									if (!portForwardForm.isCanceled()) {
+										m_dirty = true;
+										m_applyButton.enable();
+									}
+								} else {
+									MessageBox.alert(MSGS.firewallPortForwardFormError(), MSGS.firewallPortForwardFormDuplicate(), new Listener<MessageBoxEvent>() {  
+										public void handleEvent(MessageBoxEvent ce) {
+											//noop
+										}
+									});
+								}
+							}
+						});
+						portForwardForm.show();
+					}
+				}
+			}
+
+		});
+		m_editButton.setEnabled(false);
+		m_portForwardToolBar.add(m_editButton);
+		m_portForwardToolBar.add(new SeparatorToolItem());
+
+	    
+		//
+		// Delete Open Port Entry Button
+		m_deleteButton = new Button(MSGS.deleteButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.delete()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				
+				if (m_grid != null) {
+					
+					final GwtFirewallPortForwardEntry portForwardEntry = m_grid.getSelectionModel().getSelectedItem();
+					if (portForwardEntry != null) {
+
+						// ask for confirmation						
+						MessageBox.confirm(MSGS.confirm(), MSGS.firewallPortForwardDeleteConfirmation(portForwardEntry.getInPort().toString()),
+							new Listener<MessageBoxEvent>() {  
+							    public void handleEvent(MessageBoxEvent ce) {
+							    	
+							    	Log.debug("Trying to delete: " + portForwardEntry.getInPort().toString());
+							    	Log.debug("Button " + ce.getButtonClicked().getText());
+							    	
+							    	if(ce.getButtonClicked().getText().equals("Yes")) {
+							    		m_grid.getStore().remove(portForwardEntry);
+							    		m_applyButton.enable();
+							    		m_dirty = true;
+							    	}
+							    }
+							}
+						);
+					}
+				}
+			}
+		});
+		m_deleteButton.setEnabled(false);
+		m_portForwardToolBar.add(m_deleteButton);
+	}
+	
+	private void initGrid() {
+
+		//
+		// Column Configuration
+		ColumnConfig column = null;
+		List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
+		
+		column = new ColumnConfig("interfaceName", MSGS.firewallPortForwardInterfaceName(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("address", MSGS.firewallPortForwardAddress(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("protocol", MSGS.firewallPortForwardProtocol(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("inPort", MSGS.firewallPortForwardInPort(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("outPort", MSGS.firewallPortForwardOutPort(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("permittedNetwork", MSGS.firewallPortForwardPermittedNetwork(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("permittedMAC", MSGS.firewallPortForwardPermittedMac(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("sourcePortRange", MSGS.firewallPortForwardSourcePortRange(), 130);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+
+        // rpc data proxy  
+        RpcProxy<ListLoadResult<GwtFirewallPortForwardEntry>> proxy = new RpcProxy<ListLoadResult<GwtFirewallPortForwardEntry>>() {  
+          @Override  
+          protected void load(Object loadConfig, AsyncCallback<ListLoadResult<GwtFirewallPortForwardEntry>> callback) {  
+        	  gwtNetworkService.findDeviceFirewallPortForwards(callback);
+          }  
+        };  
+        
+        m_loader = new BaseListLoader<ListLoadResult<GwtFirewallPortForwardEntry>>(proxy);
+        m_loader.setSortDir(SortDir.DESC);  
+        m_loader.setSortField("inPort"); 
+        m_loader.setRemoteSort(true);  
+        
+        SwappableListStore<GwtFirewallPortForwardEntry> m_store = new SwappableListStore<GwtFirewallPortForwardEntry>(m_loader);
+        m_store.setKeyProvider( new ModelKeyProvider<GwtFirewallPortForwardEntry>() {            
+            public String getKey(GwtFirewallPortForwardEntry portForwardEntry) {
+                return portForwardEntry.getInPort().toString();
+            }
+        });
+        
+        m_grid = new Grid<GwtFirewallPortForwardEntry>(m_store, new ColumnModel(configs));
+        m_grid.setBorders(false);
+        m_grid.setStateful(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        m_grid.setAutoExpandColumn("inPort");
+        m_grid.getView().setAutoFill(true);
+        //m_grid.getView().setEmptyText(MSGS.deviceTableNoDevices());
+
+        m_loader.addLoadListener(new DataLoadListener(m_grid));
+
+        GridSelectionModel<GwtFirewallPortForwardEntry> selectionModel = new GridSelectionModel<GwtFirewallPortForwardEntry>();
+        selectionModel.setSelectionMode(SelectionMode.SINGLE);
+        m_grid.setSelectionModel(selectionModel);
+        m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtFirewallPortForwardEntry>() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent<GwtFirewallPortForwardEntry> se) {
+                m_selectedEntry = se.getSelectedItem();
+                if (m_selectedEntry != null) {
+                	m_editButton.setEnabled(true);
+                	m_deleteButton.setEnabled(true);
+                } else {
+                	m_editButton.setEnabled(false);
+                	m_deleteButton.setEnabled(false);                 
+                }
+            }
+        });
+	}
+	
+    private class DataLoadListener extends LoadListener
+    {
+        private Grid<GwtFirewallPortForwardEntry> m_grid;
+        private GwtFirewallPortForwardEntry       m_selectedEntry;
+
+        public DataLoadListener(Grid<GwtFirewallPortForwardEntry> grid) {
+            m_grid 			 = grid;
+            m_selectedEntry = null;
+        }
+        
+        public void loaderBeforeLoad(LoadEvent le) {
+        	m_selectedEntry = m_grid.getSelectionModel().getSelectedItem();
+        }
+        
+        public void loaderLoad(LoadEvent le) {
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        	
+            if (m_selectedEntry != null) {
+                ListStore<GwtFirewallPortForwardEntry> store = m_grid.getStore();
+                GwtFirewallPortForwardEntry modelEntry = store.findModel(m_selectedEntry.getInPort().toString());
+                if (modelEntry != null) {
+                    m_grid.getSelectionModel().select(modelEntry, false);
+                    m_grid.getView().focusRow(store.indexOf(modelEntry));
+                }
+            }
+        }
+    }
+    
+    private boolean duplicateEntry(GwtFirewallPortForwardEntry portForwardEntry) {
+		
+		boolean isDuplicateEntry = false; 
+		List<GwtFirewallPortForwardEntry> entries = m_grid.getStore().getModels();
+		if (entries != null && portForwardEntry != null) {
+			for (GwtFirewallPortForwardEntry entry : entries) {
+				if (entry.getInterfaceName().equals(portForwardEntry.getInterfaceName())
+						&& entry.getAddress().equals(portForwardEntry.getAddress())
+						&& entry.getProtocol().equals(portForwardEntry.getProtocol())
+						&& entry.getOutPort().equals(portForwardEntry.getOutPort())
+						&& entry.getInPort().equals(portForwardEntry.getInPort())) {
+					
+					String permittedNetwork = (entry.getPermittedNetwork() != null)? entry.getPermittedNetwork() : "0.0.0.0/0";
+					String newPermittedNetwork = (portForwardEntry.getPermittedNetwork() != null)?  portForwardEntry.getPermittedNetwork() : "0.0.0.0/0";
+					String permittedMAC = (entry.getPermittedMAC() != null)? entry.getPermittedMAC().toUpperCase() : "";
+					String newPermittedMAC = (portForwardEntry.getPermittedMAC() != null)? portForwardEntry.getPermittedMAC().toUpperCase() : "";
+					String sourcePortRange = (entry.getSourcePortRange() != null)? entry.getSourcePortRange() : "";
+					String newSourcePortRange = (portForwardEntry.getSourcePortRange() != null)? portForwardEntry.getSourcePortRange() : "";
+					
+					if (permittedNetwork.equals(newPermittedNetwork)
+							&& permittedMAC.equals(newPermittedMAC)
+							&& sourcePortRange.equals(newSourcePortRange)) {
+						isDuplicateEntry = true;
+						break;
+					}
+				}
+			}
+		}
+		return isDuplicateEntry;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/DhcpNatConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/DhcpNatConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..67f2b7bbccce3055c91a144c783b23a389e7d28a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/DhcpNatConfigTab.java
@@ -0,0 +1,540 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.client.util.FormUtils;
+import org.eclipse.kura.web.client.util.MessageUtils;
+import org.eclipse.kura.web.shared.model.GwtNetIfType;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtNetRouterMode;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.model.GwtWifiWirelessMode;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ComponentPlugin;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.NumberField;
+import com.extjs.gxt.ui.client.widget.form.Radio;
+import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.form.Validator;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class DhcpNatConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final ToolTipBox toolTipField = new ToolTipBox("205px");
+	private final String defaultToolTip = "Mouse over enabled items on the left to see help text.";
+
+	private static final String IPV4_REGEX  = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
+	
+	@SuppressWarnings("unused")
+    private GwtSession            m_currentSession;
+
+    private boolean                m_dirty;
+    private boolean                m_initialized;
+	private GwtNetInterfaceConfig  m_selectNetIfConfig;
+	private TcpIpConfigTab         m_tcpIpConfigTab;
+	private WirelessConfigTab	   m_wirelessConfigTab;
+	
+	private FormPanel              m_formPanel;
+	private SimpleComboBox<String> m_modeCombo;
+	private TextField<String>      m_dhcpBeginAddressField;
+	private TextField<String>      m_dhcpEndAddressField;
+	private TextField<String>      m_dhcpSubnetMaskField;
+	private NumberField            m_dhcpLeaseDefaultField;
+	private NumberField            m_dhcpLeaseMaxField;
+	private Radio 				   m_passDnsRadioTrue;
+	private Radio 				   m_passDnsRadioFalse;
+	private RadioGroup 			   m_passDnsRadioGroup;
+
+    private ComponentPlugin        m_dirtyPlugin;
+	
+    private class MouseOverListener implements Listener<BaseEvent> {
+
+    	private String  html;
+    	
+    	public MouseOverListener(String html) {
+    		this.html = html;
+    	}
+		public void handleEvent(BaseEvent be) {
+			toolTipField.setText(html);
+		}
+    	
+    }
+	
+    public DhcpNatConfigTab(GwtSession currentSession,
+    					    TcpIpConfigTab tcpIpConfigTab,
+    					    WirelessConfigTab wirelessConfigTab)
+    {
+        m_currentSession    = currentSession;
+        m_tcpIpConfigTab    = tcpIpConfigTab;
+        m_wirelessConfigTab = wirelessConfigTab;
+    	m_dirty             = true;
+    	m_initialized       = false;
+    
+	    final DhcpNatConfigTab theTab = this;
+    	m_dirtyPlugin = new ComponentPlugin() {  
+    		public void init(Component component) {  
+    			component.addListener(Events.Change, new Listener<ComponentEvent>() {  
+    				public void handleEvent(ComponentEvent be) {  
+    				    FormUtils.addDirtyFieldIcon(be.getComponent());
+    				    theTab.fireEvent(Events.Change);
+    				}  
+    			});  
+  	      	}  
+  	    };
+  	    
+  	    m_tcpIpConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+  	    	public void handleEvent(BaseEvent be) {
+  	    		refreshForm();
+  	    	}
+  	    });
+  	    
+  	    m_wirelessConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+  	    	public void handleEvent(BaseEvent be) {
+  	    		refreshForm();
+  	    	}
+  	    });
+    }
+
+    
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig)
+    {
+    	m_dirty = true;
+    	m_selectNetIfConfig = netIfConfig;
+    	
+    	Log.debug("got new netIfConfig for DHCP server for " + netIfConfig.getName() + ": " +
+       			"\n\t\trouter mode: " + netIfConfig.getRouterMode() +
+       			"\n\t\trouter DHCP start address: " + netIfConfig.getRouterDhcpBeginAddress() +
+       			"\n\t\trouter DHCP end address: " + netIfConfig.getRouterDhcpEndAddress() +
+       			"\n\t\trouter default lease: " + Integer.toString(netIfConfig.getRouterDhcpDefaultLease()) +
+       			"\n\t\trouter max lease: " + Integer.toString(netIfConfig.getRouterDhcpMaxLease()) +
+       			"\n\t\trouter Pass DNS: " + Boolean.toString(netIfConfig.getRouterDnsPass()));
+    }
+    
+    public void disableDhcpNat() {
+    	m_selectNetIfConfig.setRouterMode(GwtNetRouterMode.netRouterOff.name());
+    }
+    
+    public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf)
+    {
+    	if (m_formPanel != null) {
+    		String modeValue = m_modeCombo.getValue().getValue();
+    		for (GwtNetRouterMode mode : GwtNetRouterMode.values()) {
+    			Log.info("Possible Mode: " + mode.name() + " with util: " + MessageUtils.get(mode.name()));
+    			if (MessageUtils.get(mode.name()).equals(modeValue)) {
+    				updatedNetIf.setRouterMode(mode.name());
+    			}
+    		}
+    		Log.info("Mode Value: " + modeValue);
+    		
+	    	updatedNetIf.setRouterDhcpBeginAddress(m_dhcpBeginAddressField.getValue());
+	    	updatedNetIf.setRouterDhcpEndAddress(m_dhcpEndAddressField.getValue());
+	    	updatedNetIf.setRouterDhcpSubnetMask(m_dhcpSubnetMaskField.getValue());
+	    	if (m_dhcpLeaseDefaultField.getValue() != null) {
+	    		updatedNetIf.setRouterDhcpDefaultLease(m_dhcpLeaseDefaultField.getValue().intValue());
+	    	}
+	    	if (m_dhcpLeaseMaxField.getValue() != null) {
+	    		updatedNetIf.setRouterDhcpMaxLease(m_dhcpLeaseMaxField.getValue().intValue());
+	    	}
+	    	updatedNetIf.setRouterDnsPass(m_passDnsRadioTrue.getValue());
+    	}
+    }
+
+    public boolean isValid() {
+    	if (m_formPanel != null) {
+    		for (Field<?> field : m_formPanel.getFields()) {
+    			if (!field.isValid()) {
+    				return false;
+    			}
+    		}
+    	}
+    	return true;
+    }
+    
+    public boolean isDirty() {
+    	if (m_formPanel == null) {
+    		return false;
+    	}
+        List<Field<?>> fields = m_formPanel.getFields();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field) {
+	            Field<?> field = (Field<?>) fields.get(i);
+	            if (field.isDirty()) {
+	            	if((field.getOriginalValue() != null && field.getOriginalValue().equals("") && field.getValue() == null) || 
+	            			(field.getValue() != null && field.getValue().equals("") && field.getOriginalValue() == null)) {
+	            		continue;
+	            	} else if(field.getOriginalValue() != null && field.getValue() != null && field.getOriginalValue().equals(field.getValue())) {
+	            		continue;
+	            	} else {
+	            		if(field.getOriginalValue() instanceof SimpleComboValue) {
+	            			Log.debug("field " + field.getName() + " is dirty - original value: " + ((SimpleComboValue)field.getOriginalValue()).getValue() + " with type: " + field.getOriginalValue().getClass().toString());
+	            			if(field.getValue() != null) {
+	            				Log.debug("\tnew value: " + ((SimpleComboValue)field.getValue()).getValue() +  " with type: " + field.getValue().getClass().toString());
+	            			}
+	            		} else {
+		            		Log.debug("field " + field.getName() + " is dirty - original value: " + field.getOriginalValue() + " with type: " + field.getOriginalValue().getClass().toString());
+		            		if(field.getValue() != null) {
+		            			Log.debug("\tnew value: " + field.getValue() +  " with type: " + field.getValue().getClass().toString());
+		            		}
+	            		}
+	            		return true;
+	            	}
+	            } else {
+	            	Log.debug("NOT DIRTY: " + field.getName() + " value: " + field.getValue());
+	            }
+        	}
+        }
+        return false;
+    }
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("network-dhcp-nat");
+        FormData formData = new FormData();
+        formData.setWidth(250);
+        
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(false);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setLayout(new FlowLayout());
+        m_formPanel.setStyleAttribute("min-width", "775px");
+        m_formPanel.setStyleAttribute("padding-left", "30px");
+
+
+        FieldSet fieldSet = new FieldSet();
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        fieldSet.setBorders(false);
+        
+        //
+        // Tool Tip Box
+        //
+        toolTipField.setText(defaultToolTip);
+        fieldSet.add(toolTipField);
+        
+        //
+    	// Router Mode
+        //
+        m_modeCombo = new SimpleComboBox<String>();
+        m_modeCombo.setName("comboMode");
+        m_modeCombo.setFieldLabel(MSGS.netRouterMode());
+        m_modeCombo.setEditable(false);
+        m_modeCombo.setTypeAhead(true);  
+        m_modeCombo.setTriggerAction(TriggerAction.ALL);
+        for (GwtNetRouterMode mode : GwtNetRouterMode.values()) {
+        	m_modeCombo.add(MessageUtils.get(mode.name()));
+        }
+        m_modeCombo.setSimpleValue(MessageUtils.get(GwtNetRouterMode.netRouterDchpNat.name()));
+        m_modeCombo.setValidator(new Validator() {
+            public String validate(Field<?> field, String value) {
+                if (m_tcpIpConfigTab.isDhcp()
+                        && !value.equals(MessageUtils.get(GwtNetRouterMode.netRouterOff.toString()))){
+                    return MSGS.netRouterConfiguredForDhcpError();
+                }
+                
+                return null;
+            }
+        });
+        m_modeCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {			
+			@Override
+			public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
+				refreshForm();
+			}
+		});
+        m_modeCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipMode()));
+        m_modeCombo.addStyleName("kura-combobox");
+        m_modeCombo.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_modeCombo, formData);
+        
+        //
+        // DHCP Beginning Address
+        // 
+        m_dhcpBeginAddressField = new TextField<String>();
+        m_dhcpBeginAddressField.setAllowBlank(true);
+        m_dhcpBeginAddressField.setName("dhcpBeginAddress");
+    	m_dhcpBeginAddressField.setFieldLabel(MSGS.netRouterDhcpBeginningAddress());
+    	m_dhcpBeginAddressField.setRegex(IPV4_REGEX);
+    	m_dhcpBeginAddressField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+    	m_dhcpBeginAddressField.addPlugin(m_dirtyPlugin);
+    	m_dhcpBeginAddressField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+    	m_dhcpBeginAddressField.addStyleName("kura-textfield");
+    	m_dhcpBeginAddressField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpBeginAddr()));
+        fieldSet.add(m_dhcpBeginAddressField, formData);
+
+        //
+        // DHCP Ending Address
+        // 
+        m_dhcpEndAddressField = new TextField<String>();
+        m_dhcpEndAddressField.setAllowBlank(true);
+        m_dhcpEndAddressField.setName("dhcpEndAddress");
+        m_dhcpEndAddressField.setFieldLabel(MSGS.netRouterDhcpEndingAddress());
+        m_dhcpEndAddressField.setRegex(IPV4_REGEX);
+        m_dhcpEndAddressField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+        m_dhcpEndAddressField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpEndAddr()));
+        m_dhcpEndAddressField.addStyleName("kura-textfield");;
+        m_dhcpEndAddressField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_dhcpEndAddressField, formData);
+
+        //
+        // DHCP Subnet Mask
+        // 
+        m_dhcpSubnetMaskField = new TextField<String>();
+        m_dhcpSubnetMaskField.setAllowBlank(true);
+        m_dhcpSubnetMaskField.setName("dhcpSubnetMask");
+        m_dhcpSubnetMaskField.setFieldLabel(MSGS.netRouterDhcpSubnetMask());
+        m_dhcpSubnetMaskField.setRegex(IPV4_REGEX);
+        m_dhcpSubnetMaskField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpSubnet()));
+    	m_dhcpSubnetMaskField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+    	m_dhcpSubnetMaskField.addStyleName("kura-textfield");
+    	m_dhcpSubnetMaskField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_dhcpSubnetMaskField, formData);
+
+        //
+        // DHCP Default Lease
+        // 
+        m_dhcpLeaseDefaultField = new NumberField();
+    	m_dhcpLeaseDefaultField.setPropertyEditorType(Integer.class);
+        m_dhcpLeaseDefaultField.setAllowDecimals(false);
+        m_dhcpLeaseDefaultField.setAllowNegative(false);
+        m_dhcpLeaseDefaultField.setMaxValue(Integer.MAX_VALUE);
+        m_dhcpLeaseDefaultField.setAllowBlank(true);
+        m_dhcpLeaseDefaultField.setName("dhcpDefaultLease");
+    	m_dhcpLeaseDefaultField.setFieldLabel(MSGS.netRouterDhcpDefaultLease());
+    	m_dhcpLeaseDefaultField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpDefaultLeaseTime()));
+    	m_dhcpLeaseDefaultField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_dhcpLeaseDefaultField, formData);
+        
+        //
+        // DHCP Max Lease
+        // 
+        m_dhcpLeaseMaxField = new NumberField();
+        m_dhcpLeaseMaxField.setPropertyEditorType(Integer.class);
+        m_dhcpLeaseMaxField.setAllowDecimals(false);
+        m_dhcpLeaseMaxField.setAllowNegative(false);
+        m_dhcpLeaseMaxField.setMaxValue(Integer.MAX_VALUE);
+        m_dhcpLeaseMaxField.setAllowBlank(true);
+        m_dhcpLeaseMaxField.setName("dhcpMaxLease");
+        m_dhcpLeaseMaxField.setFieldLabel(MSGS.netRouterDhcpMaxLease());
+        m_dhcpLeaseMaxField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpMaxLeaseTime()));
+    	m_dhcpLeaseMaxField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_dhcpLeaseMaxField, formData);
+
+        //
+        // Pass DNS
+        // 
+    	m_passDnsRadioTrue = new Radio();  
+        m_passDnsRadioTrue.setBoxLabel(MSGS.trueLabel());
+        m_passDnsRadioTrue.setItemId("true");
+      
+        m_passDnsRadioFalse = new Radio();  
+        m_passDnsRadioFalse.setBoxLabel(MSGS.falseLabel());  
+        m_passDnsRadioFalse.setItemId("false");
+      
+        m_passDnsRadioGroup = new RadioGroup();
+        m_passDnsRadioGroup.setName("dhcpPassDns");
+        m_passDnsRadioGroup.setFieldLabel(MSGS.netRouterPassDns()); 
+        m_passDnsRadioGroup.add(m_passDnsRadioTrue);  
+        m_passDnsRadioGroup.add(m_passDnsRadioFalse);
+        m_passDnsRadioGroup.addPlugin(m_dirtyPlugin);  
+        m_passDnsRadioGroup.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipPassDns()));
+        fieldSet.add(m_passDnsRadioGroup, formData);
+
+	    m_formPanel.add(fieldSet);
+	    add(m_formPanel);
+	    setScrollMode(Scroll.AUTO);
+	    m_initialized = true;
+	}
+	    
+	public void refresh() 
+	{
+		Log.debug("DhcpNatConfigTab.refresh()");
+		if (m_dirty && m_initialized) {			
+	        m_dirty = false;
+			if (m_selectNetIfConfig == null) {
+				Log.debug("DhcpNatConfigTab.refresh() - resetting"); 
+				reset();
+	        } else {
+	        	Log.debug("DhcpNatConfigTab.refresh() - updating");
+				update();				
+			}		
+		}
+	}	
+	
+	private void update()
+	{
+		if (m_selectNetIfConfig != null) {
+	    	Log.debug("in update(): got new netIfConfig for DHCP server for " + m_selectNetIfConfig.getName() + ": " +
+	       			"\n\t\trouter mode: " + m_selectNetIfConfig.getRouterMode() +
+	       			"\n\t\trouter DHCP start address: " + m_selectNetIfConfig.getRouterDhcpBeginAddress() +
+	       			"\n\t\trouter DHCP end address: " + m_selectNetIfConfig.getRouterDhcpEndAddress() +
+	       			"\n\t\trouter default lease: " + Integer.toString(m_selectNetIfConfig.getRouterDhcpDefaultLease()) +
+	       			"\n\t\trouter max lease: " + Integer.toString(m_selectNetIfConfig.getRouterDhcpMaxLease()) +
+	       			"\n\t\trouter Pass DNS: " + Boolean.toString(m_selectNetIfConfig.getRouterDnsPass()));
+			
+			m_modeCombo.setSimpleValue(MessageUtils.get(m_selectNetIfConfig.getRouterMode()));
+			m_modeCombo.setOriginalValue(m_modeCombo.getValue());
+			
+			m_dhcpBeginAddressField.setValue(m_selectNetIfConfig.getRouterDhcpBeginAddress());
+			m_dhcpBeginAddressField.setOriginalValue(m_dhcpBeginAddressField.getValue());
+            
+            m_dhcpEndAddressField.setValue(m_selectNetIfConfig.getRouterDhcpEndAddress());
+            m_dhcpEndAddressField.setOriginalValue(m_dhcpEndAddressField.getValue());
+			
+			m_dhcpSubnetMaskField.setValue(m_selectNetIfConfig.getRouterDhcpSubnetMask());
+			m_dhcpSubnetMaskField.setOriginalValue(m_dhcpSubnetMaskField.getValue());
+			
+			m_dhcpLeaseDefaultField.setValue(m_selectNetIfConfig.getRouterDhcpDefaultLease());
+			m_dhcpLeaseDefaultField.setOriginalValue(m_dhcpLeaseDefaultField.getValue());
+			
+			m_dhcpLeaseMaxField.setValue(m_selectNetIfConfig.getRouterDhcpMaxLease());
+			m_dhcpLeaseMaxField.setOriginalValue(m_dhcpLeaseMaxField.getValue());
+			
+			if (m_selectNetIfConfig.getRouterDnsPass()) {
+				m_passDnsRadioTrue.setValue(true);
+				m_passDnsRadioTrue.setOriginalValue(m_passDnsRadioTrue.getValue());
+				
+				m_passDnsRadioFalse.setValue(false);
+				m_passDnsRadioFalse.setOriginalValue(m_passDnsRadioFalse.getValue());
+				
+				m_passDnsRadioGroup.setOriginalValue(m_passDnsRadioTrue);
+				m_passDnsRadioGroup.setValue(m_passDnsRadioGroup.getValue());
+			}
+			else {
+				m_passDnsRadioTrue.setValue(false);
+				m_passDnsRadioTrue.setOriginalValue(m_passDnsRadioTrue.getValue());
+
+				m_passDnsRadioFalse.setValue(true);
+				m_passDnsRadioFalse.setOriginalValue(m_passDnsRadioFalse.getValue());
+
+				m_passDnsRadioGroup.setOriginalValue(m_passDnsRadioFalse);
+				m_passDnsRadioGroup.setValue(m_passDnsRadioGroup.getValue());
+			}
+		} else {
+			Log.debug("selected Network Interface Config is null");
+		}
+
+        for (Field<?> field : m_formPanel.getFields()) {
+            FormUtils.removeDirtyFieldIcon(field);
+        }
+
+		refreshForm();
+	}
+	
+	
+	private void refreshForm() {
+
+	    if (m_formPanel != null) {		
+	  		if (!m_tcpIpConfigTab.isLanEnabled()) {
+				for (Field<?> field : m_formPanel.getFields()) {			
+					field.setEnabled(false);
+				}
+	  		}
+	  		else {
+	  			GwtWifiWirelessMode wirelessMode = m_wirelessConfigTab.getWirelessMode();
+	  			if (m_selectNetIfConfig.getHwTypeEnum() == GwtNetIfType.WIFI && (wirelessMode == GwtWifiWirelessMode.netWifiWirelessModeStation ||
+	  					wirelessMode == GwtWifiWirelessMode.netWifiWirelessModeDisabled)) 
+	  			{
+					for (Field<?> field : m_formPanel.getFields()) {			
+						field.setEnabled(false);
+					}	  				
+	  			} else {
+		
+					for (Field<?> field : m_formPanel.getFields()) {			
+						field.setEnabled(true);
+						field.validate();
+					}
+					String modeValue = m_modeCombo.getValue().getValue();
+					if (modeValue == MessageUtils.get(GwtNetRouterMode.netRouterNat.name()) ||
+					        modeValue == MessageUtils.get(GwtNetRouterMode.netRouterOff.name()))
+					{
+						for (Field<?> field : m_formPanel.getFields()) {			
+							if (field != m_modeCombo) {
+								field.setEnabled(false);
+							}
+						}
+					}
+					else {
+						for (Field<?> field : m_formPanel.getFields()) {			
+							if (field != m_modeCombo) {
+								field.setEnabled(true);
+							}
+						}
+					}
+	  			}
+	  		}
+		}
+	}
+	
+	
+	private void reset()
+	{
+		Log.debug("DhcpNatConfigTab: reset()");
+		m_modeCombo.setSimpleValue(MessageUtils.get(GwtNetRouterMode.netRouterOff.name()));
+		m_modeCombo.setOriginalValue(m_modeCombo.getValue());
+		
+		m_dhcpBeginAddressField.setValue("");
+		m_dhcpBeginAddressField.setOriginalValue(m_dhcpBeginAddressField.getValue());
+        
+        m_dhcpEndAddressField.setValue("");
+        m_dhcpEndAddressField.setOriginalValue(m_dhcpEndAddressField.getValue());
+		
+		m_dhcpSubnetMaskField.setValue("");
+		m_dhcpSubnetMaskField.setOriginalValue(m_dhcpSubnetMaskField.getValue());
+		
+		m_dhcpLeaseDefaultField.setValue(0);
+		m_dhcpLeaseDefaultField.setOriginalValue(m_dhcpLeaseDefaultField.getValue());
+		
+		m_dhcpLeaseMaxField.setValue(0);
+		m_dhcpLeaseMaxField.setOriginalValue(m_dhcpLeaseMaxField.getValue());
+				
+		m_passDnsRadioTrue.setValue(false);
+		m_passDnsRadioTrue.setOriginalValue(m_passDnsRadioTrue.getValue());
+		
+		m_passDnsRadioFalse.setValue(true);
+		m_passDnsRadioFalse.setOriginalValue(m_passDnsRadioFalse.getValue());
+		
+		m_passDnsRadioGroup.setValue(m_passDnsRadioFalse);
+		m_passDnsRadioGroup.setOriginalValue(m_passDnsRadioGroup.getValue());
+
+		update();
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/HardwareConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/HardwareConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2b834f1c97b09d0899faae66690df8f2550f049
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/HardwareConfigTab.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.LabelField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class HardwareConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession            m_currentSession;
+
+    private boolean               m_dirty;
+    private boolean               m_initialized;
+	private GwtNetInterfaceConfig m_selectNetIfConfig;
+
+	private FormPanel  m_formPanel;
+	private LabelField m_stateField;
+	private LabelField m_nameField;
+	private LabelField m_typeField;
+	private LabelField m_addressField;
+	private LabelField m_serialField;
+	private LabelField m_driverField;
+	private LabelField m_versionField;
+	private LabelField m_firmwareField;
+	private LabelField m_mtuField;
+	private LabelField m_usbField;
+	
+    public HardwareConfigTab(GwtSession currentSession) {
+        m_currentSession = currentSession;
+    	m_dirty          = true;
+    	m_initialized    = false;
+    }
+    
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig)
+    {
+    	m_dirty = true;
+    	m_selectNetIfConfig = netIfConfig;
+    }    
+    
+    public boolean isValid() {
+    	if (m_formPanel != null) {
+    		for (Field<?> field : m_formPanel.getFields()) {
+    			if (!field.isValid()) {
+    				return false;
+    			}
+    		}
+    	}
+    	return true;
+    }
+    
+    public boolean isDirty() {
+    	if (m_formPanel == null) {
+    		return false;
+    	}
+    	return false;
+    }
+    
+    
+    public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf)
+    {
+    	if (m_formPanel != null) {
+	    	updatedNetIf.setHwState((String) m_stateField.getValue());
+	    	updatedNetIf.setHwName((String) m_nameField.getValue());
+	    	updatedNetIf.setHwType((String) m_typeField.getValue());
+	    	updatedNetIf.setHwAddress((String) m_addressField.getValue());
+	    	updatedNetIf.setHwSerial((String) m_serialField.getValue());
+	    	updatedNetIf.setHwDriver((String) m_driverField.getValue());
+	    	updatedNetIf.setHwDriverVersion((String) m_versionField.getValue());
+	    	updatedNetIf.setHwFirmware((String) m_firmwareField.getValue());
+	    	if (m_mtuField.getValue() != null) {
+	    		int mtu = Integer.parseInt((String) m_mtuField.getValue());
+	    		updatedNetIf.setHwMTU(mtu);
+	    	}	    	
+	    	updatedNetIf.setHwUsbDevice((String) m_usbField.getValue());
+    	}
+    }
+
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("network-hardware");
+        
+        FormData formData = new FormData();
+        formData.setWidth(250);
+
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(false);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setScrollMode(Scroll.AUTOY);
+        m_formPanel.setLayout(new FlowLayout());
+        m_formPanel.setStyleAttribute("padding-left", "30px");
+
+
+        FieldSet fieldSet = new FieldSet();
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        fieldSet.setBorders(false);
+
+        // state
+        m_stateField = new LabelField();
+        m_stateField.setFieldLabel(MSGS.netHwState());
+        fieldSet.add(m_stateField, formData);
+        
+        // name
+        m_nameField = new LabelField();
+        m_nameField.setFieldLabel(MSGS.netHwName());
+        fieldSet.add(m_nameField, formData);
+
+        // type
+        m_typeField = new LabelField();
+        m_typeField.setFieldLabel(MSGS.netHwType());
+        fieldSet.add(m_typeField, formData);
+
+        // hardware address
+        m_addressField = new LabelField();
+        m_addressField.setFieldLabel(MSGS.netHwAddress());
+        fieldSet.add(m_addressField, formData);
+
+        // serial num
+        m_serialField = new LabelField();
+        m_serialField.setFieldLabel(MSGS.netHwSerial());
+        fieldSet.add(m_serialField, formData);
+
+        // driver
+        m_driverField = new LabelField();
+        m_driverField.setFieldLabel(MSGS.netHwDriver());
+        fieldSet.add(m_driverField, formData);
+
+        // driver version
+        m_versionField = new LabelField();
+        m_versionField.setFieldLabel(MSGS.netHwVersion());
+        fieldSet.add(m_versionField, formData);
+
+        // firmware version
+        m_firmwareField = new LabelField();
+        m_firmwareField.setFieldLabel(MSGS.netHwFirmware());
+        fieldSet.add(m_firmwareField, formData);
+
+        // mtu
+        m_mtuField = new LabelField();
+        m_mtuField.setFieldLabel(MSGS.netHwMTU());
+        fieldSet.add(m_mtuField, formData);
+
+        // usb device
+        m_usbField = new LabelField();
+        m_usbField.setFieldLabel(MSGS.netHwUSBDevice());
+        fieldSet.add(m_usbField, formData);
+    
+        m_formPanel.add(fieldSet);
+        add(m_formPanel);
+        
+        m_initialized = true;
+    }
+    
+	public void refresh() 
+	{
+		if (m_dirty && m_initialized) {			
+	        m_dirty = false;
+			if (m_selectNetIfConfig == null) {
+				reset();
+	        }
+			else {
+				update();				
+			}		
+		}
+	}
+	
+	private void update()
+	{
+		if (m_selectNetIfConfig != null) {
+			m_stateField.setValue(m_selectNetIfConfig.getHwState());
+			m_nameField.setValue(m_selectNetIfConfig.getHwName());
+			m_typeField.setValue(m_selectNetIfConfig.getHwType());
+			m_addressField.setValue(m_selectNetIfConfig.getHwAddress());
+			m_serialField.setValue(m_selectNetIfConfig.getHwSerial());
+			m_driverField.setValue(m_selectNetIfConfig.getHwDriver());
+			m_versionField.setValue(m_selectNetIfConfig.getHwDriverVersion());
+			m_firmwareField.setValue(m_selectNetIfConfig.getHwFirmware());
+			m_mtuField.setValue(m_selectNetIfConfig.getHwMTU());
+			m_usbField.setValue(m_selectNetIfConfig.getHwUsbDevice());
+		}
+		else {
+			reset();
+		}
+	}
+
+	private void reset()
+	{
+		m_stateField.setValue("");
+		m_nameField.setValue("");
+		m_typeField.setValue("");
+		m_addressField.setValue("");
+		m_serialField.setValue("");
+		m_driverField.setValue("");
+		m_versionField.setValue("");
+		m_firmwareField.setValue("");
+		m_mtuField.setValue("");
+		m_usbField.setValue("");
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ModemConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ModemConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d303a1d7bb1e69d60e5f9901a29c12cf4488ff3
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ModemConfigTab.java
@@ -0,0 +1,632 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.client.util.FormUtils;
+import org.eclipse.kura.web.client.util.MessageUtils;
+import org.eclipse.kura.web.shared.model.GwtModemAuthType;
+import org.eclipse.kura.web.shared.model.GwtModemInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ComponentPlugin;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.LabelField;
+import com.extjs.gxt.ui.client.widget.form.NumberField;
+import com.extjs.gxt.ui.client.widget.form.Radio;
+import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class ModemConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final ToolTipBox toolTipField = new ToolTipBox("275px", "66px");
+	private final String defaultToolTip = "Mouse over enabled items on the left to see help text.";
+	private final Map<String, String> defaultDialString = new HashMap<String, String>();
+	
+	@SuppressWarnings("unused")
+    private GwtSession               m_currentSession;
+
+    private boolean                  m_dirty;
+    private boolean                  m_initialized;
+	private GwtModemInterfaceConfig  m_selectNetIfConfig;
+	
+	private FormPanel                m_formPanel;
+	private LabelField               m_modemModel;
+	private SimpleComboBox<String>   m_networkTechCombo;
+	private LabelField               m_connectionType;
+    private TextField<String>        m_modemIdField;
+	private NumberField              m_ifaceNumField;
+	private TextField<String>        m_dialStringField;
+	private TextField<String>        m_apnField;
+	private SimpleComboBox<String>   m_authTypeCombo;
+	private TextField<String>        m_usernameField;
+	private TextField<String>        m_passwordField;
+	private NumberField 			 m_lcpEchoIntervalField;
+	private NumberField				 m_lcpEchoFailureField;
+	
+	private Radio 				   	 m_enableGpsRadioTrue;
+	private Radio 				   	 m_enableGpsRadioFalse;
+	private RadioGroup 			   	 m_enableGpsRadioGroup;
+	
+    private ComponentPlugin          m_dirtyPlugin;
+	
+    private class MouseOverListener implements Listener<BaseEvent> {
+
+    	private String  html;
+    	
+    	public MouseOverListener(String html) {
+    		this.html = html;
+    	}
+		public void handleEvent(BaseEvent be) {
+			toolTipField.setText(html);
+		}
+    	
+    }
+	
+    public ModemConfigTab(GwtSession currentSession)
+    {
+        m_currentSession    = currentSession;
+    	m_dirty             = true;
+    	m_initialized       = false;
+    
+    	defaultDialString.put("HE910", "atd*99***1#");
+    	defaultDialString.put("DE910", "atd#777");
+	    final ModemConfigTab theTab = this;
+    	m_dirtyPlugin = new ComponentPlugin() {  
+    		public void init(Component component) {  
+    			component.addListener(Events.Change, new Listener<ComponentEvent>() {  
+    				public void handleEvent(ComponentEvent be) {  
+    					FormUtils.addDirtyFieldIcon(be.getComponent());    					
+    					theTab.fireEvent(Events.Change);
+    				}  
+    			});  
+  	      	}  
+  	    };  	    
+    }
+
+    
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig)
+    {
+    	m_dirty = true;
+    	
+    	if(netIfConfig instanceof GwtModemInterfaceConfig) {
+	    	m_selectNetIfConfig = (GwtModemInterfaceConfig) netIfConfig;
+    	}
+    }
+    
+    
+    public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf)
+    {
+        GwtModemInterfaceConfig updatedModemNetIf = (GwtModemInterfaceConfig) updatedNetIf;
+        
+        // note - status is set in tcp/ip tab
+        
+    	if (m_formPanel != null) {
+    		updatedModemNetIf.setPppNum(m_ifaceNumField.getValue().intValue());
+    		
+            String modemId = (m_modemIdField.getValue() != null) ? m_modemIdField.getValue() : "";
+    		updatedModemNetIf.setModemId(modemId);
+
+    		String dialString = (m_dialStringField.getValue() != null) ? m_dialStringField.getValue() : "";
+    		updatedModemNetIf.setDialString(dialString);
+    		
+    		String apn = (m_apnField.getValue() != null) ? m_apnField.getValue() : "";
+    		updatedModemNetIf.setApn(apn);
+    		
+    		String authValue = m_authTypeCombo.getSimpleValue();
+    		for (GwtModemAuthType auth : GwtModemAuthType.values()) {
+    			if (MessageUtils.get(auth.name()).equals(authValue)) {
+    				updatedModemNetIf.setAuthType(auth);
+    			}
+    		}     		
+    		
+    		if(updatedModemNetIf.getAuthType() != GwtModemAuthType.netModemAuthNONE) {
+    		    String username = (m_usernameField.getValue() != null) ? m_usernameField.getValue() : "";
+        		updatedModemNetIf.setUsername(username);
+    		    
+    		    String password = (m_passwordField.getValue() != null) ? m_passwordField.getValue() : "";
+        		updatedModemNetIf.setPassword(password);
+    		}    
+    		
+    		updatedModemNetIf.setLcpEchoInterval(m_lcpEchoIntervalField.getValue().intValue());
+    		updatedModemNetIf.setLcpEchoFailure(m_lcpEchoFailureField.getValue().intValue());
+    		updatedModemNetIf.setGpsEnabled(m_enableGpsRadioTrue.getValue().booleanValue());
+    	} else {
+    	    if(m_selectNetIfConfig != null) {
+    	        Log.debug("Modem config tab not yet rendered, using original values");
+    	        
+        	    updatedModemNetIf.setPppNum(m_selectNetIfConfig.getPppNum());
+        	    updatedModemNetIf.setModemId(m_selectNetIfConfig.getModemId());
+        	    updatedModemNetIf.setDialString(m_selectNetIfConfig.getDialString());
+        	    updatedModemNetIf.setApn(m_selectNetIfConfig.getApn());
+        	    updatedModemNetIf.setAuthType(m_selectNetIfConfig.getAuthType());
+        	    updatedModemNetIf.setUsername(m_selectNetIfConfig.getUsername());
+        	    updatedModemNetIf.setPassword(m_selectNetIfConfig.getPassword());    
+        	    updatedModemNetIf.setLcpEchoInterval(m_selectNetIfConfig.getLcpEchoInterval());
+        	    updatedModemNetIf.setLcpEchoFailure(m_selectNetIfConfig.getLcpEchoFailure());
+        	    updatedModemNetIf.setGpsEnabled(m_selectNetIfConfig.isGpsEnabled());
+    	    }
+    	}
+    }
+
+    public boolean isValid() {
+    	if (m_formPanel != null) {
+    		for (Field<?> field : m_formPanel.getFields()) {
+    			if (!field.isValid()) {
+    				return false;
+    			}
+    		}
+    	}
+    	return true;
+    }
+    
+    public boolean isDirty() {
+    	if (m_formPanel == null) {
+    		return false;
+    	}
+        List<Field<?>> fields = m_formPanel.getFields();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field) {
+	            Field<?> field = (Field<?>) fields.get(i);
+	            if (field.isDirty()) {
+	                return true;
+	            }
+        	}
+        }
+        return false;
+    }
+
+    protected void onRender(Element parent, int index) 
+    {        
+        Log.debug("ModemConfigTab - onRender()");
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("network-modem");
+        
+        FormData formData = new FormData();
+        formData.setWidth(250);
+        
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(false);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setLayout(new FlowLayout());
+        m_formPanel.setStyleAttribute("min-width", "775px");
+        m_formPanel.setStyleAttribute("padding-left", "30px");
+
+
+        FieldSet fieldSet = new FieldSet();
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        fieldSet.setBorders(false);
+        
+        //
+        // Tool Tip Box
+        //
+        toolTipField.setText(defaultToolTip);
+        fieldSet.add(toolTipField);
+
+        //
+        // Modem Model
+        // 
+        m_modemModel = new LabelField();
+        m_modemModel.setName("modemModel");
+        m_modemModel.setFieldLabel(MSGS.netModemModel());
+        m_modemModel.addPlugin(m_dirtyPlugin);
+        m_modemModel.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        fieldSet.add(m_modemModel, formData);
+
+        //
+        // Network Technology
+        // 
+        m_networkTechCombo = new SimpleComboBox<String>();
+        m_networkTechCombo.setName("networkTech");
+        m_networkTechCombo.setFieldLabel(MSGS.netModemNetworkTechnology());
+        m_networkTechCombo.setEditable(false);
+        m_networkTechCombo.setTypeAhead(true);
+        m_networkTechCombo.setTriggerAction(TriggerAction.ALL);
+        m_networkTechCombo.add(MSGS.unknown());
+        m_networkTechCombo.setSimpleValue(MSGS.unknown());
+        m_networkTechCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {         
+            @Override
+            public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
+                refreshForm();
+            }
+        });        
+        m_networkTechCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipNetworkTopology()));
+        m_networkTechCombo.addStyleName("kura-combobox");
+        m_networkTechCombo.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_networkTechCombo, formData);
+       
+        //
+        // Service Type
+        // 
+        m_connectionType = new LabelField();
+        m_connectionType.setName("serviceType");
+        m_connectionType.setFieldLabel(MSGS.netModemConnectionType());
+        m_connectionType.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_connectionType, formData);
+        
+        //
+        // Modem Identifier
+        // 
+        m_modemIdField = new TextField<String>();
+        m_modemIdField.setAllowBlank(true);
+        m_modemIdField.setName("modemId");
+        m_modemIdField.setFieldLabel(MSGS.netModemIdentifier());
+        m_modemIdField.addPlugin(m_dirtyPlugin);
+        m_modemIdField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        m_modemIdField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipModemIndentifier()));
+        m_modemIdField.addStyleName("kura-textfield");
+        fieldSet.add(m_modemIdField, formData);
+        
+        //
+        // Interface number
+        // 
+        m_ifaceNumField = new NumberField();
+        m_ifaceNumField.setAllowBlank(false);
+        m_ifaceNumField.setName("ifaceNum");
+        m_ifaceNumField.setFieldLabel(MSGS.netModemInterfaceNum());
+        m_ifaceNumField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipModemInterfaceNumber()));
+        m_ifaceNumField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_ifaceNumField, formData);
+
+        //
+        // Dial String
+        // 
+        m_dialStringField = new TextField<String>();
+        m_dialStringField.setName("dialString");
+        m_dialStringField.setFieldLabel(MSGS.netModemDialString());
+        String dialString = "";
+        String model = "";
+        if (m_selectNetIfConfig != null) {
+        	model = m_selectNetIfConfig.getModel();
+        	if (model != null && model.length() > 0) {
+        		if (model.contains("HE910")) {
+        			dialString = defaultDialString.get("HE910");
+        		}
+        		else if (model.contains("DE910")) {
+        			dialString = defaultDialString.get("DE910");
+        		}
+        		else {
+        			dialString ="";
+        		}
+        	}
+        }
+        if (dialString.equals("")) {
+        	m_dialStringField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipDialStringDefault()));
+        }
+        else {
+        	m_dialStringField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipDialString(dialString)));
+        }
+        m_dialStringField.addStyleName("kura-textfield");
+        m_dialStringField.setAllowBlank(false);
+        m_dialStringField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_dialStringField, formData);
+
+        //
+        // APN
+        // 
+        m_apnField = new TextField<String>();
+        m_apnField.setName("apn");
+        m_apnField.setFieldLabel(MSGS.netModemAPN());
+        m_apnField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipApn()));
+        m_apnField.addStyleName("kura-textfield");
+        m_apnField.setAllowBlank(false);
+        m_apnField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_apnField, formData);
+
+        //
+    	// Auth Type
+        //
+        m_authTypeCombo = new SimpleComboBox<String>();
+        m_authTypeCombo.setName("authTypeCombo");
+        m_authTypeCombo.setFieldLabel(MSGS.netModemAuthType());
+        m_authTypeCombo.setEditable(false);
+        m_authTypeCombo.setTypeAhead(true);  
+        m_authTypeCombo.setTriggerAction(TriggerAction.ALL);
+        for (GwtModemAuthType auth : GwtModemAuthType.values()) {
+        	m_authTypeCombo.add(MessageUtils.get(auth.name()));
+        }
+        m_authTypeCombo.setSimpleValue(MessageUtils.get(GwtModemAuthType.netModemAuthNONE.name()));
+        m_authTypeCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {
+			@Override
+			public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
+				refreshForm();
+			}
+		});
+        m_authTypeCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipAuthentication()));
+        m_authTypeCombo.addStyleName("kura-combobox");
+        m_authTypeCombo.addPlugin(m_dirtyPlugin);
+        m_authTypeCombo.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        fieldSet.add(m_authTypeCombo, formData);
+
+        //
+        // Username
+        // 
+        m_usernameField = new TextField<String>();
+        m_usernameField.setAllowBlank(true);
+        m_usernameField.setName("username");
+        m_usernameField.setFieldLabel(MSGS.netModemUsername());
+        m_usernameField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipUsername()));
+        m_usernameField.addStyleName("kura-textfield");
+        m_usernameField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_usernameField, formData);      
+
+        //
+        // Password
+        // 
+        m_passwordField = new TextField<String>();
+        m_passwordField.setAllowBlank(true);
+        m_passwordField.setPassword(true);
+        m_passwordField.setName("password");
+        m_passwordField.setFieldLabel(MSGS.netModemPassword());
+        m_passwordField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipPassword()));
+        m_passwordField.addStyleName("kura-textfield");
+        m_passwordField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_passwordField, formData);      
+        
+        //
+        // LCP Echo Interval
+        // 
+        m_lcpEchoIntervalField = new NumberField();
+        m_lcpEchoIntervalField.setAllowBlank(false);
+        m_lcpEchoIntervalField.setName("lcpEchoInterval");
+        m_lcpEchoIntervalField.setFieldLabel(MSGS.netLcpEchoInterval());
+        m_lcpEchoIntervalField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipLcpEchoInterval()));
+        m_lcpEchoIntervalField.addPlugin(m_dirtyPlugin);
+        m_lcpEchoIntervalField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        fieldSet.add(m_lcpEchoIntervalField, formData);
+        
+        //
+        // LCP Echo Interval
+        // 
+        m_lcpEchoFailureField = new NumberField();
+        m_lcpEchoFailureField.setAllowBlank(false);
+        m_lcpEchoFailureField.setName("lcpEchoFailure");
+        m_lcpEchoFailureField.setFieldLabel(MSGS.netLcpEchoFailure());
+        m_lcpEchoFailureField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipLcpEchoFailure()));
+        m_lcpEchoFailureField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(m_lcpEchoFailureField, formData);
+        
+        m_enableGpsRadioTrue = new Radio();  
+        m_enableGpsRadioTrue.setBoxLabel(MSGS.trueLabel());
+        m_enableGpsRadioTrue.setItemId("true");
+        
+        m_enableGpsRadioFalse = new Radio();  
+        m_enableGpsRadioFalse.setBoxLabel(MSGS.falseLabel());  
+        m_enableGpsRadioFalse.setItemId("false");
+        
+        m_enableGpsRadioGroup = new RadioGroup();
+        m_enableGpsRadioGroup.setName("modemEnableGps");
+        m_enableGpsRadioGroup.setFieldLabel(MSGS.netModemEnableGps()); 
+        m_enableGpsRadioGroup.add(m_enableGpsRadioTrue);  
+        m_enableGpsRadioGroup.add(m_enableGpsRadioFalse);
+        m_enableGpsRadioGroup.addPlugin(m_dirtyPlugin);  
+        m_enableGpsRadioGroup.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netModemToolTipEnableGps()));
+        m_enableGpsRadioGroup.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        fieldSet.add(m_enableGpsRadioGroup, formData);
+        
+	    m_formPanel.add(fieldSet);
+	    add(m_formPanel);
+	    setScrollMode(Scroll.AUTO);
+	    m_initialized = true;
+	}
+	    
+	public void refresh() 
+	{
+		Log.debug("ModemConfigTab.refresh()");
+		if (m_dirty && m_initialized) {			
+	        m_dirty = false;
+			if (m_selectNetIfConfig == null) {
+				Log.debug("ModemConfigTab.refresh() - resetting"); 
+				reset();
+	        } else {
+	        	Log.debug("ModemConfigTab.refresh() - updating");
+				update();				
+			}		
+		}
+	}	
+	
+	private void update()
+	{
+		Log.debug("ModemConfigTab - update()");
+		for (Field<?> field : m_formPanel.getFields()) {
+			FormUtils.removeDirtyFieldIcon(field);
+		}
+
+		if (m_selectNetIfConfig != null) {
+            
+		    m_modemModel.setValue(m_selectNetIfConfig.getManufacturer() + " - " + m_selectNetIfConfig.getModel());
+		    
+		    m_networkTechCombo.removeAll();
+		    List<String> networkTechnologies = m_selectNetIfConfig.getNetworkTechnology();
+		    if(networkTechnologies != null && networkTechnologies.size() > 0) {
+    		    for(String techType : m_selectNetIfConfig.getNetworkTechnology()) {
+    		        m_networkTechCombo.add(techType);
+    		    }
+    		    m_networkTechCombo.setSimpleValue(m_selectNetIfConfig.getNetworkTechnology().get(0));
+		    } else {
+		        m_networkTechCombo.add(MSGS.unknown());
+		        m_networkTechCombo.setSimpleValue(MSGS.unknown());
+		    }
+            m_networkTechCombo.setOriginalValue(m_networkTechCombo.getValue());
+
+		    m_connectionType.setValue(m_selectNetIfConfig.getConnectionType());
+		    
+			m_modemIdField.setValue(m_selectNetIfConfig.getModemId());
+			m_modemIdField.setOriginalValue(m_modemIdField.getValue());
+
+            m_ifaceNumField.setValue(m_selectNetIfConfig.getPppNum());
+            m_ifaceNumField.setOriginalValue(m_ifaceNumField.getValue());
+            
+			m_dialStringField.setValue(m_selectNetIfConfig.getDialString());
+			m_dialStringField.setOriginalValue(m_dialStringField.getValue());
+			
+			m_apnField.setValue(m_selectNetIfConfig.getApn());
+			m_apnField.setOriginalValue(m_apnField.getValue());
+			
+			GwtModemAuthType authType = GwtModemAuthType.netModemAuthNONE;
+			if(m_selectNetIfConfig.getAuthType() != null) {
+			    authType = m_selectNetIfConfig.getAuthType();
+			}
+			m_authTypeCombo.setSimpleValue(MessageUtils.get(authType.name()));
+			m_authTypeCombo.setOriginalValue(m_authTypeCombo.getValue());
+			
+			m_usernameField.setValue(m_selectNetIfConfig.getUsername());
+			m_usernameField.setOriginalValue(m_usernameField.getValue());
+			
+			m_passwordField.setValue(m_selectNetIfConfig.getPassword());
+			m_passwordField.setOriginalValue(m_passwordField.getValue());			
+			
+			m_lcpEchoIntervalField.setValue(m_selectNetIfConfig.getLcpEchoInterval());
+			m_lcpEchoIntervalField.setOriginalValue(m_lcpEchoIntervalField.getValue());
+			
+			m_lcpEchoFailureField.setValue(m_selectNetIfConfig.getLcpEchoFailure());
+			m_lcpEchoFailureField.setOriginalValue(m_lcpEchoFailureField.getValue());
+			
+			if (m_selectNetIfConfig.isGpsEnabled()) {
+				m_enableGpsRadioTrue.setValue(true);
+				m_enableGpsRadioTrue.setOriginalValue(m_enableGpsRadioTrue.getValue());
+				
+				m_enableGpsRadioFalse.setValue(false);
+				m_enableGpsRadioFalse.setOriginalValue(m_enableGpsRadioFalse.getValue());
+				
+				m_enableGpsRadioGroup.setOriginalValue(m_enableGpsRadioTrue);
+				m_enableGpsRadioGroup.setValue(m_enableGpsRadioGroup.getValue());
+			} else {
+				m_enableGpsRadioTrue.setValue(false);
+				m_enableGpsRadioTrue.setOriginalValue(m_enableGpsRadioTrue.getValue());
+
+				m_enableGpsRadioFalse.setValue(true);
+				m_enableGpsRadioFalse.setOriginalValue(m_enableGpsRadioFalse.getValue());
+
+				m_enableGpsRadioGroup.setOriginalValue(m_enableGpsRadioFalse);
+				m_enableGpsRadioGroup.setValue(m_enableGpsRadioGroup.getValue());
+			}
+		} else {
+			Log.debug("selected Network Interface Config is null");
+		}
+		
+		for (Field<?> field : m_formPanel.getFields()) {
+			FormUtils.removeDirtyFieldIcon(field);
+		}
+		
+		refreshForm();
+	}
+	
+	
+	private void refreshForm() {
+
+		if (m_formPanel != null) {
+			for (Field<?> field : m_formPanel.getFields()) {
+				field.setEnabled(true);
+			}
+			
+			String authTypeVal = m_authTypeCombo.getSimpleValue();
+            if(authTypeVal == null || authTypeVal.equals(MessageUtils.get(GwtModemAuthType.netModemAuthNONE.name()))) {
+                m_usernameField.setEnabled(false);
+                m_passwordField.setEnabled(false);
+            } else {
+                m_usernameField.setEnabled(true);
+                m_passwordField.setEnabled(true);
+            }
+            
+            if (m_selectNetIfConfig.isGpsSupported()) {
+            	 m_enableGpsRadioTrue.setEnabled(true);
+                 m_enableGpsRadioFalse.setEnabled(true);
+                 m_enableGpsRadioGroup.setEnabled(true);
+            } else {
+            	 m_enableGpsRadioTrue.setEnabled(false);
+                 m_enableGpsRadioFalse.setEnabled(false);
+                 m_enableGpsRadioGroup.setEnabled(false);
+            }
+            
+            for (String techType : m_selectNetIfConfig.getNetworkTechnology()) {
+				if (techType.equals("EVDO") || techType.equals("CDMA")) {
+					m_apnField.setEnabled(false);
+					m_authTypeCombo.setEnabled(false);
+					m_usernameField.setEnabled(false);
+	                m_passwordField.setEnabled(false);
+				}
+			}
+		}
+	}
+	
+	
+	private void reset()
+	{
+		Log.debug("ModemConfigTab: reset()");
+
+		m_modemIdField.setValue("");
+		m_modemIdField.setOriginalValue(m_modemIdField.getValue());
+		
+        m_ifaceNumField.setValue(null);
+        m_ifaceNumField.setOriginalValue(m_ifaceNumField.getValue());
+        
+		m_dialStringField.setValue("");
+		m_dialStringField.setOriginalValue(m_dialStringField.getValue());
+		
+		m_apnField.setValue("");
+		m_apnField.setOriginalValue(m_apnField.getValue());
+		
+		m_authTypeCombo.setSimpleValue(MessageUtils.get(GwtModemAuthType.netModemAuthNONE.name()));
+		m_authTypeCombo.setOriginalValue(m_authTypeCombo.getValue());
+		
+		m_usernameField.setValue("");
+		m_usernameField.setOriginalValue(m_usernameField.getValue());
+		
+		m_passwordField.setValue("");
+		m_passwordField.setOriginalValue(m_passwordField.getValue());	
+		
+		m_lcpEchoIntervalField.setValue(null);
+		m_lcpEchoIntervalField.setOriginalValue(m_lcpEchoIntervalField.getValue());		
+		
+		m_lcpEchoFailureField.setValue(null);
+		m_lcpEchoFailureField.setOriginalValue(m_lcpEchoFailureField.getValue());
+		
+		m_enableGpsRadioGroup.setValue(m_enableGpsRadioFalse);
+		m_enableGpsRadioGroup.setOriginalValue(m_enableGpsRadioGroup.getValue());
+
+		update();
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetInterfaceConfigTabs.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetInterfaceConfigTabs.java
new file mode 100644
index 0000000000000000000000000000000000000000..a95c06ff344edc4256d6e6950937c5e680727fe0
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetInterfaceConfigTabs.java
@@ -0,0 +1,532 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtModemInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtNetIfStatus;
+import org.eclipse.kura.web.shared.model.GwtNetIfType;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.model.GwtWifiNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiWirelessMode;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.TabItem;
+import com.extjs.gxt.ui.client.widget.TabPanel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class NetInterfaceConfigTabs extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private GwtSession             m_currentSession;
+	
+	private TabPanel               m_tabsPanel;
+	private TabItem                m_tabIPv4Config;
+	private TabItem                m_tabWirelessConfig;
+	private TabItem                m_tabDhcpNatConfig;
+	private TabItem				   m_tabReverseNatConfig;
+	private TabItem                m_tabModemConfig;
+	private TabItem                m_tabHardwareConfig;
+	
+	private GwtNetInterfaceConfig  m_netIfConfig;
+	private TcpIpConfigTab         m_tcpIpConfigTab;
+	private WirelessConfigTab      m_wirelessConfigTab;
+	private DhcpNatConfigTab       m_dhcpNatConfigTab;
+	private ReverseNatConfigTab	   m_reverseNatConfigTab;
+	private ModemConfigTab         m_modemConfigTab;
+	private HardwareConfigTab      m_hwConfigTab;
+	
+	private Object				   m_tabsPanelLock = new Object();
+	
+    
+	public NetInterfaceConfigTabs(GwtSession currentSession) {
+	    
+		m_currentSession   = currentSession;
+	    
+	    initTabs();
+	}
+
+	
+    private void initTabs()
+    {    	
+	    final NetInterfaceConfigTabs theTabs = this;
+
+	    // TCP/IP
+	    if (m_tcpIpConfigTab != null) {
+    		m_tcpIpConfigTab.removeFromParent();
+    	}
+	    m_tcpIpConfigTab = new TcpIpConfigTab(m_currentSession, this);
+	    m_tcpIpConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				theTabs.fireEvent(be.getType());
+			}
+		});
+		if (m_tabIPv4Config != null) {
+			m_tabIPv4Config.add(m_tcpIpConfigTab);
+			m_tabIPv4Config.layout();
+		}
+	    
+		// Wireless
+	    if (m_wirelessConfigTab != null) {
+	    	m_wirelessConfigTab.removeFromParent();
+    	}
+	    m_wirelessConfigTab = new WirelessConfigTab(m_currentSession, m_tcpIpConfigTab, this);
+	    m_wirelessConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				theTabs.fireEvent(be.getType());
+			}
+		});
+		if (m_tabWirelessConfig != null) {
+			m_tabWirelessConfig.add(m_wirelessConfigTab);
+			m_tabWirelessConfig.layout();
+		}
+
+		// Modem
+	    if (m_modemConfigTab != null) {
+	    	m_modemConfigTab.removeFromParent();
+    	}
+	    m_modemConfigTab = new ModemConfigTab(m_currentSession);
+	    m_modemConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				theTabs.fireEvent(be.getType());
+			}
+		});
+		if (m_tabModemConfig != null) {
+			m_tabModemConfig.add(m_modemConfigTab);
+			m_tabModemConfig.layout();
+		}
+		
+		// DHCP/NAT
+	    if (m_dhcpNatConfigTab != null) {
+	    	m_dhcpNatConfigTab.removeFromParent();
+    	}
+	    m_dhcpNatConfigTab = new DhcpNatConfigTab(m_currentSession, m_tcpIpConfigTab, m_wirelessConfigTab);
+	    m_dhcpNatConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				theTabs.fireEvent(be.getType());
+			}
+		});
+		if (m_tabDhcpNatConfig != null) {
+			m_tabDhcpNatConfig.add(m_dhcpNatConfigTab);
+			m_tabDhcpNatConfig.layout();			
+		}
+		
+		// Reverse NAT
+	    if (m_reverseNatConfigTab != null) {
+	    	m_reverseNatConfigTab.removeFromParent();
+    	}
+	    m_reverseNatConfigTab = new ReverseNatConfigTab(m_currentSession);
+	    m_reverseNatConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				theTabs.fireEvent(be.getType());
+			}
+		});
+		if (m_tabReverseNatConfig != null) {
+			m_tabReverseNatConfig.add(m_reverseNatConfigTab);
+			m_tabReverseNatConfig.layout();			
+		}
+		
+		// Hardware
+	    if (m_hwConfigTab != null) {
+	    	m_hwConfigTab.removeFromParent();
+    	}
+	    m_hwConfigTab = new HardwareConfigTab(m_currentSession);
+	    m_hwConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				theTabs.fireEvent(be.getType());
+			}
+		});    	
+		if (m_tabHardwareConfig != null) {
+			m_tabHardwareConfig.add(m_hwConfigTab);
+			m_tabHardwareConfig.layout();			
+		}
+    }
+
+	
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig) {
+   
+    	Log.debug("Setting the netInterface " + netIfConfig.getName());
+    	    	
+    	m_netIfConfig = netIfConfig;
+    	
+    	// refresh the tabs so the dirty state is cleaned up
+    	initTabs();
+    			
+     	m_tcpIpConfigTab.setNetInterface(netIfConfig);     	
+    	m_dhcpNatConfigTab.setNetInterface(netIfConfig);
+    	m_hwConfigTab.setNetInterface(netIfConfig);
+		m_wirelessConfigTab.setNetInterface(m_netIfConfig);
+		m_modemConfigTab.setNetInterface(m_netIfConfig);
+		m_reverseNatConfigTab.setNetInterface(m_netIfConfig);
+    	
+    	// set the tabs for this interface
+    	removeInterfaceTabs();    	
+    	if(!GwtNetIfStatus.netIPv4StatusDisabled.equals(netIfConfig.getStatusEnum())) {
+    	    adjustInterfaceTabs();
+    	}
+    	
+    	// Refresh all visible tabs
+    	List<TabItem> visibleTabs = m_tabsPanel.getItems();
+        if (visibleTabs.contains(m_tabIPv4Config)) {
+            m_tcpIpConfigTab.refresh();
+        }
+        if (visibleTabs.contains(m_tabWirelessConfig)) {
+            m_wirelessConfigTab.refresh();
+        }
+        if (visibleTabs.contains(m_tabModemConfig)) {
+            m_modemConfigTab.refresh();
+        }
+        if (visibleTabs.contains(m_tabDhcpNatConfig)) {
+            m_dhcpNatConfigTab.refresh();
+        }
+        if (visibleTabs.contains(m_tabReverseNatConfig)) {
+        	m_reverseNatConfigTab.refresh();
+        }
+        if (visibleTabs.contains(m_tabHardwareConfig)) {
+            m_hwConfigTab.refresh();
+        }
+    }
+    
+    
+    public GwtNetInterfaceConfig getUpdatedNetInterface() 
+    {
+    	Log.debug("getting updatedNetInterface");
+    	
+    	GwtNetInterfaceConfig updatedNetIf = null;
+    	if (m_netIfConfig instanceof GwtWifiNetInterfaceConfig) {
+    		Log.debug("Creating GwtWifiNetInterfaceConfig");
+    		updatedNetIf = new GwtWifiNetInterfaceConfig();
+    	} else if (m_netIfConfig instanceof GwtModemInterfaceConfig) {
+    		Log.debug("Creating GwtModemInterfaceConfig");
+    		updatedNetIf = new GwtModemInterfaceConfig();
+    	} else {
+    		Log.debug("Creating GwtNetInterfaceConfig");
+    		updatedNetIf = new GwtNetInterfaceConfig();
+    	}
+    	
+    	// Copy the previous values
+    	updatedNetIf.setProperties(m_netIfConfig.getProperties());
+
+        // Get updated values from visible tabs
+    	Log.debug("Setting updated values");
+        List<TabItem> tabItems = new ArrayList<TabItem>(m_tabsPanel.getItems());
+        if (tabItems.contains(m_tabIPv4Config)) {
+            m_tcpIpConfigTab.getUpdatedNetInterface(updatedNetIf);
+        }
+        if (tabItems.contains(m_tabWirelessConfig)) {
+            m_wirelessConfigTab.getUpdatedNetInterface(updatedNetIf);
+        }
+        if (tabItems.contains(m_tabModemConfig)) {
+            m_modemConfigTab.getUpdatedNetInterface(updatedNetIf);
+        }
+        if (tabItems.contains(m_tabDhcpNatConfig)) {
+            m_dhcpNatConfigTab.getUpdatedNetInterface(updatedNetIf);
+        }
+        if (tabItems.contains(m_tabReverseNatConfig)) {
+        	m_reverseNatConfigTab.getUpdatedNetInterface(updatedNetIf);
+        }
+        if (tabItems.contains(m_tabHardwareConfig)) {
+            m_hwConfigTab.getUpdatedNetInterface(updatedNetIf);
+        }
+    	
+    	return updatedNetIf;
+    }
+    
+    
+	public void removeInterfaceTabs() {
+		synchronized (m_tabsPanelLock) {
+			for (TabItem tabItem : new ArrayList<TabItem>(
+					m_tabsPanel.getItems())) {
+				if (tabItem == m_tabWirelessConfig
+						|| tabItem == m_tabModemConfig
+						|| tabItem == m_tabDhcpNatConfig
+						|| tabItem == m_tabReverseNatConfig) {
+					removeTab(tabItem);
+				}
+			}
+		}
+	}
+    
+    public void removeDhcpNatTab() {
+    	synchronized(m_tabsPanelLock) {
+	        for (TabItem tabItem : m_tabsPanel.getItems()) {
+	            if (tabItem == m_tabDhcpNatConfig) {
+	            	m_dhcpNatConfigTab.disableDhcpNat();
+	                m_tabsPanel.remove(tabItem);
+	                break;
+	            }
+	        }
+    	}
+    }
+    
+    /*
+    public void addInterfaceTabs() {
+        removeInterfaceTabs();
+        
+        if(m_netIfConfig != null) {
+            if ((m_netIfConfig instanceof GwtNetInterfaceConfig)
+                    && m_netIfConfig.getHwTypeEnum() != GwtNetIfType.LOOPBACK 
+                    && !m_netIfConfig.getName().startsWith("mon.wlan")) {
+                m_tabsPanel.insert(m_tabDhcpNatConfig, 1);
+            }
+            if (m_netIfConfig instanceof GwtWifiNetInterfaceConfig) {
+                if (!m_netIfConfig.getName().startsWith("mon.wlan")) {
+                    m_wirelessConfigTab.setNetInterface(m_netIfConfig);
+                    m_tabsPanel.insert(m_tabWirelessConfig, 1);
+                    m_tabsPanel.insert(m_tabDhcpNatConfig, 2);
+                }
+            }
+            else if (m_netIfConfig instanceof GwtModemInterfaceConfig) {
+                m_modemConfigTab.setNetInterface(m_netIfConfig);
+                m_tabsPanel.insert(m_tabModemConfig, 1);
+                m_tabsPanel.remove(m_tabDhcpNatConfig);
+            }
+        } 
+    }
+    */
+    
+    // Add/remove tabs based on the selected settings in the various tabs
+    public void adjustInterfaceTabs() {
+    	GwtNetIfStatus netIfStatus = m_tcpIpConfigTab.getStatus();
+    	if(netIfStatus.equals(GwtNetIfStatus.netIPv4StatusDisabled)) {
+    		Log.debug("Disabled - remove tabs");
+    		removeInterfaceTabs();
+    	} else {
+    		boolean includeDhcpNatTab = !m_tcpIpConfigTab.isDhcp() && netIfStatus.equals(GwtNetIfStatus.netIPv4StatusEnabledLAN);
+    		boolean includeReverseNatTab = netIfStatus.equals(GwtNetIfStatus.netIPv4StatusEnabledWAN);
+    		
+    		Log.debug("includeDhcpNatTab? " + includeDhcpNatTab);
+    		Log.debug("includeReverseNatTab? " + includeReverseNatTab);
+    		
+    		int natTabIndex = 1;
+    		
+    		if(m_netIfConfig instanceof GwtWifiNetInterfaceConfig) {
+    			Log.debug("insert wifi tab");
+				removeTab(m_tabModemConfig);
+    			insertTab(m_tabWirelessConfig, 1);
+    			
+    			// remove dhcp/nat tab if not an access point
+    			if(!GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.equals(m_wirelessConfigTab.getWirelessMode())) {
+    				includeDhcpNatTab = false;
+    			} 
+    			
+    			if (includeDhcpNatTab || includeReverseNatTab){
+    				natTabIndex = 2;
+    			}
+    		} else if (m_netIfConfig instanceof GwtModemInterfaceConfig) {
+    			includeDhcpNatTab = false;
+				removeTab(m_tabWirelessConfig);
+
+				Log.debug("insert modem tab");
+    			insertTab(m_tabModemConfig, 1);
+    			natTabIndex = 2;
+    		} else {
+    			removeTab(m_tabWirelessConfig);
+    			removeTab(m_tabModemConfig);
+    			
+    			if(m_netIfConfig.getHwTypeEnum() == GwtNetIfType.LOOPBACK || m_netIfConfig.getName().startsWith("mon.wlan")) {
+    				includeDhcpNatTab = false;
+    			}
+    		}
+    		    		    		
+    		if(includeDhcpNatTab) {
+    			Log.debug("insert dhcp/nat tab");
+    			insertTab(m_tabDhcpNatConfig, natTabIndex);
+    		} else {
+    			Log.debug("remove dhcp/nat tab");
+    			removeTab(m_tabDhcpNatConfig);
+    		}
+    		
+    		if (includeReverseNatTab) {
+    			Log.debug("insert reverse nat tab");
+    			insertTab(m_tabReverseNatConfig, natTabIndex);
+    		} else {
+    			Log.debug("remove reverse nat tab");
+    			removeTab(m_tabReverseNatConfig);
+    		}
+    	}
+    }
+    
+    public boolean isValid() {
+    	List<TabItem> tabItems = m_tabsPanel.getItems();
+    	
+    	if (tabItems.contains(m_tabIPv4Config) && !m_tcpIpConfigTab.isValid()) {
+    		return false;
+    	}
+    	if (tabItems.contains(m_tabWirelessConfig) && !m_wirelessConfigTab.isValid()) {
+    		return false;
+    	}
+    	if (tabItems.contains(m_tabModemConfig) && !m_modemConfigTab.isValid()) {
+    		return false;
+    	}
+    	if (tabItems.contains(m_tabDhcpNatConfig) && !m_dhcpNatConfigTab.isValid()) {
+    		return false;
+    	}
+    	if (tabItems.contains(m_tabHardwareConfig) && !m_hwConfigTab.isValid()) {
+    		return false;
+    	}
+    	return true;
+    }
+    
+    public boolean isDirty() {
+    	
+        List<TabItem> tabItems = m_tabsPanel.getItems();
+        
+    	if (tabItems.contains(m_tabIPv4Config) && m_tcpIpConfigTab.isDirty()) {
+    		Log.debug("m_tcpIpConfigTab is dirty");
+    		return true;
+    	}
+    	if (tabItems.contains(m_tabWirelessConfig) && m_wirelessConfigTab.isDirty()) {
+    		Log.debug("m_wirelessConfigTab is dirty");
+    		return true;
+    	}
+    	if (tabItems.contains(m_tabModemConfig) && m_modemConfigTab.isDirty()) {
+    		Log.debug("m_modemConfigTab is dirty");
+    		return true;
+    	}
+    	if (tabItems.contains(m_tabDhcpNatConfig) && m_dhcpNatConfigTab.isDirty()) {
+    		Log.debug("m_dhcpNatConfigTab is dirty");
+    		return true;
+    	}
+    	if (tabItems.contains(m_tabReverseNatConfig) && m_reverseNatConfigTab.isDirty()) {
+    		Log.debug("m_reverseNatConfigTab is dirty");
+    		return true;
+    	}
+    	if (tabItems.contains(m_tabHardwareConfig) && m_hwConfigTab.isDirty()) {
+    		Log.debug("m_hwConfigTab is dirty");
+    		return true;
+    	}
+    	
+    	return false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);
+        
+    	setId("network-tabs-wrapper");
+        setLayout(new FitLayout());
+        
+        synchronized(m_tabsPanelLock) {
+	        m_tabsPanel = new TabPanel();
+	        m_tabsPanel.setPlain(true);
+	        m_tabsPanel.setBorders(false);
+	        m_tabsPanel.setStyleAttribute("padding-top", "5px");
+	        
+	        m_tabIPv4Config = new TabItem(MSGS.netIPv4());
+	        m_tabIPv4Config.setBorders(true);
+	        m_tabIPv4Config.setLayout(new FitLayout());
+	        m_tabIPv4Config.add(m_tcpIpConfigTab);
+	        m_tabIPv4Config.addListener(Events.Select, new Listener<ComponentEvent>() {  
+	            public void handleEvent(ComponentEvent be) {  
+	            	m_tcpIpConfigTab.refresh();
+	            }  
+	        });
+	        m_tabsPanel.add(m_tabIPv4Config);
+	        
+	        m_tabWirelessConfig = new TabItem(MSGS.netWifiWireless());
+	        m_tabWirelessConfig.setBorders(true);
+	        m_tabWirelessConfig.setLayout(new FitLayout());
+	        m_tabWirelessConfig.add(m_wirelessConfigTab);
+	        m_tabWirelessConfig.addListener(Events.Select, new Listener<ComponentEvent>() {  
+	            public void handleEvent(ComponentEvent be) { 
+	            	m_wirelessConfigTab.refresh();
+	            }  
+	        });
+	        m_tabsPanel.add(m_tabWirelessConfig);
+	        
+	        m_tabModemConfig = new TabItem(MSGS.netModemCellular());
+	        m_tabModemConfig.setBorders(true);
+	        m_tabModemConfig.setLayout(new FitLayout());
+	        m_tabModemConfig.add(m_modemConfigTab);
+	        m_tabModemConfig.addListener(Events.Select, new Listener<ComponentEvent>() {  
+	            public void handleEvent(ComponentEvent be) { 
+	            	m_modemConfigTab.refresh();
+	            }  
+	        });
+	        m_tabsPanel.add(m_tabModemConfig);
+	
+	        m_tabDhcpNatConfig = new TabItem(MSGS.netRouter());
+	        m_tabDhcpNatConfig.setBorders(true);
+	        m_tabDhcpNatConfig.setLayout(new FitLayout());
+	        m_tabDhcpNatConfig.add(m_dhcpNatConfigTab);
+	        m_tabDhcpNatConfig.addListener(Events.Select, new Listener<ComponentEvent>() {  
+	            public void handleEvent(ComponentEvent be) {  
+	            	m_dhcpNatConfigTab.refresh();
+	            }  
+	        });
+	        m_tabsPanel.add(m_tabDhcpNatConfig);
+	        
+	        m_tabReverseNatConfig = new TabItem(MSGS.netReverseNat());
+	        m_tabReverseNatConfig.setBorders(true);
+	        m_tabReverseNatConfig.setLayout(new FitLayout());
+	        m_tabReverseNatConfig.add(m_reverseNatConfigTab);
+	        m_tabReverseNatConfig.addListener(Events.Select, new Listener<ComponentEvent>() {  
+	            public void handleEvent(ComponentEvent be) {  
+	            	m_reverseNatConfigTab.refresh();
+	            }  
+	        });
+	        m_tabsPanel.add(m_tabReverseNatConfig);
+	        
+	        m_tabHardwareConfig = new TabItem(MSGS.netHwHardware());
+	        m_tabHardwareConfig.setBorders(true);
+	        m_tabHardwareConfig.setLayout(new FitLayout());
+	        m_tabHardwareConfig.add(m_hwConfigTab);
+	        m_tabHardwareConfig.addListener(Events.Select, new Listener<ComponentEvent>() {  
+	            public void handleEvent(ComponentEvent be) {  
+	            	m_hwConfigTab.refresh();
+	            }  
+	        });
+	        m_tabsPanel.add(m_tabHardwareConfig);
+	        
+	        add(m_tabsPanel);
+        }
+    }
+    
+    private void insertTab(TabItem tabItem, int index) {
+    	synchronized(m_tabsPanelLock) {
+	    	if(!containsTab(tabItem)) {
+	    		m_tabsPanel.insert(tabItem, index);
+	    	}
+    	}
+    }
+    
+    private void removeTab(TabItem tabItem) {
+    	synchronized(m_tabsPanelLock) {
+	    	if(containsTab(tabItem)) {
+	    		m_tabsPanel.remove(tabItem);
+	    	}
+    	}
+    }
+    
+    private boolean containsTab(TabItem tabItem) {
+        for (TabItem item : m_tabsPanel.getItems()) {
+            if (item == tabItem) {
+            	return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkButtonBar.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkButtonBar.java
new file mode 100644
index 0000000000000000000000000000000000000000..2eecd9912db93bc1532473f5d63e631f9b8e4871
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkButtonBar.java
@@ -0,0 +1,246 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtNetIfConfigMode;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+
+public class NetworkButtonBar extends LayoutContainer
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+
+	@SuppressWarnings("unused")
+    private GwtSession             m_currentSession;
+	private NetworkPanel           m_netPanel;
+	private NetworkInterfacesTable m_netTable;
+	private NetInterfaceConfigTabs m_netTabs;
+	
+	private ToolBar m_buttonBar;
+	private Button    m_applyButton; 
+	
+	public NetworkButtonBar(GwtSession currentSession,
+							NetworkPanel netPanel,
+							NetworkInterfacesTable netTable,
+						    NetInterfaceConfigTabs netTabs)
+	{
+        m_currentSession = currentSession;
+        m_netPanel       = netPanel; 
+        m_netTable       = netTable;
+		m_netTabs        = netTabs;
+		
+		m_netTable.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				Log.debug("Enabling Button Bar because of " + be.getSource().toString() + " :: " + be.toString());
+				if(m_buttonBar == null) {
+					Log.debug("ButtonBar is null");
+				}
+				m_applyButton.enable();
+			}
+		});
+		m_netTabs.addListener(Events.Change, new Listener<BaseEvent>() {
+			public void handleEvent(BaseEvent be) {
+				Log.debug("Enabling Button Bar because of " + be.getSource().toString() + " :: " + be.toString());
+				if(m_buttonBar == null) {
+					Log.debug("ButtonBar is null");
+				}
+				m_applyButton.enable();
+			}
+		});
+	}
+
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("network-buttons");
+        
+        m_buttonBar = new ToolBar();
+        m_buttonBar.setHeight(20);
+        m_buttonBar.setAlignment(HorizontalAlignment.LEFT);
+        
+        m_applyButton = new Button(MSGS.netApply(),
+        		AbstractImagePrototype.create(Resources.INSTANCE.accept()),
+                new SelectionListener<ButtonEvent>() {
+            		@Override
+            		public void componentSelected(ButtonEvent ce) {
+            			
+            			if (m_netTabs.isValid()) {
+	            		    GwtNetInterfaceConfig prevNetIf = m_netTable.getSelectedNetInterfaceConfig();
+	            		    
+	            			Log.debug("about to getUpdatedNetInterface()");
+	            			final GwtNetInterfaceConfig updatedNetIf = m_netTabs.getUpdatedNetInterface();
+	            			
+	            			// Submit updated NetInterfaceConfig and priorities
+	            			if(prevNetIf != null && prevNetIf.equals(updatedNetIf)) {
+	            				Log.debug("net interface config matches the previous one");
+	            				m_netTable.refresh();
+	            				m_applyButton.disable();
+	            			} else {
+	                			String newNetwork = calculateNetwork(updatedNetIf.getIpAddress(), updatedNetIf.getSubnetMask());
+	                			String prevNetwork = Window.Location.getHost();
+	                			try {
+	                				prevNetwork = calculateNetwork(Window.Location.getHost(), updatedNetIf.getSubnetMask());
+	                			} catch (Exception e) {
+	                				Log.debug("calculateNetwork() failed for ipAddress: " + Window.Location.getHost() + ", and subnet: " + updatedNetIf.getSubnetMask());
+	                			}
+	                			
+	                			if (newNetwork != null) {
+	                    			//if a static IP assigned, re-direct to the new location
+	                    			if (updatedNetIf.getConfigMode().equals(GwtNetIfConfigMode.netIPv4ConfigModeManual.name()) &&
+	                    					newNetwork.equals(prevNetwork) &&
+	                    					Window.Location.getHost().equals(prevNetIf.getIpAddress())) {
+	                    				Timer t = new Timer () {
+	                        				public void run () {
+	                        					Log.debug("redirecting to new address: " + updatedNetIf.getIpAddress());
+	                							Window.Location.replace("http://" + updatedNetIf.getIpAddress() + "/kura");
+	                        				}
+	                        			};
+	                        			t.schedule(500);
+	        						}
+	                			}
+	                			
+	                			m_netPanel.mask(MSGS.applying());
+	                			Log.debug("updateNetInterfaceConfigurations()");
+	                			gwtNetworkService.updateNetInterfaceConfigurations(updatedNetIf, new AsyncCallback<Void>() {
+	    							public void onSuccess(Void result) {
+	    							    Log.debug("successfully update net interface config");
+	    							    m_netTable.refresh();
+	    							    m_applyButton.disable();
+	    							    m_netPanel.unmask();
+	    							}
+	    							public void onFailure(Throwable caught) {
+	    								Log.debug("caught: " + caught.toString());
+	    								FailureHandler.handle(caught);
+	    								m_netPanel.unmask();
+	    							}
+	    						});
+	            			}
+            			}
+            			else {
+            				MessageBox.info(MSGS.information(),
+            						MSGS.deviceConfigError(),
+            						null);
+            			}
+            		}
+    	});
+        Button m_refresh = new Button("Refresh",
+        		AbstractImagePrototype.create(Resources.INSTANCE.refresh()),
+        		new SelectionListener<ButtonEvent>() {
+
+					@Override
+					public void componentSelected(ButtonEvent ce) {
+						// TODO Auto-generated method stub
+						m_netTable.refresh();
+					}
+        	
+        });
+        m_applyButton.setWidth(100);
+        m_buttonBar.setBorders(true);
+        m_refresh.setWidth(100);
+        m_buttonBar.add(m_applyButton);
+        m_buttonBar.add(new SeparatorToolItem());
+        m_buttonBar.add(m_refresh);
+        m_buttonBar.add(new SeparatorToolItem());
+        
+        m_applyButton.disable();
+		//m_buttonBar.disable();
+        add(m_buttonBar);
+    }
+    
+    public String calculateNetwork(String ipAddress, String netmask) {
+        if(ipAddress == null || ipAddress.isEmpty() || netmask == null || netmask.isEmpty()) {
+            return null;
+        }
+        
+        String network = null;
+        
+        try {
+    		int ipAddressValue = 0;
+    		int netmaskValue = 0;
+    
+    		String[] sa = this.splitIp(ipAddress);
+    		
+    		for (int i = 24, t = 0; i >= 0; i -= 8, t++) {
+    			ipAddressValue = ipAddressValue | (Integer.parseInt(sa[t]) << i);
+    		}
+    
+    		sa = this.splitIp(netmask);
+    		for (int i = 24, t = 0; i >= 0; i -= 8, t++) {
+    			netmaskValue = netmaskValue | (Integer.parseInt(sa[t]) << i);
+    		}
+    
+    		network = dottedQuad(ipAddressValue & netmaskValue);
+        } catch (Exception e) {
+            Log.warn("Error calculating network for ip address: " + ipAddress + " and netmask: " + netmask, e);
+        }
+        
+        return network;
+	}
+
+	private String dottedQuad(int ip) {
+		StringBuffer sb = new StringBuffer(15);
+		for (int shift = 24; shift > 0; shift -= 8) {
+			// process 3 bytes, from high order byte down.
+			sb.append(Integer.toString((ip >>> shift) & 0xff));
+			sb.append('.');
+		}
+		sb.append(Integer.toString(ip & 0xff));
+		return sb.toString();
+	}
+
+	private String[] splitIp(String ip) {
+
+		String sIp = new String(ip);
+		String[] ret = new String[4];
+
+		int ind = 0;
+		for (int i = 0; i < 3; i++) {
+			if ((ind = sIp.indexOf(".")) >= 0) {
+				ret[i] = sIp.substring(0, ind);
+				sIp = sIp.substring(ind + 1);
+				if (i == 2) {
+					ret[3] = sIp;
+				}
+			}
+		}
+		return ret;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkInterfacesTable.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkInterfacesTable.java
new file mode 100644
index 0000000000000000000000000000000000000000..64052d2ec3bff2513fb40b92a82a90b89abb9028
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkInterfacesTable.java
@@ -0,0 +1,347 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionEvent;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.store.StoreSorter;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+public class NetworkInterfacesTable extends LayoutContainer
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+
+	@SuppressWarnings("unused")
+	private GwtSession                  m_currentSession;
+
+	private NetInterfaceConfigTabs 		m_netConfigTabs;
+	 
+	private ToolBar                     m_toolBar;
+	private Grid<GwtNetInterfaceConfig>	m_grid;
+	private BaseListLoader<ListLoadResult<GwtNetInterfaceConfig>> m_loader;
+	private ListStore<GwtNetInterfaceConfig>                      m_store;
+	private GwtNetInterfaceConfig      m_selectedIfConfig;
+	
+    public NetworkInterfacesTable(GwtSession currentSession,
+    							  NetInterfaceConfigTabs netConfigTabs) 
+    {
+    	m_currentSession = currentSession;    
+    	m_netConfigTabs  = netConfigTabs;
+    }
+
+
+	protected void onRender(Element parent, int index) 
+	{
+		super.onRender(parent, index);
+     
+		setLayout(new FitLayout());
+		setBorders(false);
+		setId("network-interfaces-table");
+		
+		initToolBar();
+		initGrid();
+
+        ContentPanel panel = new ContentPanel();
+        panel.setLayout(new FitLayout());
+        panel.setBorders(false);
+        panel.setBodyBorder(true);
+        panel.setHeaderVisible(false);
+        
+        panel.add(m_grid);
+        panel.setBottomComponent(m_toolBar);
+        
+        add(panel);
+        
+        m_loader.load();
+	}
+    
+	
+    private void initToolBar() 
+    {
+    	m_toolBar = new ToolBar();
+    	m_toolBar.setBorders(true);
+    }
+    
+    
+    private void initGrid() 
+    {
+        //
+        // Column Configuration
+        List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
+
+        ColumnConfig column = new ColumnConfig("name", MSGS.netInterfaceName(), 125);
+        column.setAlignment(HorizontalAlignment.LEFT);
+        column.setSortable(false);
+        configs.add(column);
+
+        // loader and store
+        RpcProxy<ListLoadResult<GwtNetInterfaceConfig>> proxy = new RpcProxy<ListLoadResult<GwtNetInterfaceConfig>>() {
+            @Override
+            public void load(Object loadConfig, AsyncCallback<ListLoadResult<GwtNetInterfaceConfig>> callback) {
+                gwtNetworkService.findNetInterfaceConfigurations(callback);
+            }
+        };
+        m_loader = new BaseListLoader<ListLoadResult<GwtNetInterfaceConfig>>(proxy);
+        m_loader.setRemoteSort(false);
+        m_loader.setSortDir(SortDir.ASC);
+        m_loader.setSortField("name");
+         
+        m_store = new ListStore<GwtNetInterfaceConfig>(m_loader);
+        m_store.setStoreSorter(new StoreSorter<GwtNetInterfaceConfig>(new Comparator<Object>() {
+			public int compare(Object o1, Object o2) {
+				if (o1 == null) {
+					o1 = new Integer(-1);
+				}
+				else {
+					o1 = getIntFromName((String)o1); 
+				}
+				if (o2 == null) {
+					o2 = new Integer(-1);
+				}
+				else {
+					o2 = getIntFromName((String)o2); 
+				}
+				return (Integer)o1 - (Integer)o2;
+			}
+			
+			private Integer getIntFromName (String name) {
+				if ("lo".equals(name)) return new Integer(1);
+				else if ("eth0".equals(name)) return new Integer(2);
+				else if ("eth1".equals(name)) return new Integer(3);
+				else if (name.contains("eth")) return new Integer(4);
+				else if ("wlan0".equals(name)) return new Integer(10);
+				else if ("ppp0".equals(name)) return new Integer(20);
+				else if (name.contains("ppp")) return new Integer(21);
+				else return new Integer(100);
+			}
+		}));
+
+        m_grid = new Grid<GwtNetInterfaceConfig>(m_store, new ColumnModel(configs));
+        m_grid.setBorders(false);
+        m_grid.setStateful(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        m_grid.setAutoExpandColumn("name");
+        m_grid.getView().setAutoFill(true);
+        m_grid.getView().setEmptyText(MSGS.netTableNoInterfaces());
+
+        GridSelectionModel<GwtNetInterfaceConfig> selectionModel = new GridSelectionModel<GwtNetInterfaceConfig>();
+        selectionModel.setSelectionMode(SelectionMode.SINGLE);
+        m_grid.setSelectionModel(selectionModel);
+        
+        
+        //
+        // on selection, complete the switch
+        m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtNetInterfaceConfig>() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent<GwtNetInterfaceConfig> se) {            	
+            	GwtNetInterfaceConfig gwtNetIfConfig = se.getSelectedItem();
+            	if (gwtNetIfConfig != null) {
+            	    m_selectedIfConfig = gwtNetIfConfig;
+            		m_netConfigTabs.setNetInterface(gwtNetIfConfig);
+            	}
+            }
+        });        
+        
+        m_loader.addLoadListener( new DataLoadListener(m_netConfigTabs, m_grid));
+    }
+    
+    public GwtNetInterfaceConfig getSelectedNetInterfaceConfig() {
+        return m_selectedIfConfig;
+    }
+    
+    // --------------------------------------------------------------------------------------
+    //
+    //    Interface List Management
+    //
+    // --------------------------------------------------------------------------------------
+
+    public void refresh() {
+        
+        // check if there is a selected item
+        m_loader.load();
+    }
+    
+    // --------------------------------------------------------------------------------------
+    //
+    //    Status Information
+    //
+    // --------------------------------------------------------------------------------------
+    public boolean isDirty() {
+    	if (m_netConfigTabs != null) {
+    		return m_netConfigTabs.isDirty();
+    	}
+    	else {
+    		return false;
+    	}
+    }
+        
+    // --------------------------------------------------------------------------------------
+    //
+    //    Data Load Listener
+    //
+    // --------------------------------------------------------------------------------------
+
+    
+    private static class BeforeSelectEventListener implements Listener<BaseEvent> 
+    {    
+    	private NetInterfaceConfigTabs m_netConfigTabs;
+		private Grid<GwtNetInterfaceConfig>	m_grid;
+
+    	public BeforeSelectEventListener(NetInterfaceConfigTabs netConfigTabs,
+    									 Grid<GwtNetInterfaceConfig> grid)
+    	{
+    		m_netConfigTabs = netConfigTabs;
+    		m_grid = grid;
+    	}
+    	
+		public void handleEvent(BaseEvent be) 
+		{
+			final BaseEvent theEvent = be;
+			if (m_netConfigTabs != null && m_netConfigTabs.isDirty()) {
+		        
+				// cancel the event first
+	        	theEvent.setCancelled(true);
+	
+	        	// ask for confirmation before switching
+	        	@SuppressWarnings("unchecked")
+				SelectionEvent<ModelData> se = (SelectionEvent<ModelData>) be;
+	        	
+	        	final int selectionIndex = se.getIndex();
+	        	final GwtNetInterfaceConfig netIfToSwitchTo = (GwtNetInterfaceConfig) se.getModel();
+	        	MessageBox.confirm(MSGS.confirm(), 
+		            	MSGS.deviceConfigDirty(),
+		                new Listener<MessageBoxEvent>() {  
+		                    public void handleEvent(MessageBoxEvent ce) {
+	                            // if confirmed, delete
+	                            Dialog  dialog = ce.getDialog(); 
+	                            if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+	                        		m_netConfigTabs.setNetInterface(netIfToSwitchTo);
+	                            	m_grid.getSelectionModel().select(selectionIndex, false);                                    	
+	                            }
+		                    }
+		        });
+			}
+		}	
+    }
+
+    
+    private static class DataLoadListener extends LoadListener
+    {
+    	private NetInterfaceConfigTabs m_netConfigTabs;
+		private Grid<GwtNetInterfaceConfig>	m_grid;
+		private GwtNetInterfaceConfig       m_selectedNetIf;
+		private BeforeSelectEventListener   m_beforeSelectListener;
+		
+        public DataLoadListener(NetInterfaceConfigTabs netConfigTabs,
+				 			    Grid<GwtNetInterfaceConfig> grid) {
+
+    		m_netConfigTabs = netConfigTabs;
+        	m_grid = grid;
+
+            //
+            // Selection Listener for the component
+            // make sure the form is not dirty before switching.
+            m_beforeSelectListener = new BeforeSelectEventListener(m_netConfigTabs, m_grid); 
+            m_grid.getSelectionModel().addListener(Events.BeforeSelect, m_beforeSelectListener);
+        }
+        
+        public void loaderBeforeLoad(LoadEvent le) {
+        	m_grid.mask(MSGS.loading());
+        	m_netConfigTabs.mask(MSGS.loading());
+        	m_selectedNetIf = m_grid.getSelectionModel().getSelectedItem();
+        	m_grid.getSelectionModel().removeListener(Events.BeforeSelect, m_beforeSelectListener);
+        }
+        
+        public void loaderLoad(LoadEvent le) {
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        	if (m_selectedNetIf == null) {
+        		m_grid.getSelectionModel().select(0, false);
+        	}
+        	else {
+        		int i=0;
+        		for (GwtNetInterfaceConfig netIf : m_grid.getStore().getModels()) {
+        			String netIfSerial = netIf.getHwSerial();
+        			String selIfSerial = m_selectedNetIf.getHwSerial();
+        			
+        			// Select the proper interface based on interface name
+        			// In case of modem, the interface name may have changed, so try checking serial numbers
+        			if ((netIf.getName().equals(m_selectedNetIf.getName())) ||
+        					(netIfSerial != null && selIfSerial != null && netIfSerial.equals(selIfSerial))) {
+        				m_grid.getSelectionModel().select(i, false);
+        				break;
+        			}
+        			i++;
+        		}
+        	}
+
+        	m_grid.unmask();
+        	m_netConfigTabs.unmask();
+        	m_grid.getSelectionModel().addListener(Events.BeforeSelect, m_beforeSelectListener);
+        }
+        
+        public void loaderLoadException(LoadEvent le) 
+        {
+        	if (le.exception != null) {
+    			for( StackTraceElement e : le.exception.getStackTrace()) {
+    				Log.debug(e.toString());
+    			}
+                FailureHandler.handle(le.exception);
+            }
+        	m_grid.unmask();
+        	m_netConfigTabs.unmask();
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkPanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..a953818b3fdfccbbdb811e96dc75a48b0d7c55ba
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/NetworkPanel.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class NetworkPanel extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+    @SuppressWarnings("unused")
+	private boolean                m_initialized;
+	private GwtSession             m_currentSession;
+
+	private NetworkInterfacesTable m_netIfTable; 
+	private NetInterfaceConfigTabs m_netConfigTabs;
+	private NetworkButtonBar       m_netButtons; 
+			
+    public NetworkPanel(GwtSession currentSession) {
+    	m_currentSession  = currentSession;
+    	m_initialized     = false;    	
+
+    }
+    
+    public boolean isDirty() {
+    	if (m_netIfTable != null) {
+    		return m_netIfTable.isDirty();
+    	}
+    	else {
+    		return false;
+    	}
+    }
+    
+    protected void onRender(Element parent, int index) {
+        
+        super.onRender(parent, index);
+        setId("network-panel-wrapper");
+        
+        m_netConfigTabs = new NetInterfaceConfigTabs(m_currentSession);  
+        m_netIfTable    = new NetworkInterfacesTable(m_currentSession, m_netConfigTabs);
+        m_netButtons    = new NetworkButtonBar(m_currentSession, this, m_netIfTable, m_netConfigTabs);
+        BorderLayout borderLayout = new BorderLayout();
+        setLayout(borderLayout);
+        setBorders(true);
+        //
+        // west
+        BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST);  
+        westData.setSplit(false);  
+        westData.setCollapsible(false);  
+        westData.setMargins(new Margins(25, 5, 5, 25));        
+        add(m_netIfTable, westData);
+
+        //
+        // north
+        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 25);  
+        northData.setMargins(new Margins(10, 25, 5, 25));
+        Label intro = new Label(MSGS.netIntro());
+        intro.setId("network-label");
+        add(intro, northData);
+
+        //
+        // center
+        
+        BorderLayout centerBorderLayout = new BorderLayout();
+        LayoutContainer centerLayoutContainer = new LayoutContainer(centerBorderLayout);
+        centerLayoutContainer.setBorders(true);
+        centerLayoutContainer.setId("network-content-wrapper");
+        BorderLayoutData blDataNorth = new BorderLayoutData(LayoutRegion.NORTH, 25);
+        blDataNorth.setMargins(new Margins(1, 1, 1, 1));
+        centerLayoutContainer.add(m_netButtons, blDataNorth);
+        BorderLayoutData blDataCenter = new BorderLayoutData(LayoutRegion.CENTER);
+        blDataCenter.setMargins(new Margins(1, 1, 1, 1));
+        centerLayoutContainer.add(m_netConfigTabs, blDataCenter);
+        
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);  
+        centerData.setMargins(new Margins(25, 25, 5, 0));
+        //add(m_netButtons, centerData);
+        
+        add(centerLayoutContainer, centerData);
+                
+        m_initialized = true;
+    }    
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ReverseNatConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ReverseNatConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..2878b2dacbda82be9d5f030b1726f06a771c2bdd
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ReverseNatConfigTab.java
@@ -0,0 +1,395 @@
+package org.eclipse.kura.web.client.network;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.allen_sauer.gwt.log.client.Log;
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.SwappableListStore;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtReverseNatEntries;
+import org.eclipse.kura.web.shared.model.GwtReverseNatEntry;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.ModelKeyProvider;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+
+public class ReverseNatConfigTab extends LayoutContainer {
+	
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+	
+	private GwtSession            m_currentSession;
+
+	private Grid<GwtReverseNatEntry>   m_grid;
+	
+	private BaseListLoader<ListLoadResult<GwtReverseNatEntry>> m_loader;
+	private GwtReverseNatEntry m_selectedEntry;
+	private boolean m_dirty;
+	
+	private GwtNetInterfaceConfig  m_selectNetIfConfig;
+	private ToolBar m_reverseNatToolBar;
+	private Button m_newButton;
+	private Button m_editButton;
+	private Button m_deleteButton;
+		
+	public ReverseNatConfigTab(GwtSession currentSession) {
+		m_currentSession = currentSession; 
+	}
+	
+	protected void onRender(final Element parent, int index) {
+		
+		super.onRender(parent, index);
+
+		m_dirty = false;
+		
+		//
+		// Borderlayout that expands to the whole screen
+		setLayout(new FitLayout());
+		setBorders(false);
+		setId("reverse-nat");
+		
+        LayoutContainer mf = new LayoutContainer();
+        mf.setLayout(new BorderLayout());
+		
+		//
+		// Center Panel: Open Ports Table
+		BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, 1F);
+		centerData.setMargins(new Margins(0, 0, 0, 0));
+		centerData.setSplit(true);  
+		centerData.setMinSize(0);
+		
+		ContentPanel reverseNatTablePanel = new ContentPanel();
+		reverseNatTablePanel.setBorders(false);
+		reverseNatTablePanel.setBodyBorder(false);
+		reverseNatTablePanel.setHeaderVisible(false);
+		reverseNatTablePanel.setScrollMode(Scroll.AUTO);
+		reverseNatTablePanel.setLayout(new FitLayout());
+		
+		initToolBar();
+        initGrid();
+        
+        reverseNatTablePanel.setTopComponent(m_reverseNatToolBar);
+        reverseNatTablePanel.add(m_grid);
+		mf.add(reverseNatTablePanel, centerData);
+		
+        add(mf);
+        
+        refresh();
+	}
+	
+	public void refresh() {
+		if (m_loader != null) {
+			if (!m_dirty) {
+				if ((gwtNetworkService != null) && (m_selectNetIfConfig != null)) {
+					m_loader.load();
+				}
+			}
+		}
+	}
+    
+    public boolean isDirty() {
+    	return m_dirty;
+    }
+    
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig) {
+    	m_selectNetIfConfig = netIfConfig;
+    }
+    
+    public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf) {
+    	if (m_grid != null) {
+			List<GwtReverseNatEntry> reversenatEntries = m_grid.getStore().getModels();
+			for (GwtReverseNatEntry gwtReverseNatEntry : reversenatEntries) {
+				if ((gwtReverseNatEntry.getSourceNetwork() == null)
+						|| (gwtReverseNatEntry.getSourceNetwork().length() == 0)) {
+					gwtReverseNatEntry.setSourceNetwork("0.0.0.0/0");
+				}
+				
+				if ((gwtReverseNatEntry.getDestinationNetwork() == null)
+						|| (gwtReverseNatEntry.getDestinationNetwork().length() == 0)) {
+					gwtReverseNatEntry.setDestinationNetwork("0.0.0.0/0");
+				}
+			}
+	    	
+	    	updatedNetIf.setReverseNatEntries(new GwtReverseNatEntries(reversenatEntries));
+    	}
+    }
+    
+    
+	private void initToolBar() {
+		
+		m_reverseNatToolBar = new ToolBar();
+		m_reverseNatToolBar.setId("reverse-nat-toolbar");
+		
+		//
+		// New Open Port Button
+		m_newButton = new Button(MSGS.newButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.add()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				final ReverseNatForm reverseNatForm = new ReverseNatForm(m_currentSession);
+				reverseNatForm.addListener(Events.Hide, new Listener<ComponentEvent>() {
+					public void handleEvent(ComponentEvent be) {
+						// add the new entry to the grid and select it
+						if (reverseNatForm.getNewReverseNatEntry() != null) {
+							if(!duplicateEntry(reverseNatForm.getNewReverseNatEntry())) {
+								m_grid.getStore().add(reverseNatForm.getNewReverseNatEntry());
+								if (!reverseNatForm.isCanceled()) {
+									//m_applyButton.enable();
+									m_dirty = true;
+									fireEvent(Events.Change);
+								}
+							} else {
+								MessageBox.alert(MSGS.netReverseNatFormError(), MSGS.netReverseNatFormDuplicate(), new Listener<MessageBoxEvent>() {  
+									public void handleEvent(MessageBoxEvent ce) {
+										//noop
+									}
+								});
+							}
+						}
+					}
+				});
+				reverseNatForm.show();
+			}
+
+		});
+		m_reverseNatToolBar.add(m_newButton);
+		m_reverseNatToolBar.add(new SeparatorToolItem());
+
+		//
+		// Edit Open Port Button
+		m_editButton = new Button(MSGS.editButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.edit()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				if (m_grid != null) {
+					final GwtReverseNatEntry reverseNatEntry = m_grid.getSelectionModel().getSelectedItem();
+					if (reverseNatEntry != null) {
+						final ReverseNatForm reverseNatForm = new ReverseNatForm(m_currentSession, m_grid.getSelectionModel().getSelectedItem());
+						reverseNatForm.addListener(Events.Hide, new Listener<ComponentEvent>() {
+							public void handleEvent(ComponentEvent be) {
+								if(!duplicateEntry(reverseNatForm.getNewReverseNatEntry())) {
+									m_grid.getStore().remove(reverseNatEntry);
+									m_grid.getStore().add(reverseNatForm.getExistingReverseNatEntry());
+									if (!reverseNatForm.isCanceled()) {
+										m_dirty = true;
+										fireEvent(Events.Change);
+									}
+								} else {
+									MessageBox.alert(MSGS.netReverseNatFormError(), MSGS.netReverseNatFormDuplicate(), new Listener<MessageBoxEvent>() {  
+										public void handleEvent(MessageBoxEvent ce) {
+											//noop
+										}
+									});
+								}
+							}
+						});
+						reverseNatForm.show();
+					}
+				}
+			}
+
+		});
+		m_editButton.setEnabled(false);
+		m_reverseNatToolBar.add(m_editButton);
+		m_reverseNatToolBar.add(new SeparatorToolItem());
+
+	    
+		//
+		// Delete Open Port Entry Button
+		m_deleteButton = new Button(MSGS.deleteButton(), 
+			    AbstractImagePrototype.create(Resources.INSTANCE.delete()),
+				new SelectionListener<ButtonEvent>() {
+			@Override
+			public void componentSelected(ButtonEvent ce) {
+				
+				if (m_grid != null) {
+					
+					final GwtReverseNatEntry reverseNatEntry = m_grid.getSelectionModel().getSelectedItem();
+					if (reverseNatEntry != null) {
+
+						// ask for confirmation						
+						MessageBox.confirm(MSGS.confirm(), MSGS.netReverseNatDeleteConfirmation(reverseNatEntry.getOutInterface()),
+							new Listener<MessageBoxEvent>() {  
+							    public void handleEvent(MessageBoxEvent ce) {
+							    	
+							    	Log.debug("Trying to delete: " + reverseNatEntry.getOutInterface());
+							    	Log.debug("Button " + ce.getButtonClicked().getText());
+							    	
+							    	if(ce.getButtonClicked().getText().equals("Yes")) {
+							    		m_grid.getStore().remove(reverseNatEntry);
+							    		m_dirty = true;
+										fireEvent(Events.Change);
+							    	}
+							    }
+							}
+						);
+					}
+				}
+			}
+		});
+		m_deleteButton.setEnabled(false);
+		m_reverseNatToolBar.add(m_deleteButton);
+	}
+	
+	private void initGrid() {
+		
+		//
+		// Column Configuration
+		ColumnConfig column = null;
+		List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
+		
+		column = new ColumnConfig("outInterface", MSGS.netReverseNatOutInterface(), 60);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("protocol", MSGS.netReverseNatFormProtocol(), 60);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("sourceNetwork", MSGS.netReverseNatSourceNetwork(), 120);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		column = new ColumnConfig("destinationNetwork", MSGS.netReverseNatDestinationNetwork(), 120);
+		column.setAlignment(HorizontalAlignment.CENTER);
+		configs.add(column);
+		
+		// rpc data proxy  
+		RpcProxy<ListLoadResult<GwtReverseNatEntry>> proxy = new RpcProxy<ListLoadResult<GwtReverseNatEntry>>() {
+			@Override
+			protected void load(Object loadConfig, AsyncCallback<ListLoadResult<GwtReverseNatEntry>> callback) {
+				gwtNetworkService.findReverseNatConfigurations(m_selectNetIfConfig.getName(), callback);
+			}
+		};
+        
+        m_loader = new BaseListLoader<ListLoadResult<GwtReverseNatEntry>>(proxy);
+        m_loader.setSortDir(SortDir.DESC);  
+        m_loader.setSortField("outInterface"); 
+        
+        SwappableListStore<GwtReverseNatEntry> m_store = new SwappableListStore<GwtReverseNatEntry>(m_loader);
+        m_store.setKeyProvider( new ModelKeyProvider<GwtReverseNatEntry>() {            
+            public String getKey(GwtReverseNatEntry reverseNatEntry) {
+                return reverseNatEntry.getOutInterface();
+            }
+        });
+        
+        m_grid = new Grid<GwtReverseNatEntry>(m_store, new ColumnModel(configs));
+        m_grid.setBorders(false);
+        m_grid.setStateful(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        m_grid.setAutoExpandColumn("outInterface");
+        m_grid.getView().setAutoFill(true);
+        
+        m_loader.addLoadListener(new DataLoadListener(m_grid));
+
+        GridSelectionModel<GwtReverseNatEntry> selectionModel = new GridSelectionModel<GwtReverseNatEntry>();
+        selectionModel.setSelectionMode(SelectionMode.SINGLE);
+        m_grid.setSelectionModel(selectionModel);
+        m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtReverseNatEntry>() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent<GwtReverseNatEntry> se) {
+                m_selectedEntry = se.getSelectedItem();
+                if (m_selectedEntry != null) {
+                	m_editButton.setEnabled(true);
+                	m_deleteButton.setEnabled(true);
+                } else {
+                	m_editButton.setEnabled(false);
+                	m_deleteButton.setEnabled(false);                 
+                }
+            }
+        });
+	}
+	
+	private class DataLoadListener extends LoadListener {
+		private Grid<GwtReverseNatEntry> m_grid;
+		private GwtReverseNatEntry m_selectedEntry;
+
+		public DataLoadListener(Grid<GwtReverseNatEntry> grid) {
+			m_grid = grid;
+			m_selectedEntry = null;
+		}
+
+		public void loaderBeforeLoad(LoadEvent le) {
+			m_selectedEntry = m_grid.getSelectionModel().getSelectedItem();
+		}
+
+		public void loaderLoad(LoadEvent le) {
+			if (le.exception != null) {
+				FailureHandler.handle(le.exception);
+			}
+
+			if (m_selectedEntry != null) {
+				ListStore<GwtReverseNatEntry> store = m_grid.getStore();
+				GwtReverseNatEntry modelEntry = store.findModel(m_selectedEntry
+						.getOutInterface());
+				if (modelEntry != null) {
+					m_grid.getSelectionModel().select(modelEntry, false);
+					m_grid.getView().focusRow(store.indexOf(modelEntry));
+				}
+			}
+		}
+	}
+	 
+	private boolean duplicateEntry(GwtReverseNatEntry reverseEntry) {
+
+		boolean isDuplicateEntry = false;
+		List<GwtReverseNatEntry> entries = m_grid.getStore().getModels();
+		if (entries != null && reverseEntry != null) {
+			for (GwtReverseNatEntry entry : entries) {
+				if (entry.getOutInterface().equals(reverseEntry.getOutInterface())
+						&& entry.getProtocol().equals(reverseEntry.getProtocol())
+						&& entry.getSourceNetwork().equals(reverseEntry.getSourceNetwork())
+						&& entry.getDestinationNetwork().equals(reverseEntry.getDestinationNetwork())) {
+					isDuplicateEntry = true;
+					break;
+				}
+			}
+		}
+		return isDuplicateEntry;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ReverseNatForm.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ReverseNatForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..f478e687239b7c6d03d1440fcecfb5731a819b3d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ReverseNatForm.java
@@ -0,0 +1,280 @@
+package org.eclipse.kura.web.client.network;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.FormUtils;
+import org.eclipse.kura.web.client.util.TextFieldValidator;
+import org.eclipse.kura.web.client.util.TextFieldValidator.FieldType;
+import org.eclipse.kura.web.shared.model.GwtReverseNatEntry;
+import org.eclipse.kura.web.shared.model.GwtReverseNatProtocol;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ComponentPlugin;
+import com.extjs.gxt.ui.client.widget.Status;
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.LabelField;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class ReverseNatForm extends Window {
+	
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+    private static final int  LABEL_WIDTH_FORM = 190; 
+    
+	//private GwtSession m_currentSession;
+	private GwtReverseNatEntry m_newEntry;
+	private GwtReverseNatEntry m_existingEntry;
+	private FormPanel m_formPanel;
+	private Status m_status;
+	private boolean m_isCanceled;
+	private ComponentPlugin m_dirtyPlugin;
+    
+    public ReverseNatForm(GwtSession session) {
+    	//m_currentSession = session;
+    	m_existingEntry = null;
+    	
+    	 setModal(true);
+         setSize(600, /*500*/250);
+         setLayout(new FitLayout());
+         setResizable(false);
+         String heading = MSGS.netReverseNatFormNew();
+         setHeading(heading);
+         
+		final ReverseNatForm theTab = this;
+		m_dirtyPlugin = new ComponentPlugin() {
+			public void init(Component component) {
+				component.addListener(Events.Change,
+						new Listener<ComponentEvent>() {
+							public void handleEvent(ComponentEvent be) {
+								FormUtils.addDirtyFieldIcon(be.getComponent());
+								theTab.fireEvent(Events.Change);
+							}
+						});
+			}
+		};   
+    }
+    
+	public ReverseNatForm(GwtSession session, GwtReverseNatEntry existingEntry) {
+		this(session);
+		m_existingEntry = existingEntry;
+		if (m_existingEntry != null) {
+			setHeading(MSGS.netReverseNatFormUpdate(m_existingEntry
+					.getOutInterface()));
+		}
+	}
+
+	public GwtReverseNatEntry getNewReverseNatEntry() {
+		return m_newEntry;
+	}
+
+	public GwtReverseNatEntry getExistingReverseNatEntry() {
+		return m_existingEntry;
+	}
+
+	public boolean isCanceled() {
+		return m_isCanceled;
+	}
+	
+	public boolean isValid() {
+    	if (m_formPanel != null) {
+    		for (Field<?> field : m_formPanel.getFields()) {
+    			if (!field.isValid()) {
+    				return false;
+    			}
+    		}
+    	}
+    	return true;
+    }
+
+	protected void onRender(Element parent, int index) {
+		
+		super.onRender(parent, index);
+    	setId("reverse-nat-form");
+    	
+    	FormData formData = new FormData("-30");
+
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(true);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setScrollMode(Scroll.AUTOY);
+        m_formPanel.setLayout(new FlowLayout());
+
+        FieldSet fieldSet = new FieldSet();
+        fieldSet.setHeading(MSGS.netReverseNatFormInformation());
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        
+        //
+    	// interface name
+        //
+        final LabelField outInterfaceNameLabel = new LabelField();
+        outInterfaceNameLabel.setName("outInterfaceNameLabel");
+        outInterfaceNameLabel.setFieldLabel(MSGS.netReverseNatFormOutInterfaceName());
+        outInterfaceNameLabel.setLabelSeparator(":");
+        fieldSet.add(outInterfaceNameLabel, formData);
+
+        final TextField<String> outInterfaceNameField = new TextField<String>();
+        outInterfaceNameField.setAllowBlank(false);
+        outInterfaceNameField.setName("interfaceName");
+        outInterfaceNameField.setFieldLabel(MSGS.netReverseNatFormOutInterfaceName());
+        outInterfaceNameField.setValidator(new TextFieldValidator(outInterfaceNameField, FieldType.ALPHANUMERIC));
+        outInterfaceNameField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(outInterfaceNameField, formData);
+        
+        //
+    	// protocol
+        //
+        /*
+        final LabelField protocolLabel = new LabelField();
+        protocolLabel.setName("protocolLabel");
+        protocolLabel.setFieldLabel(MSGS.netReverseNatFormProtocol());
+        protocolLabel.setLabelSeparator(":");
+        fieldSet.add(protocolLabel, formData);
+		*/
+        final SimpleComboBox<String> protocolCombo = new SimpleComboBox<String>();
+        protocolCombo.setName("protocolCombo");
+        protocolCombo.setFieldLabel(MSGS.netReverseNatFormProtocol());
+        protocolCombo.setEditable(false);
+        protocolCombo.setTypeAhead(true);  
+        protocolCombo.setTriggerAction(TriggerAction.ALL);
+        for (GwtReverseNatProtocol protocol : GwtReverseNatProtocol.values()) {
+        	protocolCombo.add(protocol.name());
+        }
+        protocolCombo.setSimpleValue(GwtReverseNatProtocol.all.name());
+        fieldSet.add(protocolCombo, formData);
+        
+        //
+    	// Source Network
+        //
+        final LabelField sourceNetworkLabel = new LabelField();
+        sourceNetworkLabel.setName("sourceNetworkLabel");
+        sourceNetworkLabel.setFieldLabel(MSGS.netReverseNatFormSourceNetwork());
+        sourceNetworkLabel.setLabelSeparator(":");
+        fieldSet.add(sourceNetworkLabel, formData);
+
+        final TextField<String> sourceNetworkField = new TextField<String>();
+        sourceNetworkField.setAllowBlank(true);
+        sourceNetworkField.setName("address");
+        sourceNetworkField.setFieldLabel(MSGS.netReverseNatFormSourceNetwork());
+        sourceNetworkField.setValidator(new TextFieldValidator(sourceNetworkField, FieldType.NETWORK));
+        sourceNetworkField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(sourceNetworkField, formData);
+        
+        //
+    	// Destination Network
+        //
+        final LabelField destinationNetworkLabel = new LabelField();
+        destinationNetworkLabel.setName("destinationNetworkLabel");
+        destinationNetworkLabel.setFieldLabel(MSGS.netReverseNatFormDestinationNetwork());
+        destinationNetworkLabel.setLabelSeparator(":");
+        fieldSet.add(destinationNetworkLabel, formData);
+        
+        final TextField<String> destinationNetworkField = new TextField<String>();
+        destinationNetworkField.setAllowBlank(true);
+        destinationNetworkField.setName("address");
+        destinationNetworkField.setFieldLabel(MSGS.netReverseNatFormDestinationNetwork());
+        destinationNetworkField.setValidator(new TextFieldValidator(destinationNetworkField, FieldType.NETWORK));
+        destinationNetworkField.addPlugin(m_dirtyPlugin);
+        fieldSet.add(destinationNetworkField, formData);
+        
+        //add the fieldSet to the panel
+        m_formPanel.add(fieldSet);
+    	
+        //disable the labels
+        outInterfaceNameLabel.setVisible(false);
+        sourceNetworkLabel.setVisible(false);
+        destinationNetworkLabel.setVisible(false);
+    	
+		m_status = new Status();
+		m_status.setBusy(MSGS.waitMsg());
+		m_status.hide();
+		m_status.setAutoWidth(true);
+		
+		m_formPanel.setButtonAlign(HorizontalAlignment.LEFT);
+		m_formPanel.getButtonBar().add(m_status);
+		m_formPanel.getButtonBar().add(new FillToolItem());
+
+        m_formPanel.addButton(new Button(MSGS.submitButton(), new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	// make sure all visible fields are valid before performing the action
+            	for (Field<?> field : m_formPanel.getFields()) {
+            		if (field.isVisible() && !field.isValid()) {
+                		return;
+            		}
+            	}
+
+            	//we need to add a new row to the open ports table
+            	if(m_existingEntry == null) {
+            		//create a new entry
+            		m_newEntry = new GwtReverseNatEntry();
+            		m_newEntry.setOutInterface(outInterfaceNameField.getValue());
+            		m_newEntry.setProtocol(protocolCombo.getValue().getValue());
+            		m_newEntry.setSourceNetwork(sourceNetworkField.getValue());
+            		m_newEntry.setDestinationNetwork(destinationNetworkField.getValue());
+            	} else {
+            		m_existingEntry = new GwtReverseNatEntry();
+            		m_existingEntry.setOutInterface(outInterfaceNameField.getValue());
+            		m_existingEntry.setProtocol(protocolCombo.getValue().getValue());
+            		m_existingEntry.setSourceNetwork(sourceNetworkField.getValue());
+            		m_existingEntry.setDestinationNetwork(destinationNetworkField.getValue());
+            	}
+            	
+            	m_isCanceled = false;
+            	hide();
+            }
+        }));
+        
+        m_formPanel.addButton(new Button(MSGS.cancelButton(), new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	m_isCanceled = true;
+                hide();
+            }
+
+        }));
+        m_formPanel.setButtonAlign(HorizontalAlignment.CENTER);
+
+        // populate if necessary
+        if (m_existingEntry != null) {
+        	
+        	outInterfaceNameLabel.setValue(m_existingEntry.getOutInterface());
+        	outInterfaceNameField.setValue(m_existingEntry.getOutInterface());
+        	outInterfaceNameField.setOriginalValue(m_existingEntry.getOutInterface());
+        	
+        	//protocolLabel.setValue(m_existingEntry.getProtocol());
+        	protocolCombo.setSimpleValue(m_existingEntry.getProtocol());
+        	
+        	sourceNetworkLabel.setValue(m_existingEntry.getSourceNetwork());
+        	sourceNetworkField.setValue(m_existingEntry.getSourceNetwork());
+        	sourceNetworkField.setOriginalValue(m_existingEntry.getSourceNetwork());
+        	
+        	destinationNetworkLabel.setValue(m_existingEntry.getDestinationNetwork());
+        	destinationNetworkField.setValue(m_existingEntry.getDestinationNetwork());
+        	destinationNetworkField.setOriginalValue(m_existingEntry.getDestinationNetwork());
+        }
+        
+        add(m_formPanel);
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/TcpIpConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/TcpIpConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..775b79629efb14d18d592f870e7130580f49f585
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/TcpIpConfigTab.java
@@ -0,0 +1,763 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.FormUtils;
+import org.eclipse.kura.web.client.util.MessageUtils;
+import org.eclipse.kura.web.shared.model.GwtNetIfConfigMode;
+import org.eclipse.kura.web.shared.model.GwtNetIfStatus;
+import org.eclipse.kura.web.shared.model.GwtNetIfStatusModel;
+import org.eclipse.kura.web.shared.model.GwtNetIfType;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FieldEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ComponentPlugin;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.AdapterField;
+import com.extjs.gxt.ui.client.widget.form.ComboBox;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
+import com.extjs.gxt.ui.client.widget.form.TextArea;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+public class TcpIpConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+	private final ToolTipBox toolTipField = new ToolTipBox("345px");
+	private final String defaultToolTip = "Mouse over enabled items on the left to see help text.";
+
+	private static final String IPV4_REGEX  = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
+	
+    private GwtSession             m_currentSession;
+
+    private boolean                m_dirty;
+    private boolean                m_initialized;
+	private GwtNetInterfaceConfig  m_selectNetIfConfig;
+	private NetInterfaceConfigTabs m_netInterfaceConfigTabs;
+	
+	private FormPanel              m_formPanel;
+	private FieldSet 			   m_fieldSet;
+	private ListStore<GwtNetIfStatusModel> m_statusListStore;
+	private ComboBox<GwtNetIfStatusModel> m_statusCombo;
+	private SimpleComboBox<String> m_configureCombo;
+	private TextField<String>      m_ipAddressField;
+	private TextField<String>      m_subnetMaskField;
+	private TextField<String>      m_gatewayField;
+	private AdapterField           m_renewDHCPButton;
+	private TextArea               m_dnsReadOnlyField;
+	private TextArea               m_dnsField;
+	private TextArea               m_domainsField;
+
+    private ComponentPlugin        m_dirtyPlugin;
+    
+    private class MouseOverListener implements Listener<BaseEvent> {
+
+    	private String  html;
+    	
+    	public MouseOverListener(String html) {
+    		this.html = html;
+    	}
+		public void handleEvent(BaseEvent be) {
+			toolTipField.setText(html);
+		}
+    }
+
+	
+    public TcpIpConfigTab(GwtSession currentSession, NetInterfaceConfigTabs netInterfaceConfigTabs) {
+        m_currentSession = currentSession;
+    	m_dirty          = true;
+    	m_initialized    = false;
+    	
+    	m_netInterfaceConfigTabs = netInterfaceConfigTabs;
+    	
+	    final TcpIpConfigTab theTab = this;
+    	m_dirtyPlugin = new ComponentPlugin() {  
+    		public void init(Component component) {  
+    			component.addListener(Events.Change, new Listener<ComponentEvent>() {  
+    				public void handleEvent(ComponentEvent be) {
+    					FormUtils.addDirtyFieldIcon(be.getComponent());    					
+    					theTab.fireEvent(Events.Change);
+    				}  
+    			});  
+  	      	}  
+  	    };    	
+    }
+
+    
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig)
+    {
+    	m_dirty = true;
+    	if(netIfConfig != null && netIfConfig.getSubnetMask() != null && netIfConfig.getSubnetMask().equals("255.255.255.255")) {
+    		netIfConfig.setSubnetMask("");
+    	}
+    	m_selectNetIfConfig = netIfConfig;
+    	
+    	Log.debug("got new netIfConfig for TCP/IP config for " + netIfConfig.getName() + ": " +
+       			"\n\t\tStatus: " + netIfConfig.getStatus() +
+       			"\n\t\tConfig Mode: " + netIfConfig.getConfigMode() +
+       			"\n\t\tIP Address: " + netIfConfig.getIpAddress() +
+       			"\n\t\tSubnet Mask: " + netIfConfig.getSubnetMask() +
+       			"\n\t\tGateway: " + netIfConfig.getGateway() +
+       			"\n\t\tDNS Servers: " + netIfConfig.getDnsServers());
+    	
+    	// Remove LAN option for modems
+    	if(m_selectNetIfConfig != null && m_selectNetIfConfig.getHwTypeEnum() == GwtNetIfType.MODEM) {
+    	    if(m_statusCombo != null) {
+                m_statusListStore.remove(m_statusListStore.findModel(GwtNetIfStatusModel.STATUS, GwtNetIfStatus.netIPv4StatusEnabledLAN.name()));
+                m_statusCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ModemToolTipStatus()));
+    	    }
+    	} else {
+    	    if(m_statusCombo != null) {
+    	        initializeStatusListStore();
+    	        m_statusCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipStatus()));
+             }
+    	}
+    }
+    
+        
+    public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf)
+    {
+    	if (m_formPanel != null) {
+    	    Log.debug("in getUpdatedNetInterface(): m_statusCombo.getValue().getStatus().name(): " + m_statusCombo.getValue().getStatus().name());
+    	    updatedNetIf.setStatus(m_statusCombo.getValue().getStatus().name());
+    		
+    		if(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()).equals(m_configureCombo.getValue().getValue())) {
+    			updatedNetIf.setConfigMode(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name());
+    		} else {
+    			updatedNetIf.setConfigMode(GwtNetIfConfigMode.netIPv4ConfigModeManual.name());
+    		}
+    		
+    		if(m_ipAddressField.getValue() != null) {
+    			updatedNetIf.setIpAddress(m_ipAddressField.getValue());
+    		} else {
+    			updatedNetIf.setIpAddress("");
+    		}
+    		if(m_subnetMaskField.getValue() != null) {
+    			updatedNetIf.setSubnetMask(m_subnetMaskField.getValue());
+    		} else {
+    			updatedNetIf.setSubnetMask("");
+    		}
+    		if(m_gatewayField.getValue() != null) {
+    			updatedNetIf.setGateway(m_gatewayField.getValue());
+    		} else {
+    			updatedNetIf.setGateway("");
+    		}
+    		if(m_dnsField.getValue() != null) {
+    			updatedNetIf.setDnsServers(m_dnsField.getValue());
+    		} else {
+    			updatedNetIf.setDnsServers("");
+    		}    
+    		if(m_domainsField.getValue() != null) {
+    			updatedNetIf.setSearchDomains(m_domainsField.getValue());
+    		} else {
+    			updatedNetIf.setSearchDomains("");
+    		}
+    	}
+    }
+    
+    
+    public boolean isValid() 
+    {
+        List<Field<?>> fields = m_formPanel.getFields();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field) {
+        		Field<?> field = (Field<?>) fields.get(i);
+        		if (!field.isValid()) {
+        			return false;
+        		}
+        	}
+        }
+        
+        //check and make sure if 'Enabled for WAN' then either DHCP is selected or STATIC and a gateway is set
+        if(GwtNetIfStatus.netIPv4StatusEnabledWAN.equals(m_statusCombo.getValue().getStatus())) {
+        	if(m_configureCombo.getSimpleValue().equals(GwtNetIfConfigMode.netIPv4ConfigModeManual)) {
+        		if(m_gatewayField.getValue() == null || m_gatewayField.getValue().trim().equals("")) {
+        			return false;
+        		}
+        	}
+        }
+        
+        return true;
+    }
+
+
+    public boolean isDirty() 
+    {
+    	if (m_formPanel == null) {
+    		return false;
+    	}
+        List<Field<?>> fields = m_formPanel.getFields();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field) {
+	            Field<?> field = (Field<?>) fields.get(i);
+	            if (field.isDirty()) {
+	            	//handle special case of null value vs empty string
+	            	if((field.getOriginalValue() != null && field.getOriginalValue().equals("") && field.getValue() == null) || 
+	            			(field.getValue() != null && field.getValue().equals("") && field.getOriginalValue() == null)) {
+	            		continue;
+	            	} else if(field.getOriginalValue() != null && field.getValue() != null && field.getOriginalValue().equals(field.getValue())) {
+	            		continue;
+	            	} else {
+	            		if(field.getOriginalValue() instanceof SimpleComboValue) {
+	            			Log.debug("field " + field.getName() + " is dirty - original value: " + ((SimpleComboValue)field.getOriginalValue()).getValue() + " with type: " + field.getOriginalValue().getClass().toString());
+	            			if(field.getValue() != null) {
+	            				Log.debug("\tnew value: " + ((SimpleComboValue)field.getValue()).getValue() +  " with type: " + field.getValue().getClass().toString());
+	            			}
+	            		} else {
+	            			Log.debug("field " + field.getName() + " is dirty - original value: " + field.getOriginalValue() + " with type: " + field.getOriginalValue().getClass().toString());
+	            			if(field.getValue() != null) {
+	            				Log.debug("\tnew value: " + field.getValue() +  " with type: " + field.getValue().getClass().toString());
+	            			}
+	            		}
+	            		return true;
+	            	}
+	            } else {
+	            	Log.debug("NOT DIRTY: " + field.getName() + " value: " + field.getValue());
+	            }
+        	}
+        }
+        return false;
+    }
+    
+    
+    public boolean isLanEnabled() 
+    {
+    	if (m_statusCombo == null) {
+    		Log.debug("TcpIpConfigTab.isLanEnabled() - m_statusCombo is null");
+    		return false;
+    	}
+    	Log.debug("TcpIpConfigTab.isLanEnabled() - m_statusCombo.getValue().getStatus(): " + m_statusCombo.getValue().getStatus());
+    	return GwtNetIfStatus.netIPv4StatusEnabledLAN.equals(m_statusCombo.getValue().getStatus());
+    }
+    
+    public boolean isWanEnabled() 
+    {
+    	if (m_statusCombo == null) {
+    		Log.debug("TcpIpConfigTab.isWanEnabled() - m_statusCombo is null");
+    		return false;
+    	}
+        Log.debug("TcpIpConfigTab.isWanEnabled() - m_statusCombo.getValue().getStatus(): " + m_statusCombo.getValue().getStatus());
+        return GwtNetIfStatus.netIPv4StatusEnabledWAN.equals(m_statusCombo.getValue().getStatus());
+    }
+    
+    public GwtNetIfStatus getStatus()
+    {
+        return m_statusCombo.getValue().getStatus();
+    }
+    
+    public boolean isDhcp() 
+    {
+        if (m_configureCombo == null) {
+            Log.debug("TcpIpConfigTab.isDhcp() - m_configureCombo is null");
+            return true;
+        }
+        Log.debug("TcpIpConfigTab.isDhcp() - m_configureCombo.getSimpleValue(): " + m_configureCombo.getSimpleValue());
+        return (MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()).equals(m_configureCombo.getSimpleValue()));
+    }
+    
+    protected void onRender(Element parent, int index) 
+    {
+    	super.onRender(parent, index);         
+        setLayout(new FitLayout());
+        setId("network-tcpip");
+        
+        FormData formData = new FormData();
+        formData.setWidth(250);
+        
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(false);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setLayout(new FlowLayout());
+        m_formPanel.setStyleAttribute("min-width", "775px");
+        m_formPanel.setStyleAttribute("padding-left", "30px");
+
+        m_fieldSet = new FieldSet();
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
+        m_fieldSet.setLayout(layoutAccount);
+        m_fieldSet.setBorders(false);
+        
+        //
+    	// Enabled
+        //
+        initializeStatusListStore();
+        
+        //
+        // Tool Tip Box
+        //
+        toolTipField.setText(defaultToolTip);
+        m_fieldSet.add(toolTipField);
+
+        
+        //
+        // Status Combo
+        //
+        m_statusCombo = new ComboBox<GwtNetIfStatusModel>();
+        m_statusCombo.setName("comboStatus");
+        m_statusCombo.setDisplayField(GwtNetIfStatusModel.NAME);
+        m_statusCombo.setFieldLabel(MSGS.netIPv4Status());
+        m_statusCombo.setEditable(false);
+        m_statusCombo.setStore(m_statusListStore);
+        m_statusCombo.setTemplate(getTemplate());
+        m_statusCombo.setTypeAhead(true);  
+        m_statusCombo.setTriggerAction(TriggerAction.ALL);
+        m_statusCombo.setValue(m_statusListStore.findModel(GwtNetIfStatusModel.STATUS, GwtNetIfStatus.netIPv4StatusDisabled.name()));
+        m_statusCombo.addSelectionChangedListener( new SelectionChangedListener<GwtNetIfStatusModel>() {			
+			@Override
+			public void selectionChanged(SelectionChangedEvent<GwtNetIfStatusModel> se) {
+			    adjustTabs();
+				refreshForm();
+			}
+		});
+        m_statusCombo.addStyleName("kura-combobox");
+        m_statusCombo.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_statusCombo, formData);
+
+        //
+    	// Configure IP
+        //
+        m_configureCombo = new SimpleComboBox<String>();
+        m_configureCombo.setName("comboConfigure");
+        m_configureCombo.setFieldLabel(MSGS.netIPv4Configure());
+        m_configureCombo.setEditable(false);
+        m_configureCombo.setTypeAhead(true);  
+        m_configureCombo.setTriggerAction(TriggerAction.ALL);
+        m_configureCombo.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+    	// show account status combo box
+        for (GwtNetIfConfigMode mode : GwtNetIfConfigMode.values()) {
+        	m_configureCombo.add(MessageUtils.get(mode.name()));
+        }
+        if(m_selectNetIfConfig != null && m_selectNetIfConfig.getHwTypeEnum() == GwtNetIfType.MODEM) {
+            m_statusListStore.remove(m_statusListStore.findModel(GwtNetIfStatusModel.STATUS, GwtNetIfStatus.netIPv4StatusEnabledLAN.name()));
+        }
+        m_configureCombo.setSimpleValue(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()));
+        m_configureCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {			
+			@Override
+			public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
+				adjustTabs();
+				refreshForm();
+			}
+		});
+        m_configureCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipConfigure()));
+        m_configureCombo.addStyleName("kura-combobox");
+        m_configureCombo.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_configureCombo, formData);
+        
+        //
+        // IP Address
+        // 
+        m_ipAddressField = new TextField<String>();
+        m_ipAddressField.setAllowBlank(true);
+        m_ipAddressField.setName("ipAddress");
+    	m_ipAddressField.setFieldLabel(MSGS.netIPv4Address());
+    	m_ipAddressField.setRegex(IPV4_REGEX);
+    	m_ipAddressField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+    	m_ipAddressField.addPlugin(m_dirtyPlugin);
+    	m_ipAddressField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipAddress()));
+    	m_ipAddressField.addStyleName("kura-textfield");
+        m_fieldSet.add(m_ipAddressField, formData);
+
+        //
+        // Subnet mask
+        // 
+        m_subnetMaskField = new TextField<String>();
+        m_subnetMaskField.setAllowBlank(true);
+        m_subnetMaskField.setName("subnetMask");
+    	m_subnetMaskField.setFieldLabel(MSGS.netIPv4SubnetMask());
+    	m_subnetMaskField.setRegex(IPV4_REGEX);
+    	m_subnetMaskField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+    	m_subnetMaskField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipSubnetMask()));
+    	m_subnetMaskField.addStyleName("kura-textfield");
+    	m_subnetMaskField.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_subnetMaskField, formData);
+
+        //
+        // Gateway
+        // 
+        m_gatewayField = new TextField<String>();
+        m_gatewayField.setAllowBlank(true);
+        m_gatewayField.setName("gateway");
+    	m_gatewayField.setFieldLabel(MSGS.netIPv4Gateway());
+    	m_gatewayField.setRegex(IPV4_REGEX);
+    	m_gatewayField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+    	m_gatewayField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipGateway()));
+    	m_gatewayField.addStyleName("kura-textfield");
+    	m_gatewayField.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_gatewayField, formData);
+
+        //
+        // Renew DHCP Lease
+        // 
+        Button renewDHCP = new Button(MSGS.netIPv4RenewDHCPLease(),
+        		null, // no image
+        		new SelectionListener<ButtonEvent>() {
+					@Override
+					public void componentSelected(ButtonEvent ce) {
+						gwtNetworkService.renewDhcpLease(m_selectNetIfConfig.getName(), new AsyncCallback<Void>() {
+							public void onSuccess(Void result) {
+								update();
+							    Log.debug("successfully renewed DHCP lease");
+							}
+							public void onFailure(Throwable caught) {
+								Log.debug("caught: " + caught.toString());
+								FailureHandler.handle(caught);
+							}
+    					});
+						
+					}});
+        m_renewDHCPButton = new AdapterField(renewDHCP);
+        m_renewDHCPButton.setId("net-ipv4-renew-dhcp");
+        m_renewDHCPButton.setLabelSeparator("");
+        m_renewDHCPButton.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipRenew()));
+        
+        FormData formDataButton = new FormData();
+        formDataButton.setWidth(150);
+        m_renewDHCPButton.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_renewDHCPButton, formDataButton);        
+
+        //
+        // DNS read-only (for DHCP)
+        // 
+        m_dnsReadOnlyField = new TextArea();
+        m_dnsReadOnlyField.setAllowBlank(true);
+        m_dnsReadOnlyField.setName("dnsReadOnlyServers");
+        m_dnsReadOnlyField.setFieldLabel(MSGS.netIPv4DNSServers());
+        m_dnsReadOnlyField.setEnabled(false);
+        m_dnsReadOnlyField.setHeight("1.5em");
+        m_dnsReadOnlyField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        m_dnsReadOnlyField.setStyleAttribute("margin-bottom", "0px");
+        m_dnsReadOnlyField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipDns()));
+        m_fieldSet.add(m_dnsReadOnlyField, formData);
+
+        //
+        // DNS
+        // 
+        m_dnsField = new TextArea();
+        m_dnsField.setAllowBlank(true);
+        m_dnsField.setName("dnsServers");
+    	m_dnsField.setFieldLabel(MSGS.netIPv4DNSServers());
+    	m_dnsField.setRegex("((" + IPV4_REGEX + ")[\\s,;\\n\\r\\t]*)+");
+    	m_dnsField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
+    	m_dnsField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipDns()));
+		m_dnsField.addListener(Events.OnChange, new Listener<FieldEvent>() {
+			// Hide the DNS entry from the DHCP server if a custom DNS entry is added
+    		public void handleEvent(FieldEvent be) {
+    			TextArea t = (TextArea) be.getField();
+    			if (t.getValue() == null || t.getValue().isEmpty()) {
+        			showReadOnlyDns();
+    			} else {
+    				hideReadOnlyDns();
+    			}
+    		}
+    	});
+    	m_dnsField.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_dnsField, formData);
+        
+        //
+        // Search Domains
+        // 
+        m_domainsField = new TextArea();
+        m_domainsField.setAllowBlank(true);
+        m_domainsField.setName("searchDomains");
+    	m_domainsField.setFieldLabel(MSGS.netIPv4SearchDomains());
+    	m_domainsField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+    	m_domainsField.addPlugin(m_dirtyPlugin);
+        m_fieldSet.add(m_domainsField, formData);
+
+        m_formPanel.add(m_fieldSet);
+        add(m_formPanel);
+        setScrollMode(Scroll.AUTO);
+        m_initialized = true;
+    }
+        
+	public void refresh() 
+	{
+		if (m_dirty && m_initialized) {			
+	        m_dirty = false;
+			if (m_selectNetIfConfig == null) {
+				reset();
+	        }
+			else {
+				update();				
+			}		
+		}
+	}	
+	
+	private void update()
+	{
+		for (Field<?> field : m_formPanel.getFields()) {
+			FormUtils.removeDirtyFieldIcon(field);
+		}		
+		if (m_selectNetIfConfig != null) {
+
+			Log.debug("in update(): m_selectNetIfConfig.getStatus().name(): " + m_selectNetIfConfig.getStatus());
+			
+			m_statusCombo.setValue(m_statusListStore.findModel(GwtNetIfStatusModel.STATUS, GwtNetIfStatus.valueOf(m_selectNetIfConfig.getStatus()).name()));
+			m_statusCombo.setOriginalValue(m_statusCombo.getValue());
+
+			m_configureCombo.setSimpleValue(MessageUtils.get(m_selectNetIfConfig.getConfigMode()));
+			m_configureCombo.setOriginalValue(m_configureCombo.getValue());
+			
+			// adjust tabs based on status and configure combo boxes
+			adjustTabs();
+			
+			m_ipAddressField.setValue(m_selectNetIfConfig.getIpAddress());
+			m_ipAddressField.setOriginalValue(m_selectNetIfConfig.getIpAddress());
+			
+			m_subnetMaskField.setValue(m_selectNetIfConfig.getSubnetMask());
+			m_subnetMaskField.setOriginalValue(m_selectNetIfConfig.getSubnetMask());
+			
+			m_gatewayField.setValue(m_selectNetIfConfig.getGateway());
+			m_gatewayField.setOriginalValue(m_selectNetIfConfig.getGateway());
+            
+            if(m_selectNetIfConfig.getReadOnlyDnsServers() != null) {
+                m_dnsReadOnlyField.setValue(m_selectNetIfConfig.getReadOnlyDnsServers());
+                m_dnsReadOnlyField.setOriginalValue(m_selectNetIfConfig.getReadOnlyDnsServers());
+            } else {
+                m_dnsReadOnlyField.setValue("");
+                m_dnsReadOnlyField.setOriginalValue("");
+            }
+			
+			if(m_selectNetIfConfig.getDnsServers() != null) {
+				m_dnsField.setValue(m_selectNetIfConfig.getDnsServers());
+				m_dnsField.setOriginalValue(m_selectNetIfConfig.getDnsServers());
+			} else {
+				m_dnsField.setValue("");
+				m_dnsField.setOriginalValue("");
+			}
+			
+			if(m_selectNetIfConfig.getSearchDomains() != null) {
+				m_domainsField.setValue(m_selectNetIfConfig.getSearchDomains());
+				m_domainsField.setOriginalValue(m_selectNetIfConfig.getSearchDomains());
+			} else {
+				m_domainsField.setValue("");
+				m_domainsField.setOriginalValue("");
+			}
+		}		
+		refreshForm();
+	}
+
+
+	private void refreshForm() {
+	    if(m_formPanel != null) {
+    	    if(m_selectNetIfConfig != null && m_selectNetIfConfig.getHwTypeEnum() == GwtNetIfType.MODEM) {
+                for (Field<?> field : m_formPanel.getFields()) {            
+                    field.setEnabled(false);
+                }
+    
+                m_statusCombo.setEnabled(true);
+                m_dnsField.setEnabled(true);
+
+                // TODO: set value according to modem setting    	        
+    	        m_configureCombo.setSimpleValue(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()));    	        
+    	    } else {
+    	        GwtNetIfStatus statusValue = m_statusCombo.getValue().getStatus();
+    	        
+    	        if(GwtNetIfStatus.netIPv4StatusDisabled.equals(statusValue)) {
+    				//clear/reset the fields
+    				m_configureCombo.setSimpleValue(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()));
+    				m_ipAddressField.setValue("");
+    				m_subnetMaskField.setValue("");
+    				m_gatewayField.setValue("");
+    				m_dnsField.setValue("");
+    				m_domainsField.setValue("");
+    				
+        			for (Field<?> field : m_formPanel.getFields()) {			
+        				if (field != m_statusCombo) {
+        					field.setEnabled(false);
+        				}
+        			}
+        		}
+        		else {
+                    m_configureCombo.setEnabled(true);
+        
+                    String configureValue = m_configureCombo.getSimpleValue();
+                    
+                    Log.debug("configureValue: " + configureValue);
+                    Log.debug("MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name())): " + MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()));
+                    Log.debug("GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name(): " + GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name());
+                    
+        			if (configureValue.equals(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()))) {
+        				Log.debug("Enabling gateway field");
+        				m_ipAddressField.setEnabled(false);
+        				m_subnetMaskField.setEnabled(false);
+        				m_gatewayField.setEnabled(false);
+        				m_renewDHCPButton.setEnabled(true);
+        			}
+        			else {
+        				m_ipAddressField.setEnabled(true);
+        				m_subnetMaskField.setEnabled(true);
+        				m_gatewayField.setEnabled(true);
+        				/*
+        				if (GwtNetIfStatus.netIPv4StatusEnabledWAN.equals(statusValue)) {
+        				    Log.debug("Enabling gateway field");
+        				    m_gatewayField.setEnabled(true);
+        				} else {
+        					Log.debug("Disabling gateway field");
+        					m_gatewayField.setValue("");
+        					m_gatewayField.setEnabled(false);
+        				}
+        				*/
+        				m_renewDHCPButton.setEnabled(false);
+        			}
+        			m_dnsField.setEnabled(true);
+        			m_domainsField.setEnabled(true);
+        		}
+    	    }
+    	    
+    	    // Show read-only dns field when DHCP is selected and there are no custom DNS entries
+    	    String configureValue = m_configureCombo.getSimpleValue();
+    	    if (configureValue.equals(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name())) 
+    	    		&& (m_dnsField.getValue() == null || m_dnsField.getValue().isEmpty())) {    	    	
+    	    	showReadOnlyDns();
+    	    } else {
+    	    	hideReadOnlyDns();
+    	    }
+	    }
+	}
+	
+	
+	private void reset()
+	{
+		Log.debug("TcpIpConfigTab: reset()");
+		m_statusCombo.setValue(m_statusListStore.findModel(GwtNetIfStatusModel.STATUS, GwtNetIfStatus.netIPv4StatusDisabled.name()));
+		m_statusCombo.setOriginalValue(m_statusCombo.getValue());
+
+		m_configureCombo.setSimpleValue(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()));
+		m_configureCombo.setOriginalValue(m_configureCombo.getValue());
+
+		m_ipAddressField.setValue("");
+		m_ipAddressField.setOriginalValue("");
+		
+		m_subnetMaskField.setValue("");
+		m_subnetMaskField.setOriginalValue("");
+		
+		m_gatewayField.setValue("");
+		m_gatewayField.setOriginalValue("");
+		
+		m_dnsField.setValue("");
+		m_dnsField.setOriginalValue("");
+		
+		m_domainsField.setValue("");
+		m_domainsField.setOriginalValue("");
+		
+		update();
+	}
+	
+	private void initializeStatusListStore() {
+        m_statusListStore = new ListStore<GwtNetIfStatusModel>();
+        m_statusListStore.add(new GwtNetIfStatusModel(GwtNetIfStatus.netIPv4StatusDisabled,
+                MessageUtils.get("netIPv4StatusDisabled"),
+                MSGS.netIPv4ToolTipStatusDisabled()));
+        m_statusListStore.add(new GwtNetIfStatusModel(GwtNetIfStatus.netIPv4StatusEnabledLAN,
+                MessageUtils.get("netIPv4StatusEnabledLAN"),
+                MSGS.netIPv4ToolTipStatusEnabledLAN()));
+        m_statusListStore.add(new GwtNetIfStatusModel(GwtNetIfStatus.netIPv4StatusEnabledWAN,
+                MessageUtils.get("netIPv4StatusEnabledWAN"),
+                MSGS.netIPv4ToolTipStatusEnabledWAN()));
+	}
+	
+	// Enable/disable other tabs according to the selected settings
+	private void adjustTabs() {
+		m_netInterfaceConfigTabs.adjustInterfaceTabs();
+		/*
+	    if (GwtNetIfStatus.netIPv4StatusEnabledLAN.equals(m_statusCombo.getValue().getStatus())) {
+            m_netInterfaceConfigTabs.addInterfaceTabs();
+            if(MessageUtils.get(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name()).equals(m_configureCombo.getSimpleValue())) {
+            	m_netInterfaceConfigTabs.removeDhcpNatTab();
+            }
+            m_statusCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipStatusEnabledLAN()));
+        } else if (GwtNetIfStatus.netIPv4StatusEnabledWAN.equals(m_statusCombo.getValue().getStatus())) {
+            m_netInterfaceConfigTabs.addInterfaceTabs();
+            m_netInterfaceConfigTabs.removeDhcpNatTab();
+            m_statusCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipStatusEnabledWAN()));
+        } else {
+            m_netInterfaceConfigTabs.removeInterfaceTabs();
+            m_statusCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netIPv4ToolTipStatus()));
+        }
+        */
+	}
+	
+    // Combo box item template
+    private native String getTemplate() /*-{
+        return  [
+        '<tpl for=".">',
+        '<div class="x-combo-list-item" qtitle="{name}">{name}</div>',
+        '</tpl>'
+        ].join("");
+    }-*/;
+    
+    private void showReadOnlyDns() {
+    	m_dnsReadOnlyField.show();
+        
+        // TODO: Better way to set the height?
+        int rows = 1;
+        if(m_selectNetIfConfig != null) {
+	        String dnsString = m_selectNetIfConfig.getReadOnlyDnsServers();
+	        if(dnsString != null) {
+    	        for(int i=0; i<dnsString.length(); i++) {
+    	            if(dnsString.charAt(i) == '\n') {
+    	                rows++;
+    	            }
+    	        }
+	        }
+        }
+        m_dnsReadOnlyField.setHeight(Double.toString(1.5 * rows) + "em");
+
+        m_dnsField.setStyleAttribute("margin-top", "0px");
+        m_dnsField.setLabelSeparator("");
+        m_dnsField.setFieldLabel("");
+    }
+    
+    private void hideReadOnlyDns() {
+    	m_dnsReadOnlyField.hide();
+        
+        m_dnsField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        m_dnsField.setLabelSeparator(m_formPanel.getLabelSeparator());
+        m_dnsField.setFieldLabel(MSGS.netIPv4DNSServers());
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ToolTipBox.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ToolTipBox.java
new file mode 100644
index 0000000000000000000000000000000000000000..0281e2bf0e0bada1151a990980103b3a8bf2a1ae
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ToolTipBox.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Style;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasText;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.TextArea;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ToolTipBox extends Composite implements HasText {
+
+	private static ToolTipBoxUiBinder uiBinder = GWT
+			.create(ToolTipBoxUiBinder.class);
+
+	interface ToolTipBoxUiBinder extends UiBinder<Widget, ToolTipBox> {
+	}
+
+	public ToolTipBox() {
+		initWidget(uiBinder.createAndBindUi(this));
+	}
+
+	@UiField
+	HTML textArea;
+	@UiField
+	Label label;
+
+	public ToolTipBox(String height) {
+		initWidget(uiBinder.createAndBindUi(this));
+		textArea.setHeight(height);
+		label.setText("Help Text");
+	}
+	
+	public ToolTipBox(String height, String top) {
+		initWidget(uiBinder.createAndBindUi(this));
+		textArea.setHeight(height);
+		label.setText("Help Text");
+		textArea.getElement().getStyle().setTop(66, Style.Unit.PX);
+	}
+
+	public void setText(String text) {
+		textArea.setHTML(text);
+	}
+
+	public String getText() {
+		return null;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ToolTipBox.ui.xml b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ToolTipBox.ui.xml
new file mode 100644
index 0000000000000000000000000000000000000000..99dd46ad4d8c9b72a79310a07ee3179b38cf9445
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/ToolTipBox.ui.xml
@@ -0,0 +1,29 @@
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
+	xmlns:g="urn:import:com.google.gwt.user.client.ui">
+	<ui:style>
+		.tool-tip {
+			border: 1px solid;
+			border-color: #b5b8c8;
+			left: 470px;
+			position: absolute
+		}
+	</ui:style>
+	<g:HTMLPanel>
+	    <g:Label ui:field="label" styleName='{style.tool-tip}' addStyleNames="tool-tip-label"/>
+		<g:HTML ui:field="textArea" styleName='{style.tool-tip}' addStyleNames="tool-tip-textarea"/>
+	</g:HTMLPanel>
+</ui:UiBinder> 
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/WirelessConfigTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/WirelessConfigTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..45e927ebc6b5763f6bd072376ef0f1c7a6c9f0d6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/network/WirelessConfigTab.java
@@ -0,0 +1,1567 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.network;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.util.FormUtils;
+import org.eclipse.kura.web.client.util.MessageUtils;
+import org.eclipse.kura.web.client.util.SwappableListStore;
+import org.eclipse.kura.web.client.util.TextFieldWithButton;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtNetIfStatus;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.model.GwtWifiBgscanModule;
+import org.eclipse.kura.web.shared.model.GwtWifiChannelModel;
+import org.eclipse.kura.web.shared.model.GwtWifiCiphers;
+import org.eclipse.kura.web.shared.model.GwtWifiConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiHotspotEntry;
+import org.eclipse.kura.web.shared.model.GwtWifiNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiRadioMode;
+import org.eclipse.kura.web.shared.model.GwtWifiSecurity;
+import org.eclipse.kura.web.shared.model.GwtWifiWirelessMode;
+import org.eclipse.kura.web.shared.model.GwtWifiWirelessModeModel;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.eclipse.kura.web.shared.service.GwtNetworkServiceAsync;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.core.El;
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.ModelKeyProvider;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.GridEvent;
+import com.extjs.gxt.ui.client.event.KeyListener;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.GroupingStore;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ComponentPlugin;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.Slider;
+import com.extjs.gxt.ui.client.widget.VerticalPanel;
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.ComboBox;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.NumberField;
+import com.extjs.gxt.ui.client.widget.form.Radio;
+import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
+import com.extjs.gxt.ui.client.widget.form.SliderField;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.form.Validator;
+import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer;
+import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
+import com.extjs.gxt.ui.client.widget.grid.GroupColumnData;
+import com.extjs.gxt.ui.client.widget.grid.GroupingView;
+import com.extjs.gxt.ui.client.widget.layout.FillLayout;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.NodeList;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+ 
+public class WirelessConfigTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final GwtNetworkServiceAsync gwtNetworkService = GWT.create(GwtNetworkService.class);
+	private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class);
+
+	private static final String PASSWORD_REGEX_ANY  = ".*";
+	private static final String PASSWORD_REGEX_WPA  = "^[ -~]{8,63}$"; // Match all ASCII printable characters
+	private static final String PASSWORD_REGEX_WEP  = "^(?:\\w{5}|\\w{13}|\\w{16}|[a-fA-F0-9]{10}|[a-fA-F0-9]{26}|[a-fA-F0-9]{32})$";
+	private static final int	MAX_WIFI_CHANNEL	= 13;
+	
+	//private final TextArea toolTipField = new TextArea();
+	private final ToolTipBox toolTipField = new ToolTipBox("360px");
+	private final String defaultToolTip = "Mouse over enabled items on the left to see help text.";
+	
+    private GwtSession            m_currentSession;
+
+    private boolean                    m_dirty;
+    private boolean                    m_initialized;
+	private GwtWifiNetInterfaceConfig  m_selectNetIfConfig;
+	private NetInterfaceConfigTabs	   m_netInterfaceConfigTabs;
+	private TcpIpConfigTab             m_tcpIpConfigTab;
+	private GwtNetIfStatus             m_tcpIpStatus;
+	private GwtWifiConfig			   m_activeWifiConfig;
+	
+	private FormPanel               m_formPanel;
+	private ListStore<GwtWifiWirelessModeModel> m_wirelessModeListStore;
+	private ComboBox<GwtWifiWirelessModeModel>  m_modeCombo;
+	private TextFieldWithButton<String> 	m_ssidField;
+	//private Button 					m_ssidPickerButton;
+	private SimpleComboBox<String>  m_radioModeCombo;
+	
+	private SimpleComboBox<String>  m_securityCombo;
+	private TextFieldWithButton<String>       m_passwordField;
+	private TextField<String>       m_verifyPasswordField;
+	
+	private SimpleComboBox<String>  m_pairwiseCiphersCombo;
+	private SimpleComboBox<String>  m_groupCiphersCombo;
+	
+	private SimpleComboBox<String>  m_bgscanModuleCombo;
+	private NumberField				m_bgscanShortIntervalField;
+	private NumberField				m_bgscanLongIntervalField;
+	private Slider 					m_bgscanRssiThresholdSlider;
+	private SliderField 			m_bgscanRssiThresholdSliderField;
+	
+	private Radio 				   	m_pingAccessPointRadioTrue;
+	private Radio 				   	m_pingAccessPointRadioFalse;
+	private RadioGroup 			   	m_pingAccessPointRadioGroup;
+	
+	private ContentPanel			m_channelPanel;
+	
+    private ComponentPlugin         m_dirtyPlugin;
+    
+    private GroupingView m_channelGroupingView;
+    private String m_checkedStyle = "x-grid3-group-check";
+    private String m_uncheckedStyle = "x-grid3-group-uncheck";
+    
+    private BaseListLoader<ListLoadResult<GwtWifiHotspotEntry>> m_wifiHotspotLoader;
+    private Grid<GwtWifiHotspotEntry> m_grid;
+    private Window m_wifiNetworksWindow;
+    
+    private class MouseOverListener implements Listener<BaseEvent> {
+
+    	private String  html;
+    	
+    	public MouseOverListener(String html) {
+    		this.html = html;
+    	}
+		public void handleEvent(BaseEvent be) {
+			toolTipField.setText(html);
+		}
+    	
+    }
+    
+	private CheckBoxSelectionModel<GwtWifiChannelModel> m_checkboxChannelSelectionModel = new CheckBoxSelectionModel<GwtWifiChannelModel>() {
+		@Override
+		public void deselectAll() {
+			super.deselectAll();
+			NodeList<com.google.gwt.dom.client.Element> groups = m_channelGroupingView.getGroups();
+			for (int i = 0; i < groups.getLength(); i++) {
+				com.google.gwt.dom.client.Element group = groups.getItem(i).getFirstChildElement();
+				setGroupChecked((Element) group, false);
+			}
+		}
+
+		@Override
+		public void selectAll() {
+			super.selectAll();
+			NodeList<com.google.gwt.dom.client.Element> groups = m_channelGroupingView.getGroups();
+			for (int i = 0; i < groups.getLength(); i++) {
+				com.google.gwt.dom.client.Element group = groups.getItem(i).getFirstChildElement();
+				setGroupChecked((Element) group, true);
+			}
+		}
+
+		@Override
+		protected void doDeselect(List<GwtWifiChannelModel> models, boolean supressEvent) {
+			super.doDeselect(models, supressEvent);
+			NodeList<com.google.gwt.dom.client.Element> groups = m_channelGroupingView.getGroups();
+			search: for (int i = 0; i < groups.getLength(); i++) {
+				com.google.gwt.dom.client.Element group = groups.getItem(i);
+				NodeList<Element> rows = El.fly(group).select(".x-grid3-row");
+				for (int j = 0, len = rows.getLength(); j < len; j++) {
+					Element r = rows.getItem(j);
+					int idx = grid.getView().findRowIndex(r);
+					GwtWifiChannelModel m = grid.getStore().getAt(idx);
+					if (!isSelected(m)) {
+						setGroupChecked((Element) group, false);
+						continue search;
+					}
+				}
+			}
+
+		}
+
+		@Override
+		protected void doSelect(List<GwtWifiChannelModel> models, boolean keepExisting,
+				boolean supressEvent) {
+			super.doSelect(models, keepExisting, supressEvent);
+			NodeList<com.google.gwt.dom.client.Element> groups = m_channelGroupingView.getGroups();
+			search: for (int i = 0; i < groups.getLength(); i++) {
+				com.google.gwt.dom.client.Element group = groups.getItem(i);
+				NodeList<Element> rows = El.fly(group).select(".x-grid3-row");
+				for (int j = 0, len = rows.getLength(); j < len; j++) {
+					Element r = rows.getItem(j);
+					int idx = grid.getView().findRowIndex(r);
+					GwtWifiChannelModel m = grid.getStore().getAt(idx);
+					if (!isSelected(m)) {
+						continue search;
+					}
+				}
+				setGroupChecked((Element) group, true);
+
+			}
+		}
+	}; 
+    
+    public WirelessConfigTab(GwtSession currentSession,
+    					     TcpIpConfigTab tcpIpConfigTab,
+    					     NetInterfaceConfigTabs netInterfaceConfigTabs)
+    {
+    	// initialization 
+        m_currentSession = currentSession;
+        m_tcpIpConfigTab = tcpIpConfigTab;
+        m_netInterfaceConfigTabs = netInterfaceConfigTabs;
+    	m_dirty          = true;
+    	m_initialized    = false;
+    
+	    final WirelessConfigTab theTab = this;
+    	m_dirtyPlugin = new ComponentPlugin() {  
+    		public void init(Component component) {  
+    			component.addListener(Events.Change, new Listener<ComponentEvent>() {  
+    				public void handleEvent(ComponentEvent be) {
+    					FormUtils.addDirtyFieldIcon(be.getComponent());    					
+    					theTab.fireEvent(Events.Change);
+    				}  
+    			});  
+  	      	}  
+  	    };
+  	    
+  	    m_tcpIpConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
+  	    	public void handleEvent(BaseEvent be) {
+  	    	    if(m_selectNetIfConfig != null) {
+      	    	    // set default values for wireless mode if tcp/ip status was changed
+      	    	    GwtNetIfStatus tcpIpStatus = m_tcpIpConfigTab.getStatus();
+      	    	    if(!tcpIpStatus.equals(m_tcpIpStatus)) {
+      	    	        if(GwtNetIfStatus.netIPv4StatusEnabledLAN.equals(tcpIpStatus)) {
+      	    	            m_activeWifiConfig = m_selectNetIfConfig.getAccessPointWifiConfig();
+                        } else {
+                            m_activeWifiConfig = m_selectNetIfConfig.getStationWifiConfig();
+                        }
+      	    	        m_tcpIpStatus = tcpIpStatus;
+      	    	    }
+  	    	    }
+  	    	    refreshForm();
+  	    	    theTab.fireEvent(Events.Change);
+  	    	}
+  	    });
+    }
+
+    public void setNetInterface(GwtNetInterfaceConfig netIfConfig)
+    {
+    	m_dirty = true;
+        if(m_tcpIpStatus == null || m_selectNetIfConfig != netIfConfig) {
+            m_tcpIpStatus = m_tcpIpConfigTab.getStatus();
+        }
+		if(netIfConfig instanceof GwtWifiNetInterfaceConfig) {
+	    	m_selectNetIfConfig = (GwtWifiNetInterfaceConfig) netIfConfig;
+	    	m_activeWifiConfig = m_selectNetIfConfig.getActiveWifiConfig();
+		}
+    }
+    
+    
+    public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf)
+    {
+        GwtWifiNetInterfaceConfig updatedWifiNetIf = (GwtWifiNetInterfaceConfig) updatedNetIf;
+
+        if (m_formPanel != null) {
+        	GwtWifiConfig updatedWifiConfig = getGwtWifiConfig();
+        	updatedWifiNetIf.setWirelessMode(updatedWifiConfig.getWirelessMode());
+        	
+    		// Update the wifi config
+    		updatedWifiNetIf.setWifiConfig(updatedWifiConfig);
+    	} else {
+    	    if(m_selectNetIfConfig != null) {
+        	    Log.debug("Wireless config tab not yet rendered, using original values");
+                
+        	    updatedWifiNetIf.setAccessPointWifiConfig(m_selectNetIfConfig.getAccessPointWifiConfigProps());
+        	    /* updatedWifiNetIf.setAdhocWifiConfig(m_selectNetIfConfig.getAdhocWifiConfigProps()); */
+        	    updatedWifiNetIf.setStationWifiConfig(m_selectNetIfConfig.getStationWifiConfigProps());
+    
+        	    // Select the correct mode
+                for (GwtWifiWirelessMode mode : GwtWifiWirelessMode.values()) {
+                    if (mode.name().equals(m_selectNetIfConfig.getWirelessMode())) {
+                        updatedWifiNetIf.setWirelessMode(mode.name());
+                        break;
+                    }
+                }
+    	    }
+    	}
+    }
+        
+    public boolean isValid() {
+    	if (m_formPanel != null) {
+    		for (Field<?> field : m_formPanel.getFields()) {
+    			if (!field.isValid()) {
+    				return false;
+    			}
+    		}
+    	}
+    	return true;
+    }
+    
+    public boolean isDirty() {
+    	if (m_formPanel == null) {
+    		return false;
+    	}
+        List<Field<?>> fields = m_formPanel.getFields();
+        for (int i=0; i<fields.size(); i++) {
+        	if (fields.get(i) instanceof Field) {
+	            Field<?> field = (Field<?>) fields.get(i);
+	            if (field.isDirty()) {
+	            	if((field.getOriginalValue() != null && field.getOriginalValue().equals("") && field.getValue() == null) || 
+	            			(field.getValue() != null && field.getValue().equals("") && field.getOriginalValue() == null)) {
+	            		continue;
+	            	} else if(field.getOriginalValue() != null && field.getValue() != null && field.getOriginalValue().equals(field.getValue())) {
+	            		continue;
+	            	} else {
+	            		if(field.getOriginalValue() instanceof SimpleComboValue) {
+	            			Log.debug("field " + field.getName() + " is dirty - original value: " + ((SimpleComboValue)field.getOriginalValue()).getValue() + " with type: " + field.getOriginalValue().getClass().toString());
+	            			if(field.getValue() != null) {
+	            				Log.debug("\tnew value: " + ((SimpleComboValue)field.getValue()).getValue() +  " with type: " + field.getValue().getClass().toString());
+	            			}
+	            		} else {
+		            		Log.debug("field " + field.getName() + " is dirty - original value: " + field.getOriginalValue() + " with type: " + field.getOriginalValue().getClass().toString());
+		            		if(field.getValue() != null) {
+		            			Log.debug("\tnew value: " + field.getValue() +  " with type: " + field.getValue().getClass().toString());
+		            		}
+	            		}
+	            		return true;
+	            	}
+	            	
+	            	/*
+                    if(field != m_bgscanRssiThresholdSliderField)       // FIXME: m_bgscanRssiThresholdSliderField.isDirty() is always returning true
+                        return true;
+                        */
+	            } else {
+	            	Log.debug("NOT DIRTY: " + field.getName() + " value: " + field.getValue());
+	            }
+        	}
+        }
+        return false;
+    }
+    
+    protected void onRender(Element parent, int index) 
+    {   
+        super.onRender(parent, index);    
+    	
+        setLayout(new FitLayout());
+        setId("network-wireless");
+        
+        FormData formData = new FormData();
+        formData.setWidth(250);
+  
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(false);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setLayout(new FlowLayout());
+        m_formPanel.setStyleAttribute("min-width", "775px");
+        m_formPanel.setStyleAttribute("padding-left", "30px");
+        
+        FieldSet fieldSet = new FieldSet();
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        fieldSet.setBorders(false);
+        
+        //
+        // Tool Tip Box
+        //
+        toolTipField.setText(defaultToolTip);
+        fieldSet.add(toolTipField);
+
+        //
+    	// Wireless Mode
+        //
+        m_wirelessModeListStore = new ListStore<GwtWifiWirelessModeModel>();
+        /*
+        m_wirelessModeListStore.add(new GwtWifiWirelessModeModel(GwtWifiWirelessMode.netWifiWirelessModeDisabled,
+                MessageUtils.get("netWifiWirelessModeDisabled"),
+                MSGS.netWifiToolTipWirelessModeDisabled()));
+        */
+        m_wirelessModeListStore.add(new GwtWifiWirelessModeModel(GwtWifiWirelessMode.netWifiWirelessModeStation,
+                MessageUtils.get("netWifiWirelessModeStation"),
+                MSGS.netWifiToolTipWirelessModeStation()));
+        m_wirelessModeListStore.add(new GwtWifiWirelessModeModel(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint,
+                MessageUtils.get("netWifiWirelessModeAccessPoint"),
+                MSGS.netWifiToolTipWirelessModeAccessPoint()));
+        /*
+        m_wirelessModeListStore.add(new GwtWifiWirelessModeModel(GwtWifiWirelessMode.netWifiWirelessModeAdHoc,
+                MessageUtils.get("netWifiWirelessModeAdHoc"),
+                MSGS.netWifiToolTipWirelessModeAdhoc()));
+        */
+        
+        m_modeCombo = new ComboBox<GwtWifiWirelessModeModel>();
+        m_modeCombo.setName("comboMode");
+        m_modeCombo.setDisplayField(GwtWifiWirelessModeModel.NAME);
+        m_modeCombo.setFieldLabel(MSGS.netWifiWirelessMode());
+        m_modeCombo.setEditable(false);
+        m_modeCombo.setTypeAhead(true);
+        m_modeCombo.setTriggerAction(TriggerAction.ALL);
+        m_modeCombo.addStyleName("kura-combobox");
+        m_modeCombo.setStore(m_wirelessModeListStore);
+        m_modeCombo.setTemplate(getTemplate());
+        m_modeCombo.setValue(m_wirelessModeListStore.findModel(GwtWifiWirelessModeModel.MODE, GwtWifiWirelessMode.netWifiWirelessModeStation.name()));
+		m_modeCombo.setValidator(new Validator() {
+			
+			public String validate(Field<?> field, String value) {
+				if (m_tcpIpConfigTab.getStatus().equals(GwtNetIfStatus.netIPv4StatusEnabledWAN)
+						&& value.equals(MessageUtils.get(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.name()))){
+					return MSGS.netWifiWirelessEnabledForWANError();
+				}
+				
+				return null;
+			}
+		});
+
+        m_modeCombo.addSelectionChangedListener( new SelectionChangedListener<GwtWifiWirelessModeModel>() {         
+			@Override
+			public void selectionChanged(SelectionChangedEvent<GwtWifiWirelessModeModel> se) {
+
+				// Station mode selected
+			    if (GwtWifiWirelessMode.netWifiWirelessModeStation.equals(se.getSelectedItem().getMode())) {
+					// Use values from station config
+					m_activeWifiConfig = m_selectNetIfConfig.getStationWifiConfig();
+					
+			    } else {
+					// Use values from access point config
+					m_activeWifiConfig = m_selectNetIfConfig.getAccessPointWifiConfig();
+			    }
+				setPasswordValidation();
+				setValues(false);
+				refreshForm();
+			}
+		});
+        m_modeCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipWirelessMode()));
+        m_modeCombo.addPlugin(m_dirtyPlugin);
+       
+        
+        Button ssidPickerButton = new Button("",
+        		AbstractImagePrototype.create(Resources.INSTANCE.magnifier16()),
+        		new SelectionListener<ButtonEvent>() {
+					@Override
+					public void componentSelected(ButtonEvent ce) {
+						m_wifiNetworksWindow = createWifiNetworksWindow();
+						m_wifiNetworksWindow.show();
+						m_wifiHotspotLoader.load();
+					}
+        });
+        
+        //
+        // SSID
+        // 
+        m_ssidField = new TextFieldWithButton<String>(ssidPickerButton, 10);
+        m_ssidField.setAllowBlank(true);
+        m_ssidField.setId("ssid-input");
+        m_ssidField.setName("ssid");
+    	m_ssidField.setFieldLabel(MSGS.netWifiNetworkName());
+    	m_ssidField.setEnabled(true, false);
+    	m_ssidField.addPlugin(m_dirtyPlugin);
+    	m_ssidField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipNetworkName()));
+    	m_ssidField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+       
+        //
+        // Radio Mode
+        // 
+        m_radioModeCombo = new SimpleComboBox<String>();
+        m_radioModeCombo.setName("radioMode");
+        m_radioModeCombo.setFieldLabel(MSGS.netWifiRadioMode());
+        m_radioModeCombo.setEditable(false);
+        m_radioModeCombo.setTypeAhead(true);
+        m_radioModeCombo.setTriggerAction(TriggerAction.ALL);
+        for (GwtWifiRadioMode mode : GwtWifiRadioMode.values()) {
+        	m_radioModeCombo.add(MessageUtils.get(mode.name()));
+        }
+        m_radioModeCombo.setSimpleValue(MessageUtils.get(GwtWifiRadioMode.netWifiRadioModeBGN.name()));
+        m_radioModeCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {			
+			@Override
+			public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
+				refreshForm();
+			}
+		});
+        m_radioModeCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipRadioMode()));
+        m_radioModeCombo.addStyleName("kura-combobox");
+        m_radioModeCombo.addPlugin(m_dirtyPlugin);
+       
+        //
+        // Wireless Security
+        // 
+        m_securityCombo = new SimpleComboBox<String>();
+        m_securityCombo.setName("security");
+        m_securityCombo.setFieldLabel(MSGS.netWifiWirelessSecurity());
+        m_securityCombo.setEditable(false);
+        m_securityCombo.setTypeAhead(true);
+        m_securityCombo.setTriggerAction(TriggerAction.ALL);
+        m_securityCombo.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        for (GwtWifiSecurity mode : GwtWifiSecurity.values()) {
+        	m_securityCombo.add(MessageUtils.get(mode.name()));
+        }
+        m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA2.name()));
+        m_securityCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {			
+			@Override
+			public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
+				setPasswordValidation();
+				refreshForm();
+			}
+		});
+        m_securityCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipSecurity()));
+        m_securityCombo.addStyleName("kura-combobox");
+        m_securityCombo.addPlugin(m_dirtyPlugin);
+
+        Button passwordButton = new Button("",
+        		AbstractImagePrototype.create(Resources.INSTANCE.connect16()),
+        		new SelectionListener<ButtonEvent>() {
+					@Override
+					public void componentSelected(ButtonEvent ce) {
+					
+						m_passwordField.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.hourglass16()));
+						m_passwordField.setEnabled(true, false);
+						GwtWifiConfig gwtWifiConfig = getGwtWifiConfig();
+						gwtNetworkService.verifyWifiCredentials(m_selectNetIfConfig.getName(), gwtWifiConfig, new AsyncCallback<Boolean>() {
+							public void onSuccess(Boolean result) {
+							    Log.warn("verifyWifiCredentials() :: result=" + result);
+							    if (!result.booleanValue()) {
+							    	m_passwordField.setValue("");
+							    }
+							    
+							    m_passwordField.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.connect16()));
+								m_passwordField.setEnabled(true, true);
+							}
+							public void onFailure(Throwable caught) {
+								Log.warn("verifyWifiCredentials() :: caught: " + caught.toString());
+								m_passwordField.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.connect16()));
+								m_passwordField.setEnabled(true, true);
+							}
+						});
+					}
+        });
+             
+        //
+        // Password
+        // 
+        m_passwordField = new TextFieldWithButton<String>(passwordButton, 10);
+        m_passwordField.setId("wifi-password");
+        m_passwordField.setName("password");
+        m_passwordField.setFieldLabel(MSGS.netWifiWirelessPassword());
+        m_passwordField.setPassword(true);
+        m_passwordField.setRegex(PASSWORD_REGEX_ANY);
+        m_passwordField.getMessages().setRegexText(MSGS.netWifiWirelessInvalidWPAPassword());
+        m_passwordField.addPlugin(m_dirtyPlugin);
+        m_passwordField.setAutoValidate(true);
+        m_passwordField.setAllowBlank(false);
+        m_passwordField.addKeyListener(new KeyListener() {
+            @Override
+            public void componentKeyUp(ComponentEvent event) {
+                super.componentKeyUp(event);
+                m_verifyPasswordField.validate();
+            }
+        });
+        
+        m_passwordField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipPassword()));
+        
+        m_passwordField.addListener(Events.OnChange, new Listener<BaseEvent>() {
+  	    	public void handleEvent(BaseEvent be) {
+  	    		setPasswordValidation();
+  	    	    refreshForm();
+  	    	}
+  	    });
+        
+        //
+        // Verify Password
+        // 
+        m_verifyPasswordField = new TextField<String>();
+        m_verifyPasswordField.setName("verifyPassword");
+        m_verifyPasswordField.setFieldLabel(MSGS.netWifiWirelessVerifyPassword());
+        m_verifyPasswordField.setPassword(true);
+        m_verifyPasswordField.addPlugin(m_dirtyPlugin);
+        m_verifyPasswordField.getMessages().setInvalidText("Invalid text 123");  //TODO:
+        m_verifyPasswordField.setAutoValidate(true);
+        m_verifyPasswordField.setAllowBlank(false);
+        m_verifyPasswordField.setValidator( new Validator() {
+            public String validate(Field<?> field, String value) {
+                if (m_modeCombo != null && GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.equals(m_modeCombo.getValue().getMode())) {
+                    // Check that the verify password field matches
+                    if(m_passwordField == null || !value.equals(m_passwordField.getValue())) {
+                        return MSGS.netWifiWirelessPasswordDoesNotMatch();
+                    }
+                }
+                return null;
+            }
+        });
+        m_verifyPasswordField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipPassword()));
+        m_verifyPasswordField.addStyleName("kura-textfield");
+                
+        // pairwise ciphers
+        m_pairwiseCiphersCombo = new SimpleComboBox<String>();
+        m_pairwiseCiphersCombo.setName("pairwiseCiphers");
+        m_pairwiseCiphersCombo.setFieldLabel(MSGS.netWifiWirelessPairwiseCiphers());
+        m_pairwiseCiphersCombo.setEditable(false);
+        m_pairwiseCiphersCombo.setTypeAhead(true);
+        m_pairwiseCiphersCombo.setTriggerAction(TriggerAction.ALL);
+        //m_pairwiseCiphersCombo.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        for (GwtWifiCiphers ciphers : GwtWifiCiphers.values()) {
+        	m_pairwiseCiphersCombo.add(MessageUtils.get(ciphers.name()));
+        }
+        m_pairwiseCiphersCombo.setSimpleValue(MessageUtils.get(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name()));
+		m_pairwiseCiphersCombo.addSelectionChangedListener(new SelectionChangedListener<SimpleComboValue<String>>() {
+					@Override
+					public void selectionChanged(
+							SelectionChangedEvent<SimpleComboValue<String>> se) {
+						refreshForm();
+					}
+				});
+		m_pairwiseCiphersCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipCiphers()));
+		m_pairwiseCiphersCombo.addStyleName("kura-combobox");
+		m_pairwiseCiphersCombo.addPlugin(m_dirtyPlugin);
+        
+        // group ciphers
+        m_groupCiphersCombo = new SimpleComboBox<String>();
+        m_groupCiphersCombo.setName("groupCiphers");
+        m_groupCiphersCombo.setFieldLabel(MSGS.netWifiWirelessGroupCiphers());
+        m_groupCiphersCombo.setEditable(false);
+        m_groupCiphersCombo.setTypeAhead(true);
+        m_groupCiphersCombo.setTriggerAction(TriggerAction.ALL);
+        //m_groupCiphersCombo.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        for (GwtWifiCiphers ciphers : GwtWifiCiphers.values()) {
+        	m_groupCiphersCombo.add(MessageUtils.get(ciphers.name()));
+        }
+        m_groupCiphersCombo.setSimpleValue(MessageUtils.get(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name()));
+        m_groupCiphersCombo.addSelectionChangedListener(new SelectionChangedListener<SimpleComboValue<String>>() {
+			@Override
+			public void selectionChanged(
+					SelectionChangedEvent<SimpleComboValue<String>> se) {
+				refreshForm();
+			}
+		});
+        m_groupCiphersCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipCiphers()));
+        m_groupCiphersCombo.addStyleName("kura-combobox");
+        m_groupCiphersCombo.addPlugin(m_dirtyPlugin);
+        
+        // bgscan module
+        m_bgscanModuleCombo = new SimpleComboBox<String>();
+        m_bgscanModuleCombo.setName("groupCiphers");
+        m_bgscanModuleCombo.setFieldLabel(MSGS.netWifiWirelessBgscanModule());
+        m_bgscanModuleCombo.setEditable(false);
+        m_bgscanModuleCombo.setTypeAhead(true);
+        m_bgscanModuleCombo.setTriggerAction(TriggerAction.ALL);
+        m_bgscanModuleCombo.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        for (GwtWifiBgscanModule module : GwtWifiBgscanModule.values()) {
+        	m_bgscanModuleCombo.add(MessageUtils.get(module.name()));
+        }
+        m_bgscanModuleCombo.setSimpleValue(MessageUtils.get(GwtWifiBgscanModule.netWifiBgscanMode_NONE.name()));
+        m_bgscanModuleCombo.addSelectionChangedListener(new SelectionChangedListener<SimpleComboValue<String>>() {
+			@Override
+			public void selectionChanged(
+					SelectionChangedEvent<SimpleComboValue<String>> se) {
+				refreshForm();
+			}
+		});
+        m_bgscanModuleCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipBgScan()));
+        m_bgscanModuleCombo.addStyleName("kura-combobox");
+        m_bgscanModuleCombo.addPlugin(m_dirtyPlugin);
+        
+        // bgscan RSSI Threshold
+        m_bgscanRssiThresholdSlider = new Slider();  
+        
+        m_bgscanRssiThresholdSlider.setWidth(200);  
+        m_bgscanRssiThresholdSlider.setIncrement(1);
+        m_bgscanRssiThresholdSlider.setMinValue(-90);
+        m_bgscanRssiThresholdSlider.setMaxValue(-20);  
+        m_bgscanRssiThresholdSlider.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipBgScanStrength()));
+        m_bgscanRssiThresholdSlider.setClickToChange(false);  
+        m_bgscanRssiThresholdSliderField = new SliderField(m_bgscanRssiThresholdSlider);
+        m_bgscanRssiThresholdSliderField.setFieldLabel(MSGS.netWifiWirelessBgscanSignalStrengthThreshold());
+        
+        // bgscan short interval
+        m_bgscanShortIntervalField = new NumberField();
+        m_bgscanShortIntervalField.setPropertyEditorType(Integer.class);
+        m_bgscanShortIntervalField.setAllowDecimals(false);
+        m_bgscanShortIntervalField.setAllowNegative(false);
+        m_bgscanShortIntervalField.setAllowBlank(true);
+        m_bgscanShortIntervalField.setName("bgscanShortInterval");
+        m_bgscanShortIntervalField.setFieldLabel(MSGS.netWifiWirelessBgscanShortInterval());
+        m_bgscanShortIntervalField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipBgScanShortInterval()));
+        m_bgscanShortIntervalField.addPlugin(m_dirtyPlugin);
+        //m_bgscanShortInterval.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        
+        // bgscan long interval
+        m_bgscanLongIntervalField = new NumberField();
+        m_bgscanLongIntervalField.setPropertyEditorType(Integer.class);
+        m_bgscanLongIntervalField.setAllowDecimals(false);
+        m_bgscanLongIntervalField.setAllowNegative(false);
+        m_bgscanLongIntervalField.setAllowBlank(true);
+        m_bgscanLongIntervalField.setName("bgscanLongInterval");
+        m_bgscanLongIntervalField.setFieldLabel(MSGS.netWifiWirelessBgscanLongInterval());
+        m_bgscanLongIntervalField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipBgScanLongInterval()));
+        m_bgscanLongIntervalField.addPlugin(m_dirtyPlugin);
+        
+        
+        m_pingAccessPointRadioTrue = new Radio();  
+        m_pingAccessPointRadioTrue.setBoxLabel(MSGS.trueLabel());
+        m_pingAccessPointRadioTrue.setItemId("true");
+        
+        m_pingAccessPointRadioFalse = new Radio();  
+        m_pingAccessPointRadioFalse.setBoxLabel(MSGS.falseLabel());  
+        m_pingAccessPointRadioFalse.setItemId("false");
+        
+        m_pingAccessPointRadioGroup = new RadioGroup();
+        m_pingAccessPointRadioGroup.setName("pingAccessPoint");
+        m_pingAccessPointRadioGroup.setFieldLabel(MSGS.netWifiWirelessPingAccessPoint()); 
+        m_pingAccessPointRadioGroup.add(m_pingAccessPointRadioTrue);  
+        m_pingAccessPointRadioGroup.add(m_pingAccessPointRadioFalse);
+        m_pingAccessPointRadioGroup.addPlugin(m_dirtyPlugin);  
+        m_pingAccessPointRadioGroup.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipPingAccessPoint()));
+        m_pingAccessPointRadioGroup.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+                
+        //
+        // Channel
+        // 
+        GroupingStore<GwtWifiChannelModel> grtoupingStore = new GroupingStore<GwtWifiChannelModel>();  
+        grtoupingStore.setMonitorChanges(true);  
+        grtoupingStore.add(GwtWifiChannelModel.getChannels());
+        grtoupingStore.groupBy("band");
+        
+        ColumnConfig channel = new ColumnConfig("name", "All Available Channels", 20);  
+        ColumnConfig frequency = new ColumnConfig("frequency", "Frequency (MHz)", 10);  
+        ColumnConfig band = new ColumnConfig("band", "Spectrum Band", 20);  
+           
+        List<ColumnConfig> channelColumnConfig = new ArrayList<ColumnConfig>();  
+        channelColumnConfig.add(m_checkboxChannelSelectionModel.getColumn()); 
+        channelColumnConfig.add(channel);  
+        channelColumnConfig.add(frequency);  
+        channelColumnConfig.add(band);  
+      
+        final ColumnModel columnModel = new ColumnModel(channelColumnConfig);  
+        m_channelGroupingView = new GroupingView() {  
+              
+            @Override  
+            protected void onMouseDown(GridEvent<ModelData> ge) {  
+              El hd = ge.getTarget(".x-grid-group-hd", 10);  
+              El target = ge.getTargetEl();  
+              if (hd != null && target.hasStyleName(m_uncheckedStyle) || target.hasStyleName(m_checkedStyle)) {  
+                boolean checked = !ge.getTargetEl().hasStyleName(m_uncheckedStyle);  
+                checked = !checked;  
+                if (checked) {  
+                  ge.getTargetEl().replaceStyleName(m_uncheckedStyle, m_checkedStyle);  
+                } else {  
+                  ge.getTargetEl().replaceStyleName(m_checkedStyle, m_uncheckedStyle);  
+                }  
+        
+                Element group = (Element) findGroup(ge.getTarget());  
+                if (group != null) {  
+                  NodeList<Element> rows = El.fly(group).select(".x-grid3-row");  
+                  List<ModelData> temp = new ArrayList<ModelData>();  
+                  for (int i = 0; i < rows.getLength(); i++) {  
+                    Element r = rows.getItem(i);  
+                    int idx = findRowIndex(r);  
+                    ModelData m = grid.getStore().getAt(idx);  
+                    temp.add(m);  
+                  }  
+                  if (checked) {  
+                    grid.getSelectionModel().select(temp, true);  
+                  } else {  
+                    grid.getSelectionModel().deselect(temp);  
+                  }  
+                }  
+                return;  
+              }  
+              super.onMouseDown(ge);  
+            }  
+        
+          };  
+         
+        m_channelGroupingView.setShowGroupedColumn(false);  
+        m_channelGroupingView.setForceFit(true);  
+        m_channelGroupingView.setShowDirtyCells(true);
+        m_channelGroupingView.setGroupRenderer(new GridGroupRenderer() {  
+            public String render(GroupColumnData data) {  
+              String f = columnModel.getColumnById(data.field).getHeader();  
+              String l = data.models.size() == 1 ? "Item" : "Items";  
+              return "<div class='x-grid3-group-checker'><div class='" + m_uncheckedStyle + "'> </div></div> " + f  
+                  + ": " + data.group + " (" + data.models.size() + " " + l + ")";  
+            }  
+          });  
+          
+        final Grid<GwtWifiChannelModel> channelGrid = new Grid<GwtWifiChannelModel>(grtoupingStore, columnModel);
+        channelGrid.setView(m_channelGroupingView);
+        channelGrid.setBorders(true);
+        channelGrid.addPlugin(m_checkboxChannelSelectionModel);
+        channelGrid.setSelectionModel(m_checkboxChannelSelectionModel);
+        channelGrid.addPlugin(m_dirtyPlugin);
+        
+        m_channelPanel = new ContentPanel();
+        m_channelPanel.setHeading("Select Channel(s)");
+        m_channelPanel.setCollapsible(true);
+        m_channelPanel.setFrame(true);
+        m_channelPanel.setSize(430, 200);
+        m_channelPanel.setLayout(new FitLayout());
+        m_channelPanel.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
+        m_channelPanel.add(channelGrid);
+        m_channelPanel.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netWifiToolTipChannels()));
+        
+        m_checkboxChannelSelectionModel.addSelectionChangedListener(new SelectionChangedListener<GwtWifiChannelModel>() {
+            @Override
+            public void selectionChanged(
+                    SelectionChangedEvent<GwtWifiChannelModel> se) {
+                
+                updateSelectedChannels(se.getSelection());
+            }
+        });
+        
+        // Adjust the number of channels shown based on defined property
+        gwtDeviceService.findDeviceConfiguration(new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {
+			public void onSuccess(ListLoadResult<GwtGroupedNVPair> results) {
+				if (results != null) {
+					List<GwtGroupedNVPair> pairs = results.getData();
+					if (pairs != null) {
+						for (GwtGroupedNVPair pair : pairs) {
+							String name = pair.getName();
+							if (name != null && name.equals("devLastWifiChannel")) {
+								int topChannel = Integer.parseInt(pair.getValue());
+								// Remove channels 12 and 13
+								if (topChannel < MAX_WIFI_CHANNEL) {
+									channelGrid.getStore().remove(MAX_WIFI_CHANNEL - 1);
+									channelGrid.getStore().remove(MAX_WIFI_CHANNEL - 2);
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			public void onFailure(Throwable caught) {
+				FailureHandler.handle(caught);
+			}
+        });
+ 
+        fieldSet.add(m_modeCombo, formData);
+        fieldSet.add(m_ssidField, formData);
+        fieldSet.add(m_radioModeCombo, formData);
+        fieldSet.add(m_securityCombo, formData);
+        fieldSet.add(m_passwordField, formData);
+        fieldSet.add(m_verifyPasswordField, formData); 
+    	fieldSet.add(m_pairwiseCiphersCombo, formData);
+    	fieldSet.add(m_groupCiphersCombo, formData);
+    	fieldSet.add(m_bgscanModuleCombo, formData);
+    	fieldSet.add(m_bgscanRssiThresholdSliderField, formData);
+    	fieldSet.add(m_bgscanShortIntervalField, formData);
+    	fieldSet.add(m_bgscanLongIntervalField, formData);
+    	fieldSet.add(m_pingAccessPointRadioGroup, formData);
+    	fieldSet.add(m_channelPanel, formData);
+    	 
+        if ((m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA2.name())))
+				|| (m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA.name())))
+				|| (m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA_WPA2.name())))) {
+        	
+            if (GwtWifiWirelessMode.netWifiWirelessModeStation.equals(m_modeCombo.getValue().getMode())) {
+        		m_pairwiseCiphersCombo.setEnabled(true);
+        		m_groupCiphersCombo.setEnabled(true);
+        	} else {
+        		m_pairwiseCiphersCombo.setEnabled(false);
+        		m_groupCiphersCombo.setEnabled(false);
+        	}
+        } else {
+        	m_pairwiseCiphersCombo.setEnabled(false);
+        	m_groupCiphersCombo.setEnabled(false);
+        }
+        	 
+	    m_formPanel.add(fieldSet);
+	    m_formPanel.setScrollMode(Scroll.AUTO);
+	    add(m_formPanel);
+	    setScrollMode(Scroll.AUTOX);
+	    m_initialized = true;
+	}
+    
+    public GwtWifiWirelessMode getWirelessMode() {
+		if (m_modeCombo != null) {
+		    return m_modeCombo.getValue().getMode();
+		} else if(m_selectNetIfConfig != null) {
+			return GwtWifiWirelessMode.valueOf(m_selectNetIfConfig.getWirelessMode());
+		}
+
+    	return null;
+    }
+	    
+	public void refresh() {
+		if (m_dirty && m_initialized) {			
+	        m_dirty = false;
+			if (m_selectNetIfConfig == null) {
+				reset();
+	        }
+			else {
+				update();				
+			}		
+		}
+	}	
+	
+	private void update() {
+		for (Field<?> field : m_formPanel.getFields()) {
+			FormUtils.removeDirtyFieldIcon(field);
+		}
+		setValues(true);
+		
+		for (Field<?> field : m_formPanel.getFields()) {
+			FormUtils.removeDirtyFieldIcon(field);
+		}
+		refreshForm();
+	}
+	
+	private void updateSelectedChannels(List<GwtWifiChannelModel> channels) {
+		
+	    /*
+        if (GwtWifiWirelessMode.netWifiWirelessModeAdHoc.equals(m_modeCombo.getValue().getMode()) 
+                || GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.equals(m_modeCombo.getValue().getMode())) {
+        */
+	    if(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.equals(m_modeCombo.getValue().getMode())) {
+		
+			if (channels != null) {
+				int ind = 0;
+				for (GwtWifiChannelModel channel : channels) {
+					if (ind > 0) {
+						m_checkboxChannelSelectionModel.deselect(channel.getChannel()-1);
+					}
+					ind++;
+				}
+			}
+		}
+	}
+		
+	private void refreshForm() {
+		if (m_formPanel != null) {
+			
+			GwtNetIfStatus tcpIpStatus = m_tcpIpConfigTab.getStatus();
+			//GwtWifiWirelessMode wifiMode = m_modeCombo.getValue().getMode();
+			
+			// tcp/ip disabled
+	  		if (tcpIpStatus.equals(GwtNetIfStatus.netIPv4StatusDisabled)) {
+	  			m_channelPanel.setEnabled(false);
+				for (Field<?> field : m_formPanel.getFields()) {
+					field.setEnabled(false);
+				}
+				
+			// wireless disabled - leave mode selectable
+			/*
+            } else if (GwtWifiWirelessMode.netWifiWirelessModeDisabled.equals(wifiMode)) {
+	  			m_channelPanel.setEnabled(false);
+				for (Field<?> field : m_formPanel.getFields()) {		
+					field.setEnabled(false);
+				}
+				m_modeCombo.setEnabled(true);
+			*/
+				
+	  		} else {
+	  			m_channelPanel.setEnabled(true);
+				for (Field<?> field : m_formPanel.getFields()) {
+					field.setEnabled(true);
+					field.clearInvalid();
+					field.validate();
+				}
+				
+				// Station mode
+				if(GwtWifiWirelessMode.netWifiWirelessModeStation.equals(m_modeCombo.getValue().getMode())) {
+					for (Field<?> field : m_formPanel.getFields()) {			
+						if (field != m_modeCombo
+								&& field != m_ssidField
+								&& field != m_securityCombo
+								&& field != m_pairwiseCiphersCombo
+								&& field != m_groupCiphersCombo
+								&& field != m_passwordField
+								&& field != m_bgscanModuleCombo
+								&& field != m_bgscanRssiThresholdSliderField
+								&& field != m_bgscanShortIntervalField
+								&& field != m_bgscanLongIntervalField
+								&& field != m_pingAccessPointRadioTrue
+								&& field != m_pingAccessPointRadioFalse
+								&& field != m_pingAccessPointRadioGroup) {
+							
+							field.setEnabled(false);
+						}
+					}
+					m_verifyPasswordField.setAllowBlank(true);
+
+				/*
+                // Ad-hoc mode
+				} else if(GwtWifiWirelessMode.netWifiWirelessModeAdHoc.equals(m_modeCombo.getValue().getMode())) {
+					for (Field<?> field : m_formPanel.getFields()) {			
+						if (field != m_modeCombo
+								&& field != m_ssidField
+								&& field != m_securityCombo
+								&& field != m_passwordField) {
+							
+							field.setEnabled(false);
+						}
+					}
+				*/
+
+                // Access Point mode
+				} else if(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.equals(m_modeCombo.getValue().getMode())) {
+					// Disable Access Point mode when TCP/IP is set to WAN
+					if (tcpIpStatus.equals(GwtNetIfStatus.netIPv4StatusEnabledWAN)) {
+						for (Field<?> field : m_formPanel.getFields()) {			
+							if (field != m_modeCombo) {
+								field.setEnabled(false);
+							}
+						}
+						m_verifyPasswordField.setAllowBlank(false);
+					}
+				}
+				
+				// disable password fields if security is None
+				if (m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityNONE.name()))) {
+					m_passwordField.setEnabled(false, false);
+					m_verifyPasswordField.setEnabled(false);
+					
+					m_passwordField.clearInvalid();
+					m_verifyPasswordField.clearInvalid();
+				}
+				
+				if (GwtWifiWirelessMode.netWifiWirelessModeStation.equals(m_modeCombo.getValue().getMode())) {
+					m_ssidField.setEnabled(true, true);
+					if (!m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityNONE.name()))) {
+						if ((m_passwordField.getValue() != null) && (m_passwordField.getValue().length() > 0)) {
+							m_passwordField.setEnabled(true, true);
+						} else {
+							m_passwordField.setEnabled(true, false);
+						}
+					}
+					
+					for (Field<?> field : m_formPanel.getFields()) {
+						
+						if (field.equals(m_bgscanModuleCombo)) {
+							field.setEnabled(true);
+						} else if (field.equals(m_bgscanRssiThresholdSliderField) 
+								|| field.equals(m_bgscanShortIntervalField)
+								|| field.equals(m_bgscanLongIntervalField)) {
+				
+							if ((m_bgscanModuleCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiBgscanModule.netWifiBgscanMode_SIMPLE.name())))
+									|| (m_bgscanModuleCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiBgscanModule.netWifiBgscanMode_LEARN.name())))) {
+								field.setEnabled(true);
+							} else {
+								field.setEnabled(false);
+							}
+						}
+					}
+				} else {
+					m_ssidField.setEnabled(true, false);
+					if (!m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityNONE.name()))) {
+						m_passwordField.setEnabled(true, false);
+					}
+					for (Field<?> field : m_formPanel.getFields()) {
+						if (field.equals(m_bgscanModuleCombo)
+								|| field.equals(m_bgscanRssiThresholdSliderField) 
+								|| field.equals(m_bgscanShortIntervalField)
+								|| field.equals(m_bgscanLongIntervalField)
+								|| field.equals(m_pingAccessPointRadioTrue)
+								|| field.equals(m_pingAccessPointRadioFalse)
+								|| field.equals(m_pingAccessPointRadioGroup)) {
+							field.setEnabled(false);
+						}
+					}
+				}
+				
+				if ((m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA2.name())))
+					|| (m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA.name())))
+					|| (m_securityCombo.getSimpleValue().equals(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA_WPA2.name())))) {
+					
+					for (Field<?> field : m_formPanel.getFields()) {
+						if (field.equals(m_pairwiseCiphersCombo) 
+								|| field.equals(m_groupCiphersCombo)) {
+							
+						    if (GwtWifiWirelessMode.netWifiWirelessModeStation.equals(m_modeCombo.getValue().getMode())) {
+								field.setEnabled(true);
+							} else {
+								field.setEnabled(false);
+							}
+						}
+					}
+				} else {
+					for (Field<?> field : m_formPanel.getFields()) {			
+						if (field.equals(m_pairwiseCiphersCombo) 
+								|| field.equals(m_groupCiphersCombo)) {
+
+							field.setEnabled(false);
+						}
+					}
+				}
+	  		}
+	  		
+	  		m_netInterfaceConfigTabs.adjustInterfaceTabs();
+		}
+	}
+	
+	
+	private void reset()
+	{
+		m_modeCombo.setValue(m_wirelessModeListStore.findModel(GwtWifiWirelessModeModel.MODE, GwtWifiWirelessMode.netWifiWirelessModeStation.name()));
+		m_modeCombo.setOriginalValue(m_modeCombo.getValue());
+		
+		m_ssidField.setValue("");
+		m_ssidField.setOriginalValue("");
+
+		m_radioModeCombo.setSimpleValue(MessageUtils.get(GwtWifiRadioMode.netWifiRadioModeBGN.name()));
+		m_radioModeCombo.setOriginalValue(m_radioModeCombo.getValue());
+
+		m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA2.name()));
+		m_securityCombo.setOriginalValue(m_securityCombo.getValue());
+		
+		m_pairwiseCiphersCombo.setSimpleValue(MessageUtils.get(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name()));
+		m_pairwiseCiphersCombo.setOriginalValue(m_pairwiseCiphersCombo.getValue());
+		
+		m_groupCiphersCombo.setSimpleValue(MessageUtils.get(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name()));
+		m_groupCiphersCombo.setOriginalValue(m_groupCiphersCombo.getValue());
+		
+		m_bgscanModuleCombo.setSimpleValue(MessageUtils.get(GwtWifiBgscanModule.netWifiBgscanMode_NONE.name()));
+		m_bgscanModuleCombo.setOriginalValue(m_bgscanModuleCombo.getValue());
+		
+		m_bgscanRssiThresholdSlider.setValue(0);
+		m_bgscanRssiThresholdSliderField.setValue(0);
+		m_bgscanRssiThresholdSliderField.setOriginalValue(0);
+		
+		m_bgscanShortIntervalField.setValue(0);
+		m_bgscanShortIntervalField.setOriginalValue(m_bgscanShortIntervalField.getValue());
+		
+		m_bgscanLongIntervalField.setValue(0);
+		m_bgscanLongIntervalField.setOriginalValue(m_bgscanLongIntervalField.getValue());
+		
+		m_passwordField.setValue("");
+		m_passwordField.setOriginalValue("");
+		
+		m_verifyPasswordField.setValue("");
+		m_verifyPasswordField.setOriginalValue("");
+		
+		m_pingAccessPointRadioGroup.setValue(m_pingAccessPointRadioFalse);
+		m_pingAccessPointRadioGroup.setOriginalValue(m_pingAccessPointRadioGroup.getValue());
+		
+		update();
+	}
+	
+	private void setValues(boolean setOriginal) {
+		if (m_activeWifiConfig != null) {
+		    m_modeCombo.setValue(m_wirelessModeListStore.findModel(GwtWifiWirelessModeModel.MODE, GwtWifiWirelessMode.valueOf(m_activeWifiConfig.getWirelessMode()).name()));
+		    if(setOriginal) m_modeCombo.setOriginalValue(m_modeCombo.getValue());
+		    
+			m_ssidField.setValue(m_activeWifiConfig.getWirelessSsid());
+			if(setOriginal) m_ssidField.setOriginalValue(m_ssidField.getValue());
+
+			m_radioModeCombo.setSimpleValue(MessageUtils.get(m_activeWifiConfig.getRadioMode()));
+			if(setOriginal) m_radioModeCombo.setOriginalValue(m_radioModeCombo.getValue());
+			
+			ArrayList<Integer> alChannels =  m_activeWifiConfig.getChannels();
+			if ((alChannels != null) && (alChannels.size() > 0)) {
+				// deselect all channels
+				for (int channel = 1; channel <= MAX_WIFI_CHANNEL; channel++) {
+					m_checkboxChannelSelectionModel.deselect(channel-1);
+				}
+				// select proper channels
+				for (int channel : alChannels) {
+					m_checkboxChannelSelectionModel.select(channel-1, true);
+				}
+			} else {
+				Log.warn("No channels specified, selecting all ...");
+				for (int channel = 1; channel <= MAX_WIFI_CHANNEL; channel++) {
+					m_checkboxChannelSelectionModel.select(channel-1, true);
+				}
+			}
+				
+			m_securityCombo.setSimpleValue(MessageUtils.get(m_activeWifiConfig.getSecurity()));
+			if(setOriginal) m_securityCombo.setOriginalValue(m_securityCombo.getValue());
+			
+			String sPairwiseCiphers = m_activeWifiConfig.getPairwiseCiphers();
+			if (sPairwiseCiphers != null) {
+				m_pairwiseCiphersCombo.setSimpleValue(MessageUtils.get(sPairwiseCiphers));
+				if(setOriginal) m_pairwiseCiphersCombo.setOriginalValue(m_pairwiseCiphersCombo.getValue());
+			}
+			
+			String sGroupCiphers = m_activeWifiConfig.getPairwiseCiphers();
+			if (sGroupCiphers != null) {
+				m_groupCiphersCombo.setSimpleValue(MessageUtils.get(sGroupCiphers));
+				if(setOriginal) m_groupCiphersCombo.setOriginalValue(m_groupCiphersCombo.getValue());
+			}
+			
+			String sBgscanModule = m_activeWifiConfig.getBgscanModule();
+			if (sBgscanModule != null) {
+				m_bgscanModuleCombo.setSimpleValue(MessageUtils.get(sBgscanModule));
+				if(setOriginal) m_bgscanModuleCombo.setOriginalValue(m_bgscanModuleCombo.getValue());
+			}
+			
+			m_bgscanRssiThresholdSlider.setValue(m_activeWifiConfig.getBgscanRssiThreshold());
+			m_bgscanRssiThresholdSliderField.setValue(m_activeWifiConfig.getBgscanRssiThreshold());
+			if(setOriginal) m_bgscanRssiThresholdSliderField.setOriginalValue(m_activeWifiConfig.getBgscanRssiThreshold());
+			
+			m_bgscanShortIntervalField.setValue(m_activeWifiConfig.getBgscanShortInterval());
+			if(setOriginal) m_bgscanShortIntervalField.setOriginalValue(m_bgscanShortIntervalField.getValue());
+			
+			m_bgscanLongIntervalField.setValue(m_activeWifiConfig.getBgscanLongInterval());
+			if(setOriginal) m_bgscanLongIntervalField.setOriginalValue(m_bgscanLongIntervalField.getValue());
+			
+			m_passwordField.setValue(m_activeWifiConfig.getPassword());
+			if(setOriginal) m_passwordField.setOriginalValue(m_passwordField.getValue());
+			
+			m_verifyPasswordField.setValue(m_activeWifiConfig.getPassword());
+			if(setOriginal) m_verifyPasswordField.setOriginalValue(m_verifyPasswordField.getValue());
+		
+			if (m_activeWifiConfig.pingAccessPoint()) {
+				m_pingAccessPointRadioTrue.setValue(true);
+				m_pingAccessPointRadioTrue.setOriginalValue(m_pingAccessPointRadioTrue.getValue());
+				
+				m_pingAccessPointRadioFalse.setValue(false);
+				m_pingAccessPointRadioFalse.setOriginalValue(m_pingAccessPointRadioFalse.getValue());
+				
+				m_pingAccessPointRadioGroup.setOriginalValue(m_pingAccessPointRadioTrue);
+				m_pingAccessPointRadioGroup.setValue(m_pingAccessPointRadioGroup.getValue());
+			} else {
+				m_pingAccessPointRadioTrue.setValue(false);
+				m_pingAccessPointRadioTrue.setOriginalValue(m_pingAccessPointRadioTrue.getValue());
+
+				m_pingAccessPointRadioFalse.setValue(true);
+				m_pingAccessPointRadioFalse.setOriginalValue(m_pingAccessPointRadioFalse.getValue());
+
+				m_pingAccessPointRadioGroup.setOriginalValue(m_pingAccessPointRadioFalse);
+				m_pingAccessPointRadioGroup.setValue(m_pingAccessPointRadioGroup.getValue());
+			}
+		}		
+	}
+	
+	private void setPasswordValidation() {
+		
+		m_passwordField.clearInvalid();
+		
+		// Access Point mode
+			// change password validation criteria
+			if(m_securityCombo.getSimpleValue() == MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA.name())) {
+		        m_passwordField.setRegex(PASSWORD_REGEX_WPA);
+		        m_passwordField.getMessages().setRegexText(MSGS.netWifiWirelessInvalidWPAPassword());
+			} else if(m_securityCombo.getSimpleValue() == MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA2.name())) {
+				m_passwordField.setRegex(PASSWORD_REGEX_WPA);
+				m_passwordField.getMessages().setRegexText(MSGS.netWifiWirelessInvalidWPAPassword());
+			} else if(m_securityCombo.getSimpleValue() == MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA_WPA2.name())) {
+				m_passwordField.setRegex(PASSWORD_REGEX_WPA);
+				m_passwordField.getMessages().setRegexText(MSGS.netWifiWirelessInvalidWPAPassword());
+			} else if(m_securityCombo.getSimpleValue() == MessageUtils.get(GwtWifiSecurity.netWifiSecurityWEP.name())) {
+				m_passwordField.setRegex(PASSWORD_REGEX_WEP);
+				m_passwordField.getMessages().setRegexText(MSGS.netWifiWirelessInvalidWEPPassword());
+			} else {
+				m_passwordField.setRegex(PASSWORD_REGEX_ANY);
+			}
+		
+		m_passwordField.validate();
+	}
+	
+
+	private El findCheck(Element group) {
+		return El.fly(group).selectNode(".x-grid3-group-checker").firstChild();
+	}
+
+	private void setGroupChecked(Element group, boolean checked) {
+		findCheck(group).replaceStyleName(
+				checked ? m_uncheckedStyle : m_checkedStyle,
+				checked ? m_checkedStyle : m_uncheckedStyle);
+	}
+	
+	
+	// Combo box item template
+    private native String getTemplate() /*-{
+        return  [
+	    '<tpl for=".">',
+	    '<div class="x-combo-list-item" qtitle="{name}">{name}</div>',
+	    '</tpl>'
+	    ].join("");
+    }-*/;
+    
+    private Window createWifiNetworksWindow() {
+    	
+		final Window window = new Window();
+		window.setSize(700, 400);
+		window.setPlain(true);
+		window.setModal(true);
+		window.setBlinkModal(true);
+		window.setHeading("Wireless Networks");
+
+		// Create a table to layout the content
+		VerticalPanel dialogContents = new VerticalPanel();
+		dialogContents.setSpacing(4);
+               
+        window.add(dialogContents);
+        
+        List<ColumnConfig> configs = new ArrayList<ColumnConfig>();  
+        ColumnConfig column = null;  
+        
+        column = new ColumnConfig("ssid", "SSID", 100);
+        column.setAlignment(HorizontalAlignment.LEFT);
+        configs.add(column);
+        
+        column = new ColumnConfig("macAddress", "MAC Address", 100);  
+        column.setAlignment(HorizontalAlignment.CENTER);
+        configs.add(column);  
+        
+        column = new ColumnConfig("signalStrength", "Signal (dBm)", 100);  
+        column.setAlignment(HorizontalAlignment.CENTER);
+        configs.add(column); 
+        
+        column = new ColumnConfig("channel", "Channel", 100);
+        column.setAlignment(HorizontalAlignment.CENTER);
+        configs.add(column);
+        
+        column = new ColumnConfig("frequency", "Frequency", 100);    
+        column.setAlignment(HorizontalAlignment.CENTER);
+        configs.add(column);  
+        
+        column = new ColumnConfig("security", "Security", 100); 
+        column.setAlignment(HorizontalAlignment.LEFT);
+        configs.add(column); 
+        
+        /*
+        CheckColumnConfig checkColumn = new CheckColumnConfig("selectAP", "Select", 55);
+        CellEditor checkBoxEditor = new CellEditor(new CheckBox());  
+        checkColumn.setEditor(checkBoxEditor);
+        configs.add(checkColumn); 
+        */
+        
+     // rpc data proxy  
+        RpcProxy<ListLoadResult<GwtWifiHotspotEntry>> proxy = new RpcProxy<ListLoadResult<GwtWifiHotspotEntry>>() {  
+          @Override  
+          protected void load(Object loadConfig, AsyncCallback<ListLoadResult<GwtWifiHotspotEntry>> callback) {
+        	  gwtNetworkService.findWifiHotspots(m_selectNetIfConfig.getName(), callback);
+          }
+        };
+        
+        m_wifiHotspotLoader = new BaseListLoader<ListLoadResult<GwtWifiHotspotEntry>>(proxy);
+        m_wifiHotspotLoader.setSortDir(SortDir.ASC);  
+        m_wifiHotspotLoader.setSortField("signalStrength");
+        //m_wifiHotspotLoader.setRemoteSort(true);  
+        
+        SwappableListStore<GwtWifiHotspotEntry> store = new SwappableListStore<GwtWifiHotspotEntry>(m_wifiHotspotLoader);
+        store.setKeyProvider( new ModelKeyProvider<GwtWifiHotspotEntry>() {            
+            public String getKey(GwtWifiHotspotEntry wifiHotspotEntry) {
+                return wifiHotspotEntry.getSignalStrength().toString();
+            }
+        });
+        
+   
+        m_grid = new Grid<GwtWifiHotspotEntry>(store, new ColumnModel(configs));
+        m_grid.setBorders(false);
+        m_grid.setStateful(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        m_grid.setColumnLines(true);
+        m_grid.setColumnReordering(true);
+        m_grid.setAutoExpandColumn("ssid");
+        m_grid.getView().setAutoFill(true); 
+        //m_grid.addPlugin(checkColumn);
+         
+        m_wifiHotspotLoader.addLoadListener(new DataLoadListener(m_grid));
+        
+        GridSelectionModel<GwtWifiHotspotEntry> selectionModel = new GridSelectionModel<GwtWifiHotspotEntry>();
+        selectionModel.setSelectionMode(SelectionMode.SINGLE);
+        
+        m_grid.setSelectionModel(selectionModel);
+        //m_grid.addPlugin(selectionModel);
+        
+        m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtWifiHotspotEntry>() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent<GwtWifiHotspotEntry> se) {
+	            if (se != null) {
+	            	List<GwtWifiHotspotEntry> list = se.getSelection();
+	            	if ((list != null) && (list.size() > 0)) {
+	            		GwtWifiHotspotEntry wifiHotspotEntry = list.get(0);
+	            		if (wifiHotspotEntry != null) {
+	            			m_ssidField.setValue(wifiHotspotEntry.getSSID());
+	            			String security = wifiHotspotEntry.getSecurity();
+	            			if (security.equals("None")) {
+	            				m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityNONE.name()));
+	            			} else if (security.equals("WEP")) {
+	            				m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWEP.name()));
+	            			} else if (security.equals("WPA")) {
+	            				m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA.name()));
+	            			} else if (security.equals("WPA2") || security.equals("WPA/WPA2")) {
+	            				m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityWPA2.name()));
+	            			} else {
+	            				m_securityCombo.setSimpleValue(MessageUtils.get(GwtWifiSecurity.netWifiSecurityNONE.name()));
+	            			}
+	            			
+	            			// deselect all channels
+	        				for (int channel = 1; channel <= MAX_WIFI_CHANNEL; channel++) {
+	        					m_checkboxChannelSelectionModel.deselect(channel-1);
+	        				}
+	        				// select proper channels
+	        				m_checkboxChannelSelectionModel.select(wifiHotspotEntry.getChannel()-1, true);
+	        				
+	            			window.hide();
+	            		}
+	             	}
+	            }
+            }
+        });
+        
+        ContentPanel cp = new ContentPanel();  
+        cp.setHeading("Wireless Networks in Range");  
+        cp.setFrame(true);  
+        
+        cp.setSize(680, 365);  
+        
+        FillLayout layout = new FillLayout();
+        layout.setAdjustForScroll(true);
+        cp.setLayout(layout);  
+        
+        cp.add(m_grid);  
+        dialogContents.add(cp);
+        window.add(dialogContents);
+        
+        return window;
+    }
+    
+ private GwtWifiConfig getGwtWifiConfig() {
+    	
+    	GwtWifiConfig gwtWifiConfig = new GwtWifiConfig();
+    	
+		// mode
+    	GwtWifiWirelessMode wifiMode = m_modeCombo.getValue().getMode(); 
+    	gwtWifiConfig.setWirelessMode(wifiMode.name());
+		
+        // ssid
+    	gwtWifiConfig.setWirelessSsid(m_ssidField.getValue());
+
+        // driver
+        String driver = "";
+        if(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.equals(wifiMode)) {
+        	driver = m_selectNetIfConfig.getAccessPointWifiConfig().getDriver();
+        } else if(GwtWifiWirelessMode.netWifiWirelessModeAdHoc.equals(wifiMode)) {
+        	driver = m_selectNetIfConfig.getAdhocWifiConfig().getDriver();
+        } else if(GwtWifiWirelessMode.netWifiWirelessModeStation.equals(wifiMode)) {
+        	driver = m_selectNetIfConfig.getStationWifiConfig().getDriver();
+        }
+        gwtWifiConfig.setDriver(driver);  // use previous value
+		
+		// radio mode
+		String radioValue = m_radioModeCombo.getValue().getValue();
+		for (GwtWifiRadioMode mode : GwtWifiRadioMode.values()) {
+			if (MessageUtils.get(mode.name()).equals(radioValue)) {
+				gwtWifiConfig.setRadioMode(mode.name());
+			}
+		} 
+		
+		// channels
+		List<GwtWifiChannelModel> lSelectedChannels =  m_checkboxChannelSelectionModel.getSelectedItems();
+		ArrayList<Integer> alChannels = new ArrayList<Integer>();
+		for (GwtWifiChannelModel item : lSelectedChannels) {
+			alChannels.add(new Integer(item.getChannel()));
+		}
+		
+		gwtWifiConfig.setChannels(alChannels);
+		
+		// security
+		String secValue = m_securityCombo.getValue().getValue();
+		for (GwtWifiSecurity sec : GwtWifiSecurity.values()) {
+			if (MessageUtils.get(sec.name()).equals(secValue)) {
+				gwtWifiConfig.setSecurity(sec.name());
+			}
+		}
+		
+		String pairwiseCiphersValue = m_pairwiseCiphersCombo.getValue().getValue();
+		for (GwtWifiCiphers ciphers : GwtWifiCiphers.values()) {
+			if (MessageUtils.get(ciphers.name()).equals(pairwiseCiphersValue)) {
+				gwtWifiConfig.setPairwiseCiphers(ciphers.name());
+			}
+		}
+
+		String groupCiphersValue = m_groupCiphersCombo.getValue().getValue();
+		for (GwtWifiCiphers ciphers : GwtWifiCiphers.values()) {
+			if (MessageUtils.get(ciphers.name()).equals(groupCiphersValue)) {
+				gwtWifiConfig.setGroupCiphers(ciphers.name());
+			}
+		}
+		
+		// bgscan
+		String bgscanModuleValue = m_bgscanModuleCombo.getValue().getValue();
+		for (GwtWifiBgscanModule module : GwtWifiBgscanModule.values()) {
+			if (MessageUtils.get(module.name()).equals(bgscanModuleValue)) {
+				gwtWifiConfig.setBgscanModule(module.name());
+			}
+		}
+		
+		gwtWifiConfig.setBgscanRssiThreshold(m_bgscanRssiThresholdSlider.getValue());
+		gwtWifiConfig.setBgscanShortInterval(m_bgscanShortIntervalField.getValue().intValue());
+		gwtWifiConfig.setBgscanLongInterval(m_bgscanLongIntervalField.getValue().intValue());
+		
+		// password
+		gwtWifiConfig.setPassword(m_passwordField.getValue());
+		
+		// ping access point
+		gwtWifiConfig.setPingAccessPoint(m_pingAccessPointRadioTrue.getValue().booleanValue());
+		
+		return gwtWifiConfig;
+    }
+    
+    private class DataLoadListener extends LoadListener
+    {
+        private Grid<GwtWifiHotspotEntry> m_grid;
+        private GwtWifiHotspotEntry       m_selectedEntry;
+
+        public DataLoadListener(Grid<GwtWifiHotspotEntry> grid) {
+            m_grid 			 = grid;
+            m_selectedEntry = null;
+        }
+        
+        public void loaderBeforeLoad(LoadEvent le) {
+        	m_selectedEntry = m_grid.getSelectionModel().getSelectedItem();
+        }
+        
+        public void loaderLoad(LoadEvent le) {
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        	        	
+            if (m_selectedEntry != null) {
+                ListStore<GwtWifiHotspotEntry> store = m_grid.getStore();
+                GwtWifiHotspotEntry modelEntry = store.findModel(m_selectedEntry.getSignalStrength().toString());
+                if (modelEntry != null) {
+                    m_grid.getSelectionModel().select(modelEntry, false);
+                    m_grid.getView().focusRow(store.indexOf(modelEntry));
+                }
+            }
+            m_grid.repaint();
+        }
+    }
+}
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/packages/PackagesPanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/packages/PackagesPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..8289225262ee78ee0493d93428eae25f561f6121
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/packages/PackagesPanel.java
@@ -0,0 +1,348 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.packages;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.kura.web.client.configuration.ServiceTree;
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.widget.PackageInstallDialog;
+import org.eclipse.kura.web.shared.model.GwtBundleInfo;
+import org.eclipse.kura.web.shared.model.GwtDeploymentPackage;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtPackageService;
+import org.eclipse.kura.web.shared.service.GwtPackageServiceAsync;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.HiddenField;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid;
+import com.extjs.gxt.ui.client.widget.treegrid.TreeGridCellRenderer;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class PackagesPanel extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtPackageServiceAsync gwtPackageService = GWT.create(GwtPackageService.class);
+	
+	private final static String SERVLET_URL = "/" + GWT.getModuleName() + "/file/deploy";
+	
+	@SuppressWarnings("unused")
+	private GwtSession           m_currentSession;
+    private ServiceTree          m_servicesTree;
+
+    private boolean    		     m_dirty;
+    private boolean              m_initialized;
+    
+    private ToolBar              m_toolBar;
+    private ContentPanel         m_packagesPanel;
+    private Button               m_refreshButton;
+    private Button               m_installButton;
+    private Button               m_uninstallButton;
+    
+    private TreeGrid<ModelData>  m_treeGrid;
+    private TreeStore<ModelData> m_treeStore = new TreeStore<ModelData>();
+    private PackageInstallDialog m_fileUpload;
+
+    
+    public PackagesPanel(GwtSession currentSession,
+					     ServiceTree serviceTree) 
+    {
+        m_currentSession = currentSession;
+    	m_servicesTree   = serviceTree;
+        m_dirty          = true;
+    	m_initialized    = false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) {
+        
+        super.onRender(parent, index);        
+        setLayout(new FitLayout());
+        setBorders(false);
+        setId("packages-panel-wrapper");
+        
+        // init components
+        initToolBar();
+        initPackages();
+
+		ContentPanel devicesConfigurationPanel = new ContentPanel();
+		devicesConfigurationPanel.setBorders(false);
+		devicesConfigurationPanel.setBodyBorder(false);
+		devicesConfigurationPanel.setHeaderVisible(false);
+		devicesConfigurationPanel.setLayout( new FitLayout());
+		//devicesConfigurationPanel.setLayout( new FlowLayout());
+		devicesConfigurationPanel.setScrollMode(Scroll.AUTO);
+        devicesConfigurationPanel.setTopComponent(m_toolBar);
+		devicesConfigurationPanel.add(m_packagesPanel);
+
+        add(devicesConfigurationPanel);
+        m_initialized = true;
+        
+        refresh();
+    }
+    
+    
+    private void initToolBar() {  
+    	
+        m_toolBar = new ToolBar();
+        m_toolBar.setBorders(true);
+        m_toolBar.setId("packages-toolbar");
+ 
+        m_refreshButton = new Button(MSGS.refreshButton(), 
+        		AbstractImagePrototype.create(Resources.INSTANCE.refresh()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	m_dirty = true;
+		    	// refresh the list
+		    	// and reselect the item
+		    	m_servicesTree.refreshServicePanel();
+                refresh();
+            }
+        });
+
+        m_installButton = new Button(MSGS.packageAddButton(),
+        		AbstractImagePrototype.create(Resources.INSTANCE.packageAdd()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+                upload();
+            }
+        });
+
+        m_uninstallButton = new Button(MSGS.packageDeleteButton(),
+        		AbstractImagePrototype.create(Resources.INSTANCE.packageDelete()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+        		ModelData selectedItem = m_treeGrid.getSelectionModel().getSelectedItem();
+
+        		if (selectedItem != null) {
+        			if (selectedItem instanceof GwtDeploymentPackage) {
+        				GwtDeploymentPackage pkg = (GwtDeploymentPackage) selectedItem;
+
+        				MessageBox.confirm(MSGS.confirm(), 
+        						           MSGS.deviceUninstallPackage(pkg.getName()),
+        						           new Listener<MessageBoxEvent>() {  
+        					public void handleEvent(MessageBoxEvent ce) {
+        						// if confirmed, uninstall
+        						Dialog  dialog = ce.getDialog();
+        						if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+        							uninstall();
+        						}
+        					}
+        				});
+        			}
+        		}
+            }
+        });
+
+        m_toolBar.add(m_refreshButton);
+        m_toolBar.add(new SeparatorToolItem());
+        m_toolBar.add(m_installButton);
+        m_toolBar.add(new SeparatorToolItem());
+        m_toolBar.add(m_uninstallButton);
+        
+        m_toolBar.disable();
+    }
+    
+    private void upload() {
+    	m_toolBar.disable();
+    	    	
+    	List<HiddenField<?>> hiddenFields = new ArrayList<HiddenField<?>>();
+    	
+    	//m_fileUpload = new FileUploadDialog(SERVLET_URL, hiddenFields);
+    	m_fileUpload = new PackageInstallDialog(SERVLET_URL, hiddenFields);
+    	
+    	m_fileUpload.addListener(Events.Hide, new Listener<BaseEvent>() {
+
+    		public void handleEvent(BaseEvent be) {
+				m_toolBar.enable();
+				m_uninstallButton.disable();
+				m_dirty = true;
+
+		    	// refresh the list
+		    	// and reselect the item
+		    	m_servicesTree.refreshServicePanel();
+				refreshWithDelay();
+    		}
+    	});
+
+    	m_fileUpload.setHeading(MSGS.deviceInstallNewPackage());
+    	m_fileUpload.show();
+    }
+    
+    private void uninstall() {
+    	m_toolBar.disable();
+    	
+    	ModelData selectedItem = m_treeGrid.getSelectionModel().getSelectedItem();
+    	
+    	if (selectedItem != null) {
+			if (selectedItem instanceof GwtDeploymentPackage) {
+				GwtDeploymentPackage pkg = (GwtDeploymentPackage) selectedItem;
+								
+				gwtPackageService.uninstallDeploymentPackage(pkg.getName(), new AsyncCallback<Void>() {					
+					public void onSuccess(Void arg0) {
+						m_toolBar.enable();
+						m_uninstallButton.disable();
+						m_dirty = true;
+
+        		    	// refresh the list
+        		    	// and reselect the item
+        		    	m_servicesTree.refreshServicePanel();
+						refreshWithDelay();
+					}
+					
+					public void onFailure(Throwable caught) {
+						m_toolBar.enable();
+						m_uninstallButton.disable();
+						m_dirty = true;
+						FailureHandler.handle(caught);
+
+        		    	// refresh the list
+        		    	// and reselect the item
+        		    	m_servicesTree.refreshServicePanel();
+						refreshWithDelay();
+					}
+				});	
+			}
+    	}
+    }
+    
+    private void initPackages() {      
+        ColumnConfig name = new ColumnConfig("name", "Name", 100);
+        name.setRenderer(new TreeGridCellRenderer<ModelData>());
+        ColumnConfig version = new ColumnConfig("version", "Version", 150);
+        version.setSortable(false);
+        ColumnModel cm = new ColumnModel(Arrays.asList(name, version));
+      
+        m_packagesPanel = new ContentPanel();
+        m_packagesPanel.setBodyBorder(false);
+        m_packagesPanel.setButtonAlign(HorizontalAlignment.CENTER);  
+        m_packagesPanel.setLayout(new FitLayout());
+        m_packagesPanel.setFrame(false);
+        m_packagesPanel.setHeaderVisible(false);
+        m_packagesPanel.setId("packages-content-wrapper");
+        
+        m_treeGrid = new TreeGrid<ModelData>(m_treeStore, cm);
+        m_treeGrid.setBorders(true);
+        m_treeGrid.getStyle().setLeafIcon(AbstractImagePrototype.create(Resources.INSTANCE.plugin()));  
+        m_treeGrid.setAutoExpandColumn("name");
+        m_treeGrid.setTrackMouseOver(false);  
+        m_treeGrid.getAriaSupport().setLabelledBy(m_packagesPanel.getHeader().getId() + "-label");
+        m_treeGrid.getView().setAutoFill(true);
+        m_treeGrid.getView().setEmptyText(MSGS.deviceNoDeviceSelected());
+        
+        m_treeGrid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<ModelData>() {
+			
+			@Override
+			public void selectionChanged(SelectionChangedEvent<ModelData> se) {
+				ModelData selectedItem = se.getSelectedItem();
+				
+				// Check if it's a package or a bundle
+				if (selectedItem instanceof GwtDeploymentPackage) {
+					m_uninstallButton.enable();
+				} else {
+					m_uninstallButton.disable();
+				}
+			}
+		});
+        
+        m_packagesPanel.add(m_treeGrid);
+    }
+
+    
+    // --------------------------------------------------------------------------------------
+    //
+    //    Device Configuration Management
+    //
+    // --------------------------------------------------------------------------------------
+
+    public void refreshWithDelay() {
+    	refresh(2500);
+    }
+    
+    public void refresh() {
+    	refresh(100);
+    }
+    
+    public void refresh(int delayMillis) {
+
+    	if (m_dirty && m_initialized) {
+
+    		m_dirty = false;
+    		m_toolBar.enable();
+    		m_uninstallButton.disable();
+    		m_treeGrid.getView().setEmptyText(MSGS.devicePackagesNone());
+    		m_treeStore.removeAll();
+        	m_treeGrid.mask(MSGS.loading());
+        	
+        	Timer timer = new Timer() {
+        	    public void run() {
+        	       
+            		gwtPackageService.findDeviceDeploymentPackages(new AsyncCallback<List<GwtDeploymentPackage>>() {					
+            			public void onSuccess(List<GwtDeploymentPackage> packages) {
+            				if (packages != null) {
+            					for (GwtDeploymentPackage pkg : packages) {
+            						m_treeStore.add(pkg, false);
+
+            						if (pkg.getBundleInfos() != null) {
+            							for (GwtBundleInfo bundle : pkg.getBundleInfos()) {
+            								m_treeStore.add(pkg, bundle, false);
+            							}
+            						}
+            					}
+            				}
+            		    	m_treeGrid.unmask();
+            			}
+
+            			public void onFailure(Throwable caught) {
+            				FailureHandler.handle(caught);
+            				m_treeGrid.unmask();
+            			}
+            		});
+        	    } 
+        	};
+        	timer.schedule(delayMillis);
+    	}
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/Resources.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/Resources.java
new file mode 100644
index 0000000000000000000000000000000000000000..70b8af5a0e4e53f41915131b21011c6f93cda75e
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/Resources.java
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.resources;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.resources.client.ClientBundleWithLookup;
+import com.google.gwt.resources.client.ImageResource;
+
+public interface Resources extends ClientBundleWithLookup {
+
+	Resources INSTANCE = GWT.create(Resources.class);
+	@Source("icons/32x32/emblems/emblem-important.png")
+	ImageResource information32();
+
+	@Source("icons/16x16/emblems/emblem-important.png")
+	ImageResource information();
+	
+	@Source("icons/32x32/devices/drive-harddisk.png")
+	ImageResource router32();
+
+	@Source("icons/16x16/devices/drive-harddisk.png")
+	ImageResource router();
+
+	@Source("icons/32x32/places/network-workgroup.png")
+	ImageResource network32();
+
+	@Source("icons/16x16/places/network-workgroup.png")
+	ImageResource network();
+
+	@Source("icons/32x32/emblems/emblem-readonly.png")
+	ImageResource firewall32();
+
+	@Source("icons/16x16/emblems/emblem-readonly.png")
+	ImageResource firewall();
+
+	@Source("icons/32x32/mimetypes/package-x-generic.png")
+	ImageResource packages32();
+
+	@Source("icons/16x16/mimetypes/package-x-generic.png")
+	ImageResource packages();
+
+	@Source("icons/32x32/categories/preferences-system.png")
+	ImageResource settings32();
+
+	@Source("icons/16x16/categories/preferences-system.png")
+	ImageResource settings();
+	
+	@Source("icons/32x32/status/dialog-warning.png")
+	ImageResource alert32();
+
+	@Source("icons/32x32/status/weather-overcast.png")
+	ImageResource cloud32();
+	
+	@Source("icons/32x32/actions/appointment-new.png")
+	ImageResource clock32();
+
+	@Source("icons/32x32/apps/internet-web-browser.png")
+	ImageResource gps32();
+
+	@Source("icons/32x32/apps/utilities-system-monitor.png")
+	ImageResource dog32();
+
+	@Source("icons/32x32/mimetypes/package-x-generic.png")
+	ImageResource plugin32();
+
+    @Source("icons/16x16/actions/view-refresh.png")
+    ImageResource refresh();
+
+    @Source("icons/16x16/actions/list-add.png")
+    ImageResource accept();
+
+    @Source("icons/16x16/actions/process-stop.png")
+    ImageResource cancel();
+
+    @Source("icons/16x16/actions/go-up.png")
+    ImageResource moveUp();
+
+    @Source("icons/16x16/actions/go-down.png")
+    ImageResource moveDown();
+
+    @Source("icons/16x16/actions/document-new.png")
+    ImageResource add();
+
+    @Source("icons/16x16/apps/accessories-text-editor.png")
+    ImageResource edit();
+
+    @Source("icons/16x16/actions/edit-delete.png")
+    ImageResource delete();
+    
+    @Source("icons/16x16/actions/list-add.png")
+    ImageResource packageAdd();
+    
+    @Source("icons/16x16/actions/list-remove.png")
+    ImageResource packageDelete();
+    
+    @Source("icons/16x16/mimetypes/package-x-generic.png")
+    ImageResource plugin();
+
+    @Source("icons/16x16/actions/edit-find-replace.png")
+    ImageResource snapshots();
+
+    @Source("icons/16x16/actions/edit-redo.png")
+    ImageResource snapshotUpload();
+
+    @Source("icons/16x16/actions/edit-undo.png")
+    ImageResource snapshotRollback();
+
+    @Source("icons/16x16/actions/document-save.png")
+    ImageResource snapshotDownload();
+
+    @Source("icons/32x32/places/network-server.png")
+    ImageResource databaseConnect32();
+    
+    @Source("icons/16x16/actions/system-search.png")
+    ImageResource magnifier16();
+    
+    @Source("icons/32x32/actions/system-search.png")
+    ImageResource magnifier32();
+    
+    @Source("icons/16x16/status/network-transmit.png")
+    ImageResource connect16();
+     
+    @Source("icons/16x16/status/dialog-information.png")
+    ImageResource hourglass16();
+
+    @Source("icons/others/mqtt32.png")
+    ImageResource mqtt32();
+
+    @Source("icons/16x16/status/network-wireless-encrypted.png")
+    ImageResource vpn();
+
+    @Source("icons/32x32/status/network-wireless-encrypted.png")
+    ImageResource vpn32();
+
+    @Source("icons/32x32/mimetypes/application-certificate.png")
+    ImageResource lock32();
+
+    @Source("icons/16x16/categories/applications-development.png")
+    ImageResource diagnostics();
+    
+    @Source("icons/32x32/categories/applications-development.png")
+    ImageResource diagnostics32();
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..df51ba89e984b83787299c56021f8e784c669a13
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/Makefile.am
@@ -0,0 +1,3 @@
+
+SUBDIRS = actions animations apps categories devices emblems emotes mimetypes places status
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..fb2a5c520a3e3e069f5c7b2e77f0272394ce7bf7
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/Makefile.in
@@ -0,0 +1,477 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = actions animations apps categories devices emblems emotes mimetypes places status
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
+	tags-recursive uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..4fb6083ff9d40be0b0ab3864c4b0243166baa5ef
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/Makefile.am
@@ -0,0 +1,82 @@
+
+size = 16x16
+context = actions
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	address-book-new.png		\
+	appointment-new.png		\
+	bookmark-new.png		\
+	contact-new.png			\
+	document-new.png		\
+	document-open.png		\
+	document-print.png		\
+	document-print-preview.png	\
+	document-properties.png		\
+	document-save.png		\
+	document-save-as.png		\
+	edit-clear.png			\
+	edit-copy.png			\
+	edit-cut.png			\
+	edit-delete.png	\
+	edit-find.png			\
+	edit-find-replace.png			\
+	edit-paste.png			\
+	edit-redo.png			\
+	edit-select-all.png	\
+	edit-undo.png			\
+	folder-new.png			\
+	format-indent-less.png		\
+	format-indent-more.png		\
+	format-justify-center.png	\
+	format-justify-fill.png		\
+	format-justify-left.png		\
+	format-justify-right.png	\
+	format-text-bold.png		\
+	format-text-italic.png		\
+	format-text-strikethrough.png	\
+	format-text-underline.png	\
+	go-bottom.png			\
+	go-down.png			\
+	go-first.png			\
+	go-home.png			\
+	go-jump.png			\
+	go-last.png			\
+	go-next.png			\
+	go-previous.png			\
+	go-top.png			\
+	go-up.png			\
+	list-add.png	\
+	list-remove.png	\
+	mail-forward.png	\
+	mail-message-new.png		\
+	mail-mark-junk.png	\
+	mail-mark-not-junk.png	\
+	mail-reply-all.png	\
+	mail-reply-sender.png	\
+	mail-send-receive.png	\
+	media-eject.png	\
+	media-playback-pause.png	\
+	media-playback-start.png	\
+	media-playback-stop.png		\
+	media-record.png		\
+	media-seek-backward.png		\
+	media-seek-forward.png		\
+	media-skip-backward.png		\
+	media-skip-forward.png		\
+	process-stop.png		\
+	system-lock-screen.png		\
+	system-log-out.png		\
+	system-search.png		\
+	system-shutdown.png		\
+	tab-new.png			\
+	view-fullscreen.png		\
+	view-refresh.png 		\
+	window-new.png	
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..405cadf0a892da332c0b3009d7ce42de80eebb26
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/Makefile.in
@@ -0,0 +1,429 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/actions
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = actions
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	address-book-new.png		\
+	appointment-new.png		\
+	bookmark-new.png		\
+	contact-new.png			\
+	document-new.png		\
+	document-open.png		\
+	document-print.png		\
+	document-print-preview.png	\
+	document-properties.png		\
+	document-save.png		\
+	document-save-as.png		\
+	edit-clear.png			\
+	edit-copy.png			\
+	edit-cut.png			\
+	edit-delete.png	\
+	edit-find.png			\
+	edit-find-replace.png			\
+	edit-paste.png			\
+	edit-redo.png			\
+	edit-select-all.png	\
+	edit-undo.png			\
+	folder-new.png			\
+	format-indent-less.png		\
+	format-indent-more.png		\
+	format-justify-center.png	\
+	format-justify-fill.png		\
+	format-justify-left.png		\
+	format-justify-right.png	\
+	format-text-bold.png		\
+	format-text-italic.png		\
+	format-text-strikethrough.png	\
+	format-text-underline.png	\
+	go-bottom.png			\
+	go-down.png			\
+	go-first.png			\
+	go-home.png			\
+	go-jump.png			\
+	go-last.png			\
+	go-next.png			\
+	go-previous.png			\
+	go-top.png			\
+	go-up.png			\
+	list-add.png	\
+	list-remove.png	\
+	mail-forward.png	\
+	mail-message-new.png		\
+	mail-mark-junk.png	\
+	mail-mark-not-junk.png	\
+	mail-reply-all.png	\
+	mail-reply-sender.png	\
+	mail-send-receive.png	\
+	media-eject.png	\
+	media-playback-pause.png	\
+	media-playback-start.png	\
+	media-playback-stop.png		\
+	media-record.png		\
+	media-seek-backward.png		\
+	media-seek-forward.png		\
+	media-skip-backward.png		\
+	media-skip-forward.png		\
+	process-stop.png		\
+	system-lock-screen.png		\
+	system-log-out.png		\
+	system-search.png		\
+	system-shutdown.png		\
+	tab-new.png			\
+	view-fullscreen.png		\
+	view-refresh.png 		\
+	window-new.png	
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/actions/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/actions/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/address-book-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/address-book-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..2098cfdf361b358ac382bea61a1d3cf8a66bdb65
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/address-book-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/appointment-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/appointment-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..18b7c6781edadc1d075728dd41546f7010ee7037
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/appointment-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/bookmark-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/bookmark-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..6cf6443a296cd908ac3e6dba8861b3955a919e20
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/bookmark-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/contact-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/contact-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..46573fff69011e6e19afcc5e8161da333af7b298
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/contact-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c3efdd6fa334616f87698708e73b2a5111c3278
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-open.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-open.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab940462fd45f9bf1cc6068fe7947ebffdf2aba0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-open.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-print-preview.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-print-preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab92a309ced4cee5fa760fe2f7c56c734be171cf
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-print-preview.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-print.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-print.png
new file mode 100644
index 0000000000000000000000000000000000000000..35c37bd73e16399b34048ea7bf8bda1659e218d3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-print.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-properties.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-properties.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab0e8ea377db9a6bb702f0a374b75841bcab0b62
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-properties.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-save-as.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-save-as.png
new file mode 100644
index 0000000000000000000000000000000000000000..9bed1436efffee1a483904588473674318598b1f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-save-as.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-save.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-save.png
new file mode 100644
index 0000000000000000000000000000000000000000..22ff49571020a2b520d34f622673bea031cbbf2d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/document-save.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-clear.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-clear.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6c8e8b9f341cbf3a1795631ccaafd14b0e0c911
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-clear.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-copy.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..8dd48c494924874a088590a749193994d075c22f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-copy.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-cut.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-cut.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc9eb9a7ad3e9500991938d0da531c06f90fea85
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-cut.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-delete.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea03150a1c15ec650240042fb695e7be84bc3e28
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-delete.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-find-replace.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-find-replace.png
new file mode 100644
index 0000000000000000000000000000000000000000..6edbef6145d36c42557ab8ddf6c4d3fe635d04ad
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-find-replace.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-find.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-find.png
new file mode 100644
index 0000000000000000000000000000000000000000..d072d3cbe2dadb1494f77e950952123813613677
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-find.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-paste.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-paste.png
new file mode 100644
index 0000000000000000000000000000000000000000..24588a3a4d2356be517b0e066a489284f0326842
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-paste.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-redo.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-redo.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3b0df03964aed629787aa2e00d5c1deb0ce3628
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-redo.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-select-all.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-select-all.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4b0b19e0911c64b51a27f62439117b771c89a2d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-select-all.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-undo.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-undo.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b0fef9a8319452009247864c41e033694859278
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/edit-undo.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/folder-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/folder-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..628f4d50ffc3a350c8cdcbb089b25bcc7139001d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/folder-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-indent-less.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-indent-less.png
new file mode 100644
index 0000000000000000000000000000000000000000..1787a7ff480ef4c79c433a779bddfb8c1b7fe6f5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-indent-less.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-indent-more.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-indent-more.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bad6bbacb8d7eb919713468900e18e862eb7e9a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-indent-more.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-center.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-center.png
new file mode 100644
index 0000000000000000000000000000000000000000..207dc4cd84d9ef1ca0e38bee0c5165735bd6209e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-center.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-fill.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-fill.png
new file mode 100644
index 0000000000000000000000000000000000000000..663cbadddefa3c7f74f35faa702b752eb251f599
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-fill.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-left.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9b40a76f7e446ac44a2558deb850904db0072a0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-left.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-right.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3013073cf9398c1c234a3f65014fbde1840840d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-justify-right.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-bold.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-bold.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9cb630343784bbf9c994b3a3a53f8e7c621bbb1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-bold.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-italic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-italic.png
new file mode 100644
index 0000000000000000000000000000000000000000..977ea821763ea983ac5b9ce3a71a57eecdbc63cf
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-italic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-strikethrough.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-strikethrough.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccee76e29e58347b30a48d7b4c3a03efc36ebde6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-strikethrough.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-underline.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-underline.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c487210023af031a2867c5418ac8f66a74dd964
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/format-text-underline.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-bottom.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c5a80385cca2f80f829819f25e943bee4fbb759
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-bottom.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-down.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..3dd7fccdf06321880f69d65631a363e4b813ba04
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-down.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-first.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-first.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c15c09e95c3430b5bd1bf24e7a01e8203a2e9a8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-first.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-home.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-home.png
new file mode 100644
index 0000000000000000000000000000000000000000..a46fb2220648f4640d48fc34273682db5fc53415
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-home.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-jump.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-jump.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d218c388b35c8720f623c9a0ad89e4d26beeea3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-jump.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-last.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-last.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e904efd06236206721c6a662ec8ecfe74e971c5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-last.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-next.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ef8de76e0f5bf01c09da24a07c61cfe558d7a4b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-next.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-previous.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..659cd90d7f80488a8a6a2c12f6f9e5ad98720461
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-previous.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-top.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..70f2c996cd72a79328be5bd0ef9b39cc86be7086
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-top.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-up.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-up.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa9a7d71b5615dde4c5f702f95df533adadd56e0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/go-up.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/list-add.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/list-add.png
new file mode 100644
index 0000000000000000000000000000000000000000..1aa7f095c6c282262390748ab2e596a3fc15c228
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/list-add.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/list-remove.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/list-remove.png
new file mode 100644
index 0000000000000000000000000000000000000000..00b654e8ca567c380fa477d4b32f808c3b5500d3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/list-remove.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-forward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..de0199b46a17ff815b511696afab8acd13ac921c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-forward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-mark-junk.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-mark-junk.png
new file mode 100644
index 0000000000000000000000000000000000000000..f12d452538b708bce48ced9ca05fabf0de9c5c4d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-mark-junk.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-mark-not-junk.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-mark-not-junk.png
new file mode 100644
index 0000000000000000000000000000000000000000..87c425f92b350d7cabaea3c81c97715ae4a3cda4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-mark-not-junk.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-message-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-message-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c68cb8d35d52dd168e8e236fcec3a3f8942c2b1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-message-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-reply-all.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-reply-all.png
new file mode 100644
index 0000000000000000000000000000000000000000..2017b0af0be0209dd2670890fde48808e1b33b93
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-reply-all.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-reply-sender.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-reply-sender.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6197415940f9bbf8391817adfe110e1344cec5f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-reply-sender.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-send-receive.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-send-receive.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eb6a9ce3f05fef318648a3e317ac3f438dd0f2e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/mail-send-receive.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-eject.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-eject.png
new file mode 100644
index 0000000000000000000000000000000000000000..2084067e94e6473ff10bed0de7d1f8e20100a6af
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-eject.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-pause.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-pause.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8b4fe2251f885e2362b7ef36b85d6c3a178f7c8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-pause.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-start.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-start.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7de0feb09ff9e98d1eeaca81e9fbf6793ef2706
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-start.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-stop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-stop.png
new file mode 100644
index 0000000000000000000000000000000000000000..ede2815e59858d0b95c02dddc1e0036a23308077
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-playback-stop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-record.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-record.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f66cdebbbfa20ba0407b3b76e7b684cd465132c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-record.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-seek-backward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-seek-backward.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffcac31132487e90bb4d74c858e0706099250e77
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-seek-backward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-seek-forward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-seek-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d7e2cd40ec9e287c6bb7b3b54ad27c5d5bdb1b0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-seek-forward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-skip-backward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-skip-backward.png
new file mode 100644
index 0000000000000000000000000000000000000000..94381f54fddd07a54b483ff931818cec51d969e7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-skip-backward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-skip-forward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-skip-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..758ec6f1b14f2dbcc92cdb13de57c59ce92175e6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/media-skip-forward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/process-stop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/process-stop.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab6808fba55428710250c72b2569ca5288cd6df2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/process-stop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-lock-screen.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-lock-screen.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7ea0cd229069eb85ba21d62faa16d7c70e97fae
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-lock-screen.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-log-out.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..0010931e2c2c35eda774f972dad5f305ff7b6766
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-log-out.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-search.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd7f0b07a558cb6d59af96bebb672bf1abe96c88
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-search.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-shutdown.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-shutdown.png
new file mode 100644
index 0000000000000000000000000000000000000000..afe62deec0e8feed4e6be87caa51d7ddd25e6bf8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/system-shutdown.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/tab-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/tab-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e590f6fe771fb37aa18faabdbe37361cc573cbf
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/tab-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/view-fullscreen.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/view-fullscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffdabd4e97cf7b4d3286ea169c5a71b2f889b052
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/view-fullscreen.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/view-refresh.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/view-refresh.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fd71d6e5929ba0c40db1960e36e9acba9d7e525
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/view-refresh.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/window-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/window-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e12ef954c7c215014cdf1ad81fab712f02d3d99
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/actions/window-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..a376a4a5467a66257403e32b5cbf17cc5e4efeb0
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/Makefile.am
@@ -0,0 +1,14 @@
+
+size = 16x16
+context = animations
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =						\
+	process-working.png
+
+EXTRA_DIST =						\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..d9263886fc7fdf02e72cc96adcf902f8e08b6591
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/Makefile.in
@@ -0,0 +1,361 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/animations
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = animations
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	process-working.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/animations/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/animations/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/process-working.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/process-working.png
new file mode 100644
index 0000000000000000000000000000000000000000..984bde41de2595a27408cf9f79590ab811a863d3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/animations/process-working.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..4116e37a45ab586318d529aec7b5f3b65edc4a18
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/Makefile.am
@@ -0,0 +1,41 @@
+
+size = 16x16
+context = apps
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =						\
+	accessories-calculator.png			\
+	accessories-character-map.png			\
+	accessories-text-editor.png			\
+	help-browser.png				\
+	internet-group-chat.png				\
+	internet-mail.png				\
+	internet-news-reader.png			\
+	internet-web-browser.png			\
+	office-calendar.png				\
+	preferences-desktop-accessibility.png		\
+	preferences-desktop-assistive-technology.png	\
+	preferences-desktop-font.png			\
+	preferences-desktop-keyboard-shortcuts.png	\
+	preferences-desktop-locale.png	\
+	preferences-desktop-multimedia.png	\
+	preferences-desktop-remote-desktop.png		\
+	preferences-desktop-screensaver.png		\
+	preferences-desktop-theme.png			\
+	preferences-desktop-wallpaper.png		\
+	preferences-system-network-proxy.png		\
+	preferences-system-session.png			\
+	preferences-system-windows.png			\
+	system-file-manager.png				\
+	system-installer.png				\
+	system-software-update.png			\
+	system-users.png				\
+	utilities-system-monitor.png 			\
+	utilities-terminal.png
+
+EXTRA_DIST =						\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..de64ad21fbb60a9a2500f0705ff8b3c26931728e
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/Makefile.in
@@ -0,0 +1,388 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/apps
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = apps
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	accessories-calculator.png			\
+	accessories-character-map.png			\
+	accessories-text-editor.png			\
+	help-browser.png				\
+	internet-group-chat.png				\
+	internet-mail.png				\
+	internet-news-reader.png			\
+	internet-web-browser.png			\
+	office-calendar.png				\
+	preferences-desktop-accessibility.png		\
+	preferences-desktop-assistive-technology.png	\
+	preferences-desktop-font.png			\
+	preferences-desktop-keyboard-shortcuts.png	\
+	preferences-desktop-locale.png	\
+	preferences-desktop-multimedia.png	\
+	preferences-desktop-remote-desktop.png		\
+	preferences-desktop-screensaver.png		\
+	preferences-desktop-theme.png			\
+	preferences-desktop-wallpaper.png		\
+	preferences-system-network-proxy.png		\
+	preferences-system-session.png			\
+	preferences-system-windows.png			\
+	system-file-manager.png				\
+	system-installer.png				\
+	system-software-update.png			\
+	system-users.png				\
+	utilities-system-monitor.png 			\
+	utilities-terminal.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/apps/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/apps/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-calculator.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-calculator.png
new file mode 100644
index 0000000000000000000000000000000000000000..9248971a914ebd40b59fc3e5b0aa98cf24178447
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-calculator.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-character-map.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-character-map.png
new file mode 100644
index 0000000000000000000000000000000000000000..5dd11246f2d3488f86958e1f232c1024b85bcbe4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-character-map.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-text-editor.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-text-editor.png
new file mode 100644
index 0000000000000000000000000000000000000000..188e1c12bd2de0029c75eefc6c7c4753b86b7d9b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/accessories-text-editor.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/help-browser.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/help-browser.png
new file mode 100644
index 0000000000000000000000000000000000000000..f25fc3fbf106af60de59581bf2e6fba58d489bf8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/help-browser.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-group-chat.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-group-chat.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6e83254b638a2b939e71f07b182dae793009080
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-group-chat.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-mail.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-mail.png
new file mode 100644
index 0000000000000000000000000000000000000000..859251fe0fcdbdf20de5040a802825ce977c1a24
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-mail.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-news-reader.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-news-reader.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9850ee2cd5772d77d85b1e0cafb778713b4aa26
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-news-reader.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-web-browser.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-web-browser.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac5957ad62d73408cd754a27453b4ce601a2b042
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/internet-web-browser.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/office-calendar.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/office-calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..106a592e671bb99e8c2288231db2a23009b638be
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/office-calendar.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-accessibility.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-accessibility.png
new file mode 100644
index 0000000000000000000000000000000000000000..b365c274db8ac6a0cac1fe8be3e717f8c2629754
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-accessibility.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-assistive-technology.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-assistive-technology.png
new file mode 100644
index 0000000000000000000000000000000000000000..513d817ddca3866554485bdcb797d094ebfd9da6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-assistive-technology.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-font.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-font.png
new file mode 100644
index 0000000000000000000000000000000000000000..18a014944a80d6f9a4454cbc102695008756c6d4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-font.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-keyboard-shortcuts.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-keyboard-shortcuts.png
new file mode 100644
index 0000000000000000000000000000000000000000..291dc1ac14cf1122cd3f196ba6a1e1de1157dd52
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-keyboard-shortcuts.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-locale.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-locale.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ef73a60b64903a3df054647d3e8b218f6565eff
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-locale.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-multimedia.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-multimedia.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e5ba43c9b1dfbef0931dd86f87c4bb4680a1a5c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-multimedia.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-remote-desktop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-remote-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..b790f63422a6a51a43539c7db8f14207204fd4a1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-remote-desktop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-screensaver.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-screensaver.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc297db176978eee43cff26b59a6b3f448f6d3e0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-screensaver.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-theme.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-theme.png
new file mode 100644
index 0000000000000000000000000000000000000000..fbea772caec3b4f9120bc7ece1a7057f32bc2ebe
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-theme.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-wallpaper.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-wallpaper.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7cc834c5eecc8c20f9a25d73ceb030c2b4a8b65
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-desktop-wallpaper.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-network-proxy.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-network-proxy.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdeb79d86a2df9480b0cb5b78ec47bf983afaf92
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-network-proxy.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-session.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-session.png
new file mode 100644
index 0000000000000000000000000000000000000000..35f8b5711a606eb08efd62b33bca3f95e672ea2e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-session.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-windows.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-windows.png
new file mode 100644
index 0000000000000000000000000000000000000000..596caf9486998d4a7c2e772de05375bd1afea9ef
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/preferences-system-windows.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-file-manager.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-file-manager.png
new file mode 100644
index 0000000000000000000000000000000000000000..60cade46c9c01c2d3e3d6dfb4c7a7038624215d8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-file-manager.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-installer.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-installer.png
new file mode 100644
index 0000000000000000000000000000000000000000..d16abcbde7cf4e793283b8811cfc2ac277176c1a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-installer.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-software-update.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-software-update.png
new file mode 100644
index 0000000000000000000000000000000000000000..58f19c68b047fb2fddff951c60bb56bf03bd7191
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-software-update.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-users.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-users.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d2d500813c206d6735ea53e47ff2c56428ea0a6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/system-users.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/utilities-system-monitor.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/utilities-system-monitor.png
new file mode 100644
index 0000000000000000000000000000000000000000..8734e777a1799c9a9d0293d692b3549f2506f418
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/utilities-system-monitor.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/utilities-terminal.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/utilities-terminal.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5b797a7dfe82a52fee3df9c7e19d49a4461ac02
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/apps/utilities-terminal.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..0a0692eecfd3f94c52f2221b78169d02c12055e6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/Makefile.am
@@ -0,0 +1,25 @@
+
+size = 16x16
+context = categories
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	applications-accessories.png	\
+	applications-development.png	\
+	applications-games.png	\
+	applications-graphics.png	\
+	applications-internet.png	\
+	applications-multimedia.png	\
+	applications-office.png	\
+	applications-other.png	\
+	applications-system.png	\
+	preferences-desktop.png	\
+	preferences-desktop-peripherals.png	\
+	preferences-system.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..b85a6267e7ef1bcbb43aaf90bec79193b2e842b8
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/Makefile.in
@@ -0,0 +1,372 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/categories
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = categories
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	applications-accessories.png	\
+	applications-development.png	\
+	applications-games.png	\
+	applications-graphics.png	\
+	applications-internet.png	\
+	applications-multimedia.png	\
+	applications-office.png	\
+	applications-other.png	\
+	applications-system.png	\
+	preferences-desktop.png	\
+	preferences-desktop-peripherals.png	\
+	preferences-system.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/categories/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/categories/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-accessories.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-accessories.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8d899cff2a5d6cfabb70db4cc39c300914069ac
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-accessories.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-development.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-development.png
new file mode 100644
index 0000000000000000000000000000000000000000..437522777b1c198d5b7880e7dace037b83f918fa
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-development.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-games.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-games.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ba874bcbb86694e6beb86a467c4a51580d5e18b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-games.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-graphics.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-graphics.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bb955f0e6dd5dc129b68edf77419cf4cecbe18e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-graphics.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-internet.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-internet.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5889683a66b6bbac124673ecfbd21dec331a046
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-internet.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-multimedia.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-multimedia.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e4ced5b60ba181f4ae26b11935c57444ffc33a7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-multimedia.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-office.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-office.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9b3bb9fb57fad4d738bde1a4a655763816e7321
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-office.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-other.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-other.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d49f9dfd9daf9765e8bec7971d631e0a8358062
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-other.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-system.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..d90ab661cbb29366ea77d3e8fb95841f1ee876c8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/applications-system.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-desktop-peripherals.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-desktop-peripherals.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a63ceeadeb658748129cc9785ffa2d7afd81d52
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-desktop-peripherals.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-desktop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..68f916c9d3793617c33986e1369c4a3be6c86508
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-desktop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-system.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..9460dfc746be14e4b2a6a94f91d002fa4a56318f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/categories/preferences-system.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..25231e6d677e2c479a55a346046e87e568c20e05
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/Makefile.am
@@ -0,0 +1,33 @@
+
+size = 16x16
+context = devices
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	audio-card.png			\
+	audio-input-microphone.png	\
+	battery.png			\
+	camera-photo.png		\
+	camera-video.png		\
+	computer.png			\
+	drive-optical.png		\
+	drive-harddisk.png		\
+	drive-removable-media.png	\
+	input-gaming.png		\
+	input-keyboard.png		\
+	input-mouse.png			\
+	media-optical.png		\
+	media-floppy.png		\
+	media-flash.png			\
+	multimedia-player.png		\
+	network-wired.png		\
+	network-wireless.png		\
+	printer.png			\
+	video-display.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..6019803a697d9792c1b9ed05be9c9cb5032bc7e8
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/Makefile.in
@@ -0,0 +1,380 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/devices
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = devices
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	audio-card.png			\
+	audio-input-microphone.png	\
+	battery.png			\
+	camera-photo.png		\
+	camera-video.png		\
+	computer.png			\
+	drive-optical.png		\
+	drive-harddisk.png		\
+	drive-removable-media.png	\
+	input-gaming.png		\
+	input-keyboard.png		\
+	input-mouse.png			\
+	media-optical.png		\
+	media-floppy.png		\
+	media-flash.png			\
+	multimedia-player.png		\
+	network-wired.png		\
+	network-wireless.png		\
+	printer.png			\
+	video-display.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/devices/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/devices/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/audio-card.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/audio-card.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaa79070016193140df01ff2c3d66c52402b7987
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/audio-card.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/audio-input-microphone.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/audio-input-microphone.png
new file mode 100644
index 0000000000000000000000000000000000000000..53a0393179be5826bebc644c40f887850fa842e1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/audio-input-microphone.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/battery.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/battery.png
new file mode 100644
index 0000000000000000000000000000000000000000..8684e2a1bba516a5e9c876e29f9173718d12ed63
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/battery.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/camera-photo.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/camera-photo.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e8e88636cae3eaa00ef7a064c0c8755162892b1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/camera-photo.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/camera-video.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/camera-video.png
new file mode 100644
index 0000000000000000000000000000000000000000..98fc2114869242c2fea67453a0dbd9b38cb758b3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/camera-video.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/computer.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/computer.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0b397bef91b4f6af85bd78a203b2373a36a3b36
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/computer.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-harddisk.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-harddisk.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c3b8587f46fa03111cef37143e4c3386923b195
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-harddisk.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-optical.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-optical.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ced6fe4f0fbb955e4ce820cc9cf732a7a8e0a32
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-optical.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-removable-media.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-removable-media.png
new file mode 100644
index 0000000000000000000000000000000000000000..915389828f73e2086652bae7902952052fd9c05c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/drive-removable-media.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-gaming.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-gaming.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d040ee84356e8c9412d290dd72537c93d012189
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-gaming.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-keyboard.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-keyboard.png
new file mode 100644
index 0000000000000000000000000000000000000000..fab414b888c3b35bd85eeca49e39993b7e1268eb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-keyboard.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-mouse.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-mouse.png
new file mode 100644
index 0000000000000000000000000000000000000000..eeda4db8643728cfe36c328768cd2c38f2f72984
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/input-mouse.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-flash.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-flash.png
new file mode 100644
index 0000000000000000000000000000000000000000..bef542a19f3847ba77314c7d14619e8364dfb68b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-flash.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-floppy.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-floppy.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1d7a1985923fbe1f4717bd66985cceddd7f36e4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-floppy.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-optical.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-optical.png
new file mode 100644
index 0000000000000000000000000000000000000000..760de9386f7ccfd2ecaa2680aaa70cd3988e16af
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/media-optical.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/multimedia-player.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/multimedia-player.png
new file mode 100644
index 0000000000000000000000000000000000000000..461e9de01f6d9a11ac8b1476d87ffb82bd2d4796
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/multimedia-player.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/network-wired.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/network-wired.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ac6b35cb0219cf0219580fc34aad1a8ee57e25d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/network-wired.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/network-wireless.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/network-wireless.png
new file mode 100644
index 0000000000000000000000000000000000000000..2dc625071aeba4ba1fa27a01f576b70d0de2d361
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/network-wireless.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/printer.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/printer.png
new file mode 100644
index 0000000000000000000000000000000000000000..12a4e39dd30977340c76ac642229a71354c0b310
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/printer.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/video-display.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/video-display.png
new file mode 100644
index 0000000000000000000000000000000000000000..226881fd2577f6a1a09dd34ab90da08dad82f463
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/devices/video-display.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..5ad874f00b4529bdb572d1944e534bb3f4e87807
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/Makefile.am
@@ -0,0 +1,20 @@
+
+size = 16x16
+context = emblems
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	emblem-favorite.png		\
+	emblem-important.png		\
+	emblem-photos.png		\
+	emblem-readonly.png		\
+	emblem-symbolic-link.png	\
+	emblem-system.png		\
+	emblem-unreadable.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..bc6d391e2731212c29fc19eeab6403bf980556ad
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/Makefile.in
@@ -0,0 +1,367 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/emblems
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = emblems
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	emblem-favorite.png		\
+	emblem-important.png		\
+	emblem-photos.png		\
+	emblem-readonly.png		\
+	emblem-symbolic-link.png	\
+	emblem-system.png		\
+	emblem-unreadable.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/emblems/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/emblems/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-favorite.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-favorite.png
new file mode 100644
index 0000000000000000000000000000000000000000..3acb57dc97fef46f12495b5405c9ad5ed3bbab48
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-favorite.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-important.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-important.png
new file mode 100644
index 0000000000000000000000000000000000000000..81e9ed29a560c6e478283f003da23194a31a443b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-important.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-photos.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-photos.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab4046363f96d56937db0b86c002c10923fd6039
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-photos.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-readonly.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-readonly.png
new file mode 100644
index 0000000000000000000000000000000000000000..04666196e552e14afa664f56bd2312c66bbb199c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-readonly.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-symbolic-link.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-symbolic-link.png
new file mode 100644
index 0000000000000000000000000000000000000000..800b9e8486da21e1da6824603bf4d4461cda7280
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-symbolic-link.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-system.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..259ed26dd000fcfb81b2c312980765a181a65486
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-system.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-unreadable.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-unreadable.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c08b05c1633412afc03186ca694b6d69dcb7775
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emblems/emblem-unreadable.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..cee11caf73592aa6700ed3f52d186b8a6bf4d9a2
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/Makefile.am
@@ -0,0 +1,26 @@
+
+size = 16x16
+context = emotes
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =			\
+	face-angel.png		\
+	face-crying.png		\
+	face-devilish.png	\
+	face-glasses.png	\
+	face-grin.png		\
+	face-kiss.png		\
+	face-monkey.png	\
+	face-plain.png		\
+	face-sad.png		\
+	face-smile.png		\
+	face-smile-big.png	\
+	face-surprise.png	\
+	face-wink.png
+
+EXTRA_DIST =			\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..be80cdb87456112d6cd75215051b27c2b29a5851
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/Makefile.in
@@ -0,0 +1,373 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/emotes
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = emotes
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	face-angel.png		\
+	face-crying.png		\
+	face-devilish.png	\
+	face-glasses.png	\
+	face-grin.png		\
+	face-kiss.png		\
+	face-monkey.png	\
+	face-plain.png		\
+	face-sad.png		\
+	face-smile.png		\
+	face-smile-big.png	\
+	face-surprise.png	\
+	face-wink.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/emotes/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/emotes/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-angel.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-angel.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2c5e940df52406a6fdb2289da426cbbf6052404
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-angel.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-crying.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-crying.png
new file mode 100644
index 0000000000000000000000000000000000000000..2620dabf0e87ed73ecf87f53759ca159b9a46e73
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-crying.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-devilish.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-devilish.png
new file mode 100644
index 0000000000000000000000000000000000000000..6edf68359e0a690fb669427b955db1627ea0f23e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-devilish.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-glasses.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-glasses.png
new file mode 100644
index 0000000000000000000000000000000000000000..00c2cd4b539c7c4f2b79060711b0f0f01ff4fd2e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-glasses.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-grin.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-grin.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d013d5012ec327e1a00cacbc252e5533e59eb8a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-grin.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-kiss.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-kiss.png
new file mode 100644
index 0000000000000000000000000000000000000000..809c1cf7724be1ca636672dcc4d1e213bc3260ec
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-kiss.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-monkey.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-monkey.png
new file mode 100644
index 0000000000000000000000000000000000000000..69db8fa5b5e06ac699018e5c702ca91c8c532018
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-monkey.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-plain.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-plain.png
new file mode 100644
index 0000000000000000000000000000000000000000..31cf984cdb1406d818e486e2a87b66ecfa4ae275
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-plain.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-sad.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-sad.png
new file mode 100644
index 0000000000000000000000000000000000000000..159c04b0c64e57abd9a7429e67454b66155caff9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-sad.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-smile-big.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-smile-big.png
new file mode 100644
index 0000000000000000000000000000000000000000..9114fde159a2fa7f9f377e271ba52860c26e8bc6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-smile-big.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-smile.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-smile.png
new file mode 100644
index 0000000000000000000000000000000000000000..de862b15db000447f2c2d12c93c947da86501a19
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-smile.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-surprise.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-surprise.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b4d423a555be4dec700187848006923fdd01a18
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-surprise.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-wink.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-wink.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2db57ec398993bf66c80b010cd1e8292eddeec9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/emotes/face-wink.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..6fdaa98df5e61f1e120d31f712eeca661f4049a5
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/Makefile.am
@@ -0,0 +1,34 @@
+
+size = 16x16
+context = mimetypes
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =					\
+	application-certificate.png		\
+	application-x-executable.png		\
+	audio-x-generic.png			\
+	font-x-generic.png	\
+	image-x-generic.png			\
+	package-x-generic.png			\
+	text-html.png				\
+	text-x-generic.png			\
+	text-x-generic-template.png			\
+	text-x-script.png			\
+	video-x-generic.png			\
+	x-office-address-book.png		\
+	x-office-calendar.png	\
+	x-office-document.png		\
+	x-office-document-template.png		\
+	x-office-drawing.png		\
+	x-office-drawing-template.png		\
+	x-office-presentation.png	\
+	x-office-presentation-template.png	\
+	x-office-spreadsheet.png		\
+	x-office-spreadsheet-template.png		
+
+EXTRA_DIST =					\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..bbbc3a7dc27f80b0608a31f4bba446ce8de1df1c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/Makefile.in
@@ -0,0 +1,381 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/mimetypes
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = mimetypes
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	application-certificate.png		\
+	application-x-executable.png		\
+	audio-x-generic.png			\
+	font-x-generic.png	\
+	image-x-generic.png			\
+	package-x-generic.png			\
+	text-html.png				\
+	text-x-generic.png			\
+	text-x-generic-template.png			\
+	text-x-script.png			\
+	video-x-generic.png			\
+	x-office-address-book.png		\
+	x-office-calendar.png	\
+	x-office-document.png		\
+	x-office-document-template.png		\
+	x-office-drawing.png		\
+	x-office-drawing-template.png		\
+	x-office-presentation.png	\
+	x-office-presentation-template.png	\
+	x-office-spreadsheet.png		\
+	x-office-spreadsheet-template.png		
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/mimetypes/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/mimetypes/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/application-certificate.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/application-certificate.png
new file mode 100644
index 0000000000000000000000000000000000000000..486913d9f51942db428b3d4ce0348e3f42c21bd4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/application-certificate.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/application-x-executable.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/application-x-executable.png
new file mode 100644
index 0000000000000000000000000000000000000000..003ded243b98decd76b698b570c7d547063c49ff
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/application-x-executable.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/audio-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/audio-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..2bd5af93884992dce73468227aa296a2b5780ee1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/audio-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/font-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/font-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdbc1a80ac4b77f1ed24ff3c6caa77a144bc9c26
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/font-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/image-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/image-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..68da5027cf1aa23d6ca16eca99fd01025c82f776
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/image-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/package-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/package-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..9015426153054c0b529b4d9ebdfa06a221d568ac
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/package-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-html.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-html.png
new file mode 100644
index 0000000000000000000000000000000000000000..53014ab153f17a68c5b107a7b0f1d153d956afbb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-html.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-generic-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-generic-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0cc462f41ad569aad7775d3fd3ca093d0b001c6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-generic-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d7f2d6017d823bf9f1209d9933faf612dffe9f8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-script.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-script.png
new file mode 100644
index 0000000000000000000000000000000000000000..c923098eacfdfac51bbc6162656a5b098335f367
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/text-x-script.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/video-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/video-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..64e7a307587829cd9a43d4ba33893a54018dc381
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/video-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-address-book.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-address-book.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3b5d9d98cb0ba5a7dfdcc80a0762896f8426b88
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-address-book.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-calendar.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6978d7d3b58ff87a72ddd993eacb7f1a3c874c2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-calendar.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-document-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-document-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1d9e7c12b05edb85ad0c623d608b222f93c330f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-document-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-document.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-document.png
new file mode 100644
index 0000000000000000000000000000000000000000..d18082e397e7e54f20721af768c4c2983258f1b4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-document.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-drawing-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-drawing-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc384dba13f771477d4ac9980b843d8dc3f67626
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-drawing-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-drawing.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-drawing.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffbb9e40714f8c5cbe3b15cfcda5ddbd1555f45c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-drawing.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-presentation-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-presentation-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..d90d034a5d5ce7e8a925739dd444ab8c5ea2be46
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-presentation-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-presentation.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-presentation.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7ea302453f905cba33eb1aa6298614d4c906e84
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-presentation.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-spreadsheet-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-spreadsheet-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8bf570cc0872aa8600137efc497dd3feb656dd9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-spreadsheet-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-spreadsheet.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-spreadsheet.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6b1268d3544aa1591a8f2239b395f69507d6452
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/mimetypes/x-office-spreadsheet.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..29cf0288981410171b08df20c01f8c48524c11d6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/Makefile.am
@@ -0,0 +1,22 @@
+
+size = 16x16
+context = places
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =					\
+	folder.png				\
+	folder-remote.png			\
+	folder-saved-search.png	\
+	network-server.png			\
+	network-workgroup.png			\
+	start-here.png	\
+	user-desktop.png			\
+	user-home.png				\
+	user-trash.png
+
+EXTRA_DIST =					\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..214b13a76fbeddcbe2a9636aaaf26a3c5f56df4a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/Makefile.in
@@ -0,0 +1,369 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/places
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = places
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	folder.png				\
+	folder-remote.png			\
+	folder-saved-search.png	\
+	network-server.png			\
+	network-workgroup.png			\
+	start-here.png	\
+	user-desktop.png			\
+	user-home.png				\
+	user-trash.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/places/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/places/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder-remote.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder-remote.png
new file mode 100644
index 0000000000000000000000000000000000000000..5234eab449c95983aee2239151f159dffbd9a1e9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder-remote.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder-saved-search.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder-saved-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca24a3676b9f18d5f6272de2f4203ff2cb4c681c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder-saved-search.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder.png
new file mode 100644
index 0000000000000000000000000000000000000000..65bd0bbdcb9005cb8929f06e25d9cb15a926366a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/folder.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/network-server.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/network-server.png
new file mode 100644
index 0000000000000000000000000000000000000000..068ffebee274d5b48b36a68670e191a7ed4cbf06
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/network-server.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/network-workgroup.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/network-workgroup.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c140d838d18bbddd135d5e7ac28ad2de3320674
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/network-workgroup.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/start-here.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/start-here.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd516a54c55f1c9ec485096cb1dced235b70c9c9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/start-here.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-desktop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c9787cc480eff555bcece6acfd9d97893670521
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-desktop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-home.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-home.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b9110df5387f0048beb870273e35a782494ecde
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-home.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-trash.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-trash.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e0953c73c60adbbc762d0553f95a586f3054aa6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/places/user-trash.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..33433bdc13da840cac4f8ff8a058a99585166443
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/Makefile.am
@@ -0,0 +1,48 @@
+
+size = 16x16
+context = status
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	audio-volume-high.png		\
+	audio-volume-low.png		\
+	audio-volume-medium.png		\
+	audio-volume-muted.png		\
+	battery-caution.png		\
+	dialog-error.png		\
+	dialog-information.png		\
+	dialog-warning.png		\
+	folder-drag-accept.png		\
+	folder-open.png			\
+	folder-visiting.png		\
+	image-loading.png		\
+	image-missing.png		\
+	mail-attachment.png 		\
+	network-error.png		\
+	network-idle.png		\
+	network-offline.png		\
+	network-receive.png		\
+	network-transmit.png		\
+	network-transmit-receive.png	\
+	network-wireless-encrypted.png	\
+	printer-error.png		\
+	software-update-available.png	\
+	software-update-urgent.png	\
+	user-trash-full.png		\
+	weather-clear.png		\
+	weather-clear-night.png		\
+	weather-few-clouds.png		\
+	weather-few-clouds-night.png	\
+	weather-overcast.png		\
+	weather-severe-alert.png	\
+	weather-showers.png		\
+	weather-showers-scattered.png	\
+	weather-snow.png		\
+	weather-storm.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..b6e81e29b626b2b466b0063abe87ab7ae072b35f
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/Makefile.in
@@ -0,0 +1,395 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 16x16/status
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 16x16
+context = status
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	audio-volume-high.png		\
+	audio-volume-low.png		\
+	audio-volume-medium.png		\
+	audio-volume-muted.png		\
+	battery-caution.png		\
+	dialog-error.png		\
+	dialog-information.png		\
+	dialog-warning.png		\
+	folder-drag-accept.png		\
+	folder-open.png			\
+	folder-visiting.png		\
+	image-loading.png		\
+	image-missing.png		\
+	mail-attachment.png 		\
+	network-error.png		\
+	network-idle.png		\
+	network-offline.png		\
+	network-receive.png		\
+	network-transmit.png		\
+	network-transmit-receive.png	\
+	network-wireless-encrypted.png	\
+	printer-error.png		\
+	software-update-available.png	\
+	software-update-urgent.png	\
+	user-trash-full.png		\
+	weather-clear.png		\
+	weather-clear-night.png		\
+	weather-few-clouds.png		\
+	weather-few-clouds-night.png	\
+	weather-overcast.png		\
+	weather-severe-alert.png	\
+	weather-showers.png		\
+	weather-showers-scattered.png	\
+	weather-snow.png		\
+	weather-storm.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  16x16/status/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  16x16/status/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-high.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-high.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec8f00b4ad0c6138d17957a9ba6d8616bb39a6a7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-high.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-low.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-low.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d7239ff684891d34e1c3ea2f2cb3aaf80197457
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-low.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-medium.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-medium.png
new file mode 100644
index 0000000000000000000000000000000000000000..36ca7b0806c8e4cb6040db879d6527db548ffea3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-medium.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-muted.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-muted.png
new file mode 100644
index 0000000000000000000000000000000000000000..af5a97b5a015497e3dd27d48404d8fce806afab3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/audio-volume-muted.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/battery-caution.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/battery-caution.png
new file mode 100644
index 0000000000000000000000000000000000000000..53a27d165c2ace13d599cad6663049d521e0b877
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/battery-caution.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-error.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-error.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bbbb4a0d3dc2f6bfb653bd25e80169e96c6c833
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-error.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-information.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-information.png
new file mode 100644
index 0000000000000000000000000000000000000000..8851b99ba1060109ab8387fd9254870480e9284c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-information.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-warning.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-warning.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9e4ff3991cb0ad2a99cc25e2d13c35e52c680c8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/dialog-warning.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-drag-accept.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-drag-accept.png
new file mode 100644
index 0000000000000000000000000000000000000000..44055dc80805a921600662d51a5692a456b5db58
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-drag-accept.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-open.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-open.png
new file mode 100644
index 0000000000000000000000000000000000000000..b67403d9fe8cc15d91acf2eaa7dba47e815dd5ae
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-open.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-visiting.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-visiting.png
new file mode 100644
index 0000000000000000000000000000000000000000..90024447a1600a0464737b16ec6d8ca1e27b102e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/folder-visiting.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/image-loading.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/image-loading.png
new file mode 100644
index 0000000000000000000000000000000000000000..174994ecf986e18d6de4b2ff6877e8ed9a4f56b9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/image-loading.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/image-missing.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/image-missing.png
new file mode 100644
index 0000000000000000000000000000000000000000..a644f242df5e719fde28a0d1b0ddba04cd40e340
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/image-missing.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/mail-attachment.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/mail-attachment.png
new file mode 100644
index 0000000000000000000000000000000000000000..529bb7f554dfa585a4a8d6b9135956b188be3f37
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/mail-attachment.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-error.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-error.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f18ed0f7b27753d31e8b32d3260ff67ca19dec7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-error.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-idle.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-idle.png
new file mode 100644
index 0000000000000000000000000000000000000000..0efee57e5980b961fefdb22df1b2bf1d29994763
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-idle.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-offline.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-offline.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f210fc3e99c84148bef3e4f10d7fc779ae27c7c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-offline.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-receive.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-receive.png
new file mode 100644
index 0000000000000000000000000000000000000000..b57c65c86a666d62dc2120e6410ddd6cfc142857
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-receive.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-transmit-receive.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-transmit-receive.png
new file mode 100644
index 0000000000000000000000000000000000000000..271d37d0f32d08f275b69a6f6ecaae69ae39a2d3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-transmit-receive.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-transmit.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-transmit.png
new file mode 100644
index 0000000000000000000000000000000000000000..08aa28b0999a4b2b5df10341acc0473192a015a7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-transmit.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-wireless-encrypted.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-wireless-encrypted.png
new file mode 100644
index 0000000000000000000000000000000000000000..c73e33c12778cd4c02076fc8553f4eaa0aebeb98
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/network-wireless-encrypted.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/printer-error.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/printer-error.png
new file mode 100644
index 0000000000000000000000000000000000000000..21d4dedff9aaeac152b367c1beb065ccbf5e80b8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/printer-error.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/software-update-available.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/software-update-available.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab8d494bb3367bae188d0c31dc7a05e86d83a87a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/software-update-available.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/software-update-urgent.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/software-update-urgent.png
new file mode 100644
index 0000000000000000000000000000000000000000..433945d700d4e22f7793a51c2a1e481155df890f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/software-update-urgent.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/user-trash-full.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/user-trash-full.png
new file mode 100644
index 0000000000000000000000000000000000000000..695d215a7ef478b4a58d7acc2f65b2e7825a930e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/user-trash-full.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-clear-night.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-clear-night.png
new file mode 100644
index 0000000000000000000000000000000000000000..4345752699fd099dadde439ba908e0cd5f70274b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-clear-night.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-clear.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-clear.png
new file mode 100644
index 0000000000000000000000000000000000000000..7dc15ea96efad0905b544473015fc80b7fe7b4f2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-clear.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-few-clouds-night.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-few-clouds-night.png
new file mode 100644
index 0000000000000000000000000000000000000000..d69efec9810eebca203e673210cfbe7c806205c3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-few-clouds-night.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-few-clouds.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-few-clouds.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e633a38f43cfa3b0416b1ff9d07db57a523a1e2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-few-clouds.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-overcast.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-overcast.png
new file mode 100644
index 0000000000000000000000000000000000000000..0045129b8759981e0bf80204eb6c319cae56f36e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-overcast.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-severe-alert.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-severe-alert.png
new file mode 100644
index 0000000000000000000000000000000000000000..98e9f6c1d04694ef26decd47a0d2cb53deabae05
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-severe-alert.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-showers-scattered.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-showers-scattered.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d10d844cda61d178f9d20998a17607c771c2261
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-showers-scattered.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-showers.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-showers.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9685d242bbb306a574adac8a08afd61f9e304c8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-showers.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-snow.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-snow.png
new file mode 100644
index 0000000000000000000000000000000000000000..a83d855981fb90633803a74257679c3a3ff24019
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-snow.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-storm.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-storm.png
new file mode 100644
index 0000000000000000000000000000000000000000..feebe1d4e2aebc95b8cd5bea560e1173a0476e2d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/16x16/status/weather-storm.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..df51ba89e984b83787299c56021f8e784c669a13
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/Makefile.am
@@ -0,0 +1,3 @@
+
+SUBDIRS = actions animations apps categories devices emblems emotes mimetypes places status
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..6cabd4fad16a707edd0c7c0124ae72ae2d3cf851
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/Makefile.in
@@ -0,0 +1,477 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = actions animations apps categories devices emblems emotes mimetypes places status
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
+	tags-recursive uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..6a0a8f954d15f4d318d2072efb499dc9d3fc2347
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/Makefile.am
@@ -0,0 +1,83 @@
+
+size = 32x32
+context = actions
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	address-book-new.png		\
+	appointment-new.png		\
+	bookmark-new.png		\
+	contact-new.png			\
+	document-new.png		\
+	document-open.png		\
+	document-print.png		\
+	document-print-preview.png	\
+	document-properties.png		\
+	document-save.png		\
+	document-save-as.png		\
+	edit-clear.png			\
+	edit-copy.png			\
+	edit-cut.png			\
+	edit-delete.png	\
+	edit-find.png			\
+	edit-find-replace.png			\
+	edit-paste.png			\
+	edit-redo.png			\
+	edit-select-all.png	\
+	edit-undo.png			\
+	folder-new.png			\
+	format-indent-less.png		\
+	format-indent-more.png		\
+	format-justify-center.png	\
+	format-justify-fill.png		\
+	format-justify-left.png		\
+	format-justify-right.png	\
+	format-text-bold.png		\
+	format-text-italic.png		\
+	format-text-strikethrough.png	\
+	format-text-underline.png	\
+	go-bottom.png			\
+	go-down.png			\
+	go-first.png			\
+	go-home.png			\
+	go-jump.png			\
+	go-last.png			\
+	go-next.png			\
+	go-previous.png			\
+	go-top.png			\
+	go-up.png			\
+	list-add.png	\
+	list-remove.png	\
+	mail-forward.png	\
+	mail-message-new.png		\
+	mail-mark-junk.png	\
+	mail-mark-not-junk.png	\
+	mail-reply-all.png	\
+	mail-reply-sender.png	\
+	mail-send-receive.png	\
+	media-eject.png	\
+	media-playback-pause.png	\
+	media-playback-start.png	\
+	media-playback-stop.png		\
+	media-record.png		\
+	media-seek-backward.png		\
+	media-seek-forward.png		\
+	media-skip-backward.png		\
+	media-skip-forward.png		\
+	process-stop.png		\
+	system-lock-screen.png		\
+	system-log-out.png		\
+	system-search.png		\
+	system-shutdown.png		\
+	tab-new.png			\
+	view-fullscreen.png		\
+	view-refresh.png 		\
+	window-new.png	
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..d7fa1c129649a78796fe2a4878049023ffbae267
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/Makefile.in
@@ -0,0 +1,429 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/actions
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = actions
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	address-book-new.png		\
+	appointment-new.png		\
+	bookmark-new.png		\
+	contact-new.png			\
+	document-new.png		\
+	document-open.png		\
+	document-print.png		\
+	document-print-preview.png	\
+	document-properties.png		\
+	document-save.png		\
+	document-save-as.png		\
+	edit-clear.png			\
+	edit-copy.png			\
+	edit-cut.png			\
+	edit-delete.png	\
+	edit-find.png			\
+	edit-find-replace.png			\
+	edit-paste.png			\
+	edit-redo.png			\
+	edit-select-all.png	\
+	edit-undo.png			\
+	folder-new.png			\
+	format-indent-less.png		\
+	format-indent-more.png		\
+	format-justify-center.png	\
+	format-justify-fill.png		\
+	format-justify-left.png		\
+	format-justify-right.png	\
+	format-text-bold.png		\
+	format-text-italic.png		\
+	format-text-strikethrough.png	\
+	format-text-underline.png	\
+	go-bottom.png			\
+	go-down.png			\
+	go-first.png			\
+	go-home.png			\
+	go-jump.png			\
+	go-last.png			\
+	go-next.png			\
+	go-previous.png			\
+	go-top.png			\
+	go-up.png			\
+	list-add.png	\
+	list-remove.png	\
+	mail-forward.png	\
+	mail-message-new.png		\
+	mail-mark-junk.png	\
+	mail-mark-not-junk.png	\
+	mail-reply-all.png	\
+	mail-reply-sender.png	\
+	mail-send-receive.png	\
+	media-eject.png	\
+	media-playback-pause.png	\
+	media-playback-start.png	\
+	media-playback-stop.png		\
+	media-record.png		\
+	media-seek-backward.png		\
+	media-seek-forward.png		\
+	media-skip-backward.png		\
+	media-skip-forward.png		\
+	process-stop.png		\
+	system-lock-screen.png		\
+	system-log-out.png		\
+	system-search.png		\
+	system-shutdown.png		\
+	tab-new.png			\
+	view-fullscreen.png		\
+	view-refresh.png 		\
+	window-new.png	
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/actions/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/actions/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/address-book-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/address-book-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..420139d3070de353e65802c2f320b120edd709fa
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/address-book-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/appointment-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/appointment-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..85daef3b0b519c8d4fe6cc1efc1c67e660e0f8e9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/appointment-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/bookmark-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/bookmark-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..621312a89b99cb4d8fe2f5e88c9e7c437042d941
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/bookmark-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/contact-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/contact-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b10c1e9a28c7d590d3f229f2ad82548c731e724
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/contact-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6d64bb90b32dfec83232de6478afc1a6b335b8f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-open.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-open.png
new file mode 100644
index 0000000000000000000000000000000000000000..f35f2583540678b7a544d9175245096082f302af
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-open.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-print-preview.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-print-preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..772efe5a8a6f214a249d7c4cbf54b72bd153b91d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-print-preview.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-print.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-print.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ef393029e56135eed0b29f27805ef4284ce54ef
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-print.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-properties.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-properties.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa697db405aa4f9623d839d18449132402a10aac
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-properties.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-save-as.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-save-as.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c9f6b343bdff4e1295342362486b2cc37387ecb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-save-as.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-save.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-save.png
new file mode 100644
index 0000000000000000000000000000000000000000..db5c52b769e74c5ff883ed02dd4f96e604f2982d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/document-save.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-clear.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-clear.png
new file mode 100644
index 0000000000000000000000000000000000000000..5542948bca68a69ee870e7a52d03116319dde91d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-clear.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-copy.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..3348ee08fd8fcefa1b65a454e1ca6126267216f4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-copy.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-cut.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-cut.png
new file mode 100644
index 0000000000000000000000000000000000000000..217663b19c426af17532b2a6c49c5e8bd119911a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-cut.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-delete.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..9becb3e2f3346b028b6349ccbd3d1d0c633b2d06
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-delete.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-find-replace.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-find-replace.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f1b117ff791666419bc589726ef043d30a2664e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-find-replace.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-find.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-find.png
new file mode 100644
index 0000000000000000000000000000000000000000..5594785d10896bc17095baf387437d01bcb1fcf5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-find.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-paste.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-paste.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd429ced625603273671b08c983a1c31c8207649
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-paste.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-redo.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-redo.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eb7b05c84809454c095bcb61b27d83585540bb2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-redo.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-select-all.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-select-all.png
new file mode 100644
index 0000000000000000000000000000000000000000..107fc60741c5520b2120d166fb29594bcd06c8e0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-select-all.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-undo.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-undo.png
new file mode 100644
index 0000000000000000000000000000000000000000..61b2ce9a5310fb03eac84ae2710e20bfca3f9e75
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/edit-undo.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/folder-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/folder-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcd15c018493cecd0498daa8d0f2e1cf3f4126e3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/folder-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-indent-less.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-indent-less.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ced16f725eb81a8a8a671bd52a85c61af075bb1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-indent-less.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-indent-more.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-indent-more.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a18867ca760573a9391b9b5ca9d72a5c40aebee
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-indent-more.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-center.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-center.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0db2bb30a816a81a0993c8d0087cc27d1e2693f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-center.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-fill.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-fill.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a34a8fd6c73c1592787d3b78877e0e1566ace2b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-fill.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-left.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba0e914a007b8e51a6d9184efba9a43a6a6dab89
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-left.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-right.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..2144cb915e4b39a88ad5670a109b642ba0105a1d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-justify-right.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-bold.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-bold.png
new file mode 100644
index 0000000000000000000000000000000000000000..99ed19c58031509ba2de244c2f6cc0ca74ec4933
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-bold.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-italic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-italic.png
new file mode 100644
index 0000000000000000000000000000000000000000..87ed6f9f6e7b93dcbe0a9f5df0c1a05d963179c9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-italic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-strikethrough.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-strikethrough.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9b55ab250b38c51a6047680901dd5e3d4a30cec
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-strikethrough.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-underline.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-underline.png
new file mode 100644
index 0000000000000000000000000000000000000000..0de6b1cfd31c6de50d7ed7df42b25057091e6695
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/format-text-underline.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-bottom.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf973fedc2ceafa07c68be16aa3e9b20cfb71df6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-bottom.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-down.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..dce3f15ef5739854e5fcf3d8f03f8da077d2617e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-down.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-first.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-first.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e2a6b1ea8da3a5f30c1a391c885b1eac6c58e39
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-first.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-home.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-home.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3ca103e3511e4e013f19b5271d7fde2daef118b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-home.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-jump.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-jump.png
new file mode 100644
index 0000000000000000000000000000000000000000..34dc4c04e27406f8ea21aaf87ac2d6cf1e69741d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-jump.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-last.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-last.png
new file mode 100644
index 0000000000000000000000000000000000000000..48fe95bd3b2f60ba64d4134c94d410c7dadd5af9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-last.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-next.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..a68e2db77531cb15a2cddd62f567f030513b60fa
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-next.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-previous.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..c37bc0414c24b6e4f34096d0c0f20fbe0bf84045
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-previous.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-top.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..d99552b6946984df9cac9cb2a0664357a7349496
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-top.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-up.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-up.png
new file mode 100644
index 0000000000000000000000000000000000000000..afb307b18c130d44b130c57f64075744d703b791
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/go-up.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/list-add.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/list-add.png
new file mode 100644
index 0000000000000000000000000000000000000000..2acdd8f514c199a37b7b14f53081467f88ef7bff
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/list-add.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/list-remove.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/list-remove.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5524f7284e4ecb40cbee1e3d3a449bd58a0e4a8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/list-remove.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-forward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..bea94ab0c8d819e7656b258657ea8d21ef8c6fee
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-forward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-mark-junk.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-mark-junk.png
new file mode 100644
index 0000000000000000000000000000000000000000..0af300667326fe1d39f54cb83bb3119fbdd4e958
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-mark-junk.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-mark-not-junk.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-mark-not-junk.png
new file mode 100644
index 0000000000000000000000000000000000000000..296e92ad13ee27616a64674fabbb4d8d458c571b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-mark-not-junk.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-message-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-message-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f51246f1e4fda7c307be20aad49365b0ff76280
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-message-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-reply-all.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-reply-all.png
new file mode 100644
index 0000000000000000000000000000000000000000..0216e390b695e8b2be13c662ee9bfd8b035f56bc
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-reply-all.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-reply-sender.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-reply-sender.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f248dc3a2e476629d3ec18c6d30ceeabc4d6869
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-reply-sender.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-send-receive.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-send-receive.png
new file mode 100644
index 0000000000000000000000000000000000000000..99349b9aac7842fbaf9eda391ca78b72f5a1ee77
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/mail-send-receive.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-eject.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-eject.png
new file mode 100644
index 0000000000000000000000000000000000000000..b218e7ae98c95b9f25e52421154e803438405f62
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-eject.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-pause.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-pause.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e9f4d535795bb2d2afccec95b0e5ad1cafcab8b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-pause.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-start.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-start.png
new file mode 100644
index 0000000000000000000000000000000000000000..66f32d89b59aed6480c4b3682ad57055828498ac
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-start.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-stop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-stop.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0947879ee9718286198e926ce6557207bf96e38
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-playback-stop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-record.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-record.png
new file mode 100644
index 0000000000000000000000000000000000000000..43f034b59a58ae614f4e31053235219283574412
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-record.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-seek-backward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-seek-backward.png
new file mode 100644
index 0000000000000000000000000000000000000000..535c536157f692c05014b14240d09f92c76b346a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-seek-backward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-seek-forward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-seek-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..96ebe01c5f77a21e05393ea50f0c1f263a2496d6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-seek-forward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-skip-backward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-skip-backward.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa082513b9ba98f60e8356055f57ce75cf0ee156
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-skip-backward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-skip-forward.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-skip-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..52be9420da416c702ab18bc14e819420291c95e4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/media-skip-forward.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/process-stop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/process-stop.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7a8d1722f328be5fa649f774e2fa6bcf049ebef
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/process-stop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-lock-screen.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-lock-screen.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c220fcb62bbbcee989e0d3879d67f51d22ab65f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-lock-screen.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-log-out.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..fddbc2bce1a6b3742bba65b0fa950659873db5ab
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-log-out.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-search.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..950d792af54b114e3ba6ea4cc39577aea7fb71e5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-search.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-shutdown.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-shutdown.png
new file mode 100644
index 0000000000000000000000000000000000000000..36acd46bd33d2e7a0db774c1b35863dd52db7949
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/system-shutdown.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/tab-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/tab-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..294d1506972cd013e5f2906ab54f85bbae8a9891
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/tab-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/view-fullscreen.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/view-fullscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..00e6b83cc005014c81fa510adbe3c9b7d8379adb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/view-fullscreen.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/view-refresh.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/view-refresh.png
new file mode 100644
index 0000000000000000000000000000000000000000..606ea9eba46b82eea04678e64369b97e595f9da5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/view-refresh.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/window-new.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/window-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..e091702e33f9ff7debfba272eb848dbd246acf84
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/actions/window-new.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..83c16f1c7c6746c9a79f6dcbae74225bb4217eec
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/Makefile.am
@@ -0,0 +1,14 @@
+
+size = 32x32
+context = animations
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =						\
+	process-working.png
+
+EXTRA_DIST =						\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..f1bc205f255497bf9a8eb2beaa43b59663de84ba
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/Makefile.in
@@ -0,0 +1,361 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/animations
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = animations
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	process-working.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/animations/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/animations/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/process-working.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/process-working.png
new file mode 100644
index 0000000000000000000000000000000000000000..f19c528145241bd1cb804fcb8ae31b0b9ed72094
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/animations/process-working.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..56414ba43de84639453cfd34a3349e9996774720
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/Makefile.am
@@ -0,0 +1,41 @@
+
+size = 32x32
+context = apps
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =						\
+	accessories-calculator.png			\
+	accessories-character-map.png			\
+	accessories-text-editor.png			\
+	help-browser.png				\
+	internet-group-chat.png				\
+	internet-mail.png				\
+	internet-news-reader.png			\
+	internet-web-browser.png			\
+	office-calendar.png				\
+	preferences-desktop-accessibility.png		\
+	preferences-desktop-assistive-technology.png	\
+	preferences-desktop-font.png			\
+	preferences-desktop-keyboard-shortcuts.png	\
+	preferences-desktop-locale.png	\
+	preferences-desktop-multimedia.png	\
+	preferences-desktop-remote-desktop.png		\
+	preferences-desktop-screensaver.png		\
+	preferences-desktop-theme.png			\
+	preferences-desktop-wallpaper.png		\
+	preferences-system-network-proxy.png		\
+	preferences-system-session.png			\
+	preferences-system-windows.png			\
+	system-file-manager.png				\
+	system-installer.png				\
+	system-software-update.png			\
+	system-users.png				\
+	utilities-system-monitor.png 			\
+	utilities-terminal.png
+
+EXTRA_DIST =						\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..3d8da3a9182de7cb118855f13446e4f23abc7d54
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/Makefile.in
@@ -0,0 +1,388 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/apps
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = apps
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	accessories-calculator.png			\
+	accessories-character-map.png			\
+	accessories-text-editor.png			\
+	help-browser.png				\
+	internet-group-chat.png				\
+	internet-mail.png				\
+	internet-news-reader.png			\
+	internet-web-browser.png			\
+	office-calendar.png				\
+	preferences-desktop-accessibility.png		\
+	preferences-desktop-assistive-technology.png	\
+	preferences-desktop-font.png			\
+	preferences-desktop-keyboard-shortcuts.png	\
+	preferences-desktop-locale.png	\
+	preferences-desktop-multimedia.png	\
+	preferences-desktop-remote-desktop.png		\
+	preferences-desktop-screensaver.png		\
+	preferences-desktop-theme.png			\
+	preferences-desktop-wallpaper.png		\
+	preferences-system-network-proxy.png		\
+	preferences-system-session.png			\
+	preferences-system-windows.png			\
+	system-file-manager.png				\
+	system-installer.png				\
+	system-software-update.png			\
+	system-users.png				\
+	utilities-system-monitor.png 			\
+	utilities-terminal.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/apps/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/apps/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-calculator.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-calculator.png
new file mode 100644
index 0000000000000000000000000000000000000000..7de1c447d1e1609099a90fbb976249241593ee33
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-calculator.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-character-map.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-character-map.png
new file mode 100644
index 0000000000000000000000000000000000000000..a86c23ee251f1a90021edc1d55262cc4f9e5061e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-character-map.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-text-editor.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-text-editor.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6b6285144355d00fea50993b3e9a28f8e73d2cc
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/accessories-text-editor.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/help-browser.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/help-browser.png
new file mode 100644
index 0000000000000000000000000000000000000000..d60425f7ec65f748d6e5d2a61d5a3cf6da8d6ee3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/help-browser.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-group-chat.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-group-chat.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cb1d3be11917600b0ed50cebc57e766b678f8bb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-group-chat.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-mail.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-mail.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc3b9dd3a6118a9a9afbe4c65ec9f580e82c12e2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-mail.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-news-reader.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-news-reader.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebc528fed8fa457a75b7bf853939009624432a70
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-news-reader.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-web-browser.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-web-browser.png
new file mode 100644
index 0000000000000000000000000000000000000000..10d2ed4f475978cea37a7cf05a77b1e1b1b471c4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/internet-web-browser.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/office-calendar.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/office-calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..7817c12b4fc33520ddd6159e18b9cc23d9392c25
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/office-calendar.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-accessibility.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-accessibility.png
new file mode 100644
index 0000000000000000000000000000000000000000..adfe247e29ab4db56772f7b830eccbea624802a7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-accessibility.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-assistive-technology.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-assistive-technology.png
new file mode 100644
index 0000000000000000000000000000000000000000..70adb92b52046d77c762d785d9eed2e9d8f48a04
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-assistive-technology.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-font.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-font.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4ec434ca1efd74ba74b4f72b8a92255d319e41d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-font.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-keyboard-shortcuts.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-keyboard-shortcuts.png
new file mode 100644
index 0000000000000000000000000000000000000000..178dd294c3fbeb033b5286b49df19b218c1e28e9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-keyboard-shortcuts.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-locale.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-locale.png
new file mode 100644
index 0000000000000000000000000000000000000000..66224ae87c669e93a5e2573988fe8ff2a131dda6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-locale.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-multimedia.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-multimedia.png
new file mode 100644
index 0000000000000000000000000000000000000000..56a5662eeed45e0c4605a5357045931f6b3cf9c3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-multimedia.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-remote-desktop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-remote-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..6da67c65f7b4ef94b40e2e4e46551e73f129aee0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-remote-desktop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-screensaver.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-screensaver.png
new file mode 100644
index 0000000000000000000000000000000000000000..dba245586f2ea2eae17139b94ac13debd785efa3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-screensaver.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-theme.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-theme.png
new file mode 100644
index 0000000000000000000000000000000000000000..7af777d6e727df53c6aec66e9a206e9b695415c1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-theme.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-wallpaper.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-wallpaper.png
new file mode 100644
index 0000000000000000000000000000000000000000..4eb744ca14466c1e1154a70c9ef4e69f6f82f527
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-desktop-wallpaper.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-network-proxy.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-network-proxy.png
new file mode 100644
index 0000000000000000000000000000000000000000..e75f6f769c07cc25274f3f6bc07898e7767b0d14
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-network-proxy.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-session.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-session.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8c2d112c9bc6970f1236fb12abcc43c8b414437
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-session.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-windows.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-windows.png
new file mode 100644
index 0000000000000000000000000000000000000000..517e48ae085603f465f9687be6710b4de07107fa
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/preferences-system-windows.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-file-manager.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-file-manager.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d6ce3151066958fc5b5ce763e9f08314429a999
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-file-manager.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-installer.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-installer.png
new file mode 100644
index 0000000000000000000000000000000000000000..c26576ee8fcaab7c49014d9fa4b4d4c8f6a84b34
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-installer.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-software-update.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-software-update.png
new file mode 100644
index 0000000000000000000000000000000000000000..470b5d46f41a2bc4510b47437055dd89d501e680
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-software-update.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-users.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-users.png
new file mode 100644
index 0000000000000000000000000000000000000000..749c825e0743a3d6341572de182ba101d64e2ae0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/system-users.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/utilities-system-monitor.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/utilities-system-monitor.png
new file mode 100644
index 0000000000000000000000000000000000000000..b62959e4f3d7871c986f24c6f112153561912ea8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/utilities-system-monitor.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/utilities-terminal.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/utilities-terminal.png
new file mode 100644
index 0000000000000000000000000000000000000000..f86c7840026a28c021d0ea682263c0c45f7b4811
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/apps/utilities-terminal.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..3992e1ff2e802bb4ce5bbce9d5ffff250ec7dc3e
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/Makefile.am
@@ -0,0 +1,25 @@
+
+size = 32x32
+context = categories
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	applications-accessories.png	\
+	applications-development.png	\
+	applications-games.png	\
+	applications-graphics.png	\
+	applications-internet.png	\
+	applications-multimedia.png	\
+	applications-office.png	\
+	applications-other.png	\
+	applications-system.png	\
+	preferences-desktop.png	\
+	preferences-desktop-peripherals.png	\
+	preferences-system.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..800252048a56c66b97b2c2d8cc210260a7a53fea
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/Makefile.in
@@ -0,0 +1,372 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/categories
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = categories
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	applications-accessories.png	\
+	applications-development.png	\
+	applications-games.png	\
+	applications-graphics.png	\
+	applications-internet.png	\
+	applications-multimedia.png	\
+	applications-office.png	\
+	applications-other.png	\
+	applications-system.png	\
+	preferences-desktop.png	\
+	preferences-desktop-peripherals.png	\
+	preferences-system.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/categories/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/categories/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-accessories.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-accessories.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd43de3d27e5350e637309df9ee5964ab8e1921b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-accessories.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-development.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-development.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc88a5c56a5b9cdbc647e0824b55d4bdc6c42238
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-development.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-games.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-games.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff4044c529675e4449e574b459f7323550c4b53b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-games.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-graphics.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-graphics.png
new file mode 100644
index 0000000000000000000000000000000000000000..36b77c291a6c7f81cb4f3492744023fd812bc41e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-graphics.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-internet.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-internet.png
new file mode 100644
index 0000000000000000000000000000000000000000..096e8489584adb762d2bdb7ef6e6719e32d19c44
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-internet.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-multimedia.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-multimedia.png
new file mode 100644
index 0000000000000000000000000000000000000000..d09995ab96c785eefa4eaeb4751f3e76843d1528
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-multimedia.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-office.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-office.png
new file mode 100644
index 0000000000000000000000000000000000000000..efb850e06484fcd8e5669e388efc3af03cd5cf49
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-office.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-other.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-other.png
new file mode 100644
index 0000000000000000000000000000000000000000..1990dbb829779df572f7e307faa608c8b72c705a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-other.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-system.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..565f406dd147d585f47374e20544996b3542dbd5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/applications-system.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-desktop-peripherals.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-desktop-peripherals.png
new file mode 100644
index 0000000000000000000000000000000000000000..4682b369ecb22413e3fa64e03671b55de7b2389e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-desktop-peripherals.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-desktop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ec71a35777e5bb0b5954877e0e69eef103f053c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-desktop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-system.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e52db7cfd482e228dae640a7717ea1dcaf523e8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/categories/preferences-system.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..d0dbf8b6bade49ab09a86e7f0c1b53782bae1cfc
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/Makefile.am
@@ -0,0 +1,33 @@
+
+size = 32x32
+context = devices
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	audio-card.png			\
+	audio-input-microphone.png	\
+	battery.png			\
+	camera-photo.png		\
+	camera-video.png		\
+	computer.png			\
+	drive-optical.png		\
+	drive-harddisk.png		\
+	drive-removable-media.png	\
+	input-gaming.png		\
+	input-keyboard.png		\
+	input-mouse.png			\
+	media-optical.png		\
+	media-floppy.png		\
+	media-flash.png			\
+	multimedia-player.png		\
+	network-wired.png		\
+	network-wireless.png		\
+	printer.png			\
+	video-display.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..39b03343e9d89cf64ec2944b44bdc3fd66a1c591
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/Makefile.in
@@ -0,0 +1,380 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/devices
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = devices
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	audio-card.png			\
+	audio-input-microphone.png	\
+	battery.png			\
+	camera-photo.png		\
+	camera-video.png		\
+	computer.png			\
+	drive-optical.png		\
+	drive-harddisk.png		\
+	drive-removable-media.png	\
+	input-gaming.png		\
+	input-keyboard.png		\
+	input-mouse.png			\
+	media-optical.png		\
+	media-floppy.png		\
+	media-flash.png			\
+	multimedia-player.png		\
+	network-wired.png		\
+	network-wireless.png		\
+	printer.png			\
+	video-display.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/devices/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/devices/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/audio-card.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/audio-card.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b15dd6d25189647c193ff4ca164480663a844ec
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/audio-card.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/audio-input-microphone.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/audio-input-microphone.png
new file mode 100644
index 0000000000000000000000000000000000000000..9fe3b968200f1ae5d15e0ba81b83d03dd5796c1e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/audio-input-microphone.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/battery.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/battery.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef08925868d5e4ced9cabd473106745fd3fa1deb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/battery.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/camera-photo.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/camera-photo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffbffc7791191b4817d385f59d897138655caf3e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/camera-photo.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/camera-video.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/camera-video.png
new file mode 100644
index 0000000000000000000000000000000000000000..7473dd73b5d591139b4673afc1567b9a2dbdbd9a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/camera-video.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/computer.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/computer.png
new file mode 100644
index 0000000000000000000000000000000000000000..e34eb4e4088c2f21c5471574f6133d3421a32182
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/computer.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-harddisk.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-harddisk.png
new file mode 100644
index 0000000000000000000000000000000000000000..b34d8b7794546d6e614fc0e110b304d87dcb405d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-harddisk.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-optical.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-optical.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf2e8c89fbc45b0d26a699b5a26b1542c4ac8575
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-optical.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-removable-media.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-removable-media.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d2890935c579e3b5e4970a5910144fe2ab95f51
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/drive-removable-media.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-gaming.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-gaming.png
new file mode 100644
index 0000000000000000000000000000000000000000..26e2a98273c504480f20a50ea2d0d27ac27e5a5a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-gaming.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-keyboard.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-keyboard.png
new file mode 100644
index 0000000000000000000000000000000000000000..788c717fd07ebf3ab59dbd05b82f907aed757a59
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-keyboard.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-mouse.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-mouse.png
new file mode 100644
index 0000000000000000000000000000000000000000..49a923c5cbf2fe7af219c30ea410a2e4ae94dfa9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/input-mouse.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-flash.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-flash.png
new file mode 100644
index 0000000000000000000000000000000000000000..7540f3fd2e02deaba007057937c3baf9b31ccfd3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-flash.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-floppy.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-floppy.png
new file mode 100644
index 0000000000000000000000000000000000000000..17b1274e6dbd233e0f56ab845ee3bb9831a1206a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-floppy.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-optical.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-optical.png
new file mode 100644
index 0000000000000000000000000000000000000000..5853a754e4dce473369b8d2af7dd0626e073bceb
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/media-optical.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/multimedia-player.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/multimedia-player.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d592084ed5c05b181479d6e30dc5d9936df511c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/multimedia-player.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/network-wired.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/network-wired.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3ca69179fa802f1e671d238f6f6effac91b5bb2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/network-wired.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/network-wireless.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/network-wireless.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa5f9f2e7b3755e8c5942636d7f2214167b188c7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/network-wireless.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/printer.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/printer.png
new file mode 100644
index 0000000000000000000000000000000000000000..05b49e0225ee6efe9da2b1bbefd656b57d6e9745
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/printer.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/video-display.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/video-display.png
new file mode 100644
index 0000000000000000000000000000000000000000..b95ea5d366ca056831cf478afa1806543c4c983f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/devices/video-display.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..503f15b5fad9d153a469e3e2d8e39e388cbe5256
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/Makefile.am
@@ -0,0 +1,20 @@
+
+size = 32x32
+context = emblems
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	emblem-favorite.png		\
+	emblem-important.png		\
+	emblem-photos.png		\
+	emblem-readonly.png		\
+	emblem-symbolic-link.png	\
+	emblem-system.png		\
+	emblem-unreadable.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..05568c946bf655d97f4ff27f169d0ec0a4c48e1a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/Makefile.in
@@ -0,0 +1,367 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/emblems
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = emblems
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	emblem-favorite.png		\
+	emblem-important.png		\
+	emblem-photos.png		\
+	emblem-readonly.png		\
+	emblem-symbolic-link.png	\
+	emblem-system.png		\
+	emblem-unreadable.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/emblems/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/emblems/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-favorite.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-favorite.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a9ad39b236c9533d69eb7d51181f66e4bffe15f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-favorite.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-important.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-important.png
new file mode 100644
index 0000000000000000000000000000000000000000..263fbd5866aef1ce3645d768fbf55def9a091905
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-important.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-photos.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-photos.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7dfd88e7153452bebf25651ee83d34145172d77
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-photos.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-readonly.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-readonly.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e972d1605ec1fafd05807f975d96825cd30d633
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-readonly.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-symbolic-link.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-symbolic-link.png
new file mode 100644
index 0000000000000000000000000000000000000000..56ef039a21e195f08c207c43fdd4df8239a12595
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-symbolic-link.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-system.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..abac7e91088bb8a45e07f83aaf93a976a77fb944
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-system.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-unreadable.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-unreadable.png
new file mode 100644
index 0000000000000000000000000000000000000000..b94fc97b201075dad6ad22bc896c5e410b372b4e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emblems/emblem-unreadable.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..772e732e93cff8ed9af0e8805f77e039be52641d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/Makefile.am
@@ -0,0 +1,26 @@
+
+size = 32x32
+context = emotes
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =			\
+	face-angel.png		\
+	face-crying.png		\
+	face-devilish.png	\
+	face-glasses.png	\
+	face-grin.png		\
+	face-kiss.png		\
+	face-monkey.png	\
+	face-plain.png		\
+	face-sad.png		\
+	face-smile.png		\
+	face-smile-big.png	\
+	face-surprise.png	\
+	face-wink.png
+
+EXTRA_DIST =			\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..50c0b075aae58676d50c625300277e61091dedfd
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/Makefile.in
@@ -0,0 +1,373 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/emotes
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = emotes
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	face-angel.png		\
+	face-crying.png		\
+	face-devilish.png	\
+	face-glasses.png	\
+	face-grin.png		\
+	face-kiss.png		\
+	face-monkey.png	\
+	face-plain.png		\
+	face-sad.png		\
+	face-smile.png		\
+	face-smile-big.png	\
+	face-surprise.png	\
+	face-wink.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/emotes/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/emotes/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-angel.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-angel.png
new file mode 100644
index 0000000000000000000000000000000000000000..abd0285b420e32dc0acf713cf3959d6a476d6460
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-angel.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-crying.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-crying.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8bc41eb95a0de3612fca33a03e9e7e22d9f4dea
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-crying.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-devilish.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-devilish.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a3cb08c7e6ba81fd6d69f72c0265039de333d29
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-devilish.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-glasses.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-glasses.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b253948156338a4fba6daaab50fcc88ccaa8d38
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-glasses.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-grin.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-grin.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e8268f5da89d316a49c3f586396916a05666356
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-grin.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-kiss.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-kiss.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e3fa54195b75ba2ffa8c898b005e8fae6779995
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-kiss.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-monkey.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-monkey.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb0204a139a254b0c575e9d61c4fff030f18a79d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-monkey.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-plain.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-plain.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8128a653ca264225df35a3fd5cf9c50848eb1ec
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-plain.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-sad.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-sad.png
new file mode 100644
index 0000000000000000000000000000000000000000..2fbecde2dec9b78a4819a9e09140dc9ee5c162e4
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-sad.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-smile-big.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-smile-big.png
new file mode 100644
index 0000000000000000000000000000000000000000..28704ae479f200312ec971ed5dd9f74d5e5a9f57
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-smile-big.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-smile.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-smile.png
new file mode 100644
index 0000000000000000000000000000000000000000..a52e44d04b5fb8fcb3ed29377094a58435581bff
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-smile.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-surprise.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-surprise.png
new file mode 100644
index 0000000000000000000000000000000000000000..af7cef47d02eaa7214f0f7f01a8bdb0ca4b454b1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-surprise.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-wink.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-wink.png
new file mode 100644
index 0000000000000000000000000000000000000000..494d7850f984741a025370a072a80530ce982a1c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/emotes/face-wink.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..97309c9de0db05a8fe53020183dac552576f58e3
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/Makefile.am
@@ -0,0 +1,34 @@
+
+size = 32x32
+context = mimetypes
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =					\
+	application-certificate.png		\
+	application-x-executable.png		\
+	audio-x-generic.png			\
+	font-x-generic.png	\
+	image-x-generic.png			\
+	package-x-generic.png			\
+	text-html.png				\
+	text-x-generic.png			\
+	text-x-generic-template.png			\
+	text-x-script.png			\
+	video-x-generic.png			\
+	x-office-address-book.png		\
+	x-office-calendar.png	\
+	x-office-document.png		\
+	x-office-document-template.png		\
+	x-office-drawing.png		\
+	x-office-drawing-template.png		\
+	x-office-presentation.png	\
+	x-office-presentation-template.png	\
+	x-office-spreadsheet.png		\
+	x-office-spreadsheet-template.png		
+
+EXTRA_DIST =					\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..c2bd82b51b39eff1cfe14a8957c290f344601293
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/Makefile.in
@@ -0,0 +1,381 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/mimetypes
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = mimetypes
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	application-certificate.png		\
+	application-x-executable.png		\
+	audio-x-generic.png			\
+	font-x-generic.png	\
+	image-x-generic.png			\
+	package-x-generic.png			\
+	text-html.png				\
+	text-x-generic.png			\
+	text-x-generic-template.png			\
+	text-x-script.png			\
+	video-x-generic.png			\
+	x-office-address-book.png		\
+	x-office-calendar.png	\
+	x-office-document.png		\
+	x-office-document-template.png		\
+	x-office-drawing.png		\
+	x-office-drawing-template.png		\
+	x-office-presentation.png	\
+	x-office-presentation-template.png	\
+	x-office-spreadsheet.png		\
+	x-office-spreadsheet-template.png		
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/mimetypes/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/mimetypes/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/application-certificate.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/application-certificate.png
new file mode 100644
index 0000000000000000000000000000000000000000..b75ba54e2cdd1435c109172a32edb376fec4eafa
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/application-certificate.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/application-x-executable.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/application-x-executable.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a150b847114e2468c61b01cf0119c7fbca15f11
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/application-x-executable.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/audio-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/audio-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..c60b595dac5f47609cb225f21a697ba17e4e24b9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/audio-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/font-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/font-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..b166f4b08f34085c4e4494a351681ccd4a8724a0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/font-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/image-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/image-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f118cd0875464017b8b9ace2419b4f03f10d1a2
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/image-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/package-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/package-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b55b504af9993c40c2314f11d1ab58f728cb43b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/package-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-html.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-html.png
new file mode 100644
index 0000000000000000000000000000000000000000..a896697d78043cf2ed044a1a6cdcae86e736cca3
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-html.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-generic-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-generic-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b7e64910e6b549d37a0f0c0063f8b73aa15fe5a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-generic-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..928a67995ee9713bc3c86159ed84c0bc568675d9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-script.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-script.png
new file mode 100644
index 0000000000000000000000000000000000000000..801dcd69bc4a3f15ae323c1ffc03a30e17bb1ead
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/text-x-script.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/video-x-generic.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/video-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d6c8d17a6b3674368f6bee9b6f2fc8f4c3c39d0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/video-x-generic.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-address-book.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-address-book.png
new file mode 100644
index 0000000000000000000000000000000000000000..53dde74cde4f92734f49159f422eef56b6333f83
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-address-book.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-calendar.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc6db5b934daeb69447607bd7b1c6d9ee8a43e00
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-calendar.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-document-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-document-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..9619241c563bbcc2683275d440abaabb74a0b4ea
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-document-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-document.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-document.png
new file mode 100644
index 0000000000000000000000000000000000000000..daf84b2860ea1affe59f2aedae69cb8c69b39e5b
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-document.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-drawing-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-drawing-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..6fc043c5a76f98df5fc6d2206fab6ededcf8c215
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-drawing-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-drawing.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-drawing.png
new file mode 100644
index 0000000000000000000000000000000000000000..5cd66c17ae4c0825af4da96beff5124332cab37f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-drawing.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-presentation-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-presentation-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc348f185fdb76ffe7472749f35a09901d0e12f9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-presentation-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-presentation.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-presentation.png
new file mode 100644
index 0000000000000000000000000000000000000000..047355c7d0d5e9aee4cddf4d4d977426f4832db1
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-presentation.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-spreadsheet-template.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-spreadsheet-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a81f365140f6c1bf55962f3793aa25cf08d013d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-spreadsheet-template.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-spreadsheet.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-spreadsheet.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0ccb7ab6fea5c4c77208b0ba10cd49d5b8b394d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/mimetypes/x-office-spreadsheet.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..13f87c7fa172e44332ff059d671d00f1e23ac97a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/Makefile.am
@@ -0,0 +1,22 @@
+
+size = 32x32
+context = places
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =					\
+	folder.png				\
+	folder-remote.png			\
+	folder-saved-search.png	\
+	network-server.png			\
+	network-workgroup.png			\
+	start-here.png	\
+	user-desktop.png			\
+	user-home.png				\
+	user-trash.png
+
+EXTRA_DIST =					\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..ca420210d50a01c719a17944650b5821a3eb0cf6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/Makefile.in
@@ -0,0 +1,369 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/places
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = places
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	folder.png				\
+	folder-remote.png			\
+	folder-saved-search.png	\
+	network-server.png			\
+	network-workgroup.png			\
+	start-here.png	\
+	user-desktop.png			\
+	user-home.png				\
+	user-trash.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/places/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/places/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder-remote.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder-remote.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e0d9add38a8481e639dd3e266daf866d25ef537
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder-remote.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder-saved-search.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder-saved-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..88d4541e8f81691f49a9292ef9f891445fb2d67f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder-saved-search.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder.png
new file mode 100644
index 0000000000000000000000000000000000000000..472484f11279c3e37a20ddcc8277c516ad246115
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/folder.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/network-server.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/network-server.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d38e4f9c807e24f3c6ec1d169464bc4c77b5d01
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/network-server.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/network-workgroup.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/network-workgroup.png
new file mode 100644
index 0000000000000000000000000000000000000000..4137b3c3b73a2b2ff11988f49ae1d11665c7f7c5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/network-workgroup.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/start-here.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/start-here.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e54d01ff26043be41f0e509324612d88add6e7e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/start-here.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-desktop.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..57fb1775767c9e8bfedf66ff391268718d79a6d0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-desktop.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-home.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-home.png
new file mode 100644
index 0000000000000000000000000000000000000000..a29bd69f68067c1c763cb596109c3cff0f5ad93d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-home.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-trash.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-trash.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b7a462d7db7a51710bc05b5d5306d382f54e505
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/places/user-trash.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/Makefile.am b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..588607a0d94e0413294ee7dd8ad223a9996430cb
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/Makefile.am
@@ -0,0 +1,48 @@
+
+size = 32x32
+context = status
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA =				\
+	audio-volume-high.png		\
+	audio-volume-low.png		\
+	audio-volume-medium.png		\
+	audio-volume-muted.png		\
+	battery-caution.png		\
+	dialog-error.png		\
+	dialog-information.png		\
+	dialog-warning.png		\
+	folder-drag-accept.png		\
+	folder-open.png			\
+	folder-visiting.png		\
+	image-loading.png		\
+	image-missing.png		\
+	mail-attachment.png 		\
+	network-error.png		\
+	network-idle.png		\
+	network-offline.png		\
+	network-receive.png		\
+	network-transmit.png		\
+	network-transmit-receive.png	\
+	network-wireless-encrypted.png	\
+	printer-error.png		\
+	software-update-available.png	\
+	software-update-urgent.png	\
+	user-trash-full.png		\
+	weather-clear.png		\
+	weather-clear-night.png		\
+	weather-few-clouds.png		\
+	weather-few-clouds-night.png	\
+	weather-overcast.png		\
+	weather-severe-alert.png	\
+	weather-showers.png		\
+	weather-showers-scattered.png	\
+	weather-snow.png		\
+	weather-storm.png
+
+EXTRA_DIST =				\
+	$(icons_DATA)
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/Makefile.in b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..cdadf73bcaa486b1608d2dd921c3ef1c5da3cab1
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/Makefile.in
@@ -0,0 +1,395 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = 32x32/status
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(iconsdir)"
+iconsDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(icons_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+ICONMAP = @ICONMAP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SVGCONVERT = @SVGCONVERT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+themedir = @themedir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+size = 32x32
+context = status
+iconsdir = $(themedir)/$(size)/$(context)
+icons_DATA = \
+	audio-volume-high.png		\
+	audio-volume-low.png		\
+	audio-volume-medium.png		\
+	audio-volume-muted.png		\
+	battery-caution.png		\
+	dialog-error.png		\
+	dialog-information.png		\
+	dialog-warning.png		\
+	folder-drag-accept.png		\
+	folder-open.png			\
+	folder-visiting.png		\
+	image-loading.png		\
+	image-missing.png		\
+	mail-attachment.png 		\
+	network-error.png		\
+	network-idle.png		\
+	network-offline.png		\
+	network-receive.png		\
+	network-transmit.png		\
+	network-transmit-receive.png	\
+	network-wireless-encrypted.png	\
+	printer-error.png		\
+	software-update-available.png	\
+	software-update-urgent.png	\
+	user-trash-full.png		\
+	weather-clear.png		\
+	weather-clear-night.png		\
+	weather-few-clouds.png		\
+	weather-few-clouds-night.png	\
+	weather-overcast.png		\
+	weather-severe-alert.png	\
+	weather-showers.png		\
+	weather-showers-scattered.png	\
+	weather-snow.png		\
+	weather-storm.png
+
+EXTRA_DIST = \
+	$(icons_DATA)
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  32x32/status/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  32x32/status/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-iconsDATA: $(icons_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)"
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(iconsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  $(iconsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+
+uninstall-iconsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(icons_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(iconsdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(iconsdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(iconsdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-iconsDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-iconsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-iconsDATA \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-iconsDATA
+
+
+install-data-local: install-iconsDATA
+	(cd $(DESTDIR)$(themedir)/$(size) && $(ICONMAP) -c $(context))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-high.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-high.png
new file mode 100644
index 0000000000000000000000000000000000000000..70ae43a1d773de628ec18d67aa24e3c52016372c
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-high.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-low.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-low.png
new file mode 100644
index 0000000000000000000000000000000000000000..34546f9c82bfb42d99249bfb656228910f581023
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-low.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-medium.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-medium.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d48a9a58a699f1a48ceb07c8a35d73b4d92fda9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-medium.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-muted.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-muted.png
new file mode 100644
index 0000000000000000000000000000000000000000..a602c8546f9e25f7fa8a8259e3e67db71ea7a64f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/audio-volume-muted.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/battery-caution.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/battery-caution.png
new file mode 100644
index 0000000000000000000000000000000000000000..ede97882bb86f793448f604a6d50211d86d81339
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/battery-caution.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-error.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-error.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdd95bade1d2fc496e067d2a78e4b1cf76624e03
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-error.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-information.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-information.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ac57475c3b36e46ff4c4ea0506892e2fe884fd7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-information.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-warning.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-warning.png
new file mode 100644
index 0000000000000000000000000000000000000000..7233d45d8e6e41ef8fcb318c76303a9b6f23997e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/dialog-warning.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-drag-accept.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-drag-accept.png
new file mode 100644
index 0000000000000000000000000000000000000000..2feba856039bc646c04af6105fd087350993ba22
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-drag-accept.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-open.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-open.png
new file mode 100644
index 0000000000000000000000000000000000000000..901816c8ec38be3f5129f979b5efb839b76c67cc
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-open.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-visiting.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-visiting.png
new file mode 100644
index 0000000000000000000000000000000000000000..be02b6a01e36c347103944b22217022de7637d3e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/folder-visiting.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/image-loading.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/image-loading.png
new file mode 100644
index 0000000000000000000000000000000000000000..9442085d1c22c6e52da1d4ac67fc4b156c02850f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/image-loading.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/image-missing.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/image-missing.png
new file mode 100644
index 0000000000000000000000000000000000000000..27fccd52d594d876384e21f44a4fbaef0abeea82
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/image-missing.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/mail-attachment.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/mail-attachment.png
new file mode 100644
index 0000000000000000000000000000000000000000..78f1e1cdaab3d8a3dd2742a9abdd7f601c2fedb7
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/mail-attachment.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-error.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-error.png
new file mode 100644
index 0000000000000000000000000000000000000000..3de26e782711ac3a291e2f57bec09b00ef0d9229
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-error.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-idle.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-idle.png
new file mode 100644
index 0000000000000000000000000000000000000000..dca03af4eeaa856ad71cbcb11b8c8c5382cee850
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-idle.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-offline.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-offline.png
new file mode 100644
index 0000000000000000000000000000000000000000..428aaa5d4c5718081bb304f5a86e0b014953f813
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-offline.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-receive.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-receive.png
new file mode 100644
index 0000000000000000000000000000000000000000..b149c5dd12d675780d1113b9f4a688fe5e044a95
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-receive.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-transmit-receive.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-transmit-receive.png
new file mode 100644
index 0000000000000000000000000000000000000000..10ad0ac98720e92605704082449f0135fda5b27d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-transmit-receive.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-transmit.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-transmit.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaa91b88e29fd7bc7ecc067f7107d8d49178b3cf
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-transmit.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-wireless-encrypted.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-wireless-encrypted.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d4e3684fd796c9c3b0218ac60fa674e5ff20824
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/network-wireless-encrypted.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/printer-error.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/printer-error.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6aa46008e8a6767fd33076f9503a38d8919fe53
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/printer-error.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/software-update-available.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/software-update-available.png
new file mode 100644
index 0000000000000000000000000000000000000000..aadcb91292d0e5ad5ae38b4965a9a87b6229992a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/software-update-available.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/software-update-urgent.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/software-update-urgent.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d67d9e8e2f4b562e037c1263d8ec538ba6fd1e6
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/software-update-urgent.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/user-trash-full.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/user-trash-full.png
new file mode 100644
index 0000000000000000000000000000000000000000..462ef399dad1ebc4e2919508ddc675e6cc768d8a
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/user-trash-full.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-clear-night.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-clear-night.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa2714cbe2bcaa459c67538a747a8a08b435deb5
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-clear-night.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-clear.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-clear.png
new file mode 100644
index 0000000000000000000000000000000000000000..c84e8d3771b29559c6201f98128bed398387644e
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-clear.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-few-clouds-night.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-few-clouds-night.png
new file mode 100644
index 0000000000000000000000000000000000000000..62e21d7ff8a80a520cb86e982caeeaf4e98f26f9
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-few-clouds-night.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-few-clouds.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-few-clouds.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c14e0d710fce8a09ded64a066f6514680bdd2d0
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-few-clouds.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-overcast.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-overcast.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc22e4ce4644cc91315a87daf68c761f99c33e5f
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-overcast.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-severe-alert.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-severe-alert.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb75808bb4c88a2fee2bb89021a3ab5c14340e2d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-severe-alert.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-showers-scattered.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-showers-scattered.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e85a7bc924b2fa70ef670afd13ed5b191f25706
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-showers-scattered.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-showers.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-showers.png
new file mode 100644
index 0000000000000000000000000000000000000000..00743484ee64c3ff5644595db0c8ad7c26f02f5d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-showers.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-snow.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-snow.png
new file mode 100644
index 0000000000000000000000000000000000000000..fef6e4dde63decfc9ca75dc696292014e4fa11b8
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-snow.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-storm.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-storm.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a7db962b90e2e2e82a4ad79d946cf3939efa406
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/32x32/status/weather-storm.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/others/mqtt16.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/others/mqtt16.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc3b85a21a074f27cda2bcb8f5a1f00dd86b8a04
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/others/mqtt16.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/others/mqtt32.png b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/others/mqtt32.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee2b3f0656f319cbf438d4cadabac5f5e5b88d1d
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/resources/icons/others/mqtt32.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/AdminPasswordTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/AdminPasswordTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..68bf94b16dfb48dcb6160842da37a09cc97a2791
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/AdminPasswordTab.java
@@ -0,0 +1,242 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.settings;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.ConfirmPasswordFieldValidator;
+import org.eclipse.kura.web.client.util.Constants;
+import org.eclipse.kura.web.client.util.TextFieldValidator;
+import org.eclipse.kura.web.client.util.TextFieldValidator.FieldType;
+import org.eclipse.kura.web.shared.GwtKuraErrorCode;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.model.GwtSettings;
+import org.eclipse.kura.web.shared.service.GwtSettingService;
+import org.eclipse.kura.web.shared.service.GwtSettingServiceAsync;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Info;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class AdminPasswordTab extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtSettingServiceAsync gwtSettingService = GWT.create(GwtSettingService.class);
+	
+    @SuppressWarnings("unused")
+	private GwtSession        m_currentSession;
+
+	private FormPanel         m_formPanel;
+
+    private ToolBar           m_toolBar;
+    private Button            m_apply;
+
+    private TextField<String> m_currentPassword;
+	private TextField<String> m_newPassword;
+
+	
+    public AdminPasswordTab(GwtSession currentSession) {
+    	m_currentSession = currentSession;
+    }
+
+	protected void onRender(final Element parent, int index) {
+		
+		super.onRender(parent, index);
+        
+		//
+		// Borderlayout that expands to the whole screen
+		setLayout(new FitLayout());
+		setBorders(false);
+		setId("settings-admin-password");
+		
+        LayoutContainer mf = new LayoutContainer();
+        mf.setLayout(new BorderLayout());
+		
+		//
+		// Center Panel: Open Ports Table
+		BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, 1F);
+		centerData.setMargins(new Margins(0, 0, 0, 0));
+		centerData.setSplit(true);  
+		centerData.setMinSize(0);
+		
+		ContentPanel openPortsTablePanel = new ContentPanel();
+		openPortsTablePanel.setBorders(false);
+		openPortsTablePanel.setBodyBorder(false);
+		openPortsTablePanel.setHeaderVisible(false);
+		openPortsTablePanel.setScrollMode(Scroll.AUTO);
+		openPortsTablePanel.setLayout(new FitLayout());
+		
+		initToolBar();
+		initAdminPasswordForm();
+        
+		openPortsTablePanel.setTopComponent(m_toolBar);
+		openPortsTablePanel.add(m_formPanel);
+		mf.add(openPortsTablePanel, centerData);
+		
+        add(mf);
+
+		refresh();
+	}
+
+	
+    public void refresh() {
+    	// Nothing to refresh in this case
+    	// The current password must be supplied in 
+    	// order to be able to change it to a new one.
+    }
+
+    
+    public boolean isDirty() {
+    	if (m_formPanel != null) {
+    		return m_formPanel.isDirty();
+    	}
+    	return false;
+    }
+    
+    
+    private void initToolBar() 
+    {	
+        m_toolBar = new ToolBar();
+        m_toolBar.setBorders(true);
+        m_toolBar.setId("settings-admin-password-toolbar");
+        
+        m_apply = new Button(MSGS.apply(), 
+        		AbstractImagePrototype.create(Resources.INSTANCE.accept()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+                apply();
+            }
+        });
+
+        m_toolBar.add(m_apply);
+        m_toolBar.add(new SeparatorToolItem());
+    }
+
+    
+    private void initAdminPasswordForm()
+    {
+        FormData formData = new FormData("-30");
+
+        m_formPanel = new FormPanel();
+        m_formPanel.setFrame(false);
+        m_formPanel.setBodyBorder(false);
+        m_formPanel.setHeaderVisible(false);
+        m_formPanel.setScrollMode(Scroll.AUTOY);
+        m_formPanel.setLayout(new FlowLayout());
+
+        FieldSet fieldSet = new FieldSet();
+        fieldSet.setHeading(MSGS.settingsChangeAdmin());
+        FormLayout layoutAccount = new FormLayout();
+        layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
+        fieldSet.setLayout(layoutAccount);
+        
+        //
+    	// current password
+        //
+        m_currentPassword = new TextField<String>();
+        m_currentPassword.setAllowBlank(false);
+        m_currentPassword.setName("currentPassword");
+        m_currentPassword.setFieldLabel("* "+MSGS.settingsAdminPwdCurrent());
+        m_currentPassword.setPassword(true);
+        fieldSet.add(m_currentPassword, formData);
+
+        //
+    	// new password
+        //
+        m_newPassword = new TextField<String>();
+        m_newPassword.setAllowBlank(false);
+        m_newPassword.setName("newPassword");
+        m_newPassword.setFieldLabel("* "+MSGS.settingsAdminPwdNew());
+        m_newPassword.setValidator(new TextFieldValidator(m_newPassword, FieldType.PASSWORD));
+        m_newPassword.setPassword(true);
+        fieldSet.add(m_newPassword, formData);
+
+        //
+    	// confirm password
+        //
+        final TextField<String> confirmPassword = new TextField<String>();
+        confirmPassword.setAllowBlank(false);
+        confirmPassword.setName("confirmPassword");
+        confirmPassword.setFieldLabel("* "+MSGS.settingsAdminPwdConfirm());
+        confirmPassword.setValidator(new ConfirmPasswordFieldValidator(confirmPassword, m_newPassword));
+        confirmPassword.setPassword(true);
+        fieldSet.add(confirmPassword, formData);
+
+        m_formPanel.add(fieldSet);
+    }
+
+    
+    private void apply()
+    {
+    	// make sure all visible fields are valid before performing the action
+    	for (Field<?> field : m_formPanel.getFields()) {
+    		if (field.isVisible() && !field.isValid()) {
+        		return;
+    		}
+    	}
+                    	
+    	GwtSettings settings = new GwtSettings();
+    	settings.setPasswordCurrent(m_currentPassword.getValue());
+    	settings.setPasswordNew(m_newPassword.getValue());    
+    	
+    	gwtSettingService.updateSettings(settings, new AsyncCallback<Void>() {
+			public void onFailure(Throwable caught) {
+				if (caught instanceof GwtKuraException) {
+					GwtKuraException gwtExc = (GwtKuraException) caught;
+					if (GwtKuraErrorCode.CURRENT_ADMIN_PASSWORD_DOES_NOT_MATCH.equals(gwtExc.getCode())) {
+						Info.display(MSGS.error(), MSGS.settingsPasswoedNotMatchError());
+						return;
+					}
+				}
+				Info.display(MSGS.error(), caught.getMessage());								
+			}
+			public void onSuccess(Void result) {
+				Info.display(MSGS.info(), MSGS.settingsApplied());
+				reset();
+			}                    		
+    	});
+    }
+    
+    
+    private void reset()
+    {
+    	// make sure all visible fields are valid before performing the action
+    	for (Field<?> field : m_formPanel.getFields()) {
+    		field.reset();
+    	}
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SettingsPanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SettingsPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..f531968014105289d83429c589ebb5805eab22c4
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SettingsPanel.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.settings;
+
+import org.eclipse.kura.web.client.configuration.ServiceTree;
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class SettingsPanel extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private GwtSession        m_currentSession;
+    private SettingsTabs      m_settingsTabs;
+    private ServiceTree       m_servicesTree;
+    
+    public SettingsPanel(GwtSession currentSession,
+    					 ServiceTree serviceTree) {
+    	m_currentSession = currentSession;
+    	m_servicesTree   = serviceTree;
+    }
+    
+    
+    protected void onRender(Element parent, int index) 
+    {    
+        super.onRender(parent, index);
+
+        m_settingsTabs = new SettingsTabs(m_currentSession, m_servicesTree);
+       
+        BorderLayout borderLayout = new BorderLayout();
+        setLayout(borderLayout);
+        setBorders(true);
+        setId("settings-panel-wrapper");
+        
+        //
+        // north
+        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 10);  
+        northData.setMargins(new Margins(10, 25, 5, 25));
+        Label intro = new Label(MSGS.settingsIntro());
+        intro.setId("settings-label");
+        add(intro, northData);
+
+        //
+        // center
+        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);  
+        centerData.setMargins(new Margins(10, 15, 25, 15));          
+        add(m_settingsTabs, centerData);
+    }    
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SettingsTabs.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SettingsTabs.java
new file mode 100644
index 0000000000000000000000000000000000000000..90a639207b3980f85c61b5faa4427aa34c63b4e9
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SettingsTabs.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.settings;
+
+import org.eclipse.kura.web.client.configuration.ServiceTree;
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.shared.model.GwtSession;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.TabItem;
+import com.extjs.gxt.ui.client.widget.TabPanel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class SettingsTabs extends LayoutContainer 
+{
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private GwtSession          m_currentSession;
+    private ServiceTree         m_servicesTree;
+	
+	private TabPanel            m_tabsPanel;
+	private TabItem             m_adminPasswordConfig;
+	private TabItem             m_snapshotsConfig;
+	
+	private AdminPasswordTab	m_adminPasswordTab;
+	private SnapshotsTab	    m_snapshotsTab;
+	
+	public SettingsTabs(GwtSession currentSession,
+					    ServiceTree serviceTree) 
+	{    
+		m_currentSession = currentSession;
+    	m_servicesTree   = serviceTree;
+		
+		Log.debug("about to get the firewall configuration");
+	    initTabs();
+	}
+
+	
+    private void initTabs()
+    {
+    	m_adminPasswordTab = new AdminPasswordTab(m_currentSession);
+		if (m_adminPasswordConfig != null) {
+			m_adminPasswordConfig.add(m_adminPasswordTab);
+			m_adminPasswordConfig.layout();
+		}
+
+    	m_snapshotsTab = new SnapshotsTab(m_currentSession, m_servicesTree);
+		if (m_snapshotsConfig != null) {
+			m_snapshotsConfig.add(m_snapshotsTab);
+			m_snapshotsConfig.layout();
+		}
+    }
+    
+    public boolean isDirty() {
+    	
+    	if (m_adminPasswordTab.isDirty()) {
+    		return true;
+    	}
+    	
+    	return false;
+    }
+    
+    protected void onRender(Element parent, int index) 
+    {        
+    	super.onRender(parent, index);
+        
+    	setId("settings-tabs-wrapper");
+        setLayout(new FitLayout());
+      
+        m_tabsPanel = new TabPanel();
+        m_tabsPanel.setPlain(true);
+        m_tabsPanel.setBorders(false);
+        m_tabsPanel.setBodyBorder(false);
+        m_tabsPanel.setStyleAttribute("padding-top", "5px");
+                
+        m_snapshotsConfig = new TabItem(MSGS.settingsSnapshots());
+        m_snapshotsConfig.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.snapshots()));
+        m_snapshotsConfig.setBorders(true);
+        m_snapshotsConfig.setLayout(new FitLayout());
+        m_snapshotsConfig.add(m_snapshotsTab);
+        m_tabsPanel.add(m_snapshotsConfig);
+
+        m_adminPasswordConfig = new TabItem(MSGS.settingsAdminPassword());
+        m_adminPasswordConfig.setBorders(true);
+        m_adminPasswordConfig.setLayout(new FitLayout());
+        m_adminPasswordConfig.add(m_adminPasswordTab);
+        m_tabsPanel.add(m_adminPasswordConfig);
+
+        add(m_tabsPanel);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SnapshotsTab.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SnapshotsTab.java
new file mode 100644
index 0000000000000000000000000000000000000000..67afcaa18f2b07113e8590e18c672991d41af033
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/settings/SnapshotsTab.java
@@ -0,0 +1,362 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.settings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.web.client.configuration.ServiceTree;
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.client.widget.FileUploadDialog;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.model.GwtSnapshot;
+import org.eclipse.kura.web.shared.service.GwtSnapshotService;
+import org.eclipse.kura.web.shared.service.GwtSnapshotServiceAsync;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.LoadEvent;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.LoadListener;
+import com.extjs.gxt.ui.client.event.MessageBoxEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.HiddenField;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class SnapshotsTab extends LayoutContainer {
+
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private final GwtSnapshotServiceAsync gwtSnapshotService = GWT.create(GwtSnapshotService.class);
+	
+	private final static String SERVLET_URL = "/" + GWT.getModuleName() + "/file/configuration/snapshot";
+	
+	@SuppressWarnings("unused")
+	private GwtSession             m_currentSession;
+    private ServiceTree            m_servicesTree;
+
+    private boolean    		       m_dirty;
+    private boolean                m_initialized;
+    
+    private ToolBar                m_toolBar;
+    private Button                 m_refreshButton;
+    private Button                 m_downloadButton;
+    private Button                 m_rollbackButton;
+    private Button                 m_uploadButton;
+    private ListStore<GwtSnapshot> m_store;
+    private Grid<GwtSnapshot>      m_grid;
+    private BaseListLoader<ListLoadResult<GwtSnapshot>> m_loader;
+    private FileUploadDialog       m_fileUpload;
+
+    
+    public SnapshotsTab(GwtSession currentSession,
+    					ServiceTree serviceTree) 
+    {
+        m_currentSession = currentSession;
+    	m_servicesTree   = serviceTree;
+        m_dirty          = false;
+    	m_initialized    = false;
+    }
+    
+    
+    protected void onRender(Element parent, int index) {
+        
+        super.onRender(parent, index);        
+        setLayout(new FitLayout());
+        setBorders(false);
+        setId("settings-snapshots");
+        
+        // init components
+        initToolBar();
+        initGrid();
+
+		ContentPanel devicesHistoryPanel = new ContentPanel();
+		devicesHistoryPanel.setBorders(false);
+		devicesHistoryPanel.setBodyBorder(false);
+		devicesHistoryPanel.setHeaderVisible(false);
+		devicesHistoryPanel.setLayout( new FitLayout());
+		devicesHistoryPanel.setScrollMode(Scroll.AUTO);
+        devicesHistoryPanel.setTopComponent(m_toolBar);
+		devicesHistoryPanel.add(m_grid);
+
+        add(devicesHistoryPanel);
+        m_initialized = true;
+        reload();
+    }
+    
+    
+    private void initToolBar() {
+        
+        m_toolBar = new ToolBar();
+        m_toolBar.setEnabled(true);
+        m_toolBar.setId("settings-snapshots-toolbar");
+        
+        //
+        // Refresh Button
+        m_refreshButton = new Button(MSGS.refreshButton(), 
+                AbstractImagePrototype.create(Resources.INSTANCE.refresh()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+                reload();
+            }
+        });
+        m_refreshButton.setEnabled(true);
+        m_toolBar.add(m_refreshButton);
+        m_toolBar.add(new SeparatorToolItem());
+
+        m_downloadButton = new Button(MSGS.download(),
+                AbstractImagePrototype.create(Resources.INSTANCE.snapshotDownload()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	downloadSnapshot();
+            }
+        });
+        m_downloadButton.setEnabled(false);
+        
+        m_rollbackButton = new Button(MSGS.rollback(),
+                AbstractImagePrototype.create(Resources.INSTANCE.snapshotRollback()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	rollbackSnapshot();
+            }
+        });
+        m_rollbackButton.setEnabled(false);
+
+        m_uploadButton = new Button(MSGS.upload(),
+                AbstractImagePrototype.create(Resources.INSTANCE.snapshotUpload()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+            	uploadSnapshot();
+            }
+        });
+        m_uploadButton.setEnabled(true);
+
+        m_toolBar.add(m_downloadButton);
+        m_toolBar.add(new SeparatorToolItem());
+        m_toolBar.add(m_rollbackButton);
+        m_toolBar.add(new SeparatorToolItem());
+        m_toolBar.add(m_uploadButton);
+    }
+    
+    private void initGrid() {
+        
+        List<ColumnConfig> columns = new ArrayList<ColumnConfig>();  
+        
+        ColumnConfig column = new ColumnConfig("snapshotId", MSGS.deviceSnapshotId(), 25);
+        column.setSortable(false);
+        column.setAlignment(HorizontalAlignment.CENTER);
+        columns.add(column);
+
+        column = new ColumnConfig("createdOnFormatted", MSGS.deviceSnapshotCreatedOn(), 75);
+        column.setSortable(false);
+        column.setAlignment(HorizontalAlignment.LEFT);
+        columns.add(column);
+                          
+        // loader and store
+        RpcProxy<ListLoadResult<GwtSnapshot>> proxy = new RpcProxy<ListLoadResult<GwtSnapshot>>() {
+            @Override
+            public void load(Object loadConfig, AsyncCallback<ListLoadResult<GwtSnapshot>> callback) {
+                gwtSnapshotService.findDeviceSnapshots(callback);
+            }
+        };
+        m_loader = new BaseListLoader<ListLoadResult<GwtSnapshot>>(proxy);
+        m_loader.setSortDir(SortDir.DESC);  
+        m_loader.setSortField("createdOnFormatted"); 
+        m_loader.addLoadListener( new DataLoadListener());
+        
+        m_store = new ListStore<GwtSnapshot>(m_loader);        
+        m_grid = new Grid<GwtSnapshot>(m_store, new ColumnModel(columns));
+        m_grid.setBorders(false);   
+        m_grid.setStateful(false);
+        m_grid.setLoadMask(true);
+        m_grid.setStripeRows(true);
+        m_grid.setTrackMouseOver(false);
+        m_grid.getView().setAutoFill(true);
+		m_grid.getView().setEmptyText(MSGS.deviceSnapshotsNone());
+
+        GridSelectionModel<GwtSnapshot> selectionModel = new GridSelectionModel<GwtSnapshot>();
+        selectionModel.setSelectionMode(SelectionMode.SINGLE);
+        m_grid.setSelectionModel(selectionModel);
+        m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtSnapshot>() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent<GwtSnapshot> se) {
+                if (se.getSelectedItem() != null) {                	
+                	m_downloadButton.setEnabled(true);
+                	m_rollbackButton.setEnabled(true);
+                }
+                else {
+                	m_downloadButton.setEnabled(false);
+                	m_rollbackButton.setEnabled(false);
+                }
+            }
+        });
+    }
+
+    
+    
+    // --------------------------------------------------------------------------------------
+    //
+    //    Device Event List Management
+    //
+    // --------------------------------------------------------------------------------------
+
+    public void refreshWithDelay() {
+    	Timer timer = new Timer() { 
+    	    public void run() { 
+    	        refresh();    	        
+    	    } 
+    	};
+    	m_grid.mask(MSGS.waiting());
+    	timer.schedule(5000);
+    }
+
+    public void refresh() {
+		if (m_dirty && m_initialized) {
+			m_dirty = false;
+			m_toolBar.enable();
+			m_refreshButton.enable();
+		    reload();
+		    
+	    	// refresh the list
+	    	// and reselect the item
+	    	m_servicesTree.refreshServicePanel();
+		}
+	}
+    
+    public void reload() {
+    	m_loader.load();
+    }
+    
+    private void downloadSnapshot() {
+    	GwtSnapshot snapshot = m_grid.getSelectionModel().getSelectedItem();
+        StringBuilder sbUrl = new StringBuilder();
+        sbUrl.append("/" + GWT.getModuleName() + "/device_snapshots?")
+             .append("snapshotId=")
+             .append(snapshot.getSnapshotId());
+        Window.open(sbUrl.toString(), "_blank", "location=no");
+	}
+    
+    private void uploadSnapshot() {
+    	List<HiddenField<?>> hiddenFields = new ArrayList<HiddenField<?>>();
+    	m_fileUpload = new FileUploadDialog(SERVLET_URL, hiddenFields);        	
+    	m_fileUpload.addListener(Events.Hide, new Listener<BaseEvent>() {
+    		public void handleEvent(BaseEvent be) {
+    			m_dirty = true;
+    			m_grid.mask(MSGS.applying());
+            	m_toolBar.disable();
+
+				refresh();
+    		}
+    	});
+
+    	m_fileUpload.setHeading(MSGS.upload());
+    	m_fileUpload.show();
+    }
+    
+    private void rollbackSnapshot() {    	
+    	
+    	final GwtSnapshot snapshot = m_grid.getSelectionModel().getSelectedItem();
+    	if (snapshot != null) {
+    		
+        	MessageBox.confirm(MSGS.confirm(), 
+	            			   MSGS.deviceSnapshotRollbackConfirm(),
+                new Listener<MessageBoxEvent>() {  
+                    public void handleEvent(MessageBoxEvent ce) {
+                        // if confirmed, delete
+                        Dialog  dialog = ce.getDialog(); 
+                        if (dialog.yesText.equals(ce.getButtonClicked().getText())) {
+
+                        	m_dirty = true;
+                        	m_grid.mask(MSGS.rollingBack());
+                        	m_toolBar.disable();
+
+                        	// do the rollback
+                        	gwtSnapshotService.rollbackDeviceSnapshot(
+                        			snapshot,  
+                        			new AsyncCallback<Void>() {                        										 	    
+						                public void onFailure(Throwable caught) {
+						                    FailureHandler.handle(caught);
+						                    m_dirty = true;
+						                }                        								    
+						                public void onSuccess(Void arg0) {
+						                    refresh();
+						                }
+                        			});
+                        }
+                    }
+        	});
+    	}
+    }
+    
+    
+    // --------------------------------------------------------------------------------------
+    //
+    //    Data Load Listener
+    //
+    // --------------------------------------------------------------------------------------
+
+    private class DataLoadListener extends LoadListener
+    {
+        public DataLoadListener() {
+        }
+        
+        public void loaderLoad(LoadEvent le) {
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        }
+
+        public void loaderLoadException(LoadEvent le) {
+            
+        	if (le.exception != null) {
+                FailureHandler.handle(le.exception);
+            }
+        	m_store.removeAll();
+        	m_grid.unmask();
+        	m_toolBar.enable();
+        }
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/status/StatusPanel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/status/StatusPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ee50c46286ec0e9f8f7acb67d903af40f31216c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/status/StatusPanel.java
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.status;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.resources.Resources;
+import org.eclipse.kura.web.client.util.FailureHandler;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtSession;
+import org.eclipse.kura.web.shared.service.GwtStatusService;
+import org.eclipse.kura.web.shared.service.GwtStatusServiceAsync;
+
+import com.extjs.gxt.ui.client.data.BaseListLoader;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.GroupingStore;
+import com.extjs.gxt.ui.client.store.StoreSorter;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.grid.GroupingView;
+import com.extjs.gxt.ui.client.widget.layout.FillLayout;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class StatusPanel extends LayoutContainer {
+	
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private final GwtStatusServiceAsync gwtStatusService = GWT.create(GwtStatusService.class);
+	
+	@SuppressWarnings("unused")
+	private GwtSession           m_currentSession;
+    
+    private boolean				m_initialized;
+    
+    private ToolBar				m_toolBar;
+    private Button				m_refreshButton;
+    
+    private Grid<GwtGroupedNVPair> m_grid;
+    private GroupingStore<GwtGroupedNVPair> m_store;
+    private BaseListLoader<ListLoadResult<GwtGroupedNVPair>> m_loader;
+    
+    public StatusPanel(GwtSession gwtSession) {
+    	m_currentSession = gwtSession;
+    	m_initialized = false;
+    }
+    
+    protected void onRender(Element parent, int index) {
+    	super.onRender(parent, index);        
+        setLayout(new FitLayout());
+        setBorders(false);
+        setId("status-panel-wrapper");
+        
+        initToolBar();
+        initStatusPanel();
+        
+        ContentPanel statusWrapperPanel = new ContentPanel();
+        statusWrapperPanel.setBorders(false);
+        statusWrapperPanel.setBodyBorder(false);
+        statusWrapperPanel.setHeaderVisible(false);
+        statusWrapperPanel.setLayout(new FillLayout());
+        statusWrapperPanel.setTopComponent(m_toolBar);
+        statusWrapperPanel.add(m_grid);
+        
+        add(statusWrapperPanel);
+        m_initialized = true;
+        refresh();
+        
+    }
+    
+    private void initToolBar() {
+    	m_toolBar = new ToolBar();
+        m_toolBar.setBorders(true);
+        m_toolBar.setId("status-toolbar");
+ 
+        m_refreshButton = new Button(MSGS.refreshButton(), 
+        		AbstractImagePrototype.create(Resources.INSTANCE.refresh()),
+                new SelectionListener<ButtonEvent>() {
+            @Override
+            public void componentSelected(ButtonEvent ce) {
+                refresh();
+            }
+        });
+        
+        m_toolBar.add(m_refreshButton);
+        m_toolBar.add(new SeparatorToolItem());
+    }
+    
+    private void initStatusPanel() {
+    	
+    	RpcProxy<ListLoadResult<GwtGroupedNVPair>> proxy = new RpcProxy<ListLoadResult<GwtGroupedNVPair>>() {
+			@Override
+			protected void load(Object loadConfig, final AsyncCallback<ListLoadResult<GwtGroupedNVPair>> callback) {
+				mask(MSGS.loading());
+				gwtStatusService.getDeviceConfig(new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() {
+					public void onFailure(Throwable caught) {
+						unmask();
+						FailureHandler.handle(caught);
+					}
+					public void onSuccess(ListLoadResult<GwtGroupedNVPair> pairs) {
+						unmask();
+						callback.onSuccess(pairs);
+					}
+		    	});
+			}
+    	};
+    	
+    	m_loader = new BaseListLoader<ListLoadResult<GwtGroupedNVPair>>(proxy);
+    	
+    	m_store = new GroupingStore<GwtGroupedNVPair>(m_loader);
+    	m_store.groupBy("groupLoc");
+    	m_store.setStoreSorter(new StoreSorter<GwtGroupedNVPair>(new Comparator<Object>() {
+			public int compare(Object o1, Object o2) {
+				if (o1 == null) o1 = new Integer(-1);
+				else o1 = getIntFromString((String)o1);
+				
+				if (o2 == null) o2 = new Integer(-1);
+				else o2 = getIntFromString((String)o2);
+				
+				return (Integer)o1 - (Integer)o2;
+			}
+			
+			private Integer getIntFromString(String value) {
+				if ("Cloud and Data Service".equals(value)) return new Integer(0);
+				else if ("Ethernet Settings".equals(value)) return new Integer(1);
+				else if ("Wireless Settings".equals(value)) return new Integer(2);
+				else if ("Cellular Settings".equals(value)) return new Integer(3);
+				else if ("Position Status".equals(value)) return new Integer(4);
+				else return new Integer(100);
+			}
+    		
+    	}));
+    	
+    	ColumnConfig name  = new ColumnConfig("name", MSGS.devicePropName(), 50);
+    	ColumnConfig value = new ColumnConfig("value", MSGS.devicePropValue(), 50);
+    	List<ColumnConfig> config = new ArrayList<ColumnConfig>();
+    	config.add(name);
+    	config.add(value);
+    	
+    	
+    	ColumnModel cm = new ColumnModel(config);
+    	GroupingView view = new GroupingView();
+    	view.setShowGroupedColumn(false);
+    	view.setForceFit(true);
+    	
+    	m_grid = new Grid<GwtGroupedNVPair>(m_store, cm);
+    	m_grid.setView(view);
+    	m_grid.setBorders(false);
+    	m_grid.setLoadMask(true);
+    	m_grid.setStripeRows(true);
+    	m_grid.setHideHeaders(true);
+    }
+    
+    private void refresh() {
+    	if (m_initialized) {
+    		m_loader.load();
+    	}
+    }
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/ConfirmPasswordFieldValidator.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/ConfirmPasswordFieldValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..7da395d0e2347364d9b173ca210b140010929456
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/ConfirmPasswordFieldValidator.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import org.eclipse.kura.web.client.messages.ValidationMessages;
+
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.google.gwt.core.client.GWT;
+
+public class ConfirmPasswordFieldValidator extends PasswordFieldValidator 
+{
+	private static final ValidationMessages MSGS = GWT.create(ValidationMessages.class);
+
+	private TextField<String> m_passwordField;
+	
+	public ConfirmPasswordFieldValidator(TextField<String> confirmPasswordField, TextField<String> passwordField) {
+		
+		super (confirmPasswordField);		
+		m_passwordField = passwordField;
+	}
+	
+	
+	public String validate(Field<?> field, String value) 
+	{	
+		String result = super.validate(field, value);
+		if (result == null) {
+			if (!value.equals(m_passwordField.getValue())) {
+				result = MSGS.passwordDoesNotMatch();
+			}
+		}
+		return result;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/Constants.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..39045277b6853d9e06937f2be65621f4365ab32c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/Constants.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+public class Constants {
+
+	public static final int    LABEL_WIDTH_FORM           = 170;
+	public static final int    LABEL_WIDTH_FORM_SMALL     = 25;
+	public static final int    LABEL_WIDTH_CONFIG_FORM    = 250;
+	public static final int    LABEL_WIDTH_INFO           = 150;
+	
+	public static final String LABEL_MARGIN_TOP_SEPARATOR = "25px";
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/DateUtils.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/DateUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..554718c0d9707c68a626f5ecb489133d3e50c380
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/DateUtils.java
@@ -0,0 +1,279 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import java.util.Date;
+
+import org.eclipse.kura.web.client.messages.Messages;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.i18n.client.DateTimeFormat;
+
+public class DateUtils {
+
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	
+	/**
+	 * formatDate takes a date an return its string representation
+	 */
+	public static String formatDateTime(Date d) {
+
+		Date dNow = new Date();
+
+		DateTimeFormat dtf1 = DateTimeFormat.getFormat("yyyy.MM.dd 00:00:00.000 ZZZZ");
+		DateTimeFormat dtf2 = DateTimeFormat.getFormat("yyyy.MM.dd HH:mm:ss.SSS ZZZZ");
+		String today = dtf1.format(dNow);
+		Date  dToday = dtf2.parse(today);
+
+		String date = null;
+		@SuppressWarnings("unused")
+		long lSecDiff = (dNow.getTime() - d.getTime()) / 1000;
+		double dDayDiff = ((double) (d.getTime() - dToday.getTime())) / (86400000); // 1000 * 60 * 60 * 24
+
+		// if more in the future than tomorrow than format the date
+		// even if it's just 2 days from today at midnight (day diff of 2 exactly)
+		if (dDayDiff >= 2) {
+
+			DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM);
+			date = dtf.format(d);
+		}
+
+		// if the modification time is still tomorrow, or
+		// exactly at midnight tomorrow, then
+		// return something like "Tomorrow 10:30 am"
+		else if (dDayDiff >= 1) {
+
+			DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.TIME_MEDIUM);
+			date = MSGS.tomorrow(dtf.format(d));
+		}
+
+		// if the time difference is less than 1 hour
+		// return something like "30 minutes ago"
+//		else if (lSecDiff >= 0 && lSecDiff < 3600) {
+//
+//			if ((lSecDiff / 60) < 1) {
+//				date = lCtx.format(LocaleContext.RB.STR_LESS_THAN_ONE_MIN_AGO);
+//			} else {
+//				String mins = String.valueOf(lSecDiff / 60);
+//				date = lCtx.format(LocaleContext.RB.STR_N_MIN_AGO, mins);
+//			}
+//		}
+
+		// if the modification time is still today, or it is midnight
+		// this same day (this morning), then
+		// return something like "Today 10:30 am"
+		else if (dDayDiff >= 0) {
+
+			DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.TIME_MEDIUM);
+			date = MSGS.today(dtf.format(d));
+		}
+
+		// if the modification time is yesterday,
+		// or exactly 1 day ago at midnight, then
+		// return something like "Yesterday 10:30 am"
+		else if (dDayDiff >= -1) {
+
+			DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.TIME_MEDIUM);
+			date = MSGS.yesterday(dtf.format(d));
+		} 
+		else {
+
+			DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM);
+			date = dtf.format(d);
+		}
+		
+		return date;
+	}
+	
+	public static int getYear(Date date) {
+		return Integer.parseInt(DateTimeFormat.getFormat( "yyyy" ).format(date));
+	}
+	
+	public static int getMonth(Date date) {
+		//NB: The month in DateTimeFormat is not zero based [unlike Date() & Calendar()] so we need to subtract one when getting !!! 
+		return Integer.parseInt(DateTimeFormat.getFormat( "MM" ).format(date))-1;
+	}
+	
+	public static int getDayOfMonth(Date date) {
+		return Integer.parseInt(DateTimeFormat.getFormat( "dd" ).format(date));
+	}
+	
+	public static int getHour(Date date) {
+		return Integer.parseInt(DateTimeFormat.getFormat( "HH" ).format(date));
+	}
+	
+	public static int getMinute(Date date) {
+		return Integer.parseInt(DateTimeFormat.getFormat( "mm" ).format(date));
+	}
+	
+	public static int getSecond(Date date) {
+		return Integer.parseInt(DateTimeFormat.getFormat( "ss" ).format(date));
+	}
+	
+	public static int getMillisecond(Date date) {
+		return Integer.parseInt(DateTimeFormat.getFormat( "SSS" ).format(date));
+	}
+	
+	public static Date setYear(Date date, int year) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(pad(Integer.toString(year), 4));
+		sb.append(dateString.substring(5));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setMonth(Date date, int month) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 5));
+		//NB: The month in DateTimeFormat is not zero based [unlike Date() & Calendar()] so we need to add one when setting !!! 
+		sb.append(pad(Integer.toString(month+1), 2));
+		sb.append(dateString.substring(7));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setDayOfMonth(Date date, int dayOfMonth) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 8));
+		sb.append(pad(Integer.toString(dayOfMonth), 2));
+		sb.append(dateString.substring(10));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setToLastDayOfMonth(Date date) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 8));
+		
+		switch(getMonth(date)) {
+			case 0 : // Jan
+				sb.append("31");
+				break;
+			case 1 : // Feb
+				if(isLeapYear(getYear(date))) {
+					sb.append("29");
+				} else {
+					sb.append("28");
+				}
+				break;
+			case 2 : // Mar
+				sb.append("31");
+				break;
+			case 3 : // Apr
+				sb.append("30");
+				break;
+			case 4 : // May
+				sb.append("31");
+				break;
+			case 5 : // June
+				sb.append("30");
+				break;
+			case 6 : // July
+				sb.append("31");
+				break;
+			case 7 : // August
+				sb.append("31");
+				break;
+			case 8 : // Sept
+				sb.append("30");
+				break;
+			case 9 : // Oct
+				sb.append("31");
+				break;
+			case 10 : // Nov
+				sb.append("30");
+				break;
+			case 11 : // Dec
+				sb.append("31");
+				break;
+			default :
+				break;
+		}
+		
+		sb.append(dateString.substring(10));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setHour(Date date, int hour) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 11));
+		sb.append(pad(Integer.toString(hour), 2));
+		sb.append(dateString.substring(13));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setMinute(Date date, int minute) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 14));
+		sb.append(pad(Integer.toString(minute), 2));
+		sb.append(dateString.substring(16));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setSecond(Date date, int second) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 17));
+		sb.append(pad(Integer.toString(second), 2));
+		sb.append(dateString.substring(19));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	public static Date setMillisecond(Date date, int millisecond) {
+		String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(dateString.substring(0, 20));
+		sb.append(pad(Integer.toString(millisecond), 3));
+		
+		return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString());
+	}
+	
+	private static String pad(String data, int size) {
+		if(data.length() < size) {
+			StringBuffer sb = new StringBuffer();
+			for(int i=0; i<(size-data.length()); i++) {
+				sb.append("0");
+			}
+			sb.append(data);
+			return sb.toString();
+		}
+			
+		return data;
+	}
+	
+	private static boolean isLeapYear(int year) {
+		if(year % 4 == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/FailureHandler.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/FailureHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..0123f7a17b6580883032b30c13825dc0bd0f19d4
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/FailureHandler.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.messages.ValidationMessages;
+import org.eclipse.kura.web.shared.GwtKuraErrorCode;
+import org.eclipse.kura.web.shared.GwtKuraException;
+
+import com.extjs.gxt.ui.client.widget.Info;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.TextArea;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.rpc.StatusCodeException;
+
+/**
+ * Handles GwtExceptions from RCP calls. 
+ *  
+ * @author mcarrer
+ *
+ */
+public class FailureHandler 
+{
+	private static final Messages          CMSGS = GWT.create(Messages.class);
+	private static final ValidationMessages MSGS = GWT.create(ValidationMessages.class);
+
+	public static void handle(Throwable caught) {
+		if (caught instanceof GwtKuraException) {
+
+			GwtKuraException  gee = (GwtKuraException) caught;   
+			GwtKuraErrorCode code = gee.getCode();
+			switch (code) {
+			
+			default:
+				Info.display(CMSGS.error(), caught.getLocalizedMessage());
+				break;
+			}
+		}
+		else if (caught instanceof StatusCodeException && 
+		         ((StatusCodeException) caught).getStatusCode() == 0) {
+
+	        // the current operation was interrupted as the user started a new one 
+	        // or navigated away from the page.
+	        // we can ignore this error and do nothing.
+		}
+		else {
+
+			Info.display(CMSGS.error(), caught.getLocalizedMessage());
+			caught.printStackTrace();			
+		}
+	}
+
+
+	@SuppressWarnings("unchecked")
+	public static boolean handleFormException(FormPanel form, Throwable caught) {
+		
+		boolean isWarning = false;
+		if (caught instanceof GwtKuraException) {
+
+			List<Field<?>> fields = form.getFields();
+			GwtKuraException   gee = (GwtKuraException) caught;   
+			GwtKuraErrorCode  code = gee.getCode();
+			switch (code) {
+			
+			case DUPLICATE_NAME:
+			    boolean fieldFound = false;
+				String duplicateFieldName = gee.getArguments()[0];
+				for (Field<?> field : fields) {
+					if (duplicateFieldName.equals(field.getName())) {
+						TextField<String>  textField = (TextField<String>) field;
+						textField.markInvalid(MSGS.duplicateValue());
+						fieldFound = true;
+						break;
+					}
+				}
+				if (!fieldFound) {
+				    Info.display(CMSGS.error(), caught.getLocalizedMessage());
+				}
+				break;
+
+			case ILLEGAL_NULL_ARGUMENT:
+				String invalidFieldName = gee.getArguments()[0];
+				for (Field<?> field : fields) {
+					if (invalidFieldName.equals(field.getName())) {
+						TextField<String>  textField = (TextField<String>) field;
+						textField.markInvalid(MSGS.invalidNullValue());
+						break;
+					}
+				}
+				break;
+
+			case ILLEGAL_ARGUMENT:
+				String invalidFieldName1 = gee.getArguments()[0];
+				for (Field<?> field : fields) {
+					if (invalidFieldName1.equals(field.getName())) {
+						TextField<String>  textField = (TextField<String>) field;
+						textField.markInvalid(gee.getCause().getMessage());
+						break;
+					}
+				}
+				break;
+
+			case INVALID_RULE_QUERY:
+				for (Field<?> field : fields) {
+					if ("query".equals(field.getName())) {
+						TextArea statement = (TextArea) field;
+						statement.markInvalid(caught.getLocalizedMessage());
+						break;
+					}
+				}
+				break;
+
+			case WARNING:
+				isWarning = true;
+				Info.display(CMSGS.warning(), caught.getLocalizedMessage());
+				break;
+
+			default:
+				Info.display(CMSGS.error(), caught.getLocalizedMessage());
+				caught.printStackTrace();
+				break;
+			}
+		}
+		else {
+
+			Info.display(CMSGS.error(), caught.getLocalizedMessage());
+			caught.printStackTrace();			
+		}
+		
+		return isWarning;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/FormUtils.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/FormUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..6352d62bbff83bde669042f788d22ad6c01077ae
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/FormUtils.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import com.extjs.gxt.ui.client.core.El;
+import com.extjs.gxt.ui.client.widget.Component;
+
+public class FormUtils 
+{
+	public static void addDirtyFieldIcon(Component c)
+	{
+		El elem = c.el().findParent(".x-form-element", 6);
+		El dirtyIcon= elem.createChild("");
+		dirtyIcon.setStyleName("x-grid3-dirty-cell");
+		dirtyIcon.setStyleAttribute("top", "0");
+		dirtyIcon.setStyleAttribute("position", "absolute");
+		dirtyIcon.setSize(10, 10);
+		dirtyIcon.show();		
+	}
+
+	
+	public static void removeDirtyFieldIcon(Component c)
+	{
+		El elem = c.el().findParent(".x-form-element", 6);
+		El dirtyIcon= elem.child(".x-grid3-dirty-cell");
+		if (dirtyIcon != null) {
+			dirtyIcon.removeFromParent();
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/MessageUtils.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/MessageUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..4dfa79a303821923bfdf438ee50bee180ea1349f
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/MessageUtils.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import java.util.MissingResourceException;
+
+import org.eclipse.kura.web.client.messages.ValidationMessages;
+
+import com.google.gwt.core.client.GWT;
+
+public class MessageUtils 
+{
+	private static final ValidationMessages VMSGS = GWT.create(ValidationMessages.class);
+
+	
+	public static String get(String key) {
+		try {
+			return VMSGS.getString(key);
+		}
+		catch (MissingResourceException mre) {
+			return "";
+		}
+	}
+
+	public static String get(String key, Object... arguments) {
+		try {
+			String message = VMSGS.getString(key);
+			if (arguments != null) {
+				message = doFormat(message, arguments);
+			}
+			return message;						
+		}
+		catch (MissingResourceException mre) {
+			return "";
+		}
+	}
+	
+	
+	private static String doFormat(String s, Object[] arguments )
+    {
+        // A very simple implementation of format
+        int i = 0;
+        while (i < arguments.length)
+        {
+            String delimiter = "{" + i + "}";
+            while( s.contains( delimiter ) )
+            {
+                s = s.replace( delimiter, String.valueOf( arguments[i] ) );
+            }
+            i++;
+        }
+        return s;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/PasswordFieldValidator.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/PasswordFieldValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..b725fbc9a8b463589b9f49d8302df19d8f7af3f2
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/PasswordFieldValidator.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+
+public class PasswordFieldValidator extends TextFieldValidator 
+{
+	public PasswordFieldValidator(TextField<String> passwordField) {
+		
+		super (passwordField, FieldType.PASSWORD);
+		m_textField.setRegex(null);
+	}
+	
+	public String validate(Field<?> field, String value) {
+
+		// if the field is not dirty, ignore the validation
+		// this is needed for the update flow, in which we do not show the whole password
+		boolean isDirty = m_textField.isDirty(); 
+		if (!isDirty) {
+			m_textField.setRegex(null);
+			return null;
+		}
+		
+		if (m_textFieldType.getRegex() != null) {
+			m_textField.setRegex(m_textFieldType.getRegex());
+		}		
+
+		return super.validate(field, value);
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/ScaledAbstractImagePrototype.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/ScaledAbstractImagePrototype.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d98706619d361687e18a935fa78da27bb16b47d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/ScaledAbstractImagePrototype.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+import com.google.gwt.user.client.ui.Image;
+
+public class ScaledAbstractImagePrototype extends AbstractImagePrototype 
+{
+	private AbstractImagePrototype m_aip;
+	
+	public ScaledAbstractImagePrototype(AbstractImagePrototype aip)
+	{
+		m_aip = aip;
+	}
+	
+	@Override
+	public void applyTo(Image image) {
+		m_aip.applyTo(image);
+	}
+
+	@Override
+	public Image createImage() {
+		Image img = m_aip.createImage();
+		return new Image(img.getUrl());
+	}
+	
+	@Override
+	public ImagePrototypeElement createElement() {
+		ImagePrototypeElement imgElement = m_aip.createElement();
+		imgElement.getStyle().setProperty("backgroundSize", "100%");
+		return imgElement;		
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/SwappableListStore.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/SwappableListStore.java
new file mode 100644
index 0000000000000000000000000000000000000000..f06379cbc1bc0f61162eb9cfc2ee8820415d42c8
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/SwappableListStore.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import com.extjs.gxt.ui.client.data.ListLoader;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.store.ListStore;
+
+
+public class SwappableListStore<M extends ModelData> extends ListStore<M> {
+
+    public SwappableListStore(ListLoader<?> loader) {
+        super(loader);
+    }
+
+    public void swapModelInstance (M oldModel, M newModel) {
+        super.swapModelInstance (oldModel, newModel);
+    }
+}
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/TextFieldValidator.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/TextFieldValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf52a96fd772f5360a8bab52f5885bc49e04734c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/TextFieldValidator.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import java.util.MissingResourceException;
+
+import org.eclipse.kura.web.client.messages.ValidationMessages;
+
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.form.Validator;
+import com.google.gwt.core.client.GWT;
+
+public class TextFieldValidator implements Validator {
+
+	private static final ValidationMessages MSGS = GWT.create(ValidationMessages.class);
+
+	protected FieldType         m_textFieldType;
+	protected TextField<String> m_textField;
+	
+	public TextFieldValidator(TextField<String> textField, FieldType textFieldType) {		
+
+		m_textField = textField;
+		m_textFieldType = textFieldType;
+		
+		// initialize the field for its validation
+		if (m_textFieldType.getRegex() != null) {
+			m_textField.setRegex(m_textFieldType.getRegex());
+		}
+		if (m_textFieldType.getToolTipMessage() != null) {
+			m_textField.setToolTip(m_textFieldType.getToolTipMessage());
+		}
+		if (m_textFieldType.getRequiredMessage() != null) {
+			m_textField.getMessages().setBlankText(m_textFieldType.getRequiredMessage());
+		}
+		if (m_textFieldType.getRegexMessage() != null) {
+			m_textField.getMessages().setRegexText(m_textFieldType.getRegexMessage());
+		}
+	}
+
+
+	public String validate(Field<?> field, String value) {
+		
+		String result = null;
+		if (!value.matches(m_textFieldType.getRegex())) {
+			result = m_textFieldType.getRegexMessage();
+		}
+		return result;
+	}
+	
+
+	public enum FieldType {
+		
+		SIMPLE_NAME		("simple_name",  "^[a-zA-Z0-9\\-]{3,}$"),
+		NAME            ("name",         "^[a-zA-Z0-9\\_\\-]{3,}$"),
+		NAME_SPACE      ("name_space",   "^[a-zA-Z0-9\\ \\_\\-]{3,}$"),
+		PASSWORD	    ("password",     "^.*(?=.{6,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=!\\~\\|]).*$"), 
+		EMAIL		    ("email",        "^(\\w+)([-+.][\\w]+)*@(\\w[-\\w]*\\.){1,5}([A-Za-z]){2,4}$"), 
+		PHONE           ("phone",        "^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$"), 
+		ALPHABET        ("alphabet",     "^[a-zA-Z_]+$"), 
+		ALPHANUMERIC    ("alphanumeric", "^[a-zA-Z0-9_]+$"), 
+		NUMERIC         ("numeric",      "^[+0-9.]+$"),
+		NETWORK			("network",      "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,3})"),
+		IPv4_ADDRESS	("ipv4_address", "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"),
+		PORT_RANGE		("port_range", "^[0-9]+:*[0-9]+$"),
+		MAC_ADDRESS		("mac_address", "^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$");
+		
+		private String m_name;
+		private String m_regex;
+		private String m_regexMsg;
+		private String m_toolTipMsg;
+		private String m_requiredMsg;
+
+		FieldType(String name, String regex) {
+			
+			m_name = name;
+			m_regex = regex;
+			m_regexMsg = name + "RegexMsg";
+			m_toolTipMsg = name + "ToolTipMsg";
+			m_requiredMsg = name + "RequiredMsg";
+		}
+
+
+		public String getName() {
+			return m_name;
+		}
+		
+		public String getRegex() {
+			return m_regex;
+		}
+
+		public String getRegexMessage() {
+			try {
+				return MSGS.getString(m_regexMsg);
+			}
+			catch (MissingResourceException mre) {
+				return null;
+			}
+		}
+
+		public String getToolTipMessage() {
+			try {
+				return MSGS.getString(m_toolTipMsg);
+			}
+			catch (MissingResourceException mre) {
+				return null;
+			}
+		}
+
+		public String getRequiredMessage() {
+			try {
+				return MSGS.getString(m_requiredMsg);
+			}
+			catch (MissingResourceException mre) {
+				return null;
+			}
+		}
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/TextFieldWithButton.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/TextFieldWithButton.java
new file mode 100644
index 0000000000000000000000000000000000000000..2edb25ba903f3e5f7ebff1f11e2c647ca5a8449c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/TextFieldWithButton.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+import org.eclipse.kura.web.client.network.ToolTipBox;
+
+import com.extjs.gxt.ui.client.GXT;
+import com.extjs.gxt.ui.client.core.El;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.widget.ComponentHelper;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class TextFieldWithButton<D> extends TextField<D> {
+
+	private El m_wrap;
+	private Button m_button;
+	private int m_buttonOffset = 0;
+		
+	public TextFieldWithButton(Button button, int buttonOffset) {
+		m_button = button;
+		m_buttonOffset = buttonOffset;
+	}
+	
+	@Override
+	protected void doAttachChildren() {
+		super.doAttachChildren();
+		ComponentHelper.doAttach(m_button);
+	}
+
+	@Override
+	protected void doDetachChildren() {
+		super.doDetachChildren();
+		ComponentHelper.doDetach(m_button);
+	}
+
+	@Override
+	protected El getInputEl() {
+		return input;
+	}
+
+	@Override
+	protected void onAttach() {
+		super.onAttach();
+		m_wrap.removeStyleName(fieldStyle);
+		if (GXT.isIE) {
+			int y1, y2;
+			if ((y1 = input.getY()) != (y2 = el().getParent().getY())) {
+				int dif = y2 - y1;
+				input.setTop(dif);
+			}
+		}
+	}
+	
+	public void setEnabled(boolean textEnabled, boolean bottonEnabled) {
+		super.setEnabled(textEnabled);
+		m_button.setEnabled(bottonEnabled);
+	}
+	
+	public void setIcon(AbstractImagePrototype icon) {
+		m_button.setIcon(icon);
+	}
+	
+	@Override
+	protected void onRender(Element target, int index) {
+		m_wrap = new El(DOM.createDiv());
+		m_wrap.addStyleName("x-form-field-wrap");
+		m_wrap.addStyleName("x-form-file-wrap");
+		
+		if (isPassword()) {
+			input = new El(DOM.createInputPassword());
+		} else {
+			input = new El(DOM.createInputText());
+		}
+		input.addStyleName(fieldStyle);
+		input.addStyleName("x-form-file-text");
+		input.setStyleAttribute("color", "#000000");
+		m_wrap.appendChild(input.dom);
+		
+		setElement(m_wrap.dom, target, index);
+		super.onRender(target, index);
+
+		m_button.addStyleName("x-form-file-btn");
+		m_button.render(m_wrap.dom);
+
+		if (width == null) {
+			setWidth(150);
+		}
+	}
+
+	@Override
+	protected void onResize(int width, int height) {
+		super.onResize(width, height);	
+		input.setWidth(m_wrap.getWidth() - m_button.el().getWidth() - m_buttonOffset);
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/UserAgentUtils.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/UserAgentUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..bbf2f8c6006cff43e494717c309273a736dcd1a6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/util/UserAgentUtils.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.util;
+
+public class UserAgentUtils
+{
+    public static boolean isIE() {
+        return getUserAgent().contains("msie");
+    }
+    
+    public static int getIEDocumentMode() {
+    	return getIEUserAgentAgent();
+    }
+    
+    public static native String getUserAgent() /*-{
+        return navigator.userAgent.toLowerCase();
+    }-*/;
+    
+    public static native int getIEUserAgentAgent() /*-{
+    	var myNav = navigator.userAgent.toLowerCase();
+    	var ieVersion = (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : 0;
+    	if (ieVersion > 0) {
+    		return Math.min(ieVersion, document.documentMode);
+    	}
+    	return ieVersion;
+    }-*/;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/widget/FileUploadDialog.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/widget/FileUploadDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..1cdaa6c9b637a0dbbc651fc716f0acdafc23afe7
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/widget/FileUploadDialog.java
@@ -0,0 +1,156 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.widget;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FormEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.Status;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.FileUploadField;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Encoding;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Method;
+import com.extjs.gxt.ui.client.widget.form.HiddenField;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class FileUploadDialog extends Dialog {
+	
+	private static final Messages MSGS = GWT.create(Messages.class);
+
+	private FormPanel m_formPanel;
+	private FileUploadField m_fileUploadField;
+	private List<HiddenField<?>> m_hiddenFields;
+	private Button m_submitButton;
+	private Button m_cancelButton;
+	private Status m_status;
+	private String m_url;
+	
+	public FileUploadDialog(String url, List<HiddenField<?>> hiddenFields) {
+		super();
+		m_url = url;
+		m_hiddenFields = hiddenFields;
+		setButtonAlign(HorizontalAlignment.RIGHT);
+	}
+	
+	@Override  
+	protected void onRender(Element parent, int pos) {  
+		super.onRender(parent, pos);
+		
+		setLayout(new FormLayout());
+		setBodyBorder(false);
+		setModal(true);
+		setButtons("");
+		setScrollMode(Scroll.AUTO);
+		setHideOnButtonClick(false);
+		setSize(400, 125);
+		
+	    m_formPanel = new FormPanel();
+	    m_formPanel.setFrame(false);
+	    m_formPanel.setHeaderVisible(false);
+	    m_formPanel.setBodyBorder(false);
+	    m_formPanel.setAction(m_url);
+	    m_formPanel.setEncoding(Encoding.MULTIPART);
+	    m_formPanel.setMethod(Method.POST);
+	    m_formPanel.setButtonAlign(HorizontalAlignment.CENTER);
+	    m_formPanel.setLabelWidth(50);
+	    
+	    m_formPanel.addListener(Events.Submit, new Listener<FormEvent>() {
+
+			public void handleEvent(FormEvent be) {
+				String htmlResponse = be.getResultHtml();				
+				if (htmlResponse == null || htmlResponse.isEmpty()) {
+					MessageBox.info(MSGS.information(), MSGS.fileUploadSuccess(), null);
+				} 
+				else {
+					String errMsg = htmlResponse;
+					int startIdx = htmlResponse.indexOf("<pre>");
+					int endIndex = htmlResponse.indexOf("</pre>");
+					if (startIdx != -1 && endIndex != -1) {
+						errMsg = htmlResponse.substring(startIdx+5, endIndex);
+					}
+					MessageBox.alert(MSGS.error(), MSGS.fileUploadFailure()+": "+errMsg, null);
+				}
+				hide();
+			}
+		});
+		
+	    m_fileUploadField = new FileUploadField();
+	    m_fileUploadField.setAllowBlank(false);
+	    m_fileUploadField.setName("uploadedFile");
+	    m_fileUploadField.setFieldLabel(MSGS.fileLabel());
+	    
+	    m_formPanel.add(m_fileUploadField);
+	    if (m_hiddenFields != null) {
+	    	for (HiddenField<?> hf : m_hiddenFields) {
+	    		m_formPanel.add(hf);
+	    	}
+	    }
+	    add(m_formPanel);
+	}
+
+	@Override
+	protected void createButtons() {
+		super.createButtons();
+		
+		m_status = new Status();
+		m_status.setBusy(MSGS.waitMsg());
+		m_status.hide();
+		m_status.setAutoWidth(true);
+		getButtonBar().add(m_status);
+
+		getButtonBar().add(new FillToolItem());
+
+	    m_submitButton = new Button(MSGS.uploadButton());
+	    m_submitButton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
+	    	@Override  
+	    	public void componentSelected(ButtonEvent ce) {  
+	    		submit();
+	    	}  
+	    });
+
+
+	    m_cancelButton = new Button(MSGS.cancelButton());
+	    m_cancelButton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
+	    	@Override  
+	    	public void componentSelected(ButtonEvent ce) {  
+	    		hide();
+	    	}
+	    });
+	    
+	    addButton(m_cancelButton);
+	    addButton(m_submitButton);
+	}
+	
+	private void submit() {
+		if (!m_formPanel.isValid()) {
+			return;
+		}
+		m_submitButton.disable();
+		m_cancelButton.disable();
+		m_status.show();
+		m_formPanel.submit();
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/widget/PackageInstallDialog.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/widget/PackageInstallDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..82146f0d4618a0594bdc6809cda02f50b67c2041
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/client/widget/PackageInstallDialog.java
@@ -0,0 +1,262 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.client.widget;
+
+import java.util.List;
+
+import org.eclipse.kura.web.client.messages.Messages;
+import org.eclipse.kura.web.client.util.Constants;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FormEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.Status;
+import com.extjs.gxt.ui.client.widget.TabItem;
+import com.extjs.gxt.ui.client.widget.TabPanel;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FileUploadField;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Encoding;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Method;
+import com.extjs.gxt.ui.client.widget.form.HiddenField;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+
+public class PackageInstallDialog extends Dialog {
+	
+	private static final Messages MSGS = GWT.create(Messages.class);
+	
+	private TabPanel				m_tabsPanel;
+	private TabItem					m_tabFile;
+	private TabItem					m_tabUrl;
+
+	private FormPanel 				m_formPanelFile;
+	private FileUploadField 		m_fileUploadField;
+	
+	private FormPanel 				m_formPanelUrl;
+	private TextField<String> 		m_textFieldUrl;
+	
+	private List<HiddenField<?>> 	m_hiddenFields;
+	
+	private Button 					m_submitButton;
+	private Button 					m_cancelButton;
+	private Status 					m_status;
+	
+	private String 					m_actionUrl;
+	
+	
+	public PackageInstallDialog(String actionUrl, List<HiddenField<?>> hiddenFields) {
+		super();
+		m_actionUrl = actionUrl;
+		m_hiddenFields = hiddenFields;
+		setButtonAlign(HorizontalAlignment.RIGHT);
+	}
+	
+	@Override
+	protected void onRender(Element parent, int pos) {
+		super.onRender(parent, pos);
+		
+		setLayout(new FitLayout());
+		setBodyBorder(false);
+		setModal(true);
+		setButtons("");
+		setScrollMode(Scroll.AUTO);
+		setHideOnButtonClick(false);
+		setSize(400, 175);
+		
+		m_tabsPanel = new TabPanel();
+        m_tabsPanel.setPlain(true);
+        m_tabsPanel.setBorders(false);
+		
+        //
+        // File upload tab
+	    m_formPanelFile = new FormPanel();
+	    m_formPanelFile.setFrame(false);
+	    m_formPanelFile.setHeaderVisible(false);
+	    m_formPanelFile.setBodyBorder(false);
+	    m_formPanelFile.setAction(m_actionUrl+"/upload");
+	    m_formPanelFile.setEncoding(Encoding.MULTIPART);
+	    m_formPanelFile.setMethod(Method.POST);
+	    m_formPanelFile.setButtonAlign(HorizontalAlignment.CENTER);
+	    m_formPanelFile.setStyleAttribute("padding-right", "0px");
+	    
+	    m_formPanelFile.addListener(Events.Submit, new Listener<FormEvent>() {
+			public void handleEvent(FormEvent be) {
+				String htmlResponse = be.getResultHtml();				
+				if (htmlResponse == null || htmlResponse.isEmpty()) {
+					MessageBox.info(MSGS.information(), MSGS.fileUploadSuccess(), null);
+				} else {
+					MessageBox.info(MSGS.information(), MSGS.fileUploadFailure(), null);
+				}
+				hide();
+			}
+		});
+		
+	    FieldSet fileFieldSet = new FieldSet();
+	    fileFieldSet.setBorders(false);
+	    fileFieldSet.setStyleAttribute("padding", "0px");
+        FormLayout fileFormLayout = new FormLayout();
+        fileFormLayout.setLabelWidth(Constants.LABEL_WIDTH_FORM_SMALL);
+        fileFieldSet.setLayout(fileFormLayout);
+
+	    m_fileUploadField = new FileUploadField();
+	    m_fileUploadField.setAllowBlank(false);
+	    m_fileUploadField.setName("uploadedFile");
+	    m_fileUploadField.setFieldLabel(MSGS.fileLabel());
+
+	    if (m_hiddenFields != null) {
+	    	for (HiddenField<?> hf : m_hiddenFields) {
+	    		fileFieldSet.add(hf);
+	    	}
+	    }
+
+        FormData fileFormData = new FormData("-20");
+        fileFormData.setMargins(new Margins(0, 0, 0, 0));
+	    fileFieldSet.add(m_fileUploadField, fileFormData);
+	    
+	    m_formPanelFile.add(fileFieldSet, fileFormData);
+	    
+        m_tabFile = new TabItem(MSGS.fileLabel());
+        m_tabFile.setBorders(true);
+        m_tabFile.setLayout(new FormLayout());
+        m_tabFile.add(m_formPanelFile);
+
+        m_tabsPanel.add(m_tabFile);        
+
+        //
+        // Download URL tab
+        m_formPanelUrl = new FormPanel();
+	    m_formPanelUrl.setFrame(false);
+	    m_formPanelUrl.setHeaderVisible(false);
+	    m_formPanelUrl.setBodyBorder(false);
+	    m_formPanelUrl.setAction(m_actionUrl+"/url");
+	    m_formPanelUrl.setMethod(Method.POST);
+	    m_formPanelUrl.setStyleAttribute("padding-right", "0px");
+	    
+	    m_formPanelUrl.addListener(Events.Submit, new Listener<FormEvent>() {
+
+			public void handleEvent(FormEvent be) {
+				String htmlResponse = be.getResultHtml();				
+				if (htmlResponse == null || htmlResponse.isEmpty()) {
+					MessageBox.info(MSGS.information(), MSGS.fileDownloadSuccess(), null);
+				} 
+				else {
+					String errMsg = htmlResponse;
+					int startIdx = htmlResponse.indexOf("<pre>");
+					int endIndex = htmlResponse.indexOf("</pre>");
+					if (startIdx != -1 && endIndex != -1) {
+						errMsg = htmlResponse.substring(startIdx+5, endIndex);
+					}
+					MessageBox.alert(MSGS.error(), MSGS.fileDownloadFailure()+": "+errMsg, null);
+				}
+				hide();
+			}
+		});
+	    
+	    FieldSet urlFieldSet = new FieldSet();
+	    urlFieldSet.setBorders(false);
+	    urlFieldSet.setStyleAttribute("padding", "0px");
+        FormLayout urlFormLayout = new FormLayout();
+        urlFormLayout.setLabelWidth(Constants.LABEL_WIDTH_FORM_SMALL);
+        urlFieldSet.setLayout(urlFormLayout);
+
+	    m_textFieldUrl = new TextField<String>();
+	    m_textFieldUrl.setAllowBlank(false);
+	    m_textFieldUrl.setName("packageUrl");
+	    m_textFieldUrl.setFieldLabel(MSGS.urlLabel());
+	    
+        FormData urlFormData = new FormData("-20");
+        urlFormData.setMargins(new Margins(0, 0, 0, 0));
+	    urlFieldSet.add(m_textFieldUrl, urlFormData);
+	    if (m_hiddenFields != null) {
+	    	for (HiddenField<?> hf : m_hiddenFields) {
+	    		urlFieldSet.add(hf);
+	    	}
+	    }
+	    	    
+	    m_formPanelUrl.add(urlFieldSet, urlFormData);
+	    
+        m_tabUrl = new TabItem(MSGS.urlLabel());
+        m_tabUrl.setBorders(true);
+        m_tabUrl.setLayout(new FormLayout());
+        m_tabUrl.add(m_formPanelUrl);        
+        m_tabsPanel.add(m_tabUrl);
+        
+	    add(m_tabsPanel);
+	}
+
+	@Override
+	protected void createButtons() {
+		super.createButtons();
+		
+		m_status = new Status();
+		m_status.setBusy(MSGS.waitMsg());
+		m_status.hide();
+		m_status.setAutoWidth(true);
+		getButtonBar().add(m_status);
+
+		getButtonBar().add(new FillToolItem());
+
+	    m_submitButton = new Button(MSGS.submitButton());
+	    m_submitButton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
+	    	@Override  
+	    	public void componentSelected(ButtonEvent ce) {  
+	    		submit();
+	    	}  
+	    });
+
+
+	    m_cancelButton = new Button(MSGS.cancelButton());
+	    m_cancelButton.addSelectionListener(new SelectionListener<ButtonEvent>() {  
+	    	@Override  
+	    	public void componentSelected(ButtonEvent ce) {  
+	    		hide();
+	    	}
+	    });
+	    
+	    addButton(m_cancelButton);
+	    addButton(m_submitButton);
+	}
+	
+	private void submit() {
+		TabItem selectedItem = m_tabsPanel.getSelectedItem();
+		FormPanel formPanel = null;
+		if (selectedItem == m_tabFile) {
+			formPanel = m_formPanelFile;
+		} else {
+			formPanel = m_formPanelUrl;
+		}
+		
+		if (!formPanel.isValid()) {
+			return;
+		}
+		
+		m_tabsPanel.mask();
+		m_submitButton.disable();
+		m_cancelButton.disable();
+		m_status.show();
+		formPanel.submit();
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtComponentServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtComponentServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe7b6afee49b0199203d1ab676621b11fc6570b8
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtComponentServiceImpl.java
@@ -0,0 +1,281 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.configuration.metatype.AD;
+import org.eclipse.kura.configuration.metatype.Icon;
+import org.eclipse.kura.configuration.metatype.OCD;
+import org.eclipse.kura.configuration.metatype.Option;
+import org.eclipse.kura.core.configuration.Password;
+import org.eclipse.kura.web.server.util.KuraExceptionHandler;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtConfigComponent;
+import org.eclipse.kura.web.shared.model.GwtConfigParameter;
+import org.eclipse.kura.web.shared.model.GwtConfigParameter.GwtConfigParameterType;
+import org.eclipse.kura.web.shared.service.GwtComponentService;
+
+public class GwtComponentServiceImpl extends OsgiRemoteServiceServlet implements GwtComponentService 
+{
+	private static final long serialVersionUID = -4176701819112753800L;
+
+	public List<GwtConfigComponent> findComponentConfigurations()
+		throws GwtKuraException 
+	{
+		ConfigurationService cs = ServiceLocator.getInstance().getService(ConfigurationService.class);		
+		List<GwtConfigComponent> gwtConfigs = new ArrayList<GwtConfigComponent>();
+		try {
+			
+			List<ComponentConfiguration> configs = cs.getComponentConfigurations();
+	 		// sort the list alphabetically by service name
+	 		Collections.sort(configs, new Comparator<ComponentConfiguration>() {
+				public int compare(ComponentConfiguration arg0,
+								   ComponentConfiguration arg1) {
+					String name0 = arg0.getPid().substring(arg0.getPid().lastIndexOf(".")); 
+					String name1 = arg1.getPid().substring(arg1.getPid().lastIndexOf(".")); 
+					return name0.compareTo(name1);
+				}});
+			for (ComponentConfiguration config : configs) {
+
+				// ignore items we want to hide
+				if (config.getPid().endsWith("SystemPropertiesService") || 
+				    config.getPid().endsWith("NetworkAdminService") ||
+				    config.getPid().endsWith("NetworkConfigurationService")) {
+					continue;
+				}
+				
+				OCD ocd = config.getDefinition();
+				if (ocd != null) {
+
+					GwtConfigComponent gwtConfig = new GwtConfigComponent();
+					gwtConfig.setComponentId(ocd.getId());
+					gwtConfig.setComponentName(ocd.getName());
+					gwtConfig.setComponentDescription(ocd.getDescription());
+					if (ocd.getIcon() != null && ocd.getIcon().size() > 0) {
+						Icon icon = ocd.getIcon().get(0);
+						gwtConfig.setComponentIcon(icon.getResource());
+					}
+
+					List<GwtConfigParameter> gwtParams = new ArrayList<GwtConfigParameter>();
+					gwtConfig.setParameters(gwtParams);
+					for (AD ad : ocd.getAD()) {
+
+						GwtConfigParameter gwtParam = new GwtConfigParameter();
+						gwtParam.setId(ad.getId());
+						gwtParam.setName(ad.getName());
+						gwtParam.setDescription(ad.getDescription());
+						gwtParam.setType(GwtConfigParameterType.valueOf(ad.getType().name()));
+						gwtParam.setRequired(ad.isRequired());
+						gwtParam.setCardinality(ad.getCardinality());
+						if (ad.getOption() != null && ad.getOption().size() > 0) {
+							Map<String, String> options = new HashMap<String, String>();
+							for (Option option : ad.getOption()) {
+								options.put(option.getLabel(), option.getValue());
+							}
+							gwtParam.setOptions(options);
+						}
+						gwtParam.setMin(ad.getMin());
+						gwtParam.setMax(ad.getMax());
+	            		if (config.getConfigurationProperties() != null) {
+
+	            			// handle the value based on the cardinality of the attribute
+	            			int cardinality = ad.getCardinality();
+	            			Object value = config.getConfigurationProperties().get(ad.getId());
+            				if (value != null) {
+		            			if (cardinality == 0 || cardinality == 1 || cardinality == -1) {
+		            				gwtParam.setValue(value.toString());
+		            			}
+		            			else {
+		            				// this could be an array value
+		            				if (value instanceof Object[]) {
+		            					Object[] objValues = (Object[]) value;
+		            					List<String> strValues = new ArrayList<String>();
+		            					for (Object v : objValues) {
+		            						if (v != null) {
+		            							strValues.add(v.toString());
+		            						}
+		            					}
+		            					gwtParam.setValues(strValues.toArray( new String[]{}));
+		            				}
+		            			}
+            				}
+							gwtParams.add(gwtParam);
+	            		}
+					}
+					gwtConfigs.add(gwtConfig);
+				}
+			}
+		} 
+		catch (Throwable t) {
+			KuraExceptionHandler.handle(t);
+		}
+		return gwtConfigs;
+	}
+
+	
+	public void updateComponentConfiguration(GwtConfigComponent gwtCompConfig)
+		throws GwtKuraException 
+	{
+		ConfigurationService cs = ServiceLocator.getInstance().getService(ConfigurationService.class);
+		try {
+
+			// Build the new properties
+			Map<String,Object> properties = new HashMap<String,Object>();
+	        for (GwtConfigParameter gwtConfigParam : gwtCompConfig.getParameters()) {
+	        	
+	    		Object objValue = null;
+	        	int cardinality = gwtConfigParam.getCardinality();	        	
+	        	if (cardinality == 0 || cardinality == 1 || cardinality == -1) {	        	
+
+	        		String strValue = gwtConfigParam.getValue();
+	        		objValue = getObjectValue(gwtConfigParam, strValue);
+	        	}
+	        	else {
+	        		
+	        		String[] strValues = gwtConfigParam.getValues();
+	        		objValue = getObjectValue(gwtConfigParam, strValues);
+	        	}
+	        	properties.put(gwtConfigParam.getName(), objValue);
+			}
+	        
+	        //
+	        // apply them
+	        cs.updateConfiguration(gwtCompConfig.getComponentId(), properties);
+		} 
+		catch (Throwable t) {
+			KuraExceptionHandler.handle(t);
+		}
+	}
+
+
+	private Object getObjectValue(GwtConfigParameter gwtConfigParam, String strValue)
+	{
+		Object objValue = null;
+		if (strValue != null) {		        
+        	GwtConfigParameterType gwtType = gwtConfigParam.getType();
+        	switch (gwtType) {			
+	        case LONG:
+	        	objValue = Long.parseLong(strValue);
+	        	break;
+	        case DOUBLE:
+	        	objValue = Double.parseDouble(strValue);
+	        	break;
+	        case FLOAT:
+	        	objValue = Float.parseFloat(strValue);
+	        	break;
+	        case INTEGER:
+	        	objValue = Integer.parseInt(strValue);
+	        	break;
+			case SHORT:
+				objValue = Short.parseShort(strValue);
+				break;
+			case BYTE:
+				objValue = Byte.parseByte(strValue);
+				break;				
+
+			case BOOLEAN:
+				objValue = Boolean.parseBoolean(strValue);
+				break;				
+				
+	        case PASSWORD:
+	        	objValue = new Password(strValue);
+	        	break;
+	        	
+	        case CHAR:
+	        	objValue = Character.valueOf(strValue.charAt(0));
+	        	break;
+
+	        case STRING:
+	        	objValue = strValue;
+	        	break;			        
+        	}
+		}
+		return objValue;
+	}
+
+
+
+	private Object[] getObjectValue(GwtConfigParameter gwtConfigParam, String[] defaultValues)
+	{		
+		List<Object> values = new ArrayList<Object>();
+    	GwtConfigParameterType type = gwtConfigParam.getType();
+		switch (type) {
+		case BOOLEAN:
+			for (String value : defaultValues) {
+				values.add(Boolean.valueOf(value));				
+			}
+			return values.toArray( new Boolean[]{});
+		
+		case BYTE: 
+			for (String value : defaultValues) {
+				values.add(Byte.valueOf(value));				
+			}
+			return values.toArray( new Byte[]{});
+		
+		case CHAR: 
+			for (String value : defaultValues) {
+				values.add( new Character(value.charAt(0)));		
+			}
+			return values.toArray( new Character[]{});
+
+		case DOUBLE: 
+			for (String value : defaultValues) {
+				values.add(Double.valueOf(value));		
+			}
+			return values.toArray( new Double[]{});
+
+		case FLOAT: 
+			for (String value : defaultValues) {
+				values.add(Float.valueOf(value));
+			}
+			return values.toArray( new Float[]{});
+
+		case INTEGER: 
+			for (String value : defaultValues) {
+				values.add(Integer.valueOf(value));		
+			}
+			return values.toArray( new Integer[]{});
+
+		case LONG: 
+			for (String value : defaultValues) {
+				values.add(Long.valueOf(value));		
+			}
+			return values.toArray( new Long[]{});
+
+		case SHORT: 
+			for (String value : defaultValues) {
+				values.add(Short.valueOf(value));		
+			}
+			return values.toArray( new Short[]{});
+			
+		case PASSWORD: 
+			for (String value : defaultValues) {
+				values.add( new Password(value));		
+			}
+			return values.toArray( new Password[]{});
+
+		case STRING:
+			return defaultValues;
+		}
+		
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtDeviceServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtDeviceServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d74086175b84420810041cfadf98ee68092bc13
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtDeviceServiceImpl.java
@@ -0,0 +1,477 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.command.CommandService;
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.net.NetInterface;
+import org.eclipse.kura.net.NetInterfaceAddress;
+import org.eclipse.kura.net.NetworkService;
+import org.eclipse.kura.position.PositionService;
+import org.eclipse.kura.system.SystemAdminService;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraErrorCode;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.service.GwtDeviceService;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.util.position.Position;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.extjs.gxt.ui.client.data.BaseListLoadResult;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+
+public class GwtDeviceServiceImpl extends OsgiRemoteServiceServlet implements GwtDeviceService 
+{
+	private static final Logger s_logger = LoggerFactory.getLogger(GwtDeviceServiceImpl.class);
+	
+	private static final String UNKNOWN     = "UNKNOWN";
+	
+	private static final long serialVersionUID = -4176701819112753800L;
+
+	public ListLoadResult<GwtGroupedNVPair> findDeviceConfiguration() 
+		throws GwtKuraException 
+	{
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+
+		PositionService positionService = ServiceLocator.getInstance().getService(PositionService.class);
+		NetworkService networkService = ServiceLocator.getInstance().getService(NetworkService.class);
+		SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class);
+		SystemAdminService systemAdminService = ServiceLocator.getInstance().getService(SystemAdminService.class);
+				
+		try {
+			
+			Properties systemProperties = systemService.getProperties();
+			
+			pairs.add( new GwtGroupedNVPair("devInfo", "devKuraVersion",      systemService.getKuraVersion()));
+			pairs.add( new GwtGroupedNVPair("devInfo", "devClientId",        systemService.getPrimaryMacAddress() != null ? systemService.getPrimaryMacAddress() : UNKNOWN));
+			pairs.add( new GwtGroupedNVPair("devInfo", "devDisplayName",     systemService.getDeviceName()));
+			pairs.add( new GwtGroupedNVPair("devInfo", "devUptime",          formatUptime(Long.parseLong(systemAdminService.getUptime()))));
+			pairs.add( new GwtGroupedNVPair("devInfo", "devLastWifiChannel", String.valueOf(systemService.getKuraWifiTopChannel())));
+			
+			pairs.add( new GwtGroupedNVPair("devHw", "devModelName",       systemService.getModelName()));
+			pairs.add( new GwtGroupedNVPair("devHw", "devModelId",         systemService.getModelId()));
+			pairs.add( new GwtGroupedNVPair("devHw", "devPartNumber",      systemService.getPartNumber()));
+			pairs.add( new GwtGroupedNVPair("devHw", "devSerialNumber",    systemService.getSerialNumber()));
+		
+			pairs.add( new GwtGroupedNVPair("devSw", "devFirmwareVersion", systemService.getFirmwareVersion()));
+			pairs.add( new GwtGroupedNVPair("devSw", "devBiosVersion",     systemService.getBiosVersion()));
+			pairs.add( new GwtGroupedNVPair("devSw", "devOsVersion",       systemService.getOsVersion()));
+			pairs.add( new GwtGroupedNVPair("devSw", "devOs",              systemService.getOsName()));
+			pairs.add( new GwtGroupedNVPair("devSw", "devOsArch",          systemService.getOsArch()));
+
+			pairs.add( new GwtGroupedNVPair("devJava", "devJvmName",    systemProperties.getProperty(SystemService.KEY_JAVA_VM_NAME)));
+			pairs.add( new GwtGroupedNVPair("devJava", "devJvmVersion", systemProperties.getProperty(SystemService.KEY_JAVA_VM_VERSION)));
+			
+			pairs.add( new GwtGroupedNVPair("devJava", "devJvmProfile", 			systemService.getJavaVendor() + " " + systemService.getJavaVersion()));
+			pairs.add( new GwtGroupedNVPair("devJava", "devOsgiFramework", 			systemProperties.getProperty(SystemService.KEY_OSGI_FW_NAME)));
+			pairs.add( new GwtGroupedNVPair("devJava", "devOsgiFrameworkVersion", 	systemProperties.getProperty(SystemService.KEY_OSGI_FW_VERSION)));
+			if (systemService.getNumberOfProcessors() != -1) {
+				pairs.add( new GwtGroupedNVPair("devJava", "devNumProc", String.valueOf(systemService.getNumberOfProcessors())));
+			}
+			pairs.add( new GwtGroupedNVPair("devJava", "devRamTot",  String.valueOf(systemService.getTotalMemory())+" MB"));
+			pairs.add( new GwtGroupedNVPair("devJava", "devRamFree", String.valueOf(systemService.getFreeMemory())+" MB"));
+
+			// get the network information
+			String connectionIp = UNKNOWN;
+			String connectionInterface = UNKNOWN;
+			if (networkService != null) {
+
+				// we have a network service.
+				// use it to get the connection interface and IP
+				List<NetInterface<? extends NetInterfaceAddress>> nis = networkService.getActiveNetworkInterfaces();
+				if (!nis.isEmpty()) {
+
+					NetInterface<? extends NetInterfaceAddress> ni = nis.get(0);
+
+					StringBuilder sb = new StringBuilder();
+					sb.append(ni.getName())
+					.append(" (")
+							.append(NetUtil.hardwareAddressToString(ni.getHardwareAddress()))
+							.append(")");					
+					connectionInterface = sb.toString();
+
+					List<? extends NetInterfaceAddress> nias = ni.getNetInterfaceAddresses();
+					if (!nias.isEmpty()) {
+						if (nias.get(0).getAddress() != null) {
+							connectionIp = nias.get(0).getAddress().getHostAddress();
+						}
+					}				
+				}
+			}
+			if (UNKNOWN.equals(connectionIp) || UNKNOWN.equals(connectionInterface)) {
+
+				s_logger.error("Unresolved NetworkService reference or IP address. Defaulting to JVM Networking Information.");
+				try {				
+					InetAddress addr = NetUtil.getCurrentInetAddress();
+					if (addr != null) {   
+						connectionIp = addr.getHostAddress();
+						NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
+						if (netInterface != null) {
+							connectionInterface = NetUtil.hardwareAddressToString(netInterface.getHardwareAddress());
+						}
+					}
+				}
+				catch (Exception se) {
+					s_logger.warn("Error while getting ConnetionIP and ConnectionInterface", se);
+				}			
+			}
+			
+			pairs.add( new GwtGroupedNVPair("netInfo", "netConnIf", connectionInterface));
+			pairs.add( new GwtGroupedNVPair("netInfo", "netConnIp", connectionIp));
+			
+			Position position = positionService.getPosition();
+			pairs.add( new GwtGroupedNVPair("gpsInfo", "gpsLat",  Double.toString(Math.toDegrees(position.getLatitude().getValue()))));
+			pairs.add( new GwtGroupedNVPair("gpsInfo", "gpsLong", Double.toString(Math.toDegrees(position.getLongitude().getValue()))));
+			pairs.add( new GwtGroupedNVPair("gpsInfo", "gpsAlt",  Double.toString(Math.toDegrees(position.getAltitude().getValue()))));
+			
+			// TODO: Add cloud status information in the Denali Device Profile
+//			deviceConfig.deviceStatus
+//			deviceConfig.setAcceptEncoding(null); 
+//			deviceConfig.setApplicationIdentifiers(null); 
+//			deviceConfig.setLastEventOn(new Date()); 
+//			deviceConfig.setLastEventType("UNKNOWN");
+		}
+		catch (Throwable t) {
+			t.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, t);
+		}
+		return new BaseListLoadResult<GwtGroupedNVPair>(pairs);
+	}
+		
+	
+	
+	@SuppressWarnings("unchecked")
+	public ListLoadResult<GwtGroupedNVPair> findThreads() 
+		throws GwtKuraException 
+	{
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+
+		// get root thread group
+        ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
+        while (rootGroup.getParent() != null) {
+            rootGroup = rootGroup.getParent();
+		}
+        // enumerate all other threads
+        int numGroups = rootGroup.activeGroupCount();
+        final ThreadGroup[] groups = new ThreadGroup[2 * numGroups];
+        numGroups = rootGroup.enumerate(groups);
+        Arrays.sort(groups, ThreadGroupComparator.getInstance());
+        for (int i = 0; i < groups.length; i++) {
+        	
+        	ThreadGroup group = groups[i];
+        	if (group != null) {
+	        	StringBuilder sbGroup = new StringBuilder(); 
+	        	sbGroup.append("ThreadGroup ")
+	        		   .append(group.getName())
+	        		   .append(" [")
+	        		   .append("maxprio=")
+	        		   .append(group.getMaxPriority());
+	        	sbGroup.append(", parent=");
+	            if (group.getParent() != null) {
+	            	sbGroup.append(group.getParent().getName());
+	            }
+	            else {
+	            	sbGroup.append('-');
+	            }
+	
+	            sbGroup.append(", isDaemon=");
+	            sbGroup.append(group.isDaemon());
+	            sbGroup.append(", isDestroyed=");
+	            sbGroup.append(group.isDestroyed());
+	            sbGroup.append(']');
+	
+	            int numThreads = group.activeCount();
+	            Thread[] threads = new Thread[numThreads * 2];
+	            group.enumerate(threads, false);
+	            Arrays.sort(threads, ThreadComparator.getInstance());
+	            for (int j=0; j<threads.length; j++) {
+	            	
+	            	Thread thread = threads[j];
+	            	if (thread != null) {
+	            		
+			        	StringBuilder sbThreadName = new StringBuilder(); 
+			        	sbThreadName.append(thread.getId())
+			            			.append('/')
+			            			.append(thread.getName());
+			
+			        	StringBuilder sbThreadValue = new StringBuilder();             	
+			        	sbThreadValue.append("priority=");
+			        	sbThreadValue.append(thread.getPriority());
+			        	sbThreadValue.append(", alive=");
+			        	sbThreadValue.append(thread.isAlive());
+			        	sbThreadValue.append(", daemon=");
+			        	sbThreadValue.append(thread.isDaemon());
+			        	sbThreadValue.append(", interrupted=");
+			        	sbThreadValue.append(thread.isInterrupted());
+			        	sbThreadValue.append(", loader=");
+			        	sbThreadValue.append(thread.getContextClassLoader());
+			        	sbThreadValue.append(']');
+			
+			            pairs.add( new GwtGroupedNVPair(sbGroup.toString(), sbThreadName.toString(), sbThreadValue.toString()));
+	            	}
+	            }
+        	}
+        }
+		return new BaseListLoadResult<GwtGroupedNVPair>(pairs);
+	}
+
+
+	
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public ListLoadResult<GwtGroupedNVPair> findSystemProperties() 
+		throws GwtKuraException 
+	{
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+		// kura properties
+		SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class);
+		Properties kuraProps = systemService.getProperties();
+        SortedSet kuraKeys = new TreeSet( kuraProps.keySet() );
+        for (Iterator ki = kuraKeys.iterator(); ki.hasNext(); )
+        {
+            Object key = ki.next();
+            pairs.add( new GwtGroupedNVPair("propsKura", key.toString(), kuraProps.get(key).toString()));
+        }		
+		return new BaseListLoadResult<GwtGroupedNVPair>(pairs);
+	}
+	
+	
+	
+	public ListLoadResult<GwtGroupedNVPair> findBundles() 
+		throws GwtKuraException 
+	{
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+
+		SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class);
+		Bundle[] bundles = systemService.getBundles();
+		if (bundles != null) {
+			
+			for (Bundle bundle : bundles) {
+				
+				if (bundle != null) {
+				
+					GwtGroupedNVPair pair = new GwtGroupedNVPair();
+					pair.setId(String.valueOf(bundle.getBundleId()));
+					pair.setName(getName(bundle));
+					pair.setStatus(toStateString(bundle));
+					pair.setVersion(getHeaderValue(bundle, Constants.BUNDLE_VERSION));
+					
+					pairs.add(pair);
+				}
+			}
+		}
+		return new BaseListLoadResult<GwtGroupedNVPair>(pairs);
+	}
+	
+	public String executeCommand(String cmd) throws GwtKuraException {
+		CommandService commandService = ServiceLocator.getInstance().getService(CommandService.class);
+		try {
+			return commandService.execute(cmd);
+		} catch (KuraException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		}
+	}
+	
+	// ----------------------------------------------------------------
+	//
+	//   Private Methods
+	//
+	// ----------------------------------------------------------------
+	
+	
+    /**
+     * Return a display name for the given <code>bundle</code>:
+     * <ol>
+     * <li>If the bundle has a non-empty <code>Bundle-Name</code> manifest
+     * header that value is returned.</li>
+     * <li>Otherwise the symbolic name is returned if set</li>
+     * <li>Otherwise the bundle's location is returned if defined</li>
+     * <li>Finally, as a last resort, the bundles id is returned</li>
+     * </ol>
+     *
+     * @param bundle the bundle which name to retrieve
+     * @param locale the locale, in which the bundle name is requested
+     * @return the bundle name - see the description of the method for more details.
+     */
+    public String getName(Bundle bundle)
+    {
+        String name = ( String ) bundle.getHeaders().get( Constants.BUNDLE_NAME );
+        if ( name == null || name.length() == 0 )
+        {
+            name = bundle.getSymbolicName();
+            if ( name == null )
+            {
+                name = bundle.getLocation();
+                if ( name == null )
+                {
+                    name = String.valueOf( bundle.getBundleId() );
+                }
+            }
+        }
+        return name;
+    }
+
+    /**
+     * Returns the value of the header or the empty string if the header
+     * is not available.
+     *
+     * @param bundle the bundle which header to retrieve
+     * @param headerName the name of the header to retrieve
+     * @return the header or empty string if it is not set
+     */
+    public static String getHeaderValue( Bundle bundle, String headerName )
+    {
+       Object value = bundle.getHeaders().get(headerName);
+       if ( value != null )
+       {
+           return value.toString();
+       }
+       return "";
+    }
+
+    
+    private String toStateString( final Bundle bundle )
+    {
+        switch ( bundle.getState() )
+        {
+            case Bundle.INSTALLED:
+                return "bndInstalled";
+            case Bundle.RESOLVED:
+                return "bndResolved";
+            case Bundle.STARTING:
+                return "bndStarting";
+            case Bundle.ACTIVE:
+                return "bndActive";
+            case Bundle.STOPPING:
+                return "bndStopping";
+            case Bundle.UNINSTALLED:
+                return "bndUninstalled";
+            default:
+                return "bndUnknown";
+        }
+    }
+    
+    private String formatUptime(long uptime)
+    {
+                int  days    = (int) TimeUnit.MILLISECONDS.toDays(uptime);
+                long hours   = TimeUnit.MILLISECONDS.toHours(uptime) - (days*24);
+                long minutes = TimeUnit.MILLISECONDS.toMinutes(uptime) - (TimeUnit.MILLISECONDS.toHours(uptime)* 60);
+                long seconds = TimeUnit.MILLISECONDS.toSeconds(uptime) - (TimeUnit.MILLISECONDS.toMinutes(uptime) *60);
+                        
+                StringBuilder sb = new StringBuilder();
+                sb.append(days)
+                .append(" days ")
+                .append(hours)
+                .append(":")
+                .append(minutes)
+                .append(":")
+                .append(seconds)
+                .append(" hms");
+
+                return sb.toString();
+    }
+}
+
+@SuppressWarnings("rawtypes")
+final class ThreadComparator implements Comparator
+{
+
+    private ThreadComparator()
+    {
+        // prevent instantiation
+    }
+
+    private static final Comparator instance = new ThreadComparator();
+
+    public static final Comparator getInstance()
+    {
+        return instance;
+    }
+
+    public int compare(Object thread1, Object thread2)
+    {
+        if (thread1 == null || thread2 == null) {
+        	return (thread1 == null) ? -1 : 1;
+        }
+        if (thread1 == null || thread2 == null)
+        	return 0;
+        
+        String t1 = ((Thread) thread1).getName();
+        String t2 = ((Thread) thread2).getName();
+        if (null == t1)
+        {
+            t1 = ""; //$NON-NLS-1$
+        }
+        if (null == t2)
+        {
+            t2 = ""; //$NON-NLS-1$
+        }
+
+        return t1.toLowerCase().compareTo(t2.toLowerCase());
+    }
+}
+
+@SuppressWarnings("rawtypes")
+final class ThreadGroupComparator implements Comparator
+{
+
+    private ThreadGroupComparator()
+    {
+        // prevent instantiation
+    }
+
+    private static final Comparator instance = new ThreadGroupComparator();
+
+    public static final Comparator getInstance()
+    {
+        return instance;
+    }
+
+    public int compare(Object thread1, Object thread2)
+    {
+    	if (thread1 == null || thread2 == null) {
+        	return (thread1 == null) ? -1 : 1;
+        }
+        if (thread1 == null || thread2 == null)
+        	return 0;
+        
+        String t1 = ((ThreadGroup) thread1).getName();
+        String t2 = ((ThreadGroup) thread2).getName();
+        if (null == t1)
+        {
+            t1 = ""; //$NON-NLS-1$
+        }
+        if (null == t2)
+        {
+            t2 = ""; //$NON-NLS-1$
+        }
+        return t1.toLowerCase().compareTo(t2.toLowerCase());
+    }
+}
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtNetworkServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtNetworkServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7bf1e37c9d584a6f1fae49a00e3d6e066fe1f92
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtNetworkServiceImpl.java
@@ -0,0 +1,1217 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.kura.KuraErrorCode;
+import org.eclipse.kura.KuraException;
+import org.eclipse.kura.core.net.util.NetworkUtil;
+import org.eclipse.kura.core.util.NetUtil;
+import org.eclipse.kura.net.IP4Address;
+import org.eclipse.kura.net.IPAddress;
+import org.eclipse.kura.net.NetConfig;
+import org.eclipse.kura.net.NetConfigIP4;
+import org.eclipse.kura.net.NetInterfaceAddressConfig;
+import org.eclipse.kura.net.NetInterfaceConfig;
+import org.eclipse.kura.net.NetInterfaceState;
+import org.eclipse.kura.net.NetInterfaceStatus;
+import org.eclipse.kura.net.NetInterfaceType;
+import org.eclipse.kura.net.NetProtocol;
+import org.eclipse.kura.net.NetworkAdminService;
+import org.eclipse.kura.net.NetworkPair;
+import org.eclipse.kura.net.dhcp.DhcpServerConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallNatConfig;
+import org.eclipse.kura.net.firewall.FirewallOpenPortConfigIP;
+import org.eclipse.kura.net.firewall.FirewallOpenPortConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallPortForwardConfigIP;
+import org.eclipse.kura.net.firewall.FirewallPortForwardConfigIP4;
+import org.eclipse.kura.net.firewall.FirewallReverseNatConfig;
+import org.eclipse.kura.net.modem.ModemConfig;
+import org.eclipse.kura.net.modem.ModemConfig.AuthType;
+import org.eclipse.kura.net.modem.ModemConfig.PdpType;
+import org.eclipse.kura.net.modem.ModemConnectionStatus;
+import org.eclipse.kura.net.modem.ModemInterface;
+import org.eclipse.kura.net.modem.ModemInterfaceAddressConfig;
+import org.eclipse.kura.net.modem.ModemTechnologyType;
+import org.eclipse.kura.net.wifi.WifiBgscan;
+import org.eclipse.kura.net.wifi.WifiBgscanModule;
+import org.eclipse.kura.net.wifi.WifiCiphers;
+import org.eclipse.kura.net.wifi.WifiConfig;
+import org.eclipse.kura.net.wifi.WifiHotspotInfo;
+import org.eclipse.kura.net.wifi.WifiInterfaceAddressConfig;
+import org.eclipse.kura.net.wifi.WifiMode;
+import org.eclipse.kura.net.wifi.WifiRadioMode;
+import org.eclipse.kura.net.wifi.WifiSecurity;
+import org.eclipse.kura.web.server.util.KuraExceptionHandler;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraErrorCode;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
+import org.eclipse.kura.web.shared.model.GwtFirewallPortForwardEntry;
+import org.eclipse.kura.web.shared.model.GwtModemAuthType;
+import org.eclipse.kura.web.shared.model.GwtModemInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtModemPdpType;
+import org.eclipse.kura.web.shared.model.GwtNetIfConfigMode;
+import org.eclipse.kura.web.shared.model.GwtNetIfStatus;
+import org.eclipse.kura.web.shared.model.GwtNetIfType;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtNetRouterMode;
+import org.eclipse.kura.web.shared.model.GwtReverseNatEntries;
+import org.eclipse.kura.web.shared.model.GwtReverseNatEntry;
+import org.eclipse.kura.web.shared.model.GwtWifiBgscanModule;
+import org.eclipse.kura.web.shared.model.GwtWifiCiphers;
+import org.eclipse.kura.web.shared.model.GwtWifiConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiHotspotEntry;
+import org.eclipse.kura.web.shared.model.GwtWifiNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiRadioMode;
+import org.eclipse.kura.web.shared.model.GwtWifiSecurity;
+import org.eclipse.kura.web.shared.model.GwtWifiWirelessMode;
+import org.eclipse.kura.web.shared.service.GwtNetworkService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.extjs.gxt.ui.client.data.BaseListLoadResult;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+
+
+public class GwtNetworkServiceImpl extends OsgiRemoteServiceServlet implements GwtNetworkService 
+{
+	private static final long serialVersionUID = -4188750359099902616L;
+
+	private static Logger s_logger = LoggerFactory.getLogger(GwtNetworkServiceImpl.class);
+	
+	
+	public ListLoadResult<GwtNetInterfaceConfig> findNetInterfaceConfigurations() 
+		throws GwtKuraException 
+	{
+		s_logger.debug("Starting");
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		
+		List<GwtNetInterfaceConfig> gwtNetConfigs = new ArrayList<GwtNetInterfaceConfig>();
+		try {
+
+		    GwtNetInterfaceConfig gwtNetConfig = null;		
+			for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netIfConfig : nas.getNetworkInterfaceConfigs()) {
+				s_logger.debug("Getting config for " + netIfConfig.getName() + " with type " + netIfConfig.getType());
+				
+				s_logger.debug("Interface State: " + netIfConfig.getState());
+				
+				if (netIfConfig.getType() == NetInterfaceType.WIFI) {
+					gwtNetConfig = new GwtWifiNetInterfaceConfig();
+				} else if (netIfConfig.getType() == NetInterfaceType.MODEM) {
+					gwtNetConfig = new GwtModemInterfaceConfig();
+					((GwtModemInterfaceConfig)gwtNetConfig).setModemId(((ModemInterface)netIfConfig).getModemIdentifier());
+                    ((GwtModemInterfaceConfig)gwtNetConfig).setHwSerial(((ModemInterface)netIfConfig).getSerialNumber());
+                    ((GwtModemInterfaceConfig)gwtNetConfig).setManufacturer(((ModemInterface)netIfConfig).getManufacturer());
+                    ((GwtModemInterfaceConfig)gwtNetConfig).setModel(((ModemInterface)netIfConfig).getModel());
+                    ((GwtModemInterfaceConfig)gwtNetConfig).setGpsSupported(((ModemInterface)netIfConfig).isGpsSupported());
+                    
+                    List<String> technologyList = new ArrayList<String>();
+                    List<ModemTechnologyType> technologyTypes = ((ModemInterface)netIfConfig).getTechnologyTypes();
+                    if(technologyTypes != null) {
+                        for(ModemTechnologyType techType : technologyTypes) {
+                            technologyList.add(techType.name());
+                        }
+                    }
+                    ((GwtModemInterfaceConfig)gwtNetConfig).setNetworkTechnology(technologyList);
+				} else {
+					gwtNetConfig = new GwtNetInterfaceConfig();
+				}
+				
+				gwtNetConfig.setName(netIfConfig.getName());
+				gwtNetConfig.setHwName(netIfConfig.getName());
+				if (netIfConfig.getType() != null) {
+					gwtNetConfig.setHwType(netIfConfig.getType().name());
+				}
+				if (netIfConfig.getState() != null) {
+					gwtNetConfig.setHwState(netIfConfig.getState().name());
+				}
+				s_logger.debug("MAC: "+NetUtil.hardwareAddressToString(netIfConfig.getHardwareAddress()));
+				gwtNetConfig.setHwAddress(NetUtil.hardwareAddressToString(netIfConfig.getHardwareAddress()));
+				gwtNetConfig.setHwDriver(netIfConfig.getDriver());
+				gwtNetConfig.setHwDriverVersion(netIfConfig.getDriverVersion());
+				gwtNetConfig.setHwFirmware(netIfConfig.getFirmwareVersion());
+				gwtNetConfig.setHwMTU(netIfConfig.getMTU());
+				if (netIfConfig.getUsbDevice() != null) {
+					gwtNetConfig.setHwUsbDevice(netIfConfig.getUsbDevice().getUsbDevicePath());
+				}
+				else {
+					gwtNetConfig.setHwUsbDevice("N/A");
+				}
+								
+				List<? extends NetInterfaceAddressConfig> addressConfigs = netIfConfig.getNetInterfaceAddresses();
+				
+				if (addressConfigs != null && addressConfigs.size() > 0) {
+					for (NetInterfaceAddressConfig addressConfig : addressConfigs) {
+						//current status - not configuration!
+						if(addressConfig.getAddress() != null) {
+							s_logger.debug("current address: "+addressConfig.getAddress().getHostAddress());
+						}
+						if(addressConfig.getNetworkPrefixLength() >= 0 && addressConfig.getNetworkPrefixLength() <= 32) {
+							s_logger.debug("current prefix length: "+addressConfig.getNetworkPrefixLength());
+						}
+						if(addressConfig.getNetmask() != null) {
+							s_logger.debug("current netmask: "+addressConfig.getNetmask().getHostAddress());						
+						}
+						
+						List<NetConfig> netConfigs = addressConfig.getConfigs();
+						if(netConfigs != null && netConfigs.size() > 0) {
+							boolean isNatEnabled = false;
+							boolean isDhcpServerEnabled = false;
+							
+							for(NetConfig netConfig : netConfigs) {
+								if(netConfig instanceof NetConfigIP4) {
+									s_logger.debug("Setting up NetConfigIP4 with status " + ((NetConfigIP4)netConfig).getStatus().toString());
+									
+									//we are enabled - for LAN or WAN?
+									if(((NetConfigIP4)netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledLAN) {
+										gwtNetConfig.setStatus(GwtNetIfStatus.netIPv4StatusEnabledLAN.name());
+									} else if(((NetConfigIP4)netConfig).getStatus() == NetInterfaceStatus.netIPv4StatusEnabledWAN) {
+										gwtNetConfig.setStatus(GwtNetIfStatus.netIPv4StatusEnabledWAN.name());
+									} else {
+									    gwtNetConfig.setStatus(GwtNetIfStatus.netIPv4StatusDisabled.name());
+									}
+
+									if(((NetConfigIP4)netConfig).isDhcp()) {
+										gwtNetConfig.setConfigMode(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name());
+
+										//since DHCP - populate current data
+										if(addressConfig.getAddress() != null) {
+											gwtNetConfig.setIpAddress(addressConfig.getAddress().getHostAddress());
+										} else {
+											gwtNetConfig.setIpAddress("");
+										}
+										if(addressConfig.getNetworkPrefixLength() >= 0 && addressConfig.getNetworkPrefixLength() <= 32) {
+											gwtNetConfig.setSubnetMask(NetworkUtil.getNetmaskStringForm(addressConfig.getNetworkPrefixLength()));
+										} else {
+											if(addressConfig.getNetmask() != null) {
+												gwtNetConfig.setSubnetMask(addressConfig.getNetmask().getHostAddress());
+											} else {
+												gwtNetConfig.setSubnetMask("");
+											}
+										}
+										if(addressConfig.getGateway() != null) {
+											gwtNetConfig.setGateway(addressConfig.getGateway().getHostAddress());
+										} else {
+											gwtNetConfig.setGateway("");
+										}
+
+										// DHCP supplied DNS servers
+										StringBuffer sb = new StringBuffer();
+										List<? extends IPAddress> dnsServers = addressConfig.getDnsServers();
+										if(dnsServers != null && dnsServers.size() > 0) {
+											String sep = "";
+											for(IPAddress dnsServer : dnsServers) {
+												sb.append(sep).append(dnsServer.getHostAddress());
+												sep = "\n";
+											}
+
+											s_logger.debug("DNS Servers: " + sb.toString());
+											gwtNetConfig.setReadOnlyDnsServers(sb.toString());
+										} else {
+											s_logger.debug("DNS Servers: [empty String]");
+											gwtNetConfig.setReadOnlyDnsServers("");
+										}
+									} else {
+										gwtNetConfig.setConfigMode(GwtNetIfConfigMode.netIPv4ConfigModeManual.name());
+
+										//since STATIC - populate with configured values
+										//TODO - should we throw an error if current state doesn't match configuration?
+										if(((NetConfigIP4)netConfig).getAddress() != null) {										
+											gwtNetConfig.setIpAddress(((NetConfigIP4)netConfig).getAddress().getHostAddress());
+										} else {
+											gwtNetConfig.setIpAddress("");
+										}
+										if(((NetConfigIP4)netConfig).getSubnetMask() != null) {
+											gwtNetConfig.setSubnetMask(((NetConfigIP4)netConfig).getSubnetMask().getHostAddress());
+										} else {
+											gwtNetConfig.setSubnetMask("");
+										}
+										if(((NetConfigIP4)netConfig).getGateway() != null) {
+											s_logger.debug("Gateway for " + netIfConfig.getName() + " is: " + ((NetConfigIP4)netConfig).getGateway().getHostAddress());
+											gwtNetConfig.setGateway(((NetConfigIP4)netConfig).getGateway().getHostAddress());
+										} else {
+											gwtNetConfig.setGateway("");
+										}
+									}
+
+									// Custom DNS servers
+									StringBuffer sb = new StringBuffer();
+									List<IP4Address> dnsServers = ((NetConfigIP4)netConfig).getDnsServers();
+									if(dnsServers != null && dnsServers.size() > 0) {
+										String sep = "";
+										for(IP4Address dnsServer : dnsServers) {
+											if(!dnsServer.getHostAddress().equals("127.0.0.1")) {
+												sb.append(sep).append(dnsServer.getHostAddress());
+												sep = "\n";
+											}
+										}
+
+										s_logger.debug("DNS Servers: " + sb.toString());
+										gwtNetConfig.setDnsServers(sb.toString());
+									} else {
+										s_logger.debug("DNS Servers: [empty String]");
+										gwtNetConfig.setDnsServers("");
+									}
+
+									// Search domains
+									sb = new StringBuffer();
+									List<IP4Address> winsServers = ((NetConfigIP4)netConfig).getWinsServers();
+									if(winsServers != null && winsServers.size() > 0) {
+										for(IP4Address winServer : winsServers) {
+											sb.append(winServer.getHostAddress());
+											sb.append("\n");
+										}
+
+										s_logger.debug("Search Domains: " + sb.toString());
+										gwtNetConfig.setSearchDomains(sb.toString());
+									} else {
+										s_logger.debug("Search Domains: [empty String]");
+										gwtNetConfig.setSearchDomains("");
+									}
+								}
+
+								// The NetConfigIP4 section above should also apply for a wireless interface
+								// Note that this section is used to configure both a station config and an access point config
+								if(netConfig instanceof WifiConfig) {
+									s_logger.debug("Setting up WifiConfigIP4");
+									
+									WifiConfig wifiConfig = (WifiConfig) netConfig;									
+									GwtWifiConfig gwtWifiConfig = new GwtWifiConfig();
+
+									// mode
+									if (wifiConfig.getMode() == WifiMode.MASTER) {
+										gwtWifiConfig.setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.name());
+
+										// set as the access point config for this interface
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setAccessPointWifiConfig(gwtWifiConfig);
+									} else if (wifiConfig.getMode() == WifiMode.INFRA) {
+										gwtWifiConfig.setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeStation.name());
+
+										// set as the station config for this interface
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setStationWifiConfig(gwtWifiConfig);
+									} else if (wifiConfig.getMode() == WifiMode.ADHOC) {
+										gwtWifiConfig.setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeAdHoc.name());
+
+										// set as the adhoc config for this interface
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setAdhocWifiConfig(gwtWifiConfig);
+									}
+
+									// ssid
+									gwtWifiConfig.setWirelessSsid(wifiConfig.getSSID());
+
+                                    // driver
+                                    gwtWifiConfig.setDriver(wifiConfig.getDriver());
+
+									// security
+									if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA) {
+										gwtWifiConfig.setSecurity(GwtWifiSecurity.netWifiSecurityWPA.name());
+									} else if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA2) {
+										gwtWifiConfig.setSecurity(GwtWifiSecurity.netWifiSecurityWPA2.name());
+									} else if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WPA_WPA2) {
+										gwtWifiConfig.setSecurity(GwtWifiSecurity.netWifiSecurityWPA_WPA2.name());
+									} else if (wifiConfig.getSecurity() == WifiSecurity.SECURITY_WEP) {
+										gwtWifiConfig.setSecurity(GwtWifiSecurity.netWifiSecurityWEP.name());
+									} else {
+										gwtWifiConfig.setSecurity(GwtWifiSecurity.netWifiSecurityNONE.name());
+									}
+									
+									if (wifiConfig.getPairwiseCiphers() == WifiCiphers.CCMP_TKIP) {
+										gwtWifiConfig.setPairwiseCiphers(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name());
+									} else if (wifiConfig.getPairwiseCiphers() == WifiCiphers.TKIP) {
+										gwtWifiConfig.setPairwiseCiphers(GwtWifiCiphers.netWifiCiphers_TKIP.name());
+									} else if (wifiConfig.getPairwiseCiphers() == WifiCiphers.CCMP) {
+										gwtWifiConfig.setPairwiseCiphers(GwtWifiCiphers.netWifiCiphers_CCMP.name());
+									}
+									
+									if (wifiConfig.getGroupCiphers() == WifiCiphers.CCMP_TKIP) {
+										gwtWifiConfig.setGroupCiphers(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name());
+									} else if (wifiConfig.getGroupCiphers() == WifiCiphers.TKIP) {
+										gwtWifiConfig.setGroupCiphers(GwtWifiCiphers.netWifiCiphers_TKIP.name());
+									} else if (wifiConfig.getGroupCiphers() == WifiCiphers.CCMP) {
+										gwtWifiConfig.setGroupCiphers(GwtWifiCiphers.netWifiCiphers_CCMP.name());
+									}
+									
+									// bgscan
+									WifiBgscan wifiBgscan = wifiConfig.getBgscan();			
+									if (wifiBgscan != null) {
+										if (wifiBgscan.getModule() == WifiBgscanModule.NONE) {
+											gwtWifiConfig.setBgscanModule(GwtWifiBgscanModule.netWifiBgscanMode_NONE.name());
+										} else if (wifiBgscan.getModule() == WifiBgscanModule.SIMPLE) {
+											gwtWifiConfig.setBgscanModule(GwtWifiBgscanModule.netWifiBgscanMode_SIMPLE.name());
+										} else if (wifiBgscan.getModule() == WifiBgscanModule.LEARN) {
+											gwtWifiConfig.setBgscanModule(GwtWifiBgscanModule.netWifiBgscanMode_LEARN.name());
+										}
+										gwtWifiConfig.setBgscanRssiThreshold(wifiBgscan.getRssiThreshold());
+										gwtWifiConfig.setBgscanShortInterval(wifiBgscan.getShortInterval());
+										gwtWifiConfig.setBgscanLongInterval(wifiBgscan.getLongInterval());
+									}
+									
+									// ping access point?
+									gwtWifiConfig.setPingAccessPoint(wifiConfig.pingAccessPoint());
+									
+									// passkey
+									gwtWifiConfig.setPassword(wifiConfig.getPasskey());
+
+									// channel
+									int [] channels = wifiConfig.getChannels();
+									if(channels != null) {
+										ArrayList<Integer> alChannels = new ArrayList<Integer>();
+										for (int channel : channels) {
+											alChannels.add(new Integer(channel));
+										}
+										gwtWifiConfig.setChannels(alChannels);							
+									}
+									
+									// radio mode
+									GwtWifiRadioMode gwtWifiRadioMode = null;
+									if(wifiConfig.getRadioMode() != null) {
+    									switch(wifiConfig.getRadioMode()) {
+    									case RADIO_MODE_80211a:
+    									    gwtWifiRadioMode = GwtWifiRadioMode.netWifiRadioModeA;
+    									    break;
+                                        case RADIO_MODE_80211b:
+                                            gwtWifiRadioMode = GwtWifiRadioMode.netWifiRadioModeB;
+                                            break;
+                                        case RADIO_MODE_80211g:
+                                            gwtWifiRadioMode = GwtWifiRadioMode.netWifiRadioModeBG;
+                                            break;
+                                        case RADIO_MODE_80211nHT20:
+                                        case RADIO_MODE_80211nHT40above:
+                                        case RADIO_MODE_80211nHT40below:
+                                            gwtWifiRadioMode = GwtWifiRadioMode.netWifiRadioModeBGN;
+                                            break;
+                                        default:
+                                            break;
+    									}
+									}
+									if (gwtWifiRadioMode != null) {
+										gwtWifiConfig.setRadioMode(gwtWifiRadioMode.name());
+									}
+
+									// set the currently active mode based on the address config
+									WifiMode activeWirelessMode = ((WifiInterfaceAddressConfig)addressConfig).getMode();
+									if (activeWirelessMode == WifiMode.MASTER) {
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.name());
+									} else if (activeWirelessMode == WifiMode.INFRA) {
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeStation.name());
+									} else if (activeWirelessMode == WifiMode.ADHOC) {
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeAdHoc.name());
+									} else {
+										((GwtWifiNetInterfaceConfig)gwtNetConfig).setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeDisabled.name());
+									}
+								}
+								
+								if(netConfig instanceof ModemConfig) {
+									s_logger.debug("Setting up ModemConfig");
+									
+									ModemConfig modemConfig = (ModemConfig) netConfig;									
+									GwtModemInterfaceConfig gwtModemConfig = (GwtModemInterfaceConfig) gwtNetConfig;
+									
+									gwtModemConfig.setHwSerial(((ModemInterface)netIfConfig).getSerialNumber());
+
+                                    // set as DHCP - populate current address
+									gwtModemConfig.setConfigMode(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name());
+                                    if(addressConfig.getAddress() != null) {
+                                        gwtModemConfig.setIpAddress(addressConfig.getAddress().getHostAddress());
+                                    }
+                                    if(addressConfig.getNetmask() != null) {
+                                        gwtModemConfig.setSubnetMask(addressConfig.getNetmask().getHostAddress());
+                                    }
+									
+									gwtModemConfig.setDialString(modemConfig.getDialString());
+									
+									AuthType authType = modemConfig.getAuthType();
+									if (authType == AuthType.AUTO) {
+										gwtModemConfig.setAuthType(GwtModemAuthType.netModemAuthAUTO);
+									} else if(authType == AuthType.CHAP) {
+										gwtModemConfig.setAuthType(GwtModemAuthType.netModemAuthCHAP);
+									} else if(authType == AuthType.PAP) {
+										gwtModemConfig.setAuthType(GwtModemAuthType.netModemAuthPAP);
+									} else {
+										gwtModemConfig.setAuthType(GwtModemAuthType.netModemAuthNONE);
+									}
+
+									gwtModemConfig.setUsername(modemConfig.getUsername());
+									
+									gwtModemConfig.setPassword(modemConfig.getPassword());
+                                    
+                                    gwtModemConfig.setPppNum(modemConfig.getPppNumber());
+                                    
+                                    gwtModemConfig.setLcpEchoInterval(modemConfig.getLcpEchoInterval());
+                                    
+                                    gwtModemConfig.setLcpEchoFailure(modemConfig.getLcpEchoFailure());
+                                    
+                                    gwtModemConfig.setGpsEnabled(modemConfig.isGpsEnabled());
+									
+									gwtModemConfig.setProfileID(modemConfig.getProfileID());
+                                    
+									PdpType pdpType = modemConfig.getPdpType();
+									if(pdpType == PdpType.IP) {
+										gwtModemConfig.setPdpType(GwtModemPdpType.netModemPdpIP);
+									} else if(pdpType == PdpType.PPP) {
+										gwtModemConfig.setPdpType(GwtModemPdpType.netModemPdpPPP);
+									} else if(pdpType == PdpType.IPv6) {
+										gwtModemConfig.setPdpType(GwtModemPdpType.netModemPdpIPv6);
+									} else {
+									    gwtModemConfig.setPdpType(GwtModemPdpType.netModemPdpUnknown);
+									}
+									
+									gwtModemConfig.setApn(modemConfig.getApn());
+									
+									gwtModemConfig.setDataCompression(modemConfig.getDataCompression());
+									
+									gwtModemConfig.setHeaderCompression(modemConfig.getHeaderCompression());
+                                    
+                                    ModemConnectionStatus connectionStatus = ((ModemInterfaceAddressConfig)addressConfig).getConnectionStatus();
+                                    if(connectionStatus == ModemConnectionStatus.DISCONNECTED) {
+                                        gwtModemConfig.setHwState(NetInterfaceState.DISCONNECTED.name());
+                                    } else if(connectionStatus == ModemConnectionStatus.CONNECTING) {
+                                        gwtModemConfig.setHwState(NetInterfaceState.IP_CONFIG.name());
+                                    } else if(connectionStatus == ModemConnectionStatus.CONNECTED) {
+                                        gwtModemConfig.setHwState(NetInterfaceState.ACTIVATED.name());
+                                    } else {
+                                        gwtModemConfig.setHwState(NetInterfaceState.UNKNOWN.name());
+                                    }
+                                    
+                                    gwtModemConfig.setConnectionType(((ModemInterfaceAddressConfig)addressConfig).getConnectionType().name());
+								}
+
+								if(netConfig instanceof DhcpServerConfigIP4) {									
+									s_logger.debug("Setting up DhcpServerConfigIP4: " + ((DhcpServerConfigIP4) netConfig).getRangeStart().getHostAddress() + " to " + ((DhcpServerConfigIP4) netConfig).getRangeEnd().getHostAddress());
+									s_logger.debug("Setting up DhcpServerConfigIP4: " + ((DhcpServerConfigIP4) netConfig).toString());
+									
+									isDhcpServerEnabled = ((DhcpServerConfigIP4) netConfig).isEnabled();
+
+									gwtNetConfig.setRouterDhcpBeginAddress(((DhcpServerConfigIP4) netConfig).getRangeStart().getHostAddress());
+									gwtNetConfig.setRouterDhcpEndAddress(((DhcpServerConfigIP4) netConfig).getRangeEnd().getHostAddress());
+									gwtNetConfig.setRouterDhcpSubnetMask(((DhcpServerConfigIP4) netConfig).getSubnetMask().getHostAddress());
+									gwtNetConfig.setRouterDhcpDefaultLease(((DhcpServerConfigIP4) netConfig).getDefaultLeaseTime());
+									gwtNetConfig.setRouterDhcpMaxLease(((DhcpServerConfigIP4) netConfig).getMaximumLeaseTime());
+									gwtNetConfig.setRouterDnsPass(((DhcpServerConfigIP4) netConfig).isPassDns());
+								}
+
+								if(netConfig instanceof FirewallNatConfig) {
+									s_logger.debug("Setting up FirewallNatConfig");
+									
+									isNatEnabled = true;
+								}
+
+								//TODO - only dealing with IPv4 right now
+							}
+							
+							//set up the DHCP and NAT config
+							if(isDhcpServerEnabled && isNatEnabled) {
+								s_logger.debug("setting router mode to DHCP and NAT");
+								gwtNetConfig.setRouterMode(GwtNetRouterMode.netRouterDchpNat.name());
+							} else if(isDhcpServerEnabled && !isNatEnabled) {
+								s_logger.debug("setting router mode to DHCP only");
+								gwtNetConfig.setRouterMode(GwtNetRouterMode.netRouterDchp.name());
+							} else if(!isDhcpServerEnabled && isNatEnabled) {
+								s_logger.debug("setting router mode to NAT only");
+								gwtNetConfig.setRouterMode(GwtNetRouterMode.netRouterNat.name());
+							} else {
+								s_logger.debug("setting router mode to disabled");
+								gwtNetConfig.setRouterMode(GwtNetRouterMode.netRouterOff.name());
+							}
+						}
+					}
+				}
+				
+				gwtNetConfigs.add(gwtNetConfig);
+			}
+		} 
+		catch (Throwable t) {
+			KuraExceptionHandler.handle(t);
+		}
+		
+		s_logger.debug("Returning");
+		return new BaseListLoadResult<GwtNetInterfaceConfig>(gwtNetConfigs);
+	}
+
+
+	
+	public void updateNetInterfaceConfigurations(GwtNetInterfaceConfig config) 
+		throws GwtKuraException 
+	{		
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		
+		s_logger.debug("config.getStatus(): " + config.getStatus());
+		
+		boolean autoConnect = true;
+		if(GwtNetIfStatus.netIPv4StatusDisabled.name().equals(config.getStatus())) {
+			autoConnect = false;
+		}
+		
+		try {
+			// Interface status
+			NetInterfaceStatus netInterfaceStatus = null;
+			if(config.getStatus().equals(GwtNetIfStatus.netIPv4StatusDisabled.name())) {
+				netInterfaceStatus = NetInterfaceStatus.netIPv4StatusDisabled;
+			} else if(config.getStatus().equals(GwtNetIfStatus.netIPv4StatusEnabledLAN.name())) {
+				netInterfaceStatus = NetInterfaceStatus.netIPv4StatusEnabledLAN;
+			} else if(config.getStatus().equals(GwtNetIfStatus.netIPv4StatusEnabledWAN.name())) {
+				netInterfaceStatus = NetInterfaceStatus.netIPv4StatusEnabledWAN;
+			}
+			
+			
+			//Set up configs
+			List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+
+			// Initialize NetConfigIP4 object
+			NetConfigIP4 netConfig4 = new NetConfigIP4(netInterfaceStatus, autoConnect);
+			
+			//build the appropriate NetConfig objects for ethernet type
+			if(config.getHwTypeEnum() == GwtNetIfType.ETHERNET ||
+					config.getHwTypeEnum() == GwtNetIfType.WIFI ||
+					config.getHwTypeEnum() == GwtNetIfType.MODEM) {
+				
+				s_logger.debug("config.getConfigMode(): " + config.getConfigMode());
+                String regexp = "[\\s,;\\n\\t]+";
+								
+				if(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name().equals(config.getConfigMode())) {
+					s_logger.debug("mode is DHCP");
+					netConfig4.setDhcp(true);
+				} else {
+					s_logger.debug("mode is STATIC");
+					netConfig4.setDhcp(false);
+					
+					if(config.getIpAddress() != null && !config.getIpAddress().isEmpty()) {
+						s_logger.debug("setting address: " + config.getIpAddress());
+						netConfig4.setAddress((IP4Address) IPAddress.parseHostAddress(config.getIpAddress()));
+					}
+					
+					if(config.getSubnetMask() != null && !config.getSubnetMask().isEmpty()) {
+						s_logger.debug("setting subnet mask: " + config.getSubnetMask());
+						netConfig4.setSubnetMask((IP4Address) IPAddress.parseHostAddress(config.getSubnetMask()));
+					}
+					if(config.getGateway() != null && !config.getGateway().isEmpty()) {
+						s_logger.debug("setting gateway: " + config.getGateway());
+						netConfig4.setGateway((IP4Address) IPAddress.parseHostAddress(config.getGateway()));
+					}
+					
+					String[] winServersString = config.getSearchDomains().split(regexp);
+	                if(winServersString != null && winServersString.length > 0) {
+	                    IP4Address winServer;
+	                    List<IP4Address> dnsServers = new ArrayList<IP4Address>();
+	                    for (String winsEntry : winServersString) {
+	                        if(!winsEntry.trim().isEmpty()) {
+	                        	s_logger.debug("setting WINs: " + winsEntry);
+	                            winServer = (IP4Address) IPAddress.parseHostAddress(winsEntry);
+	                            dnsServers.add(winServer);
+	                        }
+	                    }
+	                    netConfig4.setDnsServers(dnsServers);
+	                }
+				}
+				
+                String[] dnsServersString = config.getDnsServers().split(regexp);
+                if(dnsServersString != null && dnsServersString.length > 0) {
+                    IP4Address dnsServer;
+                    List<IP4Address> dnsServers = new ArrayList<IP4Address>();
+                    for (String dnsEntry : dnsServersString) {
+                        if(!dnsEntry.trim().isEmpty()) {
+                        	s_logger.debug("setting DNS: " + dnsEntry);
+                            dnsServer = (IP4Address) IPAddress.parseHostAddress(dnsEntry);
+                            dnsServers.add(dnsServer);
+                        }
+                    }
+                    netConfig4.setDnsServers(dnsServers);
+                }
+
+				netConfigs.add(netConfig4);
+				
+				//TODO - add IPv6 support later...
+			
+				//Set up DHCP and NAT
+				if(!GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name().equals(config.getConfigMode())) {
+					List<NetConfig> dhcpConfigs = getDhcpConfig(config); // <-- 
+					if(dhcpConfigs != null) {
+						s_logger.debug("Adding dhcp and/or nat configs to interface update config");
+						netConfigs.addAll(dhcpConfigs);
+					}
+				}
+				
+				List<FirewallReverseNatConfig> reverseNatConfigs = getReverseNatConfig(config);
+				//if ((reverseNatConfigs != null) && (reverseNatConfigs.size() > 0)) {
+				if (reverseNatConfigs != null) {
+					s_logger.debug("Adding reverse nat configs to interface update config");
+					nas.setFirewallReverseNatConfiguration(config.getName(), reverseNatConfigs);
+				}
+				
+				if(config.getHwTypeEnum() == GwtNetIfType.ETHERNET) {
+					nas.updateEthernetInterfaceConfig(config.getName(), autoConnect, config.getHwMTU(), netConfigs);
+				}
+			}
+			
+			if(config.getHwTypeEnum() == GwtNetIfType.WIFI) {
+				
+				if (config instanceof GwtWifiNetInterfaceConfig) {
+					//WifiConfig wifiConfig = new WifiConfig();					
+					GwtWifiConfig gwtWifiConfig = ((GwtWifiNetInterfaceConfig) config).getActiveWifiConfig();
+
+					if(gwtWifiConfig != null) {
+						gwtWifiConfig.setWirelessMode(((GwtWifiNetInterfaceConfig)config).getWirelessMode());
+						WifiConfig wifiConfig = this.getWifiConfig(gwtWifiConfig);
+						netConfigs.add(wifiConfig);
+						nas.updateWifiInterfaceConfig(config.getName(), autoConnect, null, netConfigs);
+					}
+				}
+			} else if(config.getHwTypeEnum() == GwtNetIfType.MODEM) {
+				if (config instanceof GwtModemInterfaceConfig) {
+					GwtModemInterfaceConfig gwtModemConfig = (GwtModemInterfaceConfig) config;
+					
+					ModemConfig modemConfig = new ModemConfig();
+
+					String serialNum = gwtModemConfig.getHwSerial();
+					String modemId = gwtModemConfig.getModemId();
+					int pppNum = gwtModemConfig.getPppNum();
+					
+					// modem enabled/disabled
+				    if(netInterfaceStatus.equals(NetInterfaceStatus.netIPv4StatusEnabledWAN)) {
+					    modemConfig.setEnabled(true);
+					} else {
+					    modemConfig.setEnabled(false);
+					}
+					
+					modemConfig.setApn(gwtModemConfig.getApn());
+					modemConfig.setPppNumber(gwtModemConfig.getPppNum());
+					modemConfig.setDataCompression(gwtModemConfig.getDataCompression());
+					modemConfig.setDialString(gwtModemConfig.getDialString());
+					modemConfig.setHeaderCompression(gwtModemConfig.getHeaderCompression());
+					modemConfig.setPassword(gwtModemConfig.getPassword());
+					modemConfig.setUsername(gwtModemConfig.getUsername());
+					modemConfig.setLcpEchoInterval(gwtModemConfig.getLcpEchoInterval());
+					modemConfig.setLcpEchoFailure(gwtModemConfig.getLcpEchoFailure());
+					modemConfig.setGpsEnabled(gwtModemConfig.isGpsEnabled());
+					
+					GwtModemAuthType authType = gwtModemConfig.getAuthType();
+					if (authType != null) {
+						if (authType.equals(GwtModemAuthType.netModemAuthNONE)) {
+							modemConfig.setAuthType(ModemConfig.AuthType.NONE);
+						} else if (authType.equals(GwtModemAuthType.netModemAuthAUTO)) {
+							modemConfig.setAuthType(ModemConfig.AuthType.AUTO);
+						} else if (authType.equals(GwtModemAuthType.netModemAuthCHAP)) {
+							modemConfig.setAuthType(ModemConfig.AuthType.CHAP);
+						} else if (authType.equals(GwtModemAuthType.netModemAuthPAP)) {
+							modemConfig.setAuthType(ModemConfig.AuthType.PAP);
+						}
+					}
+					
+					GwtModemPdpType pdpType = gwtModemConfig.getPdpType();
+					if (pdpType != null) {
+						if (pdpType.equals(GwtModemPdpType.netModemPdpIP)) {
+							modemConfig.setPdpType(ModemConfig.PdpType.IP);
+						} else if (pdpType.equals(GwtModemPdpType.netModemPdpIPv6)) {
+							modemConfig.setPdpType(ModemConfig.PdpType.IPv6);
+						} else if (pdpType.equals(GwtModemPdpType.netModemPdpPPP)) {
+							modemConfig.setPdpType(ModemConfig.PdpType.PPP);
+						} else {
+						    modemConfig.setPdpType(ModemConfig.PdpType.UNKNOWN);
+						}
+					}
+					
+					netConfigs.add(modemConfig);
+					
+					nas.updateModemInterfaceConfig(config.getName(), serialNum, modemId, pppNum, autoConnect, -1, netConfigs);
+				}
+			} else {
+				//TODO - more types
+			}
+
+			
+		} catch(Exception e) {
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	
+	public ListLoadResult<GwtFirewallOpenPortEntry> findDeviceFirewallOpenPorts() throws GwtKuraException 
+	{
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		List<GwtFirewallOpenPortEntry> gwtOpenPortEntries = new ArrayList<GwtFirewallOpenPortEntry>();
+		
+		try {
+			List<NetConfig> firewallConfigs = nas.getFirewallConfiguration();
+			if(firewallConfigs != null && firewallConfigs.size() > 0) {
+				for(NetConfig netConfig : firewallConfigs) {
+					if(netConfig instanceof FirewallOpenPortConfigIP4) {
+						s_logger.debug("adding new Open Port Entry: " + ((FirewallOpenPortConfigIP4) netConfig).getPort());
+						GwtFirewallOpenPortEntry entry = new GwtFirewallOpenPortEntry();
+						entry.setPort(((FirewallOpenPortConfigIP4) netConfig).getPort());
+						entry.setProtocol(((FirewallOpenPortConfigIP4) netConfig).getProtocol().toString());
+						entry.setPermittedNetwork(((FirewallOpenPortConfigIP4) netConfig).getPermittedNetwork().getIpAddress().getHostAddress() + "/" + ((FirewallOpenPortConfigIP4) netConfig).getPermittedNetwork().getPrefix());
+						entry.setPermittedInterfaceName(((FirewallOpenPortConfigIP4) netConfig).getPermittedInterfaceName());
+						entry.setUnpermittedInterfaceName(((FirewallOpenPortConfigIP4) netConfig).getUnpermittedInterfaceName());
+						entry.setPermittedMAC(((FirewallOpenPortConfigIP4) netConfig).getPermittedMac());
+						entry.setSourcePortRange(((FirewallOpenPortConfigIP4) netConfig).getSourcePortRange());
+						
+						gwtOpenPortEntries.add(entry);
+					}
+				}
+			}
+			
+			return new BaseListLoadResult<GwtFirewallOpenPortEntry>(gwtOpenPortEntries);
+			
+		} catch (KuraException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public ListLoadResult<GwtWifiHotspotEntry> findWifiHotspots(String interfaceName) throws GwtKuraException {
+		
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		List<GwtWifiHotspotEntry> gwtWifiHotspotsEntries = new ArrayList<GwtWifiHotspotEntry>();
+
+		try {
+			Map<String, WifiHotspotInfo> wifiHotspotInfoMap = nas.getWifiHotspots(interfaceName);
+			if ((wifiHotspotInfoMap != null) && (!wifiHotspotInfoMap.isEmpty())) {
+				Collection<WifiHotspotInfo> wifiHotspotInfoCollection = wifiHotspotInfoMap.values();
+				Iterator<WifiHotspotInfo> it = wifiHotspotInfoCollection.iterator();
+				while (it.hasNext()) {
+					WifiHotspotInfo wifiHotspotInfo = it.next();
+					GwtWifiHotspotEntry gwtWifiHotspotEntry = new GwtWifiHotspotEntry();
+					gwtWifiHotspotEntry.setMacAddress(wifiHotspotInfo.getMacAddress());
+					gwtWifiHotspotEntry.setSSID(wifiHotspotInfo.getSsid());
+					gwtWifiHotspotEntry.setsignalStrength(wifiHotspotInfo.getSignalLevel());
+					gwtWifiHotspotEntry.setChannel(wifiHotspotInfo.getChannel());
+					gwtWifiHotspotEntry.setFrequency(wifiHotspotInfo.getFrequency());
+					
+					if ((wifiHotspotInfo.getSecurity() == WifiSecurity.NONE)
+							|| (wifiHotspotInfo.getSecurity() == WifiSecurity.SECURITY_NONE)) {
+						gwtWifiHotspotEntry.setSecurity("None");
+					} else if (wifiHotspotInfo.getSecurity() == WifiSecurity.SECURITY_WEP) {
+						gwtWifiHotspotEntry.setSecurity("WEP");
+					} else if (wifiHotspotInfo.getSecurity() == WifiSecurity.SECURITY_WPA) {
+						gwtWifiHotspotEntry.setSecurity("WPA");
+					} else if (wifiHotspotInfo.getSecurity() == WifiSecurity.SECURITY_WPA2) {
+						gwtWifiHotspotEntry.setSecurity("WPA2");
+					} else if (wifiHotspotInfo.getSecurity() == WifiSecurity.SECURITY_WPA_WPA2) {
+						gwtWifiHotspotEntry.setSecurity("WPA/WPA2");
+					}
+					gwtWifiHotspotsEntries.add(gwtWifiHotspotEntry);
+				}
+			}
+		} catch (Throwable t) {
+			t.printStackTrace();
+			KuraExceptionHandler.handle(t);
+		}
+		
+		return new BaseListLoadResult<GwtWifiHotspotEntry>(gwtWifiHotspotsEntries);
+	}
+
+	public boolean verifyWifiCredentials(String interfaceName, GwtWifiConfig gwtWifiConfig) throws GwtKuraException {
+		
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		WifiConfig wifiConfig = getWifiConfig(gwtWifiConfig);
+		boolean status = nas.verifyWifiCredentials(interfaceName, wifiConfig, 60);
+		return status;
+	}
+		
+	public ListLoadResult<GwtReverseNatEntry> findReverseNatConfigurations(String sourceIface) throws GwtKuraException {
+		
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		List<GwtReverseNatEntry> gwtReverseNatEntries = new ArrayList<GwtReverseNatEntry>();
+		
+		try {
+			List<FirewallReverseNatConfig> firewallReverseNatConfigs = nas.getFirewallReverseNatConfiguration(sourceIface);
+			
+			for (FirewallReverseNatConfig firewallReverseNatConfig : firewallReverseNatConfigs) {
+				GwtReverseNatEntry gwtReverseNatEntry = new GwtReverseNatEntry();
+				gwtReverseNatEntry.setOutInterface(firewallReverseNatConfig.getDestinationInterface());
+				gwtReverseNatEntry.setProtocol(firewallReverseNatConfig.getProtocol());
+				gwtReverseNatEntry.setSourceNetwork(firewallReverseNatConfig.getSource());
+				gwtReverseNatEntry.setDestinationNetwork(firewallReverseNatConfig.getDestination());
+				gwtReverseNatEntries.add(gwtReverseNatEntry);
+			}
+		} catch (KuraException e) {
+			e.printStackTrace();
+		}
+		
+		return new BaseListLoadResult<GwtReverseNatEntry>(gwtReverseNatEntries);
+	}
+	
+	public ListLoadResult<GwtFirewallPortForwardEntry> findDeviceFirewallPortForwards() throws GwtKuraException 
+	{
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		List<GwtFirewallPortForwardEntry> gwtPortForwardEntries = new ArrayList<GwtFirewallPortForwardEntry>();
+		
+		try {
+			List<NetConfig> firewallConfigs = nas.getFirewallConfiguration();
+			if(firewallConfigs != null && firewallConfigs.size() > 0) {
+				for(NetConfig netConfig : firewallConfigs) {
+					if(netConfig instanceof FirewallPortForwardConfigIP4) {
+						s_logger.debug("adding new Port Forward Entry");
+						GwtFirewallPortForwardEntry entry = new GwtFirewallPortForwardEntry();
+						entry.setInterfaceName(((FirewallPortForwardConfigIP4) netConfig).getInterfaceName());
+						entry.setAddress(((FirewallPortForwardConfigIP4) netConfig).getAddress().getHostAddress());
+						entry.setProtocol(((FirewallPortForwardConfigIP4) netConfig).getProtocol().toString());
+						entry.setInPort(((FirewallPortForwardConfigIP4) netConfig).getInPort());
+						entry.setOutPort(((FirewallPortForwardConfigIP4) netConfig).getOutPort());
+						entry.setPermittedNetwork(((FirewallPortForwardConfigIP4) netConfig).getPermittedNetwork().toString());
+						entry.setPermittedMAC(((FirewallPortForwardConfigIP4) netConfig).getPermittedMac());
+						entry.setSourcePortRange(((FirewallPortForwardConfigIP4) netConfig).getSourcePortRange());
+						
+						gwtPortForwardEntries.add(entry);
+					}
+				}
+			}
+			
+			return new BaseListLoadResult<GwtFirewallPortForwardEntry>(gwtPortForwardEntries);
+			
+		} catch (KuraException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+
+	
+	// -------------------------------------------------------------------------------------
+	// 
+	//   Private Methods
+	//
+	// -------------------------------------------------------------------------------------
+
+	private List<NetConfig> getDhcpConfig(GwtNetInterfaceConfig config) throws KuraException 
+	{
+		//Setup the DHCP and NAT if necessary
+		String routerMode = config.getRouterMode();
+		if(routerMode.equals(GwtNetRouterMode.netRouterOff.name())) {
+			s_logger.debug("DCHP and NAT are disabled");
+			return null;
+		} else if(routerMode.equals(GwtNetRouterMode.netRouterDchp.name()) || routerMode.equals(GwtNetRouterMode.netRouterDchpNat.name()) || routerMode.equals(GwtNetRouterMode.netRouterNat.name())) {
+				try {
+					List<NetConfig> netConfigs = new ArrayList<NetConfig>();
+
+					if(routerMode.equals(GwtNetRouterMode.netRouterDchp.name()) || routerMode.equals(GwtNetRouterMode.netRouterDchpNat.name())) {
+						int defaultLeaseTime = config.getRouterDhcpDefaultLease();
+						int maximumLeaseTime = config.getRouterDhcpMaxLease();
+						IP4Address routerAddress = (IP4Address) IPAddress.parseHostAddress(config.getIpAddress());
+						IP4Address rangeStart = (IP4Address) IPAddress.parseHostAddress(config.getRouterDhcpBeginAddress());
+						IP4Address rangeEnd = (IP4Address) IPAddress.parseHostAddress(config.getRouterDhcpEndAddress());
+						boolean passDns = config.getRouterDnsPass();
+
+						IP4Address subnetMask = (IP4Address) IPAddress.parseHostAddress(config.getRouterDhcpSubnetMask());
+						IP4Address subnet = (IP4Address) IPAddress.parseHostAddress(NetworkUtil.calculateNetwork(config.getIpAddress(), config.getSubnetMask()));						
+						short prefix = NetworkUtil.getNetmaskShortForm(subnetMask.getHostAddress());
+						
+						//Use our IP as the DNS server and we'll use named to proxy DNS queries
+						List<IP4Address> dnsServers = new ArrayList<IP4Address>();
+						dnsServers.add((IP4Address) IPAddress.parseHostAddress(config.getIpAddress()));
+
+						s_logger.debug("DhcpServerConfigIP4 - start:" + rangeStart.getHostAddress() + ", end:" + rangeEnd.getHostAddress() + ", prefix:" + prefix + ", subnet:" + subnet.getHostAddress() + ", subnetMask:" + subnetMask.getHostAddress());
+						DhcpServerConfigIP4 dhcpServerConfigIP4 = new DhcpServerConfigIP4(config.getName(), true, subnet, routerAddress, subnetMask, defaultLeaseTime, maximumLeaseTime,
+																						prefix, rangeStart, rangeEnd, passDns, dnsServers);
+								
+						netConfigs.add(dhcpServerConfigIP4);
+					}
+
+					if(routerMode.equals(GwtNetRouterMode.netRouterDchpNat.name()) || routerMode.equals(GwtNetRouterMode.netRouterNat.name())) {
+
+						/*
+                                IPAddress m_sourceNetwork;                      //192.168.1.0
+                                IPAddress m_netmask;                            //255.255.255.0
+                                String m_sourceInterface;                       //eth0
+                                String m_destinationInterface;          		//ppp0 or something similar
+                                boolean m_masquerade;                           //yes
+						 */
+
+						String sourceInterface = config.getName();
+						String destinationInterface = "unknown";                        //dynamic and defined at runtime
+						boolean masquerade = true;
+
+						FirewallNatConfig natConfig = new FirewallNatConfig(sourceInterface, destinationInterface, masquerade);
+						netConfigs.add(natConfig);
+					}
+
+					return netConfigs;
+				} catch(Exception e) {
+					throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, e);
+				}
+		} else {
+			s_logger.error("Unsupported routerMode: " + routerMode);
+			throw new KuraException(KuraErrorCode.CONFIGURATION_ERROR, "Unsupported routerMode: " + routerMode);
+		}
+	}
+
+	private List<FirewallReverseNatConfig> getReverseNatConfig(GwtNetInterfaceConfig config) throws KuraException {
+		
+		List<FirewallReverseNatConfig> firewallNatConfigs = new ArrayList<FirewallReverseNatConfig>();
+		GwtReverseNatEntries reverseNatEntries = config.getReverseNatEntries();
+		
+		if ((reverseNatEntries != null) && (reverseNatEntries.getNumberOfEntries() > 0)) {
+			List<GwtReverseNatEntry> list = reverseNatEntries.getEntries();
+			if ((list != null) && (list.size() > 0)) {
+				// firewallNatConfigs = new ArrayList<FirewallReverseNatConfig>();
+				for (GwtReverseNatEntry en : list) {
+					FirewallReverseNatConfig natConfig = new FirewallReverseNatConfig(
+							config.getName(), en.getOutInterface(), en.getProtocol(),
+							en.getSourceNetwork(), en.getDestinationNetwork());
+					
+					firewallNatConfigs.add(natConfig);
+				}
+			}
+		}
+		return firewallNatConfigs;
+	}
+
+	public void updateDeviceFirewallOpenPorts( List<GwtFirewallOpenPortEntry> entries) throws GwtKuraException {
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		List<FirewallOpenPortConfigIP<? extends IPAddress>> firewallOpenPortConfigIPs = new ArrayList<FirewallOpenPortConfigIP<? extends IPAddress>>();
+		s_logger.debug("updating open ports");
+		
+		try {
+			for(GwtFirewallOpenPortEntry entry : entries) {
+				String network = null;
+				String prefix = null;
+				
+				if(entry.getPermittedNetwork() != null) {
+					String[] parts = entry.getPermittedNetwork().split("/");
+					network = parts[0];
+					prefix = parts[1];
+				}
+				
+				FirewallOpenPortConfigIP<IP4Address> firewallOpenPortConfigIP = new FirewallOpenPortConfigIP4();
+				firewallOpenPortConfigIP.setPort(entry.getPort());
+				firewallOpenPortConfigIP.setProtocol(NetProtocol.valueOf(entry.getProtocol()));
+				if(network != null && prefix != null) {
+					firewallOpenPortConfigIP.setPermittedNetwork(new NetworkPair<IP4Address>((IP4Address)IPAddress.parseHostAddress(network), Short.parseShort(prefix)));
+				}
+				firewallOpenPortConfigIP.setPermittedInterfaceName(entry.getPermittedInterfaceName());
+				firewallOpenPortConfigIP.setUnpermittedInterfaceName(entry.getUnpermittedInterfaceName());
+				firewallOpenPortConfigIP.setPermittedMac(entry.getPermittedMAC());
+				firewallOpenPortConfigIP.setSourcePortRange(entry.getSourcePortRange());
+				
+				s_logger.debug("adding open port entry for " + entry.getPort());
+				firewallOpenPortConfigIPs.add(firewallOpenPortConfigIP);
+			}
+			
+			nas.setFirewallOpenPortConfiguration(firewallOpenPortConfigIPs);
+		} catch (KuraException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		} catch (NumberFormatException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		} catch (UnknownHostException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+
+
+	public void updateDeviceFirewallPortForwards(List<GwtFirewallPortForwardEntry> entries) throws GwtKuraException {
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		List<FirewallPortForwardConfigIP<? extends IPAddress>> firewallPortForwardConfigIPs = new ArrayList<FirewallPortForwardConfigIP<? extends IPAddress>>();
+		s_logger.debug("updating port forward entries");
+		
+		try {
+			for(GwtFirewallPortForwardEntry entry : entries) {
+				String network = null;
+				String prefix = null;
+				
+				if(entry.getPermittedNetwork() != null) {
+					String[] parts = entry.getPermittedNetwork().split("/");
+					network = parts[0];
+					prefix = parts[1];
+				}
+				
+				FirewallPortForwardConfigIP<IP4Address> firewallPortForwardConfigIP = new FirewallPortForwardConfigIP4();
+				firewallPortForwardConfigIP.setInterfaceName(entry.getInterfaceName());
+				firewallPortForwardConfigIP.setAddress((IP4Address) IPAddress.parseHostAddress(entry.getAddress()));
+				firewallPortForwardConfigIP.setProtocol(NetProtocol.valueOf(entry.getProtocol()));
+				firewallPortForwardConfigIP.setInPort(entry.getInPort());
+				firewallPortForwardConfigIP.setOutPort(entry.getOutPort());
+				if(network != null && prefix != null) {
+					firewallPortForwardConfigIP.setPermittedNetwork(new NetworkPair<IP4Address>((IP4Address)IPAddress.parseHostAddress(network), Short.parseShort(prefix)));
+				}
+				firewallPortForwardConfigIP.setPermittedMac(entry.getPermittedMAC());
+				firewallPortForwardConfigIP.setSourcePortRange(entry.getSourcePortRange());
+				
+				s_logger.debug("adding port forward entry for " + entry.getInterfaceName() + " " + entry.getInPort());
+				firewallPortForwardConfigIPs.add(firewallPortForwardConfigIP);
+			}
+			
+			nas.setFirewallPortForwardingConfiguration(firewallPortForwardConfigIPs);
+		} catch (KuraException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		} catch (NumberFormatException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		} catch (UnknownHostException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	public void renewDhcpLease(String interfaceName) throws GwtKuraException {
+		NetworkAdminService nas = ServiceLocator.getInstance().getService(NetworkAdminService.class);
+		try {
+			nas.renewDhcpLease(interfaceName);
+		} catch (KuraException e) {
+			e.printStackTrace();
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	private WifiConfig getWifiConfig(GwtWifiConfig gwtWifiConfig) {
+		
+		WifiConfig wifiConfig = null;
+		if (gwtWifiConfig != null) {
+			
+			wifiConfig = new WifiConfig();		
+			String mode = gwtWifiConfig.getWirelessMode();
+			if (mode != null && mode.equals(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint.name())) {
+				wifiConfig.setMode(WifiMode.MASTER);
+			} else if (mode != null && mode.equals(GwtWifiWirelessMode.netWifiWirelessModeStation.name())) {
+				wifiConfig.setMode(WifiMode.INFRA);						
+			} else if (mode != null && mode.equals(GwtWifiWirelessMode.netWifiWirelessModeAdHoc.name())) {
+				wifiConfig.setMode(WifiMode.ADHOC);
+			} else {
+				wifiConfig.setMode(WifiMode.UNKNOWN);
+			}
+	        
+	        // ssid
+	        wifiConfig.setSSID(gwtWifiConfig.getWirelessSsid());
+			
+			// driver
+			wifiConfig.setDriver(gwtWifiConfig.getDriver());
+			
+			// radio mode
+			GwtWifiRadioMode radioMode = (gwtWifiConfig.getRadioModeEnum());
+			if (radioMode == GwtWifiRadioMode.netWifiRadioModeA) {
+			    wifiConfig.setRadioMode(WifiRadioMode.RADIO_MODE_80211a);
+				wifiConfig.setHardwareMode("a");
+			} else if (radioMode.equals(GwtWifiRadioMode.netWifiRadioModeB)) {
+			    wifiConfig.setRadioMode(WifiRadioMode.RADIO_MODE_80211b);
+				wifiConfig.setHardwareMode("b");
+			} else if (radioMode.equals(GwtWifiRadioMode.netWifiRadioModeBG)) {
+			    wifiConfig.setRadioMode(WifiRadioMode.RADIO_MODE_80211g);
+				wifiConfig.setHardwareMode("g");
+			} else if (radioMode.equals(GwtWifiRadioMode.netWifiRadioModeBGN)) {
+			    wifiConfig.setRadioMode(WifiRadioMode.RADIO_MODE_80211nHT20);
+				wifiConfig.setHardwareMode("n");
+			}
+			
+			// channel
+			ArrayList<Integer> alChannels = (gwtWifiConfig.getChannels());
+			if (alChannels != null) {
+				int [] channels = new int [alChannels.size()];
+				for (int i = 0; i < channels.length; i++) {
+					channels[i] = alChannels.get(i).intValue();
+				}
+				wifiConfig.setChannels(channels);
+			}
+			
+			// security
+			wifiConfig.setSecurity(WifiSecurity.SECURITY_NONE);
+			String security = (gwtWifiConfig.getSecurity());
+			if (security != null) {
+				if (security.equals(GwtWifiSecurity.netWifiSecurityWPA.name())) {
+					//wifiConfig.setSecurity(WifiSecurity.KEY_MGMT_PSK);
+					wifiConfig.setSecurity(WifiSecurity.SECURITY_WPA);
+				} else if (security.equals(GwtWifiSecurity.netWifiSecurityWPA2.name())) {
+					//wifiConfig.setSecurity(WifiSecurity.KEY_MGMT_PSK);
+					wifiConfig.setSecurity(WifiSecurity.SECURITY_WPA2);
+				} else if (security.equals(GwtWifiSecurity.netWifiSecurityWPA_WPA2.name())) {
+					//wifiConfig.setSecurity(WifiSecurity.KEY_MGMT_PSK);
+					wifiConfig.setSecurity(WifiSecurity.SECURITY_WPA_WPA2);
+				} else if (security.equals(GwtWifiSecurity.netWifiSecurityWEP.name())) {
+					//wifiConfig.setSecurity(WifiSecurity.PAIR_WEP104);
+					wifiConfig.setSecurity(WifiSecurity.SECURITY_WEP);
+				}
+			}
+			
+			String pairwiseCiphers = (gwtWifiConfig.getPairwiseCiphers());
+			if (pairwiseCiphers != null) {
+				if (pairwiseCiphers.equals(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name())) {
+					wifiConfig.setPairwiseCiphers(WifiCiphers.CCMP_TKIP);
+				} else if (pairwiseCiphers.equals(GwtWifiCiphers.netWifiCiphers_TKIP.name())) {
+					wifiConfig.setPairwiseCiphers(WifiCiphers.TKIP);
+				} else if (pairwiseCiphers.equals(GwtWifiCiphers.netWifiCiphers_CCMP.name())) {
+					wifiConfig.setPairwiseCiphers(WifiCiphers.CCMP);
+				}
+			}
+			
+			String groupCiphers = (gwtWifiConfig.getGroupCiphers());
+			if (groupCiphers != null) {
+				if (groupCiphers.equals(GwtWifiCiphers.netWifiCiphers_CCMP_TKIP.name())) {
+					wifiConfig.setGroupCiphers(WifiCiphers.CCMP_TKIP);
+				} else if (groupCiphers.equals(GwtWifiCiphers.netWifiCiphers_TKIP.name())) {
+					wifiConfig.setGroupCiphers(WifiCiphers.TKIP);
+				} else if (groupCiphers.equals(GwtWifiCiphers.netWifiCiphers_CCMP.name())) {
+					wifiConfig.setGroupCiphers(WifiCiphers.CCMP);
+				}
+			}
+			
+			// bgscan
+			String bgscanModule = (gwtWifiConfig.getBgscanModule());
+			if (bgscanModule != null) {
+				WifiBgscanModule wifiBgscanModule = null;
+				if (bgscanModule.equals(GwtWifiBgscanModule.netWifiBgscanMode_NONE.name())) {
+					wifiBgscanModule = WifiBgscanModule.NONE;
+				} else if (bgscanModule.equals(GwtWifiBgscanModule.netWifiBgscanMode_SIMPLE.name())) {
+					wifiBgscanModule = WifiBgscanModule.SIMPLE;
+				} else if (bgscanModule.equals(GwtWifiBgscanModule.netWifiBgscanMode_LEARN.name())) {
+					wifiBgscanModule = WifiBgscanModule.LEARN;
+				}
+					
+				int bgscanRssiThreshold = (gwtWifiConfig.getBgscanRssiThreshold());
+				int bgscanShortInterval = (gwtWifiConfig.getBgscanShortInterval());
+				int bgscanLongInterval = (gwtWifiConfig.getBgscanLongInterval());
+	
+				WifiBgscan wifiBgscan = new WifiBgscan(wifiBgscanModule,
+						bgscanShortInterval, bgscanRssiThreshold,
+						bgscanLongInterval);
+				wifiConfig.setBgscan(wifiBgscan);
+			}
+			
+			// passkey
+			wifiConfig.setPasskey(gwtWifiConfig.getPassword());
+			
+			// ping access point?
+			wifiConfig.setPingAccessPoint(gwtWifiConfig.pingAccessPoint());
+		}
+		
+		return wifiConfig;
+	}
+	
+	/*
+	private int getChannelFrequencyMHz(int channel) {
+		
+		int frequency = -1;
+		if ((channel >=1) && (channel <=13)) {
+			frequency = 2407 + channel * 5;
+		}
+		return frequency;
+	}
+	*/
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtPackageServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtPackageServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..8020ae2f6af69a2ade3d4b866aa8fe53ea800de6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtPackageServiceImpl.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.deployment.agent.DeploymentAgentService;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraErrorCode;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtBundleInfo;
+import org.eclipse.kura.web.shared.model.GwtDeploymentPackage;
+import org.eclipse.kura.web.shared.service.GwtPackageService;
+import org.osgi.service.deploymentadmin.BundleInfo;
+import org.osgi.service.deploymentadmin.DeploymentAdmin;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
+
+public class GwtPackageServiceImpl extends OsgiRemoteServiceServlet implements GwtPackageService
+{
+	private static final long serialVersionUID = -3422518194598042896L;
+
+
+	public List<GwtDeploymentPackage> findDeviceDeploymentPackages()
+		throws GwtKuraException 
+	{
+		DeploymentAdmin deploymentAdmin = ServiceLocator.getInstance().getService(DeploymentAdmin.class);
+		
+		List<GwtDeploymentPackage> gwtDeploymentPackages = new ArrayList<GwtDeploymentPackage>();
+		DeploymentPackage[] deploymentPackages = deploymentAdmin.listDeploymentPackages();
+		
+		if (deploymentPackages != null) {
+			for (DeploymentPackage deploymentPackage : deploymentPackages) {
+				GwtDeploymentPackage gwtDeploymentPackage = new GwtDeploymentPackage();
+				gwtDeploymentPackage.setName(deploymentPackage.getName());
+				gwtDeploymentPackage.setVersion(deploymentPackage.getVersion().toString());
+				
+				List<GwtBundleInfo> gwtBundleInfos = new ArrayList<GwtBundleInfo>();
+				BundleInfo[] bundleInfos = deploymentPackage.getBundleInfos();
+				if (bundleInfos != null) {
+					for (BundleInfo bundleInfo : bundleInfos) {
+						GwtBundleInfo gwtBundleInfo = new GwtBundleInfo();
+						gwtBundleInfo.setName(bundleInfo.getSymbolicName());
+						gwtBundleInfo.setVersion(bundleInfo.getVersion().toString());
+						
+						gwtBundleInfos.add(gwtBundleInfo);
+					}
+				}
+				
+				gwtDeploymentPackage.setBundleInfos(gwtBundleInfos);
+				
+				gwtDeploymentPackages.add(gwtDeploymentPackage);
+			}
+		}
+		
+		return gwtDeploymentPackages;
+	}
+
+	
+	
+	public void uninstallDeploymentPackage(String packageName)
+		throws GwtKuraException 
+	{
+		DeploymentAgentService deploymentAgentService = ServiceLocator.getInstance().getService(DeploymentAgentService.class);		
+		try {
+			deploymentAgentService.uninstallDeploymentPackageAsync(packageName);
+		} 
+		catch (Exception e) {
+			// TODO Auto-generated catch block
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtSettingServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtSettingServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..42ea9678bb666f3479064d14d14c4a82677c20f9
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtSettingServiceImpl.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.sql.SQLException;
+import java.util.Enumeration;
+
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.kura.web.AuthenticationManager;
+import org.eclipse.kura.web.shared.GwtKuraErrorCode;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtSettings;
+import org.eclipse.kura.web.shared.service.GwtSettingService;
+
+public class GwtSettingServiceImpl extends OsgiRemoteServiceServlet implements GwtSettingService
+{
+	private static final long serialVersionUID = -3422518194598042896L;
+
+	public void updateSettings(GwtSettings settings) throws GwtKuraException
+	{
+		AuthenticationManager authMgr = AuthenticationManager.getInstance(); 
+
+		//
+		// verify the current password
+		boolean validCurrPwd = false;
+		try {
+			validCurrPwd = authMgr.authenticate("admin", settings.getPasswordCurrent());
+		}
+		catch (SQLException e) {
+			throw new GwtKuraException(GwtKuraErrorCode.CURRENT_ADMIN_PASSWORD_DOES_NOT_MATCH, e);
+		}
+		if (!validCurrPwd) {
+			throw new GwtKuraException(GwtKuraErrorCode.CURRENT_ADMIN_PASSWORD_DOES_NOT_MATCH);
+		}
+		
+		//
+		// set the new password
+		try {
+			authMgr.changeAdminPassword(settings.getPasswordNew());
+		}
+		catch (SQLException e) {
+			throw new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, e);
+		}
+	}
+	
+	
+	@SuppressWarnings("rawtypes")
+	public void logout() 
+		throws GwtKuraException
+	{
+		HttpSession httpSession = this.getThreadLocalRequest().getSession();
+		Enumeration attrs = httpSession.getAttributeNames();
+		while (attrs.hasMoreElements()) {
+			
+			String attr = (String) attrs.nextElement();
+			httpSession.removeAttribute(attr);
+		}
+		httpSession.setAttribute("logout", "true");
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtSnapshotServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtSnapshotServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a6baf6468345b9b0e36389df6f9b113fa205236
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtSnapshotServiceImpl.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.web.server.util.KuraExceptionHandler;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtSnapshot;
+import org.eclipse.kura.web.shared.service.GwtSnapshotService;
+
+import com.extjs.gxt.ui.client.data.BaseListLoadResult;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+
+public class GwtSnapshotServiceImpl extends OsgiRemoteServiceServlet implements GwtSnapshotService
+{
+	private static final long serialVersionUID = 8804372718146289179L;
+
+
+	public ListLoadResult<GwtSnapshot> findDeviceSnapshots() 
+		throws GwtKuraException
+	{
+		List<GwtSnapshot> snapshots = new ArrayList<GwtSnapshot>();
+		try {
+			
+			// execute the command
+	        ServiceLocator  locator = ServiceLocator.getInstance();
+			ConfigurationService cs = locator.getService(ConfigurationService.class);			 
+	        Set<Long>  snapshotIds = cs.getSnapshots();
+	        if (snapshotIds != null) {
+	        	
+	        	// sort them by most recent first
+	        	if (snapshotIds != null && snapshotIds.size() > 0) {
+		        	for (Long snapshotId : snapshotIds) {
+		        		GwtSnapshot snapshot = new GwtSnapshot();
+		        		snapshot.setCreatedOn( new Date(snapshotId));
+		        		snapshots.add(0, snapshot);	
+		        	}
+	        	}
+	        }
+		} 
+		catch(Throwable t) {
+			KuraExceptionHandler.handle(t);
+	    }        
+		
+		return new BaseListLoadResult<GwtSnapshot>(snapshots);
+	}
+
+
+	public void rollbackDeviceSnapshot(GwtSnapshot snapshot) 
+		throws GwtKuraException
+	{
+		try {			
+
+	        ServiceLocator  locator = ServiceLocator.getInstance();
+			ConfigurationService cs = locator.getService(ConfigurationService.class);			 
+	        cs.rollback(snapshot.getSnapshotId());
+
+        	//
+        	// Add an additional delay after the configuration update
+        	// to give the time to the device to apply the received 
+        	// configuration            
+			SystemService ss = locator.getService(SystemService.class);
+			long delay = Long.parseLong(ss.getProperties().getProperty("console.updateConfigDelay", "5000"));
+            if (delay > 0) {
+            	Thread.sleep(delay);
+            }		
+		} 
+		catch(Throwable t) {
+			KuraExceptionHandler.handle(t);
+	    }        
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtStatusServiceImpl.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtStatusServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..b47ffecbec29d2975ba1e9223c60edba282765da
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/GwtStatusServiceImpl.java
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.kura.data.DataService;
+import org.eclipse.kura.data.DataTransportService;
+import org.eclipse.kura.position.PositionService;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+import org.eclipse.kura.web.shared.model.GwtModemInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtNetIfConfigMode;
+import org.eclipse.kura.web.shared.model.GwtNetIfStatus;
+import org.eclipse.kura.web.shared.model.GwtNetIfType;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtNetRouterMode;
+import org.eclipse.kura.web.shared.model.GwtWifiNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiWirelessMode;
+import org.eclipse.kura.web.shared.service.GwtStatusService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.extjs.gxt.ui.client.data.BaseListLoadResult;
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+
+public class GwtStatusServiceImpl extends OsgiRemoteServiceServlet implements GwtStatusService {
+
+	private static final long serialVersionUID = 8256280782910423734L;
+	
+	private static Logger s_logger = LoggerFactory.getLogger(GwtNetworkServiceImpl.class);
+	
+	public ListLoadResult<GwtGroupedNVPair> getDeviceConfig() throws GwtKuraException {
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+
+		pairs.addAll(getCloudStatus());
+		pairs.addAll(getNetworkStatus());
+		pairs.addAll(getPositionStatus());
+
+		return new BaseListLoadResult<GwtGroupedNVPair>(pairs);
+	}
+	
+	private List<GwtGroupedNVPair> getCloudStatus() {
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+		
+		try {
+		DataService dataService = ServiceLocator.getInstance().getService(DataService.class);
+		DataTransportService dataTransportService = ServiceLocator.getInstance().getService(DataTransportService.class);
+		if (dataService != null) {
+			pairs.add(new GwtGroupedNVPair("cloudStatus", "Connection Status", dataService.isConnected() ? "CONNECTED" : "DISCONNECTED"));
+			pairs.add(new GwtGroupedNVPair("cloudStatus", "Auto-connect", dataService.isAutoConnectEnabled() ? "ON (Retry Interval is " + Integer.toString(dataService.getRetryInterval()) + "s)": "OFF"));
+		}
+		if (dataTransportService != null) {
+			pairs.add(new GwtGroupedNVPair("cloudStatus", "Broker URL", dataTransportService.getBrokerUrl()));
+			pairs.add(new GwtGroupedNVPair("cloudStatus", "Account", dataTransportService.getAccountName()));
+			pairs.add(new GwtGroupedNVPair("cloudStatus", "Username", dataTransportService.getUsername()));
+		}
+		} catch (GwtKuraException e) {
+			s_logger.debug(e.getMessage());
+		}
+		
+		return pairs;
+	}
+	
+	private List<GwtGroupedNVPair> getNetworkStatus() {
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+		String nl = "<br />";
+		String tab = "&nbsp&nbsp&nbsp&nbsp";
+		
+		GwtNetworkServiceImpl gwtNetworkService = new GwtNetworkServiceImpl();
+
+		try {
+			List<GwtNetInterfaceConfig> gwtNetInterfaceConfigs = gwtNetworkService.findNetInterfaceConfigurations().getData();
+			for (GwtNetInterfaceConfig gwtNetInterfaceConfig : gwtNetInterfaceConfigs) {
+				
+				String currentAddress    = gwtNetInterfaceConfig.getIpAddress();
+				String currentSubnetMask = gwtNetInterfaceConfig.getSubnetMask();
+				String currentStatus     = (gwtNetInterfaceConfig.getStatusEnum() == GwtNetIfStatus.netIPv4StatusDisabled ? "Disabled" : (gwtNetInterfaceConfig.getStatusEnum() == GwtNetIfStatus.netIPv4StatusEnabledLAN ? "LAN" : "WAN"));
+				String currentConfigMode = gwtNetInterfaceConfig.getConfigModeEnum() == GwtNetIfConfigMode.netIPv4ConfigModeDHCP ? "DHCP" : "Manual";
+				String currentRouterMode;
+				if (gwtNetInterfaceConfig.getRouterModeEnum() == GwtNetRouterMode.netRouterDchp)
+					currentRouterMode = "DHCPD";
+				else if (gwtNetInterfaceConfig.getRouterModeEnum() == GwtNetRouterMode.netRouterNat)
+					currentRouterMode = "NAT";
+				else if (gwtNetInterfaceConfig.getRouterModeEnum() == GwtNetRouterMode.netRouterDchpNat)
+					currentRouterMode = "DHCPD & NAT";
+				else
+					currentRouterMode = "";
+						
+				if (gwtNetInterfaceConfig.getHwTypeEnum() == GwtNetIfType.ETHERNET) {
+					if (currentStatus.equals("Disabled"))
+						pairs.add(new GwtGroupedNVPair("networkStatusEthernet", gwtNetInterfaceConfig.getName(), currentStatus));
+					else
+						pairs.add(new GwtGroupedNVPair("networkStatusEthernet", gwtNetInterfaceConfig.getName(), currentAddress + nl + tab +
+																												"Subnet Mask: " + currentSubnetMask + nl + tab +
+																												"Mode: " + currentStatus + nl + tab +
+																												"IP Acquisition: " + currentConfigMode + nl + tab +
+																												"Router Mode: " + currentRouterMode));
+				}
+				else if (gwtNetInterfaceConfig.getHwTypeEnum() == GwtNetIfType.WIFI && !gwtNetInterfaceConfig.getName().startsWith("mon")) {
+					String currentWifiMode = ((GwtWifiNetInterfaceConfig)gwtNetInterfaceConfig).getWirelessModeEnum() == GwtWifiWirelessMode.netWifiWirelessModeStation ? "Station Mode" : "Access Point";
+					String currentWifiSsid = ((GwtWifiNetInterfaceConfig)gwtNetInterfaceConfig).getActiveWifiConfig().getWirelessSsid();
+					if (currentStatus.equals("Disabled"))
+						pairs.add(new GwtGroupedNVPair("networkStatusWifi", gwtNetInterfaceConfig.getName(), currentStatus));
+					else
+						pairs.add(new GwtGroupedNVPair("networkStatusWifi", gwtNetInterfaceConfig.getName(), currentAddress + nl + tab +
+																											 "Subnet Mask: " + currentSubnetMask + nl + tab +
+																											 "Mode: " + currentStatus + nl + tab +
+																											 "IP Acquisition: " + currentConfigMode + nl + tab +
+																											 "Router Mode: " + currentRouterMode + nl + tab +
+																											 "Wireless Mode:" + currentWifiMode + nl + tab +
+																											 "SSID: " + currentWifiSsid + nl));
+				}
+				else if (gwtNetInterfaceConfig.getHwTypeEnum() == GwtNetIfType.MODEM) {
+					String currentModemApn = ((GwtModemInterfaceConfig)gwtNetInterfaceConfig).getApn();
+					String currentModemPppNum = Integer.toString(((GwtModemInterfaceConfig)gwtNetInterfaceConfig).getPppNum());
+					if (currentStatus.equals("Disabled"))
+						pairs.add(new GwtGroupedNVPair("networkStatusModem", gwtNetInterfaceConfig.getName(), currentStatus));
+					else
+						pairs.add(new GwtGroupedNVPair("networkStatusModem", gwtNetInterfaceConfig.getName(), currentAddress + nl +
+																											 "Subnet Mask: " + currentSubnetMask + nl + tab +
+																											 "Mode: " + currentStatus + nl + tab +
+																											 "IP Acquisition: " + currentConfigMode + nl + tab +
+																											 "APN: " + currentModemApn + nl + tab +
+																											 "PPP: " + currentModemPppNum));
+				}
+			}
+		} catch (GwtKuraException e) {
+			s_logger.debug(e.getMessage());
+		}
+
+		return pairs;
+		
+	}
+	
+	private List<GwtGroupedNVPair> getPositionStatus() {
+		List<GwtGroupedNVPair> pairs = new ArrayList<GwtGroupedNVPair>();
+		
+		try {
+			PositionService positionService = ServiceLocator.getInstance().getService(PositionService.class);
+			
+			if (positionService != null) {
+				pairs.add(new GwtGroupedNVPair("positionStatus", "Longitude", positionService.getPosition().getLongitude().toString()));
+				pairs.add(new GwtGroupedNVPair("positionStatus", "Latitude", positionService.getPosition().getLatitude().toString()));
+				pairs.add(new GwtGroupedNVPair("positionStatus", "Altitude", positionService.getPosition().getAltitude().toString()));
+			}
+			
+		} catch (GwtKuraException e) {
+			s_logger.debug(e.getMessage());
+		}
+		
+		return pairs;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/OsgiRemoteServiceServlet.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/OsgiRemoteServiceServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..851805041921754ca949a15783c50c2d7ed33224
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/OsgiRemoteServiceServlet.java
@@ -0,0 +1,176 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.ParseException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.kura.web.Console;
+
+import com.google.gwt.user.server.rpc.RemoteServiceServlet;
+import com.google.gwt.user.server.rpc.SerializationPolicy;
+import com.google.gwt.user.server.rpc.SerializationPolicyLoader;
+
+public class OsgiRemoteServiceServlet extends RemoteServiceServlet
+{
+	private static final long serialVersionUID = -8826193840033103296L;
+
+	@Override 
+	protected void service(HttpServletRequest req, HttpServletResponse resp) 
+	        throws ServletException, IOException { 
+	    // Cache the current thread 
+	    Thread currentThread = Thread.currentThread(); 
+	    // We are going to swap the class loader 
+	    ClassLoader oldContextClassLoader = 
+	    currentThread.getContextClassLoader(); 
+	    currentThread.setContextClassLoader(this.getClass().getClassLoader()); 
+	    super.service(req, resp); 
+	    currentThread.setContextClassLoader(oldContextClassLoader); 
+	}
+	
+	
+	/**
+	 * Gets the {@link SerializationPolicy} for given module base URL and strong
+	 * name if there is one.
+	 * 
+	 * Override this method to provide a {@link SerializationPolicy} using an
+	 * alternative approach.
+	 * 
+	 * @param request
+	 *            the HTTP request being serviced
+	 * @param moduleBaseURL
+	 *            as specified in the incoming payload
+	 * @param strongName
+	 *            a strong name that uniquely identifies a serialization policy
+	 *            file
+	 * @return a {@link SerializationPolicy} for the given module base URL and
+	 *         strong name, or <code>null</code> if there is none
+	 */
+	protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, 
+														   String moduleBaseURL, 
+														   String strongName) 
+	{
+		// The request can tell you the path of the web app relative to the
+		// container root.
+		String contextPath = request.getContextPath();
+		String modulePath = null;
+		String servletRoot = Console.getServletRoot();
+		
+		if (moduleBaseURL != null) {
+			try {
+				modulePath = new URL(moduleBaseURL).getPath();
+			} catch (MalformedURLException ex) {
+				// log the information, we will default
+				log("Malformed moduleBaseURL: " + moduleBaseURL, ex);
+			}
+		}
+
+		SerializationPolicy serializationPolicy = null;
+
+		/*
+		 * Check that the module path must be in the same web app as the servlet
+		 * itself. If you need to implement a scheme different than this,
+		 * override this method.
+		 */
+		if (modulePath == null || !modulePath.startsWith(contextPath)) {
+			String message = "ERROR: The module path requested, "
+					+ modulePath
+					+ ", is not in the same web application as this servlet, "
+					+ contextPath
+					+ ".  Your module may not be properly configured or your client and server code maybe out of date.";
+			log(message, null);
+		} else {
+			// Strip off the context path from the module base URL. It should be
+			// a
+			// strict prefix.
+			String contextRelativePath = modulePath.substring(contextPath
+					.length());
+
+			// adding a comment
+			// adding a comment2
+			
+			String serializationPolicyFilePath = SerializationPolicyLoader
+					.getSerializationPolicyFileName(contextRelativePath
+							+ strongName);
+
+			// Open the RPC resource file read its contents.
+			InputStream is = getServletContext().getResourceAsStream(
+					serializationPolicyFilePath);
+			if (is == null) {
+				// try: /www/denali/202D6ADA06C975A44587AEAB102E2B68.gwt.rpc
+				String file = "/www"+servletRoot+serializationPolicyFilePath
+						.substring(serializationPolicyFilePath.indexOf("/", 1));
+				log("Trying www resource2: " + file);
+				is = Thread.currentThread().getContextClassLoader()
+						.getResourceAsStream(file);
+			}
+			if (is == null) {
+				// try: /denali/denali/202D6ADA06C975A44587AEAB102E2B68.gwt.rpc
+				log("Trying "+servletRoot+servletRoot+" resource1: " + serializationPolicyFilePath);
+				is = Thread.currentThread().getContextClassLoader()
+						.getResourceAsStream(serializationPolicyFilePath);
+			}
+			if (is == null) {
+				// try: /denali/202D6ADA06C975A44587AEAB102E2B68.gwt.rpc
+				String file = serializationPolicyFilePath
+						.substring(serializationPolicyFilePath.indexOf("/", 1));
+				log("Trying "+servletRoot+" resource3: " + file);
+				is = Thread.currentThread().getContextClassLoader()
+						.getResourceAsStream(file);
+			}
+			if (is == null) {
+				// try: /202D6ADA06C975A44587AEAB102E2B68.gwt.rpc
+				String file = serializationPolicyFilePath
+						.substring(serializationPolicyFilePath.lastIndexOf("/"));
+				log("Trying / resource4: " + file);
+				is = Thread.currentThread().getContextClassLoader()
+						.getResourceAsStream(file);
+			}
+
+			try {
+				if (is != null) {
+					try {
+						serializationPolicy = SerializationPolicyLoader
+								.loadFromStream(is, null);
+					} catch (ParseException e) {
+						log("ERROR: Failed to parse the policy file '"
+								+ serializationPolicyFilePath + "'", e);
+					} catch (IOException e) {
+						log("ERROR: Could not read the policy file '"
+								+ serializationPolicyFilePath + "'", e);
+					}
+				} else {
+					String message = "ERROR: The serialization policy file '"
+							+ serializationPolicyFilePath
+							+ "' was not found; did you forget to include it in this deployment?";
+					log(message, null);
+				}
+			} finally {
+				if (is != null) {
+					try {
+						is.close();
+					} catch (IOException e) {
+						// Ignore this error
+					}
+				}
+			}
+		}
+		return serializationPolicy;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/DeviceSnapshotsServlet.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/DeviceSnapshotsServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..54bf4dd14a99a838fe4b072bd06e58bd5b9bda52
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/DeviceSnapshotsServlet.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.core.configuration.ComponentConfigurationImpl;
+import org.eclipse.kura.core.configuration.XmlComponentConfigurations;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DeviceSnapshotsServlet extends HttpServlet 
+{
+    private static final long serialVersionUID = -2533869595709953567L;
+
+    private static Logger s_logger = LoggerFactory.getLogger(DeviceSnapshotsServlet.class);
+    
+    
+    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
+    {
+        String snapshotId = request.getParameter("snapshotId");
+
+        response.setCharacterEncoding("UTF-8");
+		response.setContentType("application/xml");
+		response.setHeader("Content-Disposition", "attachment; filename=snapshot_"+snapshotId+".xml");
+		response.setHeader("Cache-Control", "no-transform, max-age=0");
+		PrintWriter writer = response.getWriter();
+		try {
+
+            ServiceLocator  locator = ServiceLocator.getInstance();
+			ConfigurationService cs = locator.getService(ConfigurationService.class);			 
+			if (snapshotId != null) {
+
+				long sid = Long.parseLong(snapshotId);
+				List<ComponentConfiguration> configs = cs.getSnapshot(sid);
+								
+				// build a list of configuration which can be marshalled in XML
+				List<ComponentConfigurationImpl> configImpls = new ArrayList<ComponentConfigurationImpl>();
+				for (ComponentConfiguration config : configs) {
+					configImpls.add((ComponentConfigurationImpl) config);
+				}
+				XmlComponentConfigurations xmlConfigs = new XmlComponentConfigurations();
+				xmlConfigs.setConfigurations(configImpls);
+				
+				//
+				// marshall the response and write it
+				XmlUtil.marshal(xmlConfigs, writer);
+			}
+        } 
+        catch (Exception e) {
+            s_logger.error("Error creating Excel export", e);
+            throw new ServletException(e);
+        } 
+        finally {
+            if (writer != null)
+            	writer.close();
+        }
+    }
+}
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/FileServlet.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/FileServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9da7708e8131061851f2ea7e12499d10befb4e6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/FileServlet.java
@@ -0,0 +1,520 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server.servlet;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.FileCleanerCleanup;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.io.FileCleaningTracker;
+import org.apache.commons.io.IOUtils;
+import org.eclipse.kura.configuration.ComponentConfiguration;
+import org.eclipse.kura.configuration.ConfigurationService;
+import org.eclipse.kura.core.configuration.ComponentConfigurationImpl;
+import org.eclipse.kura.core.configuration.XmlComponentConfigurations;
+import org.eclipse.kura.core.configuration.util.XmlUtil;
+import org.eclipse.kura.deployment.agent.DeploymentAgentService;
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class FileServlet extends HttpServlet {
+
+	private static final long serialVersionUID = -5016170117606322129L;
+
+	private static Logger s_logger = LoggerFactory.getLogger(FileServlet.class);
+	
+	private DiskFileItemFactory m_diskFileItemFactory;
+	private FileCleaningTracker m_fileCleaningTracker;
+
+	
+	@Override
+	public void destroy() {
+		super.destroy();
+
+		s_logger.info("Servlet {} destroyed", getServletName());
+
+		if (m_fileCleaningTracker != null) {
+			s_logger.info("Number of temporary files tracked: " + m_fileCleaningTracker.getTrackCount());
+		}
+	}
+
+
+	@Override
+	public void init() throws ServletException {
+		super.init();
+
+		s_logger.info("Servlet {} initialized", getServletName());
+
+		ServletContext ctx = getServletContext();
+		m_fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(ctx);
+				
+		int sizeThreshold = getFileUploadInMemorySizeThreshold();
+		File repository = new File(System.getProperty("java.io.tmpdir"));
+		
+		s_logger.info("DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD: {}", DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);
+		s_logger.info("DiskFileItemFactory: using size threshold of: {}", sizeThreshold);
+		
+		m_diskFileItemFactory = new DiskFileItemFactory(sizeThreshold, repository);
+		m_diskFileItemFactory.setFileCleaningTracker(m_fileCleaningTracker);
+	}
+
+
+	@Override
+	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+		
+		resp.setContentType("text/html");
+
+		String reqPathInfo = req.getPathInfo();
+		if (reqPathInfo == null) {
+			s_logger.error("Request path info not found");
+			throw new ServletException("Request path info not found");
+		}
+
+		s_logger.debug("req.getRequestURI(): {}", req.getRequestURI());
+		s_logger.debug("req.getRequestURL(): {}", req.getRequestURL());
+		s_logger.debug("req.getPathInfo(): {}", req.getPathInfo());
+
+		if (reqPathInfo.startsWith("/deploy")) {
+			doPostDeploy(req, resp);
+		}
+		else if (reqPathInfo.equals("/configuration/snapshot")) {
+			doPostConfigurationSnapshot(req, resp);
+		}
+		else if (reqPathInfo.equals("/command")) {
+			doPostCommand(req, resp);
+		}
+		else {
+			s_logger.error("Unknown request path info: " + reqPathInfo);
+			throw new ServletException("Unknown request path info: " + reqPathInfo);			
+		}
+	}
+	
+	private void doPostCommand(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+		UploadRequest upload = new UploadRequest(m_diskFileItemFactory);
+
+		try {
+			upload.parse(req);
+		} catch (FileUploadException e) {
+			s_logger.error("Error parsing the file upload request");
+			throw new ServletException("Error parsing the file upload request", e);			
+		}
+
+		List<FileItem> fileItems = null;
+		InputStream is = null;
+		File localFolder = new File(System.getProperty("java.io.tmpdir"));
+		OutputStream os = null;
+		
+		try {
+			fileItems = upload.getFileItems();
+
+			if (fileItems.size() > 0) {
+				FileItem item = fileItems.get(0);
+				is = item.getInputStream();
+				
+				byte[] bytes = IOUtils.toByteArray(is);
+				ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(bytes));
+				
+				ZipEntry ze = zis.getNextEntry();
+				while (ze != null) {
+					byte[] buffer = new byte[1024];
+					
+					String fileName = ze.getName();
+					File newFile = new File(localFolder + File.separator + fileName);
+					if (newFile.isDirectory()) {
+						newFile.mkdirs();
+						ze = zis.getNextEntry();
+						continue;
+					}
+					if (newFile.getParent() != null) {
+						File parent = new File(newFile.getParent());
+						parent.mkdirs();
+					}
+					
+					FileOutputStream fos = new FileOutputStream(newFile);
+					int len;
+					while ((len = zis.read(buffer)) > 0) {
+						fos.write(buffer, 0, len);
+					}
+					fos.close();
+					ze = zis.getNextEntry();
+				}
+	
+				zis.closeEntry();
+				zis.close();
+			}
+		} catch (IOException e) {
+			throw e;
+		} finally {
+			if (os != null) {
+				try {
+					os.close();
+				} catch (IOException e) {
+					s_logger.warn("Cannot close output stream", e);
+				}
+			}
+			if (is != null) {
+				try {
+					is.close();
+				} catch (IOException e) {
+					s_logger.warn("Cannot close input stream", e);
+				}
+			}
+			if (fileItems != null) {
+				for (FileItem fileItem : fileItems) {
+					fileItem.delete();
+				}
+			}
+		}
+	}
+
+	private void doPostConfigurationSnapshot(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+		
+		UploadRequest upload = new UploadRequest(m_diskFileItemFactory);
+
+		try {
+			upload.parse(req);
+		} catch (FileUploadException e) {
+			s_logger.error("Error parsing the file upload request");
+			throw new ServletException("Error parsing the file upload request", e);			
+		}
+
+		List<FileItem> fileItems = upload.getFileItems();
+		if (fileItems.size() != 1) {
+			s_logger.error("expected 1 file item but found {}", fileItems.size());
+			throw new ServletException("Wrong number of file items");
+		}
+		
+		FileItem fileItem = fileItems.get(0);
+		byte[] data = fileItem.get();
+		String xmlString = new String(data, "UTF-8");
+		XmlComponentConfigurations xmlConfigs;
+		try {
+			xmlConfigs = XmlUtil.unmarshal(xmlString, XmlComponentConfigurations.class);
+		} catch (Exception e) {
+			s_logger.error("Error unmarshaling device configuration", e);
+			throw new ServletException("Error unmarshaling device configuration", e);
+		}		
+		
+		ServiceLocator  locator = ServiceLocator.getInstance();
+		try {
+			
+			ConfigurationService cs = locator.getService(ConfigurationService.class); 
+			List<ComponentConfigurationImpl> configImpls = xmlConfigs.getConfigurations();
+			
+			List<ComponentConfiguration> configs = new ArrayList<ComponentConfiguration>();
+			configs.addAll(configImpls);
+			
+			cs.updateConfigurations(configs);
+
+        	//
+        	// Add an additional delay after the configuration update
+        	// to give the time to the device to apply the received 
+        	// configuration            
+			SystemService ss = locator.getService(SystemService.class);
+			long delay = Long.parseLong(ss.getProperties().getProperty("console.updateConfigDelay", "5000"));
+            if (delay > 0) {
+            	Thread.sleep(delay);
+            }		
+		} 
+		catch (Exception e) {
+			s_logger.error("Error updating device configuration: {}", e);
+			throw new ServletException("Error updating device configuration", e);
+		}
+	}
+	
+	private void doPostDeployUpload (HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+		ServiceLocator locator = ServiceLocator.getInstance();
+		DeploymentAgentService deploymentAgentService;
+		try {
+			deploymentAgentService = locator.getService(DeploymentAgentService.class);
+		} catch (GwtKuraException e) {
+			s_logger.error("Error locating DeploymentAgentService", e);
+			throw new ServletException("Error locating DeploymentAgentService", e);
+		}
+		
+		// Check that we have a file upload request
+		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
+		if (!isMultipart) {
+			s_logger.error("Not a file upload request");
+			throw new ServletException("Not a file upload request");
+		}
+
+		UploadRequest upload = new UploadRequest(m_diskFileItemFactory);
+
+		try {
+			upload.parse(req);
+		} catch (FileUploadException e) {
+			s_logger.error("Error parsing the file upload request", e);
+			throw new ServletException("Error parsing the file upload request", e);			
+		}
+
+		List<FileItem> fileItems = null;
+		InputStream is = null;
+		File localFile = null;
+		OutputStream os = null;
+		boolean successful = false;
+		
+		try {
+			fileItems = upload.getFileItems();
+
+			if (fileItems.size() != 1) {
+				s_logger.error("expected 1 file item but found {}", fileItems.size());
+				throw new ServletException("Wrong number of file items");
+			}
+
+			FileItem item = fileItems.get(0);
+			String filename = item.getName();
+			is = item.getInputStream();
+
+			String filePath = System.getProperty("java.io.tmpdir") + File.separator + filename;
+
+			localFile = new File(filePath);
+			if (localFile.exists()) {
+				if (localFile.delete()) {
+					s_logger.error("Cannot delete file: {}", filePath);
+					throw new ServletException("Cannot delete file: " + filePath);
+				}
+			}
+			
+			try {
+				localFile.createNewFile();
+				localFile.deleteOnExit();
+			} catch (IOException e) {
+				s_logger.error("Cannot create file: {}", filePath, e);
+				throw new ServletException("Cannot create file: " + filePath);				
+			}
+
+			try {
+				os = new FileOutputStream(localFile);
+			} catch (FileNotFoundException e) {
+				s_logger.error("Cannot find file: {}", filePath, e);
+				throw new ServletException("Cannot find file: " + filePath, e);				
+			}
+						
+			s_logger.info("Copying uploaded package file to file: {}", filePath);
+			
+			try {
+				IOUtils.copy(is, os);
+			} catch (IOException e) {
+				s_logger.error("Failed to copy deployment package file: {}", filename, e);
+				throw new ServletException("Failed to copy deployment package file: " + filename, e);
+			}
+
+			try {
+				os.close();
+			} catch (IOException e) {
+				s_logger.warn("Cannot close output stream", e);
+			}
+				
+			URL url = localFile.toURI().toURL();
+			String sUrl = url.toString();
+
+			s_logger.info("Installing package...");
+			try {
+				deploymentAgentService.installDeploymentPackageAsync(sUrl);
+				successful = true;
+			} catch (Exception e) {
+				s_logger.error("Package installation failed", e);
+				throw new ServletException("Package installation failed", e);
+			}
+		} catch (IOException e) {
+			throw e;
+		} catch (ServletException e) {
+			throw e;
+		} finally {
+			if (os != null) {
+				try {
+					os.close();
+				} catch (IOException e) {
+					s_logger.warn("Cannot close output stream", e);
+				}
+			}
+			if (localFile != null && !successful) {
+				try {
+					localFile.delete();
+				} catch (Exception e) {
+					s_logger.warn("Cannot delete file");
+				}
+			}
+			if (is != null) {
+				try {
+					is.close();
+				} catch (IOException e) {
+					s_logger.warn("Cannot close input stream", e);
+				}
+			}
+			if (fileItems != null) {
+				for (FileItem fileItem : fileItems) {
+					fileItem.delete();
+				}
+			}
+		}
+	}
+
+	private void doPostDeploy(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+				
+		ServiceLocator locator = ServiceLocator.getInstance();
+		DeploymentAgentService deploymentAgentService;
+		try {
+			deploymentAgentService = locator.getService(DeploymentAgentService.class);
+		} catch (GwtKuraException e) {
+			s_logger.error("Error locating DeploymentAgentService", e);
+			throw new ServletException("Error locating DeploymentAgentService", e);
+		}
+						
+		String reqPathInfo = req.getPathInfo();
+		if (reqPathInfo.endsWith("url")) {
+			
+			String packageDownloadUrl = req.getParameter("packageUrl");
+			if (packageDownloadUrl == null) {
+				s_logger.error("Deployment package URL parameter missing");
+				throw new ServletException("Deployment package URL parameter missing");	
+			}
+
+			try {
+				s_logger.info("Installing package...");
+				deploymentAgentService.installDeploymentPackageAsync(packageDownloadUrl);
+			} catch (Exception e) {
+				s_logger.error("Failed to install package at URL {}", packageDownloadUrl, e);
+				throw new ServletException("Error installing deployment package", e);
+			}			
+		} else if (reqPathInfo.endsWith("upload")) {
+			doPostDeployUpload(req, resp);
+		} else {
+			s_logger.error("Unsupported package deployment request");
+			throw new ServletException("Unsupported package deployment request");			
+		}
+	}
+	
+	static long getFileUploadSizeMax() {
+		ServiceLocator locator = ServiceLocator.getInstance();
+		
+		long sizeMax = -1;
+		try {
+			SystemService systemService = locator.getService(SystemService.class);
+			sizeMax = Long.parseLong(
+					systemService.getProperties().getProperty("file.upload.size.max", "-1"));
+		} catch (GwtKuraException e) {
+			s_logger.error("Error locating SystemService", e);
+		}
+		
+		return sizeMax;
+	}
+	
+	static private int getFileUploadInMemorySizeThreshold() {
+		ServiceLocator locator = ServiceLocator.getInstance();
+		
+		int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD;
+		try {
+			SystemService systemService = locator.getService(SystemService.class);
+			sizeThreshold = Integer.parseInt(
+					systemService.getProperties().getProperty("file.upload.in.memory.size.threshold",
+							String.valueOf(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD)));
+		} catch (GwtKuraException e) {
+			s_logger.error("Error locating SystemService", e);
+		}
+		
+		return sizeThreshold;
+	}
+}
+
+class UploadRequest extends ServletFileUpload {
+
+	private static Logger s_logger = LoggerFactory.getLogger(UploadRequest.class);
+
+	Map<String, String> formFields;
+	List<FileItem> fileItems;
+
+	public UploadRequest(DiskFileItemFactory diskFileItemFactory) {
+		super(diskFileItemFactory);
+		setSizeMax(FileServlet.getFileUploadSizeMax());
+		formFields = new HashMap<String, String>();
+		fileItems = new ArrayList<FileItem>();
+	}
+
+	@SuppressWarnings("unchecked")
+	public void parse(HttpServletRequest req) throws FileUploadException {
+
+		s_logger.debug("upload.getFileSizeMax(): {}", getFileSizeMax());
+		s_logger.debug("upload.getSizeMax(): {}", getSizeMax());
+
+		// Parse the request
+		List<FileItem> items = null;
+		items = parseRequest(req);
+
+		// Process the uploaded items
+		Iterator<FileItem> iter = items.iterator();
+		while (iter.hasNext()) {
+			FileItem item = (FileItem) iter.next();
+
+			if (item.isFormField()) {
+				String name = item.getFieldName();
+				String value = item.getString();
+
+				s_logger.debug("Form field item name: {}, value: {}", name, value);
+
+				formFields.put(name, value);
+			} else {
+				String fieldName = item.getFieldName();
+				String fileName = item.getName();
+				String contentType = item.getContentType();
+				boolean isInMemory = item.isInMemory();
+				long sizeInBytes = item.getSize();
+
+				s_logger.debug("File upload item name: {}, fileName: {}, contentType: {}, isInMemory: {}, size: {}",
+						new Object[] {fieldName, fileName, contentType, isInMemory, sizeInBytes});
+
+				fileItems.add(item);
+			}
+		}
+	}
+
+	public Map<String, String> getFormFields() {
+		return formFields;
+	}
+
+	public List<FileItem> getFileItems() {
+		return fileItems;
+	}
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/SkinServlet.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/SkinServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..f680b1a47eb19485d3101435f92577a968c38c8f
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/servlet/SkinServlet.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server.servlet;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.kura.system.SystemService;
+import org.eclipse.kura.web.server.util.ServiceLocator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SkinServlet extends HttpServlet {
+
+	private static final long serialVersionUID = -556598856721497972L;
+	
+	private static Logger s_logger = LoggerFactory.getLogger(SkinServlet.class);
+	
+	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		
+		String resourceName = request.getPathInfo();
+		if (resourceName.endsWith(".css")) {
+			response.setContentType("text/css");
+			streamText(resourceName, response.getWriter());
+		}
+		else if (resourceName.endsWith(".js")) {
+			response.setContentType("text/javascript");
+			streamText(resourceName, response.getWriter());
+		}
+		else if (resourceName.endsWith(".jpg") || resourceName.endsWith(".png")) {
+			response.setContentType("image/png");
+			streamBinary(resourceName, response.getOutputStream());
+		}
+		
+		
+		
+	}
+	
+	private void streamText(String resourceName, PrintWriter w) throws ServletException, IOException {
+		FileReader fr = null;
+		
+		try {
+			// check to see if we have an external resource directory configured
+			SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class);
+			
+			File fResourceDir = checkDir(systemService.getKuraStyleDirectory());
+			if (fResourceDir == null) return;
+			
+			File fResourceFile = checkFile(fResourceDir, resourceName);
+			if (fResourceFile == null) return;
+				
+			// write the requested resource
+			fr = new FileReader(fResourceFile);
+			char[] buffer = new char[1024];
+			int iRead = fr.read(buffer);
+			while (iRead != -1) {
+				w.write(buffer, 0, iRead);
+				iRead = fr.read(buffer);
+			}
+		}
+		catch (Exception e) {
+			s_logger.error("Error loading skin resource", e);			
+		} 
+		finally {
+			if (fr != null)
+				fr.close();
+			if (w != null)
+				w.close();
+		}
+		
+	}
+	
+	private void streamBinary(String resourceName, OutputStream o) throws ServletException, IOException {
+		FileInputStream in = null;
+		
+		try {
+			// check to see if we have an external resource directory configured
+			SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class);
+			
+			File fResourceDir = checkDir(systemService.getKuraStyleDirectory());
+			if (fResourceDir == null) return;
+			
+			File fResourceFile = checkFile(fResourceDir, resourceName);
+			if (fResourceFile == null) return;
+				
+			// write the requested resource
+			in = new FileInputStream(fResourceFile);
+			byte[] buf  = new byte[1024];
+			int len = 0;
+			while ((len = in.read(buf)) >= 0) {
+				o.write(buf, 0, len);
+			}
+			
+		}
+		catch (Exception e) {
+			s_logger.error("Error loading skin resource", e);			
+		} 
+		finally {
+			if (in != null)
+				in.close();
+			if (o != null)
+				o.close();
+		}
+		
+	}
+	
+	private File checkDir(String resourceDir) {
+		File fResourceDir = null;
+		
+		if (resourceDir != null && resourceDir.trim().length() != 0) {
+			
+			fResourceDir = new File(resourceDir);
+			if (!fResourceDir.exists()) {
+				s_logger.warn("Resource Directory {} does not exist", fResourceDir.getAbsolutePath());
+				fResourceDir = null;
+				
+				return fResourceDir;
+			}
+		}
+		return fResourceDir;
+	}
+	
+	private File checkFile(File resourceDir, String resourceName) {
+		File fResourceFile = new File(resourceDir, resourceName);
+		
+		if (!fResourceFile.exists()) {
+			s_logger.warn("Resource File {} does not exist", fResourceFile.getAbsolutePath());
+			fResourceFile = null;
+			
+			return fResourceFile;
+		}
+		
+		return fResourceFile;
+	}
+	
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/util/KuraExceptionHandler.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/util/KuraExceptionHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..3aa0a71d85b9fb1169b29b7c1e7e68b0bfaafec6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/util/KuraExceptionHandler.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server.util;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class KuraExceptionHandler {
+
+	private static final Logger s_logger = LoggerFactory.getLogger(KuraExceptionHandler.class);
+	
+	public static void handle(Throwable t) throws GwtKuraException 
+	{
+		t.printStackTrace();
+		
+		// all others => log and throw internal error code
+		s_logger.warn("RPC service non-application error", t);
+		throw GwtKuraException.internalError(t, t.getLocalizedMessage());
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/util/ServiceLocator.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/util/ServiceLocator.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f7f4552dc7a4ae3e81067393a7c4a2126c588e1
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/server/util/ServiceLocator.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.server.util;
+
+import org.eclipse.kura.web.Console;
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class ServiceLocator 
+{
+	private static final ServiceLocator s_instance = new ServiceLocator();
+	
+	private ServiceLocator()
+	{}
+	
+	
+	public static ServiceLocator getInstance() {
+		return s_instance;
+	}
+	
+	
+	public <T> T getService(Class<T> serviceClass)
+		throws GwtKuraException
+	{
+		T service = null; 
+		BundleContext bundleContext = Console.getBundleContext();
+		if (bundleContext != null) {
+			ServiceReference sr = bundleContext.getServiceReference(serviceClass);
+			if (sr != null) {
+			    service = (T) bundleContext.getService(sr);
+			}
+		}
+		if (service == null) {
+			throw GwtKuraException.internalError(serviceClass.toString()+" not found.");
+		}
+		return service;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/GwtKuraErrorCode.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/GwtKuraErrorCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..faf375d5dff1c2e314c7bfc28895b3600c6817dc
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/GwtKuraErrorCode.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared;
+
+public enum GwtKuraErrorCode {
+
+    DUPLICATE_NAME, 
+    CANNOT_REMOVE_LAST_ADMIN,
+    ILLEGAL_ACCESS,
+    ILLEGAL_ARGUMENT, 
+    ILLEGAL_NULL_ARGUMENT, 
+    INVALID_USERNAME_PASSWORD,
+    INVALID_RULE_QUERY,
+    INTERNAL_ERROR, 
+    OVER_RULE_LIMIT,
+    UNAUTHENTICATED,
+    WARNING,
+    CURRENT_ADMIN_PASSWORD_DOES_NOT_MATCH,
+    OPERATION_NOT_SUPPORTED;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/GwtKuraException.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/GwtKuraException.java
new file mode 100644
index 0000000000000000000000000000000000000000..6d569be3b1bf3d39e3f3b873c0bac72d723c398a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/GwtKuraException.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared;
+
+import java.util.MissingResourceException;
+
+/**
+ * The GwtKuraException class is the superclass of all GWT errors and exceptions in the Kura project. It extends the JDK Exception class by requesting its invokers to provide an error code when
+ * building its instances. The code is one value of KuraErrorCode enum; the code is used to document the possible error conditions generated by the platform as well as to identify the localized
+ * exception messages to be reported. Exceptions messages are stored in the KuraExceptionMessagesBundle Properties Bundle and they are keyed on the exception code.
+ * 
+ * @author mcarrer
+ * 
+ */
+public class GwtKuraException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    protected GwtKuraErrorCode m_errorCode;
+    protected String[]        m_arguments;
+
+    @SuppressWarnings("unused")
+    private GwtKuraException() {
+        super();
+    }
+
+	public GwtKuraException(String message) {
+        super(message);
+    }
+
+    @SuppressWarnings("unused")
+    private GwtKuraException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    @SuppressWarnings("unused")
+    private GwtKuraException(Throwable t) {
+        super(t);
+    }
+    
+    /**
+     * Builds a new GwtKuraException instance based on the supplied GwtKuraErrorCode, an optional Throwable cause.
+     * 
+     * @param code
+     * @param t
+     * @param arguments
+     */
+    public GwtKuraException(GwtKuraErrorCode errorCode) { 
+        this.m_errorCode = errorCode;
+    }
+
+    /**
+     * Builds a new GwtKuraException instance based on the supplied GwtKuraErrorCode, an optional Throwable cause.
+     * 
+     * @param code
+     * @param t
+     * @param arguments
+     */
+    public GwtKuraException(GwtKuraErrorCode errorCode, Throwable cause) { 
+        super(cause);
+        this.m_errorCode = errorCode;
+    }
+
+    public GwtKuraException(GwtKuraErrorCode errorCode, Throwable cause, String... arguments) {
+        super(cause);
+        m_errorCode = errorCode;
+        m_arguments = arguments;
+    }
+
+    /**
+     * Factory method to build an GwtKuraException with the GwtKuraErrorCode.INTERNAL_ERROR code providing a cause and a message.
+     * 
+     * @param cause
+     * @param message
+     * @return
+     */
+    public static GwtKuraException internalError(Throwable cause, String message) {
+        return new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, cause, message);
+    }
+
+    /**
+     * Factory method to build an GwtKuraException with the GwtKuraErrorCode.INTERNAL_ERROR code providing only a message.
+     * 
+     * @param cause
+     * @param message
+     * @return
+     */
+    public static GwtKuraException internalError(String message) {
+        return new GwtKuraException(GwtKuraErrorCode.INTERNAL_ERROR, null);
+    }
+
+    public GwtKuraErrorCode getCode() {
+        return m_errorCode;
+    }
+
+    public String getMessage() {
+    	return getLocalizedMessage();
+    }
+    
+    public String getLocalizedMessage() {
+    	
+    	String msg = m_errorCode.toString();
+    	try {
+//    		ValidationMessages MSGS = GWT.create(ValidationMessages.class);
+//    		String msgPattern = MSGS.getString(m_errorCode.name());
+//    		if (msgPattern != null) {
+//				msg = format(msgPattern, (Object[]) m_arguments);
+//    		}
+    	}
+    	catch (MissingResourceException e) {
+    		// ignore
+    	}
+    	return msg; 
+    }
+    
+    public String[] getArguments() {
+    	return m_arguments;
+    }
+    
+    
+    @SuppressWarnings("unused")
+	private String format(String s, Object[] arguments) {
+
+    	if (arguments == null) {
+    		return s;
+    	}
+    	
+    	// A very simple implementation of format
+        int i = 0;
+        while (i < arguments.length) {
+            String delimiter = "{" + i + "}";
+            while (s.contains(delimiter)) {
+                s = s.replace(delimiter, String.valueOf(arguments[i]));
+            }
+            i++;
+        }
+        return s;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtBundleInfo.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtBundleInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..18d1bdc389d7dbbe1e38e60e1089147c896cc987
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtBundleInfo.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtBundleInfo extends BaseModel implements Serializable {
+
+	private static final long serialVersionUID = -7285859217584861659L;
+
+	public void setName(String name) {
+		set("name", name);
+	}
+	
+	public String getName() {
+		return (String) get("name");
+	}
+	
+	public void setVersion(String version) {
+		set("version", version);
+	}
+	
+	public String getVersion() {
+		return (String) get("version");
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtCommandResponse.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtCommandResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..439200ab4722d869b0f2f14ef62ce303fd638c37
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtCommandResponse.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+
+public class GwtCommandResponse implements Serializable {
+
+	private static final long serialVersionUID = -6187902237651876015L;
+
+	private String m_command;
+	private String m_stdout;
+	private int m_exitValue;
+	
+	public GwtCommandResponse()
+	{}
+
+	public String getCommand() {
+		return m_command;
+	}
+
+	public void setCommand(String command) {
+		m_command = command;
+	}
+
+	public String getStdout() {
+		return m_stdout;
+	}
+
+	public void setStdout(String stdout) {
+		m_stdout = stdout;
+	}
+	
+	public int getExitValue() {
+		return m_exitValue;
+	}
+	
+	public void setExitValue(int value) {
+		m_exitValue = value;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtConfigComponent.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtConfigComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..606a378ba6bcf17c52e08a8960ec333d8d98561d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtConfigComponent.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtConfigComponent extends BaseModelData implements Serializable {
+
+	private static final long serialVersionUID = -6388356998309026758L;
+
+	private List<GwtConfigParameter> m_parameters;
+	
+	public GwtConfigComponent() {
+		m_parameters = new ArrayList<GwtConfigParameter>();
+	}
+	
+    public String getComponentId() {
+        return get("componentId");
+    }
+
+    public void setComponentId(String componentId) {
+        set("componentId", componentId);
+    }
+
+    public String getComponentName() {
+        return get("componentName");
+    }
+
+    public void setComponentName(String componentName) {
+        set("componentName", componentName);
+    }
+
+    public String getComponentDescription() {
+        return get("componentDescription");
+    }
+
+    public void setComponentDescription(String componentDescription) {
+        set("componentDescription", componentDescription);
+    }
+
+    public String getComponentIcon() {
+        return get("componentIcon");
+    }
+
+    public void setComponentIcon(String componentIcon) {
+        set("componentIcon", componentIcon);
+    }
+
+	public List<GwtConfigParameter> getParameters() {
+		return m_parameters;
+	}
+
+	public void setParameters(List<GwtConfigParameter> parameters) {
+		m_parameters = parameters;
+	}
+	
+	public GwtConfigParameter getParameter(String id) {
+		for (GwtConfigParameter param : m_parameters) {
+			if (param.getId().equals(id)) {
+				return param;
+			}
+		}
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtConfigParameter.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtConfigParameter.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ec4aa9ffcd1494e73bed8d092ee99b3b25c42db
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtConfigParameter.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public class GwtConfigParameter implements Serializable {
+
+	private static final long serialVersionUID = -1738441153196315880L;
+
+	public enum GwtConfigParameterType implements Serializable, IsSerializable {		
+	    STRING,
+	    LONG,
+	    DOUBLE,
+	    FLOAT,
+	    INTEGER,
+	    BYTE,
+	    CHAR,
+	    BOOLEAN,
+	    SHORT,
+	    PASSWORD;
+	    GwtConfigParameterType() 
+		{}
+	}
+	
+	private String                 m_id;
+	private String                 m_name;
+	private String                 m_description;
+	private GwtConfigParameterType m_type;
+	private boolean                m_required;
+	private String		           m_default;
+	private int                    m_cardinality;
+	private Map<String, String>    m_options;
+	private String		           m_min;
+	private String		           m_max;
+	private String		           m_value;  // used for fields with single cardinality
+	private String[]		       m_values; // used for fields with multiple cardinality
+	
+	public GwtConfigParameter()
+	{}
+
+	public String getId() {
+		return m_id;
+	}
+
+	public void setId(String id) {
+		m_id = id;
+	}
+
+	public String getName() {
+		return m_name;
+	}
+
+	public void setName(String name) {
+		m_name = name;
+	}
+
+	public String getDescription() {
+		return m_description;
+	}
+
+	public void setDescription(String description) {
+		m_description = description;
+	}
+
+	public GwtConfigParameterType getType() {
+		return m_type;
+	}
+
+	public void setType(GwtConfigParameterType type) {
+		m_type = type;
+	}
+
+	public boolean isRequired() {
+		return m_required;
+	}
+
+	public void setRequired(boolean required) {
+		m_required = required;
+	}
+
+	public String getDefault() {
+		return m_default;
+	}
+
+	public void setDefault(String default1) {
+		m_default = default1;
+	}
+
+	public int getCardinality() {
+		return m_cardinality;
+	}
+
+	public void setCardinality(int cardinality) {
+		m_cardinality = cardinality;
+	}
+	
+	public Map<String, String> getOptions() {
+		return m_options;
+	}
+	
+	public void setOptions(Map<String, String> options) {
+		m_options = options;
+	}
+
+	public String getMin() {
+		return m_min;
+	}
+
+	public void setMin(String min) {
+		m_min = min;
+	}
+
+	public String getMax() {
+		return m_max;
+	}
+
+	public void setMax(String max) {
+		m_max = max;
+	}
+
+	public String getValue() {
+		return m_value;
+	}
+
+	public void setValue(String value) {
+		m_value = value;
+	}
+
+	public String[] getValues() {
+		return m_values;
+	}
+
+	public void setValues(String[] values) {
+		m_values = values;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtDeploymentPackage.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtDeploymentPackage.java
new file mode 100644
index 0000000000000000000000000000000000000000..09784c391cdbc546063be3f4fd2c8ef5045ae091
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtDeploymentPackage.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtDeploymentPackage extends BaseModel implements Serializable {
+
+	private static final long serialVersionUID = -7648638193931336835L;
+		
+	// Needed to prevent serialization errors
+	@SuppressWarnings("unused")
+	private GwtBundleInfo unused;
+
+	public void setName(String name) {
+		set("name", name);
+	}
+	
+	public String getName() {
+		return (String) get("name");
+	}
+	
+	public void setVersion(String version) {
+		set("version", version);
+	}
+	
+	public String getVersion() {
+		return (String) get("version");
+	}
+	
+	public List<GwtBundleInfo> getBundleInfos() {
+		return get("bundles");
+	}
+
+	public void setBundleInfos(List<GwtBundleInfo> bundleInfos) {
+		set("bundles", bundleInfos);
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtDeviceConfig.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtDeviceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a001fca4f35c882f6ff748d6f3631342986dd9c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtDeviceConfig.java
@@ -0,0 +1,306 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.eclipse.kura.web.client.util.DateUtils;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtDeviceConfig extends BaseModel implements Serializable {
+
+    private static final long serialVersionUID = 1708831984640005284L;
+    
+	public GwtDeviceConfig() {}   
+	
+    @Override
+    @SuppressWarnings({"unchecked"})
+    public <X> X get(String property) {
+    	if ("lastEventOnFormatted".equals(property)) {
+    		return (X) (DateUtils.formatDateTime((Date) get("lastEventOn")));
+    	}
+    	else if ("uptimeFormatted".equals(property)) {
+    	    if (getUptime() == -1) {
+    	        return (X) "Unknown";
+    	    }
+    	    else {
+    	        return (X) String.valueOf(getUptime());
+    	    }
+        }
+    	else {
+    		return super.get(property);
+    	}
+    }
+    
+    public String getAccountName() {
+        return get("accountName");
+    }
+
+    public void setAccountName(String accountName) {
+        set("accountName", accountName);
+    }
+    
+    public String getClientId() {
+        return (String) get("clientId");
+    }
+
+
+    public void setClientId(String clientId) {
+        set("clientId", clientId);
+    }
+	
+    public Long getUptime() {
+        return (Long) get("uptime");
+    }
+
+    public String getUptimeFormatted() {
+        return (String) get("uptimeFormatted");
+    }
+
+    public void setUptime(Long uptime) {
+        set("uptime", uptime);
+    }
+    
+    public String getGwtDeviceStatus() {
+    	return (String) get("gwtDeviceStatus");
+	}
+
+	public void setGwtDeviceStatus(String gwtDeviceStatus) {
+		set("gwtDeviceStatus", gwtDeviceStatus);
+	}    
+    
+    public String getDisplayName() {
+        return (String) get("displayName");
+    }
+
+    public void setDisplayName(String displayName) {
+        set("displayName", displayName);
+    }
+    
+    public String getModelName() {
+        return (String) get("modelName");
+    }
+
+    public void setModelName(String modelName) {
+        set("modelName", modelName);
+    }
+    
+    public String getModelId() {
+        return (String) get("modelId");
+    }
+
+    public void setModelId(String modelId) {
+        set("modelId", modelId);
+    }
+    
+    public String getPartNumber() {
+        return (String) get("partNumber");
+    }
+
+    public void setPartNumber(String partNumber) {
+        set("partNumber", partNumber);
+    }    
+    
+    public String getSerialNumber() {
+        return (String) get("serialNumber");
+    }
+
+    public void setSerialNumber(String serialNumber) {
+        set("serialNumber", serialNumber);
+    }
+    
+    public String getAvailableProcessors() {
+        return (String) get("availableProcessors");
+    }
+
+    public void setAvailableProcessors(String availableProcessors) {
+        set("availableProcessors", availableProcessors);
+    }
+    
+    public String getTotalMemory() {
+        return (String) get("totalMemory");
+    }
+
+    public void setTotalMemory(String totalMemory) {
+        set("totalMemory", totalMemory);
+    }
+   
+    public String getFirmwareVersion() {
+        return (String) get("firmwareVersion");
+    }
+
+    public void setFirmwareVersion(String firmwareVersion) {
+        set("firmwareVersion", firmwareVersion);
+    }    
+    
+    public String getBiosVersion() {
+        return (String) get("biosVersion");
+    }
+
+    public void setBiosVersion(String biosVersion) {
+        set("biosVersion", biosVersion);
+    }    
+    
+    public String getOs() {
+        return (String) get("os");
+    }
+
+    public void setOs(String os) {
+        set("os", os);
+    }    
+    
+    public String getOsVersion() {
+        return (String) get("osVersion");
+    }
+
+    public void setOsVersion(String osVersion) {
+        set("osVersion", osVersion);
+    }    
+    
+    public String getOsArch() {
+        return (String) get("osArch");
+    }
+
+    public void setOsArch(String osArch) {
+        set("osArch", osArch);
+    }    
+    
+    public String getJvmName() {
+        return (String) get("jvmName");
+    }
+
+    public void setJvmName(String jvmName) {
+        set("jvmName", jvmName);
+    }    
+    
+    public String getJvmVersion() {
+        return (String) get("jvmVersion");
+    }
+
+    public void setJvmVersion(String jvmVersion) {
+        set("jvmVersion", jvmVersion);
+    }
+    
+    public String getJvmProfile() {
+        return (String) get("jvmProfile");
+    }
+
+    public void setJvmProfile(String jvmProfile) {
+        set("jvmProfile", jvmProfile);
+    }
+    
+    public String getOsgiFramework() {
+        return (String) get("osgiFramework");
+    }
+
+    public void setOsgiFramework(String osgiFramework) {
+        set("osgiFramework", osgiFramework);
+    }
+    
+    public String getOsgiFrameworkVersion() {
+        return (String) get("osgiFrameworkVersion");
+    }
+
+    public void setOsgiFrameworkVersion(String osgiFrameworkVersion) {
+        set("osgiFrameworkVersion", osgiFrameworkVersion);
+    }
+    
+    public String getConnectionInterface() {
+        return (String) get("connectionInterface");
+    }
+
+    public void setConnectionInterface(String connectionInterface) {
+        set("connectionInterface", connectionInterface);
+    }
+    
+    public String getConnectionIp() {
+        return (String) get("connectionIp");
+    }
+
+    public void setConnectionIp(String connectionIp) {
+        set("connectionIp", connectionIp);
+    }
+    
+    public String getAcceptEncoding() {
+    	return (String) get("acceptEncoding");
+    }
+    
+    public void setAcceptEncoding(String acceptEncoding) {
+    	set("acceptEncoding", acceptEncoding);
+    }
+
+    public String getApplicationIdentifiers() {
+        return (String) get("applicationIdentifiers");
+    }
+
+    public void setApplicationIdentifiers(String applicationIdentifiers) {
+        set("applicationIdentifiers", applicationIdentifiers);
+    }
+    
+    public Double getGpsLatitude() {
+        return (Double) get("gpsLatitude");
+    }
+
+    public void setGpsLatitude(Double gpsLatitude) {
+        set("gpsLatitude", gpsLatitude);
+    }
+
+    public Double getGpsLongitude() {
+        return (Double) get("gpsLongitude");
+    }
+
+    public void setGpsLongitude(Double gpsLongitude) {
+        set("gpsLongitude", gpsLongitude);
+    }
+
+    public Double getGpsAltitude() {
+        return (Double) get("gpsAltitude");
+    }
+
+    public void setGpsAltitude(Double gpsAltitude) {
+        set("gpsAltitude", gpsAltitude);
+    }    
+    
+    public String getGpsAddress() {
+        return (String) get("gpsAddress");
+    }
+
+    public void setGpsAddress(String gpsAddress) {
+        set("gpsAddress", gpsAddress);
+    }
+
+    public Date getLastEventOn() {
+        return (Date) get("lastEventOn");
+    }
+
+    public String getLastEventOnFormatted() {
+        return (String) get("lastEventOnFormatted");
+    }
+
+    public void setLastEventOn(Date lastEventDate) {
+        set("lastEventOn", lastEventDate);
+    }    
+    
+    public String getLastEventType() {
+        return (String) get("lastEventType");
+    }
+
+    public void setLastEventType(String lastEventType) {
+        set("lastEventType", lastEventType);
+    }
+    
+    public boolean isOnline() {
+    	return getGwtDeviceStatus().compareTo("CONNECTED") == 0;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtFirewallOpenPortEntry.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtFirewallOpenPortEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..745b4a0ff302514bd7dbb09ed757a0d26ea0f8e3
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtFirewallOpenPortEntry.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtFirewallOpenPortEntry extends BaseModelData implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1153451329284913943L;
+
+	public GwtFirewallOpenPortEntry() {}
+	
+	public Integer getPort() {
+    	if (get("port") != null) {
+    		return (Integer) get("port");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+
+    public void setPort(int port) {
+        set("port", port);
+    }
+    
+    public String getProtocol() {
+        return get("protocol");
+    }
+
+    public void setProtocol(String protocol) {
+        set("protocol", protocol);
+    }
+    
+    public String getPermittedNetwork() {
+        return get("permittedNetwork");
+    }
+
+    public void setPermittedNetwork(String permittedNetwork) {
+        set("permittedNetwork", permittedNetwork);
+    }
+    
+    public String getPermittedInterfaceName() {
+    	return get("permittedInterfaceName");
+    }
+    
+    public void setPermittedInterfaceName(String permittedInterfaceName) {
+    	set("permittedInterfaceName", permittedInterfaceName);
+    }
+    
+    public String getUnpermittedInterfaceName() {
+    	return get("unpermittedInterfaceName");
+    }
+    
+    public void setUnpermittedInterfaceName(String unpermittedInterfaceName) {
+    	set("unpermittedInterfaceName", unpermittedInterfaceName);
+    }
+    
+    public String getPermittedMAC() {
+        return get("permittedMAC");
+    }
+
+    public void setPermittedMAC(String permittedMAC) {
+        set("permittedMAC", permittedMAC);
+    }
+    
+    public String getSourcePortRange() {
+        return get("sourcePortRange");
+    }
+
+    public void setSourcePortRange(String sourcePortRange) {
+        set("sourcePortRange", sourcePortRange);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtFirewallPortForwardEntry.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtFirewallPortForwardEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d09cf515692af77130b8ea0b59d8fd247358ce0
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtFirewallPortForwardEntry.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtFirewallPortForwardEntry extends BaseModelData implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -2257728265961620948L;
+
+	public GwtFirewallPortForwardEntry() {}
+	
+	public String getInterfaceName() {
+        return get("interfaceName");
+    }
+
+    public void setInterfaceName(String interfaceName) {
+        set("interfaceName", interfaceName);
+    }
+    
+    public String getAddress() {
+        return get("address");
+    }
+
+    public void setAddress(String address) {
+        set("address", address);
+    }
+    
+    public String getProtocol() {
+        return get("protocol");
+    }
+
+    public void setProtocol(String protocol) {
+        set("protocol", protocol);
+    }
+    
+    public Integer getInPort() {
+    	if (get("inPort") != null) {
+    		return (Integer) get("inPort");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+
+    public void setInPort(int inPort) {
+        set("inPort", inPort);
+    }
+    
+    public Integer getOutPort() {
+    	if (get("outPort") != null) {
+    		return (Integer) get("outPort");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+
+    public void setOutPort(int outPort) {
+        set("outPort", outPort);
+    }
+    
+    public String getPermittedNetwork() {
+        return get("permittedNetwork");
+    }
+
+    public void setPermittedNetwork(String permittedNetwork) {
+        set("permittedNetwork", permittedNetwork);
+    }
+    
+    public String getPermittedMAC() {
+        return get("permittedMAC");
+    }
+
+    public void setPermittedMAC(String permittedMAC) {
+        set("permittedMAC", permittedMAC);
+    }
+    
+    public String getSourcePortRange() {
+        return get("sourcePortRange");
+    }
+
+    public void setSourcePortRange(String sourcePortRange) {
+        set("sourcePortRange", sourcePortRange);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtGroupedNVPair.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtGroupedNVPair.java
new file mode 100644
index 0000000000000000000000000000000000000000..a82d916b56f31f01fe4b487bb8daa747defa3af7
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtGroupedNVPair.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import org.eclipse.kura.web.client.messages.ValidationMessages;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+import com.google.gwt.core.client.GWT;
+
+public class GwtGroupedNVPair extends BaseModel implements Serializable 
+{
+	private static final long serialVersionUID = 6017065568183482351L;
+
+	
+	public GwtGroupedNVPair()
+	{}
+	
+	public GwtGroupedNVPair(String group, String name, String value) {
+		setGroup(group);
+		setName(name);
+		setValue(value);
+	}
+	
+	public void setGroup(String group) {
+		set("group", group); 	
+	}
+	
+	public String getGroup() {
+		return get("group");
+	}
+	
+	public String getGroupLoc() {
+		return get("groupLoc");
+	}
+
+	public void setId(String id) {
+		set("id", id); 	
+	}
+	
+	public String getId() {
+		return get("id");
+	}
+
+	public void setName(String name) {
+		set("name", name); 	
+	}
+	
+	public String getName() {
+		return get("name");
+	}
+
+	public String getNameLoc() {
+		return get("nameLoc");
+	}
+	
+	public void setValue(String value) {
+		set("value", value); 	
+	}
+	
+	public String getValue() {
+		return get("value");
+	}
+
+	public void setStatus(String status) {
+		set("status", status); 	
+	}
+	
+	public String getStatus() {
+		return get("status");
+	}
+
+	public String getStatusLoc() {
+		return get("statusLoc");
+	}
+
+	public void setVersion(String version) {
+		set("version", version); 	
+	}
+	
+	public String getVersion() {
+		return get("version");
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+    public <X> X get(String property) {
+    	if ("groupLoc".equals(property)) {
+    		ValidationMessages msgs = GWT.create(ValidationMessages.class);
+    		return (X) msgs.getString(getGroup());
+    	}
+    	else if ("nameLoc".equals(property)) {
+    		ValidationMessages msgs = GWT.create(ValidationMessages.class);
+    		return (X) msgs.getString(getName());
+    	}
+    	else if ("statusLoc".equals(property)) {
+    		ValidationMessages msgs = GWT.create(ValidationMessages.class);
+    		return (X) msgs.getString(getStatus());
+    	}
+    	else {
+    		return super.get(property);
+    	}
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemAuthType.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemAuthType.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2b9822116cc96c1c04eef09099af4b47c6da46b
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemAuthType.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtModemAuthType {
+	netModemAuthNONE,
+	netModemAuthAUTO,
+	netModemAuthCHAP,
+	netModemAuthPAP
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca3fc6b75f372384a9bdbbecd47c2b4e2d580b3f
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java
@@ -0,0 +1,213 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.util.List;
+
+
+public class GwtModemInterfaceConfig extends GwtNetInterfaceConfig
+{
+	private static final long serialVersionUID = -2586979604841994110L;
+
+	public GwtModemInterfaceConfig() {
+		super();
+	}
+	
+	public String getManufacturer() {
+	    return get("manufacturer");
+	}
+	
+	public void setManufacturer(String manufacturer) {
+	    set("manufacturer", manufacturer);
+	}
+	
+	public String getModel() {
+	    return get("model");
+	}
+	
+	public void setModel(String model) {
+	    set("model", model);
+	}
+	
+	public int getPppNum() {
+	    return ((Integer)get("pppNum")).intValue();
+	}
+	
+	public void setPppNum(int pppNum) {
+	    set("pppNum", Integer.valueOf(pppNum));
+	}
+	
+	public String getModemId() {
+	    return get("modemId");
+	}
+	
+	public void setModemId(String modemId) {
+	    set("modemId", modemId);
+	}
+	
+	public String getDialString() {
+		return get("dialString");
+	}
+	
+	public void setDialString(String dialString) {
+		set("dialString", dialString);
+	}
+	
+	public GwtModemAuthType getAuthType() {
+	    if(get("authType") != null) {
+            return GwtModemAuthType.valueOf((String)get("authType"));
+	    } else {
+            return null;
+	    }
+	}
+	
+	public void setAuthType(GwtModemAuthType authType) {
+		set("authType", authType.name());
+	}
+	
+	public String getUsername() {
+		return get("username");
+	}
+	
+	public void setUsername(String username) {
+		set("username", username);
+	}
+    
+    public String getPassword() {
+        return get("password");
+    }
+    
+    public void setPassword(String password) {
+        set("password", password);
+    }
+    
+    public int getLcpEchoInterval() {
+	    return ((Integer)get("lcpEchoInterval")).intValue();
+	}
+	
+	public void setLcpEchoInterval(int lcpEchoInterval) {
+	    set("lcpEchoInterval", Integer.valueOf(lcpEchoInterval));
+	}
+	
+	public int getLcpEchoFailure() {
+	    return ((Integer)get("lcpEchoFailure")).intValue();
+	}
+	
+	public void setLcpEchoFailure(int lcpEchoFailure) {
+	    set("lcpEchoFailure", Integer.valueOf(lcpEchoFailure));
+	}
+    
+	public int getProfileID() {
+    	if (get("profileID") != null) {
+    		return (Integer) get("profileID");
+    	}
+    	else {
+    		return 0;
+    	}
+	}
+
+	public void setProfileID(int id) {
+		set("profileID", id);
+	}
+	
+	public GwtModemPdpType getPdpType() {
+        if(get("pdpType") != null) {
+            return GwtModemPdpType.valueOf((String)get("pdpType"));
+        } else {
+            return null;
+        }
+	}
+	
+	public void setPdpType(GwtModemPdpType pdpType) {
+		set("pdpType", pdpType.name());
+	}
+	
+	public String getApn() {
+		return get("apn");
+	}
+	
+	public void setApn(String apn) {
+		set("apn", apn);
+	}
+	
+	public int getDataCompression() {
+    	if (get("dataCompression") != null) {
+    		return (Integer) get("dataCompression");
+    	}
+    	else {
+    		return 0;
+    	}
+	}
+	
+	public void setDataCompression(int dataCompression) {
+		set("dataCompression", dataCompression);
+	}
+	
+	public int getHeaderCompression() {
+    	if (get("headerCompression") != null) {
+    		return (Integer) get("headerCompression");
+    	}
+    	else {
+    		return 0;
+    	}
+	}
+	
+	public void setHeaderCompression(int headerCompression) {
+		set("headerCompression", headerCompression);
+	}
+    
+    public boolean isDataCompression() {
+        return (this.getDataCompression() == 0)? false : true;
+    }
+    
+    public boolean isHeaderCompression() {
+        return (this.getHeaderCompression() == 0)? false : true;
+    }
+    
+    public void setNetworkTechnology(List<String> networkTechnology) {
+        set("networkTechnology", networkTechnology);
+    }
+    
+    public List<String> getNetworkTechnology() {
+        return get("networkTechnology");
+    }
+	
+	public void setConnectionType(String connectionType) {
+	    set("connectionType", connectionType);
+	}
+	
+	public String getConnectionType() {
+		return get("connectionType");
+	}
+	
+	public boolean isGpsEnabled() {
+    	if (get("gpsEnabled") != null) {
+    		return (Boolean) get("gpsEnabled");
+    	}
+    	return false;
+    }
+
+    public void setGpsEnabled(boolean gpsEnabled) {
+        set("gpsEnabled", gpsEnabled);
+    }
+    
+    public boolean isGpsSupported() {
+    	if (get("gpsSupported") != null) {
+    		return (Boolean) get("gpsSupported");
+    	}
+    	return false;
+    }
+
+    public void setGpsSupported(boolean gpsSupported) {
+        set("gpsSupported", gpsSupported);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemNetworkTechnologyType.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemNetworkTechnologyType.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe0e31a9e03d1b07e8aa87befdc30eebb5f96db1
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemNetworkTechnologyType.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+public enum GwtModemNetworkTechnologyType implements Serializable {
+    NONE,
+    CDMA,
+    EVDO,
+    HSDPA,
+    GPS
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemPdpType.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemPdpType.java
new file mode 100644
index 0000000000000000000000000000000000000000..1accce76067c3073964b6322a2c87b459fcba257
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtModemPdpType.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtModemPdpType {
+    netModemPdpUnknown,
+	netModemPdpIP,
+	netModemPdpPPP,
+	netModemPdpIPv6
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfConfigMode.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfConfigMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..14a4e490846fc5a7ac56b7a3e49de5ee82fd6e63
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfConfigMode.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public enum GwtNetIfConfigMode implements Serializable, IsSerializable {
+	netIPv4ConfigModeDHCP,		
+	netIPv4ConfigModeManual;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfStatus.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..689ad0a3dfd9fa99ec6fc2f08f0e7c011cf71abc
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfStatus.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public enum GwtNetIfStatus implements Serializable, IsSerializable {
+	netIPv4StatusDisabled,
+	netIPv4StatusEnabledLAN,  
+	netIPv4StatusEnabledWAN;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfStatusModel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfStatusModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..01aa13c749e97eff3f2940b50e7a3b18c6e03bf3
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfStatusModel.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtNetIfStatusModel extends BaseModelData {
+
+    private static final long serialVersionUID = 2779596516813518500L;
+
+    public static final String NAME = "name";
+    public static final String STATUS = "status";
+    public static final String TOOLTIP = "tooltip";
+    
+    protected GwtNetIfStatusModel() {
+        
+    }
+    
+    public GwtNetIfStatusModel(GwtNetIfStatus status, String name, String tooltip) {
+        set(STATUS, status.name());
+        set(NAME, name);
+        set(TOOLTIP, tooltip);
+    }
+
+    public String getName() {
+        return get(NAME);
+    }
+    
+    public GwtNetIfStatus getStatus() {
+        GwtNetIfStatus status = null;
+        String statusStr = get(STATUS);
+        
+        try {
+            status = GwtNetIfStatus.valueOf(statusStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        
+        return status;
+    }
+    
+    public String getTooltip() {
+        return get(TOOLTIP);
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if(obj == null) {
+            return false;
+        }
+        
+        if (!(obj instanceof GwtNetIfStatusModel)) {
+            return false;
+        }
+        
+        GwtNetIfStatusModel other = (GwtNetIfStatusModel) obj;
+        
+        if(getStatus() != null) {
+            if(!getStatus().equals(other.getStatus())) {
+                return false;
+            }
+        } else if(other.getStatus() != null) {
+            return false;
+        }
+        
+        if(getTooltip() != null) {
+            if(!getTooltip().equals(other.getTooltip())) {
+                return false;
+            }
+        } else if(other.getTooltip() != null) {
+            return false;
+        }
+        
+        return true;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfType.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfType.java
new file mode 100644
index 0000000000000000000000000000000000000000..3aeb6deccfeb9b6717a7d01d982dcdb8ac6239fb
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetIfType.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public enum GwtNetIfType implements Serializable, IsSerializable {
+	
+	/** The device type is unknown. */
+	UNKNOWN,
+	/** The device is wired Ethernet device. */
+	ETHERNET,
+	/** The device is an 802.11 WiFi device. */
+	WIFI,
+	/** Unused */
+	UNUSED1,
+	/** Unused */
+	UNUSED2,
+	/** The device is Bluetooth device that provides PAN or DUN capabilities. */
+	BT,
+	/** The device is an OLPC mesh networking device. */
+	OLPC_MESH,
+	/** The device is an 802.16e Mobile WiMAX device. */
+	WIMAX,
+	/** The device is a modem supporting one or more of analog telephone, CDMA/EVDO, GSM/UMTS/HSPA, or LTE standards to access a cellular or wireline data network. */
+	MODEM,
+	/** The device is an IP-capable InfiniBand interface. */
+	INFINIBAND,
+	/** The device is a bond master interface. */
+	BOND,
+	/** The device is a VLAN interface. */
+	VLAN,
+	/** The device is an ADSL device supporting PPPoE and PPPoATM protocols. */
+	ADSL,
+	/** The device is a loopback device. */
+	LOOPBACK;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetInterfaceConfig.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetInterfaceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..5705cee9021bd4ea7baee6bc4078390bd9e9330d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetInterfaceConfig.java
@@ -0,0 +1,341 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtNetInterfaceConfig extends BaseModelData implements Serializable
+{
+	private static final long serialVersionUID = 7079533925979145804L;
+	
+	private GwtReverseNatEntries m_gwtReverseNatEntries;
+	
+	public GwtNetInterfaceConfig() {	
+		setStatus(GwtNetIfStatus.netIPv4StatusDisabled.name());
+		setConfigMode(GwtNetIfConfigMode.netIPv4ConfigModeDHCP.name());
+		setRouterMode(GwtNetRouterMode.netRouterOff.name());
+	}
+
+	
+    public String getName() {
+        return get("name");
+    }
+
+    public void setName(String name) {
+        set("name", name);
+    }
+    
+    public GwtNetIfStatus getStatusEnum() {
+        return GwtNetIfStatus.valueOf(getStatus());
+    }
+
+    public String getStatus() {
+        return get("status");
+    }
+
+    public void setStatus(String status) {
+        set("status", status);
+    }
+    
+    public GwtNetIfConfigMode getConfigModeEnum() {
+        return GwtNetIfConfigMode.valueOf(getConfigMode());
+    }
+
+    public String getConfigMode() {
+        return get("configMode");
+    }
+
+    public void setConfigMode(String configMode) {
+        set("configMode", configMode);
+    }
+ 
+    public String getIpAddress() {
+        return get("ipAddress");
+    }
+
+    public void setIpAddress(String ipAddress) {
+        set("ipAddress", ipAddress);
+    }
+
+    public String getSubnetMask() {
+        return get("subnetMask");
+    }
+
+    public void setSubnetMask(String subnetMask) {
+        set("subnetMask", subnetMask);
+    }
+
+    public String getGateway() {
+        return get("gateway");
+    }
+
+    public void setGateway(String gateway) {
+        set("gateway", gateway);
+    }
+
+    public String getDnsServers() {
+        return get("dnsServers");
+    }
+
+    public void setDnsServers(String dnsServers) {
+        set("dnsServers", dnsServers);
+    }
+
+    public String getReadOnlyDnsServers() {
+        return get("dnsReadOnlyServers");
+    }
+
+    public void setReadOnlyDnsServers(String dnsServers) {
+        set("dnsReadOnlyServers", dnsServers);
+    }
+    
+    public String getSearchDomains() {
+        return get("searchDomains");
+    }
+
+    public void setSearchDomains(String searchDomains) {
+        set("searchDomains", searchDomains);
+    }
+    
+    public void setHwState(String hwState) {
+    	set("hwState", hwState);
+    }
+
+    public String getHwState() {
+    	return get("hwState");
+    }
+
+    public void setHwName(String hwName) {
+    	set("hwName", hwName);
+    }
+
+    public String getHwName() {
+    	return get("hwName");
+    }
+    
+    public GwtNetIfType getHwTypeEnum() {
+        GwtNetIfType typeEnum = GwtNetIfType.UNKNOWN;
+        
+        try {
+            typeEnum = GwtNetIfType.valueOf(getHwType());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        
+        return typeEnum;
+    }
+
+    public void setHwType(String hwType) {
+    	set("hwType", hwType);
+    }
+
+    public String getHwType() {
+    	return get("hwType");
+    }
+
+    public void setHwAddress(String hwAddress) {
+    	set("hwAddress", hwAddress);
+    }
+
+    public String getHwAddress() {
+    	return get("hwAddress");
+    }
+    
+    public void setHwSerial(String hwSerial) {
+        set("hwSerial", hwSerial);
+    }
+    
+    public String getHwSerial() {
+        return get("hwSerial");
+    }
+
+    public void setHwDriver(String hwDriver) {
+    	set("hwDriver", hwDriver);
+    }
+
+    public String getHwDriver() {
+    	return get("hwDriver");
+    }
+
+    public void setHwDriverVersion(String hwDriverVersion) {
+    	set("hwDriverVersion", hwDriverVersion);
+    }
+
+    public String getHwDriverVersion() {
+    	return get("hwDriverVersion");
+    }
+
+    public void setHwFirmware(String hwFirmware) {
+    	set("hwFirmware", hwFirmware);
+    }
+
+    public String getHwFirmware() {
+    	return get("hwFirmware");
+    }
+
+    public void setHwMTU(int mtu) {
+    	set("hwMTU", mtu);
+    }
+
+    public int getHwMTU() {
+    	if (get("hwMTU") != null) {
+    		return (Integer) get("hwMTU");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+
+    public void setHwUsbDevice(String hwUsbDevice) {
+    	set("hwUsbDevice", hwUsbDevice);
+    }
+
+    public String getHwUsbDevice() {
+    	return get("hwUsbDevice");
+    }
+    
+    public GwtNetRouterMode getRouterModeEnum() {
+        return GwtNetRouterMode.valueOf(getRouterMode());
+}
+
+    public String getRouterMode() {
+        return get("routerMode");
+    }
+
+    public void setRouterMode(String routerMode) {
+        set("routerMode", routerMode);
+    }
+
+    public String getRouterDhcpBeginAddress() {
+        return get("routerDhcpBeginAddress");
+    }
+
+    public void setRouterDhcpBeginAddress(String routerDhcpBeginAddress) {
+        set("routerDhcpBeginAddress", routerDhcpBeginAddress);
+    }
+
+    public String getRouterDhcpEndAddress() {
+        return get("routerDhcpEndAddress");
+    }
+
+    public void setRouterDhcpEndAddress(String routerDhcpEndAddress) {
+        set("routerDhcpEndAddress", routerDhcpEndAddress);
+    }
+
+    public int getRouterDhcpDefaultLease() {
+    	if (get("routerDhcpDefaultLease") != null) {
+    		return (Integer) get("routerDhcpDefaultLease");
+    	}
+		return 0;
+    }
+
+    public void setRouterDhcpDefaultLease(int routerDhcpDefaultLease) {
+        set("routerDhcpDefaultLease", routerDhcpDefaultLease);
+    }
+    
+    public int getRouterDhcpMaxLease() {
+    	if (get("routerDhcpMaxLease") != null) {
+    		return (Integer) get("routerDhcpMaxLease");
+    	}
+		return 0;
+    }
+
+    public void setRouterDhcpMaxLease(int routerDhcpMaxLease) {
+        set("routerDhcpMaxLease", routerDhcpMaxLease);
+    }
+
+    public String getRouterDhcpSubnetMask() {
+		return (String) get("routerDhcpSubnetMask");
+    }
+    
+    public void setRouterDhcpSubnetMask(String routerDhcpSubnetMask) {
+    	set("routerDhcpSubnetMask", routerDhcpSubnetMask);
+    }
+    
+    public boolean getRouterDnsPass() {
+    	if (get("routerDnsPass") != null) {
+    		return (Boolean) get("routerDnsPass");
+    	}
+    	return false;
+    }
+
+    public void setRouterDnsPass(boolean routerDnsPass) {
+        set("routerDnsPass", routerDnsPass);
+    }
+    
+	public GwtReverseNatEntries getReverseNatEntries() {
+		return m_gwtReverseNatEntries;
+	}
+
+	public void setReverseNatEntries(GwtReverseNatEntries gwtReverseNatEntries) {
+		m_gwtReverseNatEntries = gwtReverseNatEntries;
+	}
+    
+    @Override
+    public boolean equals(Object o) {
+        if(!(o instanceof GwtNetInterfaceConfig)) {
+            return false;
+        }
+        
+        GwtNetInterfaceConfig otherGwtNetInterfaceConfig = (GwtNetInterfaceConfig)o;
+        if (m_gwtReverseNatEntries != null) {
+        	if (otherGwtNetInterfaceConfig.m_gwtReverseNatEntries == null) {
+        		return false;
+        	}       
+        	if (!m_gwtReverseNatEntries.equals(otherGwtNetInterfaceConfig.m_gwtReverseNatEntries)) {
+        		return false;
+        	}
+        } else {
+        	if (otherGwtNetInterfaceConfig.m_gwtReverseNatEntries != null) {
+        		return false;
+        	}
+        }
+        
+        Map<String, Object> properties = this.getProperties();
+        Map<String, Object> otherProps = ((GwtNetInterfaceConfig)o).getProperties();
+        
+        if(properties != null) {
+            if(otherProps == null) {
+                return false;
+            }            
+            if(properties.size() != otherProps.size()) {
+                Log.debug("Sizes differ");
+                return false;
+            }
+            
+            Object oldVal, newVal;
+            for(String key : properties.keySet()) {
+                oldVal = properties.get(key);
+                newVal = otherProps.get(key);                
+                if(oldVal != null) {
+                    if(!oldVal.equals(newVal)) {
+                        Log.debug("Values differ - Key: " + key + " oldVal: " + oldVal + ", newVal: " + newVal);
+                        return false;
+                    }
+                } else if(newVal != null) {
+                    return false;
+                }
+            }
+        } else if(otherProps != null) {
+            return false;
+        }
+        
+        return true;
+    }
+}
+
+
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetProtocol.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetProtocol.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd40958acf9ef85b7b524371e658a8b545cb94a8
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetProtocol.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtNetProtocol {
+
+	tcp,
+	udp
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetRouterMode.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetRouterMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..140dcb532ce7e344012f363a59a0cc08b3d2565d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtNetRouterMode.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtNetRouterMode {
+	netRouterDchpNat,
+	netRouterDchp,
+	netRouterNat,
+	netRouterOff;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatEntries.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatEntries.java
new file mode 100644
index 0000000000000000000000000000000000000000..acdf79c2ea94dd922a730919c61c472ea60b5c03
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatEntries.java
@@ -0,0 +1,102 @@
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GwtReverseNatEntries implements Serializable {
+		
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -347524482384552722L;
+	private List<GwtReverseNatEntry> m_revNatEntries = null;
+	
+	public GwtReverseNatEntries() {
+		m_revNatEntries = new ArrayList<GwtReverseNatEntry>();
+	}
+	
+	public GwtReverseNatEntries(List<GwtReverseNatEntry> list) {
+		m_revNatEntries = new ArrayList<GwtReverseNatEntry>();
+		m_revNatEntries.addAll(list);
+	}
+	
+	public void add(GwtReverseNatEntry revNatEntry) {
+		boolean entryFound = false;
+		for(GwtReverseNatEntry entry : m_revNatEntries) {
+			if (equals(entry, revNatEntry)) {
+				entryFound = true;
+				break;
+			}
+		}
+		if (!entryFound) {
+			m_revNatEntries.add(revNatEntry);
+		}
+	}
+	
+	public void remove(GwtReverseNatEntry revNatEntry) {
+		for (int i = 0; i < m_revNatEntries.size(); i++) {
+			GwtReverseNatEntry entry = m_revNatEntries.get(i);
+			if (equals(entry, revNatEntry)) {
+				m_revNatEntries.remove(i);
+				break;
+			}
+		}
+	}
+	
+	public List<GwtReverseNatEntry> getEntries() {
+		return m_revNatEntries;
+	}
+	
+	public int getNumberOfEntries() {
+		return m_revNatEntries.size();
+	}
+	
+	public boolean equals(Object o) {
+		if (!(o instanceof GwtReverseNatEntries)) {
+			return false;
+		}
+		
+		GwtReverseNatEntries other = (GwtReverseNatEntries)o;
+		if (m_revNatEntries != null) {
+			if (other.m_revNatEntries == null) {
+				return false;
+			}
+			
+			if (m_revNatEntries.size() != other.m_revNatEntries.size()) {
+				return false;
+			}
+			
+			for (GwtReverseNatEntry thisRevNatEntry : m_revNatEntries) {
+				boolean isMatch = false;
+				for (GwtReverseNatEntry otherRevNatEntry : other.m_revNatEntries) {
+					if (thisRevNatEntry.equals(otherRevNatEntry)) {
+						isMatch = true;
+					}
+				}
+				if (!isMatch) {
+					return false;
+				}
+			}
+		} else {
+			if (other.m_revNatEntries != null) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+	
+	private boolean equals (GwtReverseNatEntry revNatEntry1, GwtReverseNatEntry revNatEntry2) {
+		
+		boolean ret = false;
+		if (revNatEntry1.getOutInterface().equals(revNatEntry2.getOutInterface())
+				&& revNatEntry1.getProtocol().equals(revNatEntry2.getProtocol())
+				&& revNatEntry1.getOutInterface().equals(revNatEntry2.getOutInterface())
+				&& revNatEntry1.getOutInterface().equals(revNatEntry2.getOutInterface())) {	
+			ret = true;
+		}
+		return ret;
+	}
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatEntry.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f1e7b3b7e975b36b356c4719a43827105a514af
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatEntry.java
@@ -0,0 +1,84 @@
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtReverseNatEntry extends BaseModelData implements Serializable {
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -4076511862696349122L;
+
+	public String getOutInterface() {
+        return get("outInterface");
+    }
+
+    public void setOutInterface(String outInterface) {
+        set("outInterface", outInterface);
+    }
+    
+    public String getProtocol() {
+        return get("protocol");
+    }
+
+    public void setProtocol(String protocol) {
+        set("protocol", protocol);
+    }
+    
+    public String getSourceNetwork() {
+        return get("sourceNetwork");
+    }
+
+    public void setSourceNetwork(String sourceNetwork) {
+        set("sourceNetwork", sourceNetwork);
+    }
+    
+    public String getDestinationNetwork() {
+        return get("destinationNetwork");
+    }
+
+    public void setDestinationNetwork(String destinationNetwork) {
+        set("destinationNetwork", destinationNetwork);
+    }
+    
+    public boolean equals(Object o) {
+    	if (!(o instanceof GwtReverseNatEntry)) {
+    		return false;
+    	}
+    	
+    	Map<String, Object> properties = this.getProperties();
+        Map<String, Object> otherProps = ((GwtReverseNatEntry)o).getProperties();
+        
+        if(properties != null) {
+            if(otherProps == null) {
+                return false;
+            }            
+            if(properties.size() != otherProps.size()) {
+                Log.debug("Sizes differ");
+                return false;
+            }
+            
+            Object oldVal, newVal;
+            for(String key : properties.keySet()) {
+                oldVal = properties.get(key);
+                newVal = otherProps.get(key);                
+                if(oldVal != null) {
+                    if(!oldVal.equals(newVal)) {
+                        Log.debug("Values differ - Key: " + key + " oldVal: " + oldVal + ", newVal: " + newVal);
+                        return false;
+                    }
+                } else if(newVal != null) {
+                    return false;
+                }
+            }
+        } else if(otherProps != null) {
+            return false;
+        }
+    			
+    	return true;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatProtocol.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatProtocol.java
new file mode 100644
index 0000000000000000000000000000000000000000..d94a1a942552222bb89bbd4720c177e8c9bd26f6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtReverseNatProtocol.java
@@ -0,0 +1,7 @@
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtReverseNatProtocol {
+	all,
+	tcp,
+	udp
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSession.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSession.java
new file mode 100644
index 0000000000000000000000000000000000000000..f79b849d97c4345370a9f0848113b0223247f553
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSession.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtSession extends BaseModel implements Serializable 
+{
+	private static final long serialVersionUID = -2507268464782812398L;
+
+	private boolean m_netAdminAvailable;
+	private String m_kuraVersion;
+	private String m_osVersion;
+	
+	public GwtSession()
+	{
+		m_netAdminAvailable = true;
+		m_kuraVersion = "version-unknown";
+	}
+
+	public boolean isNetAdminAvailable() {
+		return m_netAdminAvailable;
+	}
+
+	public void setNetAdminAvailable(boolean haveNetAdmin) {
+		this.m_netAdminAvailable = haveNetAdmin;
+	}
+	
+	public String getKuraVersion() {
+		return m_kuraVersion;
+	}
+	
+	public void setKuraVersion(String kuraVersion) {
+		m_kuraVersion = kuraVersion;
+	}
+	
+	public String getOsVersion() {
+		return m_osVersion;
+	}
+	
+	public void setOsVersion(String osVersion) {
+		m_osVersion = osVersion;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSettings.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSettings.java
new file mode 100644
index 0000000000000000000000000000000000000000..1416dade66f6966ef7cb9846db145976a7552445
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSettings.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtSettings extends BaseModel implements Serializable {
+
+	private static final long serialVersionUID = -7285859217584861659L;
+
+	public void setPasswordCurrent(String pwdCurrent) {
+		set("pwdCurrent", pwdCurrent);
+	}
+	
+	public String getPasswordCurrent() {
+		return (String) get("pwdCurrent");
+	}
+	
+	public void setPasswordNew(String pwdNew) {
+		set("pwdNew", pwdNew);
+	}
+	
+	public String getPasswordNew() {
+		return (String) get("pwdNew");
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSnapshot.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSnapshot.java
new file mode 100644
index 0000000000000000000000000000000000000000..0385f478d910c5c520cee2d0a81ec776437b7773
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtSnapshot.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.eclipse.kura.web.client.util.DateUtils;
+import org.eclipse.kura.web.client.util.MessageUtils;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtSnapshot extends BaseModel implements Serializable 
+{
+	private static final long serialVersionUID = 204571826084819719L;
+
+	
+	public GwtSnapshot()
+	{}
+	
+    @Override
+    @SuppressWarnings({"unchecked"})
+    public <X> X get(String property) {
+    	if ("createdOnFormatted".equals(property)) {
+    		if (((Date) get("createdOn")).getTime() == 0) {
+    			return (X) (MessageUtils.get("snapSeeded"));
+    		}    		
+    		return (X) (DateUtils.formatDateTime((Date) get("createdOn")));
+    	}
+    	else if ("snapshotId".equals(property)) {
+    		return (X) new Long(((Date) get("createdOn")).getTime());
+    	}
+    	else {
+    		return super.get(property);
+    	}
+    }
+	
+    public Date getCreatedOn() {
+        return (Date) get("createdOn");
+    }
+
+    public long getSnapshotId() {
+        return ((Date) get("createdOn")).getTime();
+    }
+
+    public String getCreatedOnFormatted() {
+        return DateUtils.formatDateTime((Date) get("createdOn"));
+    }    
+
+    public void setCreatedOn(Date createdOn) {
+        set("createdOn", createdOn);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiBgscanModule.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiBgscanModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8a1ea918496a1cdd4f874c679a8c4f190a4c588
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiBgscanModule.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtWifiBgscanModule {
+
+	netWifiBgscanMode_NONE,
+	netWifiBgscanMode_SIMPLE,
+	netWifiBgscanMode_LEARN
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiChannel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiChannel.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e2971400b9da333107dd9c9a2a41ba657f9e2eb
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiChannel.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtWifiChannel {
+	netWifiChannelAuto,
+	netWifiChannel1,
+	netWifiChannel2,
+	netWifiChannel3,
+	netWifiChannel4,
+	netWifiChannel5,
+	netWifiChannel6,
+	netWifiChannel7,
+	netWifiChannel8,
+	netWifiChannel9,
+	netWifiChannel10,
+	netWifiChannel11,
+	netWifiChannel12,
+	netWifiChannel13;
+	
+	public static GwtWifiChannel valueOf(short channel) {
+		try {
+			return GwtWifiChannel.valueOf("netWifiChannel" + channel);
+		} catch (Exception e) {
+			return GwtWifiChannel.netWifiChannelAuto;
+		}
+	}
+	
+	public static short toShort(GwtWifiChannel channel) {
+		
+		switch(channel) {
+			case netWifiChannel1:
+				return 1;
+			case netWifiChannel2:
+				return 2;
+			case netWifiChannel3:
+				return 3;
+			case netWifiChannel4:
+				return 4;
+			case netWifiChannel5:
+				return 5;
+			case netWifiChannel6:
+				return 6;
+			case netWifiChannel7:
+				return 7;
+			case netWifiChannel8:
+				return 8;
+			case netWifiChannel9:
+				return 9;
+			case netWifiChannel10:
+				return 10;
+			case netWifiChannel11:
+				return 11;
+			case netWifiChannel12:
+				return 13;
+			case netWifiChannel13:
+				return 13;
+			default:
+		}
+		
+		// TODO: what value to return for auto?
+		return -1;							
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiChannelModel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiChannelModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..4684abcbc8bc4695fc70696ed348b878cefa8336
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiChannelModel.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GwtWifiChannelModel extends BaseModel {
+	
+	private static final long serialVersionUID = -1471520645150788770L;
+	private static final String BAND2400MHZ = "2.4 GHz";
+	private static final int FIRST_2400MHZ_CHANNEL = 1;
+	private static final int LAST_2400MHZ_CHANNEL = 13;
+
+	public GwtWifiChannelModel () {
+		
+	}
+	
+	public GwtWifiChannelModel (String name, int channel, int frequency, String band) {
+		
+		set("name", name);
+		set("channel", channel);
+		set("frequency", frequency);
+		set("band", band);
+	}
+	
+	public String getName () {
+		return (String)get("name");
+	}
+	
+	public int getChannel () {
+		Integer iChannel = (Integer)get("channel");
+		return iChannel.intValue();
+	}
+	
+	public int getFrequency() {
+		Integer iFrequency = (Integer)get("frequency");
+		return iFrequency.intValue();
+	}
+	
+	public String getBand() {
+		return get("band");
+	}
+	
+	public void setBand(String band) {
+		set("band", band);
+	}
+	
+	public static List<GwtWifiChannelModel> getChannels() {
+		
+		List<GwtWifiChannelModel> alCannels = new ArrayList<GwtWifiChannelModel> ();
+		for (int i = FIRST_2400MHZ_CHANNEL; i <= LAST_2400MHZ_CHANNEL; i++) {
+			alCannels.add(new GwtWifiChannelModel(formChannelName(i), i, getCannelFrequencyMHz(i), BAND2400MHZ));
+		}
+		return alCannels;
+	}
+	
+	public String toString() {
+		return getName();
+	}
+	
+	private static String formChannelName (int channel) {
+		
+		StringBuffer sb = new StringBuffer();
+		sb.append("Channel ");
+		sb.append(channel);
+		return sb.toString();
+	}
+	
+	private static int getCannelFrequencyMHz (int channel) {
+		
+		int frequency = -1;
+		if ((channel >=1) && (channel <= 13)) {
+			frequency = 2407 + channel * 5;
+		}
+		return frequency;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiCiphers.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiCiphers.java
new file mode 100644
index 0000000000000000000000000000000000000000..76a8f78368d43b1136882bf070cfecfbb4be9d2f
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiCiphers.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtWifiCiphers {
+
+	netWifiCiphers_CCMP_TKIP,
+	netWifiCiphers_CCMP,
+	netWifiCiphers_TKIP
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiConfig.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..9313fc57e206075bf1983a23f59b2a096e6d5b90
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiConfig.java
@@ -0,0 +1,179 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+
+public class GwtWifiConfig extends BaseModelData implements Serializable {
+
+	private static final long serialVersionUID = -7610506986073264800L;
+	
+	public GwtWifiConfig() {
+		setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeStation.name());
+		setRadioMode(GwtWifiRadioMode.netWifiRadioModeBGN.name());
+		//setChannel(GwtWifiChannel.netWifiChannelAuto.name());
+		setSecurity(GwtWifiSecurity.netWifiSecurityWPA2.name());
+	}
+
+    public String getWirelessMode() {
+        return get("wirelessMode");
+    }
+
+    public void setWirelessMode(String wirelessMode) {
+        set("wirelessMode", wirelessMode);
+    }
+
+    public GwtWifiWirelessMode getWirelessModeEnum() {
+        return GwtWifiWirelessMode.valueOf(getWirelessMode());
+    }
+    
+    public String getWirelessSsid() {
+        return get("wirelessSsid");
+    }
+
+    public void setWirelessSsid(String wirelessSsid) {
+        set("wirelessSsid", wirelessSsid);
+    }
+	
+    public String getDriver() {
+        return get("driver");
+    }
+
+    public void setDriver(String driver) {
+        set("driver", driver);
+    }
+    
+    public String getRadioMode() {
+        return get("radioMode");
+    }
+
+    public void setRadioMode(String radioMode) {
+        set("radioMode", radioMode);
+    }
+
+    public GwtWifiRadioMode getRadioModeEnum() {
+        return GwtWifiRadioMode.valueOf(getRadioMode());
+    }
+
+    public ArrayList<Integer> getChannels () {
+    	return get("channels");
+    }
+    
+    public void setChannels(ArrayList<Integer> channels) {
+    	set("channels", channels);
+    }    
+    
+    public String getSecurity() {
+        return get("security");
+    }
+
+    public void setSecurity(String security) {
+        set("security", security);
+    }
+    
+    public GwtWifiSecurity getSecurityEnum() {
+        return GwtWifiSecurity.valueOf(getSecurity());
+    }
+    
+    public String getPairwiseCiphers() {
+    	return get("pairwiseCiphers");
+    }
+    
+    public void setPairwiseCiphers(String ciphers) {
+    	set("pairwiseCiphers", ciphers);
+    }
+    
+    public GwtWifiCiphers getPairwiseCiphersEnum () {
+    	return GwtWifiCiphers.valueOf(getPairwiseCiphers());
+    }
+    
+    public String getGroupCiphers() {
+    	return get("groupCiphers");
+    }
+    
+    public void setGroupCiphers(String ciphers) {
+    	set("groupCiphers", ciphers);
+    }
+    
+    public GwtWifiCiphers getGroupCiphersEnum () {
+    	return GwtWifiCiphers.valueOf(getGroupCiphers());
+    }
+
+    public String getPassword() {
+        return get("password");
+    }
+
+    public void setPassword(String password) {
+        set("password", password);
+    }
+    
+    public String getBgscanModule () {
+    	return get("bgscanModule");
+    }
+    
+    public void setBgscanModule(String bgscanModule) {
+    	set("bgscanModule", bgscanModule);
+    }
+    
+    public GwtWifiBgscanModule getBgscanModuleEnum () {
+    	return GwtWifiBgscanModule.valueOf(getBgscanModule());
+    }
+    
+    public int getBgscanRssiThreshold () {
+    	if (get("bgscanRssiThreshold") != null) {
+    		return (Integer)get("bgscanRssiThreshold");
+    	}
+    	return 0;
+    }
+    
+    public void setBgscanRssiThreshold (int bgscanRssiThreshold) {
+    	set ("bgscanRssiThreshold", bgscanRssiThreshold);
+    }
+    
+    public int getBgscanShortInterval () {
+    	if (get("bgscanShortInterval") != null) {
+    		return (Integer)get("bgscanShortInterval");
+    	}
+    	return 0;
+    }
+    
+    public void setBgscanShortInterval (int bgscanShortInterval) {
+    	set("bgscanShortInterval", bgscanShortInterval);
+    }
+    
+    public int getBgscanLongInterval () {
+    	
+    	if (get("bgscanLongInterval") != null) {
+    		return (Integer)get("bgscanLongInterval");
+    	}
+    	return 0;
+    }
+    
+    public void setBgscanLongInterval (int bgscanLongInterval) {
+    	set("bgscanLongInterval", bgscanLongInterval);
+    } 
+    
+    public boolean pingAccessPoint() {
+    	if (get("pingAccessPoint") != null) {
+    		return (Boolean) get("pingAccessPoint");
+    	}
+    	return false;
+    }
+
+    public void setPingAccessPoint(boolean pingAccessPoint) {
+        set("pingAccessPoint", pingAccessPoint);
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiHotspotEntry.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiHotspotEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3d8f255b2caf8b57d9e4e530182c7271b4113c9
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiHotspotEntry.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.io.Serializable;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtWifiHotspotEntry extends BaseModelData implements Serializable {
+	
+	private static final long serialVersionUID = -7818472380334612955L;
+
+	public String getSSID() {
+        return get("ssid");
+    }
+
+    public void setSSID(String ssid) {
+        set("ssid", ssid);
+    }
+    
+    public String getMacAddress() {
+    	return get("macAddress");
+    }
+    
+    public void setMacAddress(String macAddress) {
+    	set("macAddress", macAddress);
+    }
+    
+    public Integer getSignalStrength() {
+    	if (get("signalStrength") != null) {
+    		return (Integer) get("signalStrength");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+    
+    public void setsignalStrength(int signalStrength) {
+    	set("signalStrength", signalStrength);
+    }
+    
+    public Integer getChannel() {
+    	if (get("channel") != null) {
+    		return (Integer) get("channel");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+
+    public void setChannel(int channel) {
+        set("channel", channel);
+    }
+    
+    public Integer getFrequency() {
+    	if (get("frequency") != null) {
+    		return (Integer) get("frequency");
+    	}
+    	else {
+    		return 0;
+    	}
+    }
+
+    public void setFrequency(int frequency) {
+        set("frequency", frequency);
+    }
+    
+    
+    public String getSecurity() {
+    	return get("security");
+    }
+    
+    public void setSecurity(String security) {
+    	set("security", security);
+    }
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiNetInterfaceConfig.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiNetInterfaceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..22a52938b111f5350b9ce54f3417568ec0f016ca
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiNetInterfaceConfig.java
@@ -0,0 +1,168 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import java.util.Map;
+
+public class GwtWifiNetInterfaceConfig extends GwtNetInterfaceConfig 
+{
+	private static final long serialVersionUID = -7509149975400963837L;
+	
+	private GwtWifiConfig m_adhocWifiConfig;
+	private GwtWifiConfig m_stationWifiConfig;
+	private GwtWifiConfig m_accessPointWifiConfig;
+	
+	public GwtWifiNetInterfaceConfig() {
+		super();
+		
+		m_adhocWifiConfig = new GwtWifiConfig();
+		m_stationWifiConfig = new GwtWifiConfig();
+		m_accessPointWifiConfig = new GwtWifiConfig();
+		
+		setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeStation.name());
+	}
+	
+	public GwtWifiNetInterfaceConfig(GwtWifiConfig adhocConfig,
+			GwtWifiConfig stationConfig, GwtWifiConfig accessPointConfig) {
+		super();
+
+		m_adhocWifiConfig = adhocConfig;
+		m_stationWifiConfig = stationConfig;
+		m_accessPointWifiConfig = accessPointConfig;
+
+		setWirelessMode(GwtWifiWirelessMode.netWifiWirelessModeStation.name());
+	}
+	
+	public void setAdhocWifiConfig(GwtWifiConfig adhocConfig) {
+		m_adhocWifiConfig = adhocConfig;
+	}
+	
+	public void setAdhocWifiConfig(Map<String, Object> properties) {		
+		m_adhocWifiConfig = new GwtWifiConfig();
+		m_adhocWifiConfig.setProperties(properties);
+	}
+	
+	public GwtWifiConfig getAdhocWifiConfig() {
+		return m_adhocWifiConfig;
+	}
+	
+	public Map<String, Object> getAdhocWifiConfigProps() {
+		return m_adhocWifiConfig.getProperties();
+	}
+	
+	public void setStationWifiConfig(GwtWifiConfig stationConfig) {
+		m_stationWifiConfig = stationConfig;
+	}
+	
+	public void setStationWifiConfig(Map<String, Object> properties) {
+		m_stationWifiConfig = new GwtWifiConfig();
+		m_stationWifiConfig.setProperties(properties);
+	}
+	
+	public GwtWifiConfig getStationWifiConfig() {
+		return m_stationWifiConfig;
+	}
+	
+	public Map<String, Object> getStationWifiConfigProps() {
+		
+		return m_stationWifiConfig.getProperties();
+	}
+	
+	public void setAccessPointWifiConfig(GwtWifiConfig accessPointConfig) {
+		m_accessPointWifiConfig = accessPointConfig;
+	}
+	
+	public void setAccessPointWifiConfig (Map<String, Object> properties) {
+		m_accessPointWifiConfig = new GwtWifiConfig();
+		m_accessPointWifiConfig.setProperties(properties);
+	}
+	
+	public GwtWifiConfig getAccessPointWifiConfig() {
+		return m_accessPointWifiConfig;
+	}
+	
+	public Map<String, Object> getAccessPointWifiConfigProps() {
+		
+		return m_accessPointWifiConfig.getProperties();
+	}
+	
+	public void setWifiConfig(GwtWifiConfig wifiConfig) {
+		GwtWifiWirelessMode wifiMode = wifiConfig.getWirelessModeEnum();
+		
+	    if(wifiMode.equals(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint)) {
+	    	setAccessPointWifiConfig(wifiConfig);
+	    } else if(wifiMode.equals(GwtWifiWirelessMode.netWifiWirelessModeAdHoc)) {
+	    	setAdhocWifiConfig(wifiConfig);
+	    } else if(wifiMode.equals(GwtWifiWirelessMode.netWifiWirelessModeStation)) {
+	    	setStationWifiConfig(wifiConfig);
+	    }
+	}
+	
+	public GwtWifiConfig getActiveWifiConfig() {
+		GwtWifiWirelessMode wifiMode = getWirelessModeEnum();
+		GwtWifiConfig activeConfig = null;
+		
+	    if(wifiMode.equals(GwtWifiWirelessMode.netWifiWirelessModeAccessPoint)) {
+	    	activeConfig = m_accessPointWifiConfig;
+	    } else if(wifiMode.equals(GwtWifiWirelessMode.netWifiWirelessModeAdHoc)) {
+	    	activeConfig = m_adhocWifiConfig;
+	    } else if(wifiMode.equals(GwtWifiWirelessMode.netWifiWirelessModeStation)) {
+	    	activeConfig = m_stationWifiConfig;
+	    }
+	    
+	    return activeConfig;
+	}
+	
+    public void setWirelessMode(String wirelessMode) {
+        set("wirelessMode", wirelessMode);
+    }
+    
+    public String getWirelessMode() {
+        return get("wirelessMode");
+    }
+
+    public GwtWifiWirelessMode getWirelessModeEnum() {
+        return GwtWifiWirelessMode.valueOf(getWirelessMode());
+    }
+    
+    
+    @Override
+    public boolean equals(Object o) {
+        if(!(o instanceof GwtWifiNetInterfaceConfig)) {
+            return false;
+        }
+
+        if(super.equals(o) == false) {
+            return false;
+        }
+        
+        GwtWifiNetInterfaceConfig other = (GwtWifiNetInterfaceConfig) o;
+        
+        if(compare(getActiveWifiConfig(), other.getActiveWifiConfig()) == false) {
+            return false;
+        }
+        
+        return true;
+    }
+    
+    private boolean compare(Object obj1, Object obj2) {
+        if(obj1 == null) {
+            if(obj2 != null) {
+                return false;
+            }
+        } else {
+            return obj1.equals(obj2);
+        }
+        
+        return true;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiRadioMode.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiRadioMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..dee639a4957e4cf147818b74a20045fb2825043e
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiRadioMode.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtWifiRadioMode {
+	netWifiRadioModeBGN,
+	netWifiRadioModeBG,
+	netWifiRadioModeB,
+	netWifiRadioModeA;
+	
+	/**
+	 * Return mode based on given string
+	 * 
+	 * @param mode - "a", "b", "g", or "n"
+	 * @return
+	 */
+	public static GwtWifiRadioMode getRadioMode(String mode) {
+
+		if ("a".equals(mode)) {
+			return GwtWifiRadioMode.netWifiRadioModeA;
+		} else if ("b".equals(mode)) {
+			return GwtWifiRadioMode.netWifiRadioModeB;
+		} else if ("g".equals(mode)) {
+			return GwtWifiRadioMode.netWifiRadioModeBG;
+		} else if ("n".equals(mode)) {
+			return GwtWifiRadioMode.netWifiRadioModeBGN;
+		}
+		
+		return null;
+	}
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiSecurity.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiSecurity.java
new file mode 100644
index 0000000000000000000000000000000000000000..6972f440ab8a9a4d71b2d176dfd5b37fe3ca01b0
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiSecurity.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtWifiSecurity {
+	netWifiSecurityNONE,
+	netWifiSecurityWEP,
+	netWifiSecurityWPA,
+	netWifiSecurityWPA2,
+	netWifiSecurityWPA_WPA2
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiWirelessMode.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiWirelessMode.java
new file mode 100644
index 0000000000000000000000000000000000000000..df006dc113a4d3908f157eb41551c0a56a1ea2c9
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiWirelessMode.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+public enum GwtWifiWirelessMode {
+	netWifiWirelessModeDisabled,
+	netWifiWirelessModeStation,
+	netWifiWirelessModeAccessPoint,
+	netWifiWirelessModeAdHoc
+}
+
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiWirelessModeModel.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiWirelessModeModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..c07b58d259b4f3f915b4d8fc4827f0b480a9f4eb
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/model/GwtWifiWirelessModeModel.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.model;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GwtWifiWirelessModeModel extends BaseModelData {
+
+    private static final long serialVersionUID = -6095963356000494663L;
+
+    public static final String NAME = "name";
+    public static final String MODE = "mode";
+    public static final String TOOLTIP = "tooltip";
+    
+    protected GwtWifiWirelessModeModel() {
+        
+    }
+    
+    public GwtWifiWirelessModeModel(GwtWifiWirelessMode mode, String name, String tooltip) {
+        set(MODE, mode.name());
+        set(NAME, name);
+        set(TOOLTIP, tooltip);
+    }
+
+    public String getName() {
+        return get(NAME);
+    }
+    
+    public GwtWifiWirelessMode getMode() {
+        GwtWifiWirelessMode mode = null;
+        String modeStr = get(MODE);
+        
+        try {
+            mode = GwtWifiWirelessMode.valueOf(modeStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        
+        return mode;
+    }
+    
+    public String getTooltip() {
+        return get(TOOLTIP);
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if(obj == null) {
+            return false;
+        }
+        
+        if (!(obj instanceof GwtWifiWirelessModeModel)) {
+            return false;
+        }
+        
+        GwtWifiWirelessModeModel other = (GwtWifiWirelessModeModel) obj;
+        
+        if(getMode() != null) {
+            if(!getMode().equals(other.getMode())) {
+                return false;
+            }
+        } else if(other.getMode() != null) {
+            return false;
+        }
+        
+        if(getTooltip() != null) {
+            if(!getTooltip().equals(other.getTooltip())) {
+                return false;
+            }
+        } else if(other.getTooltip() != null) {
+            return false;
+        }
+        
+        return true;
+    }
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtComponentService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtComponentService.java
new file mode 100644
index 0000000000000000000000000000000000000000..31eb0d0f1cc8bd32473c04c2e319df3efda8ceb6
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtComponentService.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import java.util.List;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtConfigComponent;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("component")
+public interface GwtComponentService extends RemoteService 
+{	
+	/**
+	 * Returns the configuration of a Device as the list of all the configurable components.
+	 * @param device
+	 * @return
+	 */
+	public List<GwtConfigComponent> findComponentConfigurations() throws GwtKuraException;
+
+	
+	public void updateComponentConfiguration(GwtConfigComponent configComponent) throws GwtKuraException; 
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtDeviceService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtDeviceService.java
new file mode 100644
index 0000000000000000000000000000000000000000..fdc5fc3c9bf94ed3e73ceea8371e7118ee7d79c5
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtDeviceService.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("device")
+public interface GwtDeviceService extends RemoteService 
+{	
+	public ListLoadResult<GwtGroupedNVPair> findDeviceConfiguration() throws GwtKuraException;
+
+	public ListLoadResult<GwtGroupedNVPair> findBundles() throws GwtKuraException;
+
+	public ListLoadResult<GwtGroupedNVPair> findThreads() throws GwtKuraException;
+
+	public ListLoadResult<GwtGroupedNVPair> findSystemProperties() throws GwtKuraException; 
+	
+	public String executeCommand(String cmd) throws GwtKuraException;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtNetworkService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtNetworkService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f72202ac5c76366b4165d3be084fd19e0ad0585d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtNetworkService.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import java.util.List;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
+import org.eclipse.kura.web.shared.model.GwtFirewallPortForwardEntry;
+import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
+import org.eclipse.kura.web.shared.model.GwtReverseNatEntry;
+import org.eclipse.kura.web.shared.model.GwtWifiConfig;
+import org.eclipse.kura.web.shared.model.GwtWifiHotspotEntry;
+
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("network")
+public interface GwtNetworkService extends RemoteService
+{
+	public ListLoadResult<GwtNetInterfaceConfig> findNetInterfaceConfigurations() throws GwtKuraException;
+
+
+	public void updateNetInterfaceConfigurations(GwtNetInterfaceConfig config) throws GwtKuraException;
+	
+	
+	public ListLoadResult<GwtFirewallOpenPortEntry> findDeviceFirewallOpenPorts() throws GwtKuraException;
+
+
+	public void updateDeviceFirewallOpenPorts(List<GwtFirewallOpenPortEntry> entries) throws GwtKuraException;
+	
+	
+	public ListLoadResult<GwtFirewallPortForwardEntry> findDeviceFirewallPortForwards() throws GwtKuraException;
+	
+	
+	public void updateDeviceFirewallPortForwards(List<GwtFirewallPortForwardEntry> entries) throws GwtKuraException;
+	
+	public ListLoadResult<GwtReverseNatEntry> findReverseNatConfigurations(String sourceIface) throws GwtKuraException;
+	
+	public void renewDhcpLease(String interfaceName) throws GwtKuraException;
+	
+	public ListLoadResult<GwtWifiHotspotEntry> findWifiHotspots(String interfaceName) throws GwtKuraException;
+	
+	public boolean verifyWifiCredentials(String interfaceName, GwtWifiConfig gwtWifiConfig) throws GwtKuraException;
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtPackageService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtPackageService.java
new file mode 100644
index 0000000000000000000000000000000000000000..cabb2121e0098fa1c5b076df6598027312209c26
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtPackageService.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import java.util.List;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtDeploymentPackage;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("package")
+public interface GwtPackageService extends RemoteService 
+{
+	public List<GwtDeploymentPackage> findDeviceDeploymentPackages() throws GwtKuraException;
+	
+	public void uninstallDeploymentPackage(String packageName) throws GwtKuraException;
+
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtSettingService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtSettingService.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c5e8549440eef3a9aeb023125ce3f99f847ff1d
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtSettingService.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtSettings;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("setting")
+public interface GwtSettingService extends RemoteService 
+{	
+	public void updateSettings(GwtSettings settings) throws GwtKuraException;
+
+	public void logout() throws GwtKuraException;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtSnapshotService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtSnapshotService.java
new file mode 100644
index 0000000000000000000000000000000000000000..11fec546c297e6ecf2ea6ec8b52d9a739da8d9fe
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtSnapshotService.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtSnapshot;
+
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("snapshot")
+public interface GwtSnapshotService extends RemoteService
+{
+	public ListLoadResult<GwtSnapshot> findDeviceSnapshots() throws GwtKuraException;
+	
+	public void rollbackDeviceSnapshot(GwtSnapshot snapshot) throws GwtKuraException;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtStatusService.java b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtStatusService.java
new file mode 100644
index 0000000000000000000000000000000000000000..e65ac2d09e62ea281aa7744856e799be81fd2fd2
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/java/org/eclipse/kura/web/shared/service/GwtStatusService.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+package org.eclipse.kura.web.shared.service;
+
+import org.eclipse.kura.web.shared.GwtKuraException;
+import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
+
+import com.extjs.gxt.ui.client.data.ListLoadResult;
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+@RemoteServiceRelativePath("status")
+public interface GwtStatusService extends RemoteService {
+	
+	public ListLoadResult<GwtGroupedNVPair> getDeviceConfig() throws GwtKuraException;
+}
diff --git a/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2c8a7e9afefcd49debbc9d55e5e07ab40315d02a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties
@@ -0,0 +1,334 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+system=System
+device=Device
+network=Network
+firewall=Firewall
+
+services=Services
+
+info=Confirmation
+information=Information
+error=Error 
+warning=Warning
+noResults=No Results
+waitMsg=Please Wait...
+confirm=Confirm
+loading=Loading...
+applying=Applying...
+waiting=Waiting...
+rollingBack=Rolling back...
+unknown=Unknown
+
+apply=Apply
+reset=Reset
+upload=Upload and Apply
+download=Download
+rollback=Rollback
+refresh=Refresh
+
+trueLabel=true
+falseLabel=false
+fileLabel=File
+urlLabel=URL
+
+uploadTab=Upload
+downloadTab=Download
+
+deviceNoDeviceSelected=No Device Selected
+deviceNoComponents=No Components Available
+deviceNoConfigSupported=The selected Device is not online or it does not support remote configuration.
+deviceConfigError=There are invalid configuration values. 
+
+deviceConfigConfirmation=Are you sure you want to apply the new configuration to service {0}?
+deviceCloudConfigConfirmation=Are you sure you want to apply the new configuration to service {0}? During the configuration update, the device will disconnect and reconnect.
+deviceConfigDirty=There are unsaved changes. Do you want to discard them and continue?
+deviceConfigApplied=Service Configuration has been applied.
+
+copyright=Copyright \u00A9 2011-2014 Eurotech and/or its affiliates.  All rights reserved.
+
+enable=Enable
+disable=Disable
+moveUp=Move Up
+moveDown=Move Down
+
+deviceIntro=Summary information about the current hardware and software configuration of this device.
+deviceTabProfile=Profile
+deviceTabBundles=Bundles
+deviceTabThreads=Threads
+deviceTabSystemProperties=System Properties
+deviceTabCommand=Command
+deviceCommandExecute=Execute
+deviceCommandNoOutput=No Output
+
+deviceBndId=ID
+deviceBndName=Name
+deviceBndState=State
+deviceBndVersion=Version
+
+deviceThreadName=Name
+deviceThreadInfo=Info
+
+devicePropName=Name
+devicePropValue=Value
+
+packages=Packages
+settings=Settings
+
+deviceInstallNewPackage=Install New Package
+devicePackagesNone=No Packages Installed
+deviceUninstallPackage=Are you sure you want to uninstall the package {0}? Uninstalling a package might have unexpected effects on the stability of the framework. If in doubt answer "No".
+
+fileUploadSuccess=File was successfully uploaded
+fileUploadFailure=File upload failed
+
+fileDownloadSuccess=File was successfully downloaded
+fileDownloadFailure=File download failed
+
+settingsIntro=Review and update the available system settings.
+settingsAdminPassword=Admin Password
+settingsChangeAdmin=Change Admin Password
+settingsAdminPwdCurrent=Current Admin Password
+settingsAdminPwdNew=New Admin Password
+settingsAdminPwdConfirm=Confirm Admin Password
+settingsApplied=Settings have been applied.
+settingsError=An error occurred while applying the settings. {0}
+settingsPasswoedNotMatchError=Current admin password does not match. 
+
+settingsSnapshots=Snapshots
+deviceSnapshotId=Snapshot Id
+deviceSnapshotCreatedOn=Created On
+deviceSnapshotsNone=No Snapshots Available
+deviceSnapshotRollbackConfirm=Are you sure you want to rollback to a previous configuration? During the rollback operation, the device will disconnect and reconnect. If a timeout is encountered during the reload of the device configuration, please refresh it manually. 
+
+netIntro=Select a Network Interface and configure it. DHCP Server and NAT can be configured only for interfaces enabled for LAN usage. When applying your changes, your connection to the gateway may be lost depending on your network configuration changes.  
+netInterfaceName=Interface Name
+netTableNoInterfaces=No Network Interfaces
+netIPv4=TCP/IP
+netIPv4Status=Status
+netIPv4Configure=Configure
+netIPv4Address=IP Address
+netIPv4SubnetMask=Subnet Mask
+netIPv4Gateway=Gateway
+netIPv4DNSServers=DNS Servers
+netIPv4SearchDomains=Search Domains
+netIPv4InvalidAddress=Invalid IPv4 Address
+netIPv4RenewDHCPLease=Renew DHCP Lease
+netIPv4ToolTipStatus=<b>Disabled</b><br>The interface is disabled.<br><br><b>Enabled for LAN</b><br>Interface is used to create a local network. Use this for creating an access point that other devices can connect to.<br><br><b>Enabled for WAN</b><br>Interface is enabled for use as a gateway to an external network. Use this to connect to a router, wireless access point, or cellular network.
+netIPv4ModemToolTipStatus=<b>Disabled</b><br>The interface is disabled.<br><br><b>Enabled for WAN</b><br>Interface is enabled for use as a gateway to an external network. Use this to connect to a router, wireless access point, or cellular network.
+netIPv4ToolTipStatusDisabled=Interface is disabled
+netIPv4ToolTipStatusEnabledLAN=Interface is used to create a local network.  Use this for creating an access point that other devices can connect to.
+netIPv4ToolTipStatusEnabledWAN=Interface is enabled for use as a gateway to an external network. Use this to connect to a router, wireless access point, or cellular network.
+netIPv4ToolTipConfigure=<b>Using DHCP</b><br>Select 'Using DHCP' to obtain an IP address from a network DCHP server.<br><br><b>Manually</b><br>Select 'Manually' to enter a static IP address.
+netIPv4ToolTipAddress=For static configuration, enter an IP address to assign to the device.
+netIPv4ToolTipSubnetMask=For static configuration, enter a subnet mask to assign to the device.
+netIPv4ToolTipGateway=For static configuration, enter a default gateway for the device.
+netIPv4ToolTipRenew=For DHCP configuration, clicking this button will release the current IP address and acquire a new lease from the server.
+netIPv4ToolTipDns=List of DNS servers. New servers can be added by entering an address and clicking apply. To remove a server, delete the address from the list and click apply.<br/><br/>When configured for DHCP, manually entered DNS entries will replace the ones provided by the DHCP server.  Removing them will restore the DHCP entries.
+
+firewallIntro=Enable ports to be opened and port forwarding port forwarding
+firewallOpenPorts=Open Ports
+firewallPortForwarding=Port Forwarding
+
+firewallOpenPort=Port
+firewallOpenPortProtocol=Protocol
+firewallOpenPortPermittedNetwork=Permitted Network
+firewallOpenPortPermittedNetworkMask=Permitted Network Prefix
+firewallOpenPortPermittedInterfaceName=Permitted Interface Name
+firewallOpenPortUnpermittedInterfaceName=Unpermitted Interface Name
+firewallOpenPortFormPermittedInterfaceToolTip=Specify an interface to which the rule will be applied. An entry in this field will disable the unpermitted interface field.
+firewallOpenPortFormUnpermittedInterfaceToolTip=Specify an interface to which the rule will be blocked. All other interface will allow this rule. An entry in this field will disable the permitted interface field. 
+firewallOpenPortPermittedMac=Permitted MAC Address
+firewallOpenPortSourcePortRange=Source Port Range
+firewallOpenPortTableNoPorts=No Ports Open
+firewallOpenPortDeleteConfirmation=Are you sure you want to delete the Open Port entry for {0}?
+firewallOpenPortDeleteConfirmation22=Port 22 is used for ssh (remote shell) access. Improper configuration could lead to not being able to access the device remotely. Are you sure you want to delete the Open Port entry for {0}?
+firewallOpenPortDeleteConfirmation80=Port 80 is used for http (remote web configuration) access. Improper configuration could lead to not being able to access the device remotely. Are you sure you want to delete the Open Port entry for {0}?
+
+firewallOpenPortsCaution=Be Careful!
+firewallOpenPorts22=Port 22 is used for ssh (remote shell) access. Use caution when modifying this rule. Improper configuration could lead to not being able to access the device remotely.
+firewallOpenPorts80=Port 80 is used for http (remote web configuration) access. Use caution when modifying this rule. Improper configuration could lead to not being able to access the device remotely.
+
+firewallOpenPortFormNew=New Open Port Entry
+firewallOpenPortFormUpdate=Update Open Port Entry: {0}
+firewallOpenPortFormInformation=Open Port Entry Information
+firewallOpenPortFormPort=Port
+firewallOpenPortFormProtocol=Protocol
+firewallOpenPortFormPermittedNetwork=Permitted Network
+firewallOpenPortFormPermittedInterfaceName=Permitted Interface Name
+firewallOpenPortFormUnpermittedInterfaceName=Unpermitted Interface Name
+firewallOpenPortFormPermittedMac=Permitted MAC Address
+firewallOpenPortFormSourcePortRange=Source Port Range
+firewallOpenPortFormError=Error
+firewallOpenPortFormDuplicate=Duplicate Entry - Not adding to the list of Open Ports
+
+firewallPortForwardInterfaceName=Interface Name
+firewallPortForwardAddress=LAN Address
+firewallPortForwardProtocol=Protocol
+firewallPortForwardInPort=External Port
+firewallPortForwardOutPort=Internal Port
+firewallPortForwardPermittedNetwork=Permitted Network
+firewallPortForwardPermittedNetworkMask=Permitted Network Prefix
+firewallPortForwardPermittedMac=Permitted MAC Address
+firewallPortForwardSourcePortRange=Source Port Range
+firewallPortForwardTableNoPorts=No Ports Forwarded
+firewallPortForwardDeleteConfirmation=Are you sure you want to delete the Port Forward entry for {0}?
+
+firewallPortForwardFormNew=New Port Forward Entry
+firewallPortForwardFormUpdate=Update Port Forward Entry: {0}
+firewallPortForwardFormInformation=Port Forward Entry Information
+firewallPortForwardFormInterfaceName=Interface Name
+firewallPortForwardFormAddress=LAN Address
+firewallPortForwardFormProtocol=Protocol
+firewallPortForwardFormInPort=External Port
+firewallPortForwardFormOutPort=Internal Port
+firewallPortForwardFormPermittedNetwork=Permitted Network
+firewallPortForwardFormPermittedMac=Permitted MAC Address
+firewallPortForwardFormSourcePortRange=Source Port Range
+firewallPortForwardFormError=Error
+firewallPortForwardFormDuplicate=Duplicate Entry - Not adding to the list of Forwarded Ports
+firewallPortForwardFormNotification=Notification!
+firewallPortForwardFormNotificationMacFiltering=Please verify that MAC Address filtering is enabled on your platform.
+
+firewallApply=Apply
+submitButton=Submit
+cancelButton=Cancel
+uploadButton=Upload
+refreshButton=Refresh
+packageAddButton=Install/Upgrade
+packageDeleteButton=Uninstall
+
+netHwHardware=Hardware
+netHwState=State
+netHwStateUp=Up
+netHwStatDown=Down
+netHwName=Name
+netHwType=Type
+netHwAddress=Hardware Address
+netHwSerial=Serial #
+netHwDriver=Driver
+netHwVersion=Version
+netHwFirmware=Firmware
+netHwMTU=MTU
+netHwUSBDevice=USB Device
+
+netRouter=DHCP & NAT
+netRouterMode=Router Mode
+netRouterDhcpBeginningAddress=DHCP Beginning Address
+netRouterDhcpEndingAddress=DHCP Ending Address
+netRouterDhcpSubnetMask=DHCP Subnet Mask
+netRouterDhcpDefaultLease=DHCP Default Lease Time (mins)
+netRouterDhcpMaxLease=DHCP Max Lease Time (mins)
+netRouterPassDns=Pass DNS Servers through DHCP
+netRouterConfiguredForDhcpError=Invalid selection when TCP/IP is configured for DHCP
+netRouterToolTipMode=Select if interface provides DHCP addresses, network address translation, or both.
+netRouterToolTipDhcpBeginAddr=For DHCP, enter the first available client address.
+netRouterToolTipDhcpEndAddr=For DHCP, enter the last available client address.
+netRouterToolTipDhcpSubnet=For DHCP, enter the network mask.
+netRouterToolTipDhcpDefaultLeaseTime=For DHCP, enter the default time that a client will retain a provided IP address (ex: 7200).
+netRouterToolTipDhcpMaxLeaseTime=For DHCP, enter the maximum time that a client will retain a provided IP address (ex: 9600).
+netRouterToolTipPassDns=Select whether the interface will provide DNS server information.
+
+netReverseNat=Reverse NAT
+netReverseNatOutInterface=Output Interface
+netReverseNatSourceNetwork=Source Network/Host
+netReverseNatDestinationNetwork=Destination Network/Host
+netReverseNatDeleteConfirmation=Are you sure you want to delete the Reverse NAT entry for {0}?
+
+netReverseNatFormNew=New Reverse NAT Entry
+netReverseNatFormUpdate=Update Reverse NAT Entry: {0}
+netReverseNatFormInformation=Reverse NAT Entry Information
+netReverseNatFormError=Error
+netReverseNatFormDuplicate=Duplicate Entry - Not adding to the list of Reversed NATs
+netReverseNatFormOutInterfaceName=Output Interface Name
+netReverseNatFormProtocol=Protocol
+netReverseNatFormSourceNetwork=Source Network/Host
+netReverseNatFormDestinationNetwork=Destination Network/Host
+
+netWifiWireless=Wireless
+netWifiWirelessMode=Wireless Mode
+netWifiNetworkName=Network Name
+netWifiAllowDiscovery=Allow this network to be discovered
+netWifiRadioMode=Radio Mode
+netWifiChannel=Channel
+netWifiWirelessSecurity=Wireless Security
+netWifiWirelessPassword=Wireless Password
+netWifiWirelessVerifyPassword=Verify Password
+netWifiWirelessInvalidWPAPassword=Password must be 8-63 characters
+netWifiWirelessInvalidWEPPassword=Password must be 5, 13, or 16 ASCII characters, or 10, 26, or 32 HEX characters
+netWifiWirelessPasswordDoesNotMatch=Passwords do not match
+netWifiWirelessEnabledForWANError=Invalid selection when TCP/IP is Enabled for WAN
+netWifiWirelessWpaAcceptedProtocols=Accepted Protocols
+netWifiWirelessPairwiseCiphers=Pairwise Ciphers
+netWifiWirelessGroupCiphers= Group Ciphers
+netWifiWirelessBgscanModule=Bgscan Module
+netWifiWirelessBgscanSignalStrengthThreshold=Bgscan Signal Strength Threshold (dBm)
+netWifiWirelessBgscanShortInterval=Bgscan Short Interval (secs)
+netWifiWirelessBgscanLongInterval=Bgscan Long Interval (secs)
+netWifiWirelessPingAccessPoint=Ping Access Point & renew DHCP lease if not reachable
+netWifiToolTipWirelessMode=<b>Station Mode</b><br>Connect to a wireless access point. Input the access point''s SSID as the Network Name, select the Wireless Security it is configured with, and enter a password if needed.<br><br><b>Access Point</b><br>Create a wireless access point. Specify a Network Name for the access point, then select a Wireless Security type and enter a password as needed. Select other options as appropriate.
+netWifiToolTipWirelessModeDisabled=The wireless interface is not used
+netWifiToolTipWirelessModeStation=Connect to a wireless access point.  Input the access point''s SSID as the Network Name, select the Wireless Security it is configured with, and enter a password if needed.
+netWifiToolTipWirelessModeAccessPoint=Create a wireless access point.  Specify a Network Name for the access point, then select a Wireless Security type and enter a password as needed.  Select other options as appropriate.
+netWifiToolTipWirelessModeAdhoc=Configure the wireless interface in adhoc mode.  This allows two wireless devices to communicate without a central access point.
+netWifiToolTipNetworkName=In 'Access Point' mode, enter the SSID that will identify this wireless network.<br><br>In 'Station Mode', enter the SSID of the wireless network or click the button to select wireless network in range. The button may be disabled for some systems. 
+netWifiToolTipRadioMode=In 'Access Point' mode, select the appropriate speed rating for this device.
+netWifiToolTipSecurity=Select the appropriate security protocol for this wireless network.
+netWifiToolTipPassword=Enter password for wireless network.<br>Press button to verify password.
+netWifiToolTipChannels=Select the desired channel frequencies over which the device should communicate.
+netWifiToolTipCiphers=Select the appropriate cipher for this wireless network.
+netWifiToolTipBgScan=Choose between simple background scan or learn. Learn bgscan will attempt to avoid channels not in use on the wireless network.
+netWifiToolTipBgScanStrength=Use the slider to set the bgscan threshold signal strength.
+netWifiToolTipBgScanShortInterval=Specify the minimum bgscan interval in seconds (ex: 30).
+netWifiToolTipBgScanLongInterval=Specify the maximum bgsan interval in seconds (ex: 300).
+netWifiToolTipPingAccessPoint=Ping Access Point to determine if it is reachable.
+
+netModemCellular=Cellular
+netModemModel=Model
+netModemNetworkTechnology=Network Technology
+netModemConnectionType=Connection Type
+netModemInterfaceNum=Interface #
+netModemIdentifier=Modem Identifier
+netModemDialString=Dial String
+netModemAPN=APN
+netModemAuthType=Auth Type
+netModemUsername=Username
+netModemPassword=Password
+netLcpEchoInterval=LCP Echo Interval
+netLcpEchoFailure=LCP Echo Failure
+netModemEnableGps=Enable GPS
+netModemToolTipNetworkTopology=Select the appropriate network topology.
+netModemToolTipModemIndentifier=Enter a unique name for the modem.
+netModemToolTipModemInterfaceNumber=Enter a unique number for the modem interface. For example: <br><br>An Interface # of 0 would name the modem interface ppp0<br><br>An Interface # of 1 would name the modem interface ppp1
+netModemToolTipDialString=Instructions for how the modem should attempt to connect. A typical dial string for the detected modem is:<br> <b>{0}</b>
+netModemToolTipDialStringDefault=Instructions for how the modem should attempt to connect. Typical dial strings are:<br><br>Model HE910 => <b>atd*99***1#</b><br>Model DE910 =><b>atd#777</b>
+netModemToolTipApn=Modem access point name.
+netModemToolTipAuthentication=Select modem authentication type.
+netModemToolTipUsername=Enter user name.
+netModemToolTipPassword=Enter password.
+netModemToolTipLcpEchoInterval=Enter LCP Echo Interval.<br><br>If set to a positive number, modem will send an LCP echo-request to the peer every specified number of seconds.<br><br>This option can be used with the 'LCP Echo Failure' option to detect that the peer is no longer connected. 
+netModemToolTipLcpEchoFailure=Enter LCP Echo Failure.<br><br>If set to a positive number, modem will presume the peer to be dead if specified number of LCP echo-requests are sent without receiving a valid LCP echo-reply.
+netModemToolTipEnableGps=Enable GPS from Modem.
+
+netApply=Apply
+netRevert=Revert
+
+addButton=Add
+removeButton=Remove
+newButton=New
+editButton=Edit
+deleteButton=Delete
+
+today=Today {0}
+yesterday=Yesterday {0}
+tomorrow=Tomorrow {0}
diff --git a/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/Messages_fr.properties b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/Messages_fr.properties
new file mode 100644
index 0000000000000000000000000000000000000000..42129181aef960a2763a3ba19b5f1bcf6fdcf3dc
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/Messages_fr.properties
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+sendButton = Envoyer
+nameField = Entrez votre nom
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/ValidationMessages.properties b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/ValidationMessages.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b5f6be74b84d2dad0dd47516254156abc80e228a
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/client/messages/ValidationMessages.properties
@@ -0,0 +1,166 @@
+#
+# Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+#
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Eurotech
+#
+
+# Exception Messages
+UNAUTHENTICATED=You are not logged in.
+INVALID_USERNAME_PASSWORD=The username and/or password provided do not match.
+ILLEGAL_ACCESS=The current subject is not authorized to perform this operation.
+DUPLICATE_NAME=An entity with the same value for field {0} already exists.
+ILLEGAL_NULL_ARGUMENT=An illegal null value was provided for the argument {0}.
+ILLEGAL_ARGUMENT=An illegal value was provided for the argument {0}.
+INTERNAL_ERROR={0}
+INVALID_RULE_QUERY={0}
+INVALID_RULE_FROMCLAUSE=Rules can have a single From clause for EdcMessageEvent or for a PatternStream
+CANNOT_REMOVE_LAST_ADMIN=Cannot delete the last Administrator of an Account or remove its Administrator Role: {0}.
+WARNING=The operation completed with a warning. {0}
+OVER_RULE_LIMIT=The maximum number of rules allowed for this account has been reached.
+OPERATION_NOT_SUPPORTED=The operation is not supported on this platform.
+
+duplicateValue=This value is already taken. Please specify another value. 
+invalidNullValue=This value cannot be null. 
+configMinValue=Value must be greater than {0}
+configMaxValue=Value must be smaller than {0}
+
+cloudStatus=Cloud and Data Service
+networkStatusEthernet=Ethernet Settings
+networkStatusWifi=Wireless Settings
+networkStatusModem=Cellular Settings
+positionStatus=Position Status
+
+devInfo=Device Information
+devHw=Hardware Information
+devSw=Software Information
+devJava=Java Information
+netInfo=Network Information
+gpsInfo=GPS Information
+devStat=Status Information
+devApps=Applications Information
+
+devKuraVersion=Kura Version
+devDisplayName=Display Name
+devClientId=Client ID
+devUptime=Uptime
+devLastWifiChannel=Last Wifi Channel
+devModelName=Model Name
+devModelId=Model ID
+devPartNumber=Part Number
+devSerialNumber=Serial Number
+
+devBiosVersion=BIOS Version
+devFirmwareVersion=Firmware Version
+devOs=Operating System
+devOsVersion=Operating System Version
+devOsArch=OS Architecture
+devJvmName=Java Virtual Machine
+devJvmVersion=Java Virtual Machine Version
+devJvmProfile=Java Runtime
+devOsgiFramework=OSGI Framework
+devOsgiFrameworkVersion=OSGI Framework Version
+devNumProc=Number of Processors
+devRamTot=Total RAM
+devRamFree=Free RAM
+
+netConnIf=Interface
+netConnIp=IP Address
+
+gpsLat=Latitude
+gpsLong=Longitude
+gpsAlt=Altitude
+
+deviceProfileFormApplicationIdentifiers=Application Identifiers
+deviceProfileFormAddress=Address
+deviceProfileFormAcceptEncoding=Accept-Encoding
+deviceProfileFormAccountId=Account ID
+deviceProfileFormGwtDeviceStatus=Status
+deviceProfileFormLastEventDate=Last Event Date
+deviceProfileFormLastEventMessage=Last Event Message
+deviceProfileFormLastEventType=Last Event Type
+
+propsSys=System Properties
+propsKura=Kura Properties
+
+snapSeeded=Seeded Snapshot
+
+bndInstalled=Installed
+bndResolved=Resolved
+bndStarting=Starting
+bndActive=Active
+bndStopping=Stopping
+bndUninstalled=Uninstalled
+bndUnknown=Unknown
+
+netIPv4StatusDisabled=Disabled
+netIPv4StatusEnabledLAN=Enabled for LAN
+netIPv4StatusEnabledWAN=Enabled for WAN
+
+netIPv4ConfigModeManual=Manually
+netIPv4ConfigModeDHCP=Using DHCP
+
+netRouterDchpNat=DHCP and NAT
+netRouterDchp=DHCP Only
+netRouterNat=NAT Only
+netRouterOff=Off
+
+netWifiWirelessModeDisabled=Disabled
+netWifiWirelessModeStation=Station Mode
+netWifiWirelessModeAccessPoint=Access Point
+netWifiWirelessModeAdHoc=Ad-Hoc
+
+netWifiRadioModeBGN=802.11n/g/b
+netWifiRadioModeBG=802.11g/b
+netWifiRadioModeB=802.11b
+netWifiRadioModeA=802.11a
+
+netWifiChannelAuto=Automatic
+netWifiChannel1=1
+netWifiChannel2=2
+netWifiChannel3=3
+netWifiChannel4=4
+netWifiChannel5=5
+netWifiChannel6=6
+netWifiChannel7=7
+netWifiChannel8=8
+netWifiChannel9=9
+netWifiChannel10=10
+netWifiChannel11=11
+
+netWifiSecurityNONE=None
+netWifiSecurityWEP=WEP
+netWifiSecurityWPA=WPA
+netWifiSecurityWPA2=WPA/WPA2
+
+netWifiWpaAcceptedProtocols_WPA_RSN=WPA and RSN
+netWifiWpaAcceptedProtocols_WPA=WPA
+netWifiWpaAcceptedProtocols_RSN=RSN
+
+netWifiCiphers_CCMP_TKIP=CCMP and TKIP
+netWifiCiphers_CCMP=CCMP
+netWifiCiphers_TKIP=TKIP
+
+netWifiBgscanMode_NONE=None
+netWifiBgscanMode_SIMPLE=Simple
+netWifiBgscanMode_LEARN=Learn
+
+netModemAuthNONE=None
+netModemAuthAUTO=Auto
+netModemAuthCHAP=CHAP
+netModemAuthPAP=PAP
+
+netModemPdpIP=IP
+netModemPdpPPP=PPP
+netModemPdpIPv6=IPv6
+
+passwordRegexMsg=Passwords must be at least 6 characters and contain at least one lower case letter, one upper case letter, one digit and one special character.
+passwordToolTipMsg=Must be at least 6 characters and contain at least one lower case letter, one upper case letter, one digit and one special character.
+passwordRequiredMsg=Password is required.
+passwordDoesNotMatch=Password values do not match.
+
diff --git a/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/denali.gwt.xml b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/denali.gwt.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0e6929fa7e53e5b8b254369b114f56a7f50f6778
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/resources/org/eclipse/kura/web/denali.gwt.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<module rename-to='denali'>
+    
+  <!-- Inherit the core Web Toolkit stuff.                        -->
+  <inherits name='com.google.gwt.user.User' />
+  
+  <inherits name="com.allen_sauer.gwt.log.gwt-log-OFF"/>
+
+  <!-- We need the JUnit module in the main module,               -->
+  <!-- otherwise eclipse complains (Google plugin bug?)           -->
+  <!-- inherits name='com.google.gwt.junit.JUnit' />              -->
+
+  <!-- Inherit the default GWT style sheet.  You can change       -->
+  <!-- the theme of your GWT application by uncommenting          -->
+  <!-- any one of the following lines.                            -->
+  <inherits name='com.google.gwt.user.theme.standard.Standard' />
+  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
+  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->
+
+  <!-- Other module inherits                                      -->
+  <inherits name='com.extjs.gxt.ui.GXT' />
+  <inherits name="com.google.gwt.i18n.I18N"/>
+
+  <!-- Locales: English language, independent of country -->
+  <extend-property name="locale" values="en"/>
+  <set-property-fallback name="locale" value="en"/>
+  
+  <!-- Specify the app entry point class.                         -->
+  <entry-point class='org.eclipse.kura.web.client.denali' />
+<!--
+  <set-property name='user.agent' value='safari'/>  
+-->
+  <!-- Specify the paths for translatable code                    -->
+  <source path='client' />
+  <source path='shared' />
+  
+</module>
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/WEB-INF/web.xml b/kura/org.eclipse.kura.web/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aaaf07fc11d6963a0297a1b81fe48d4e7c3009c2
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<!DOCTYPE web-app
+    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+    "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+
+  <listener>
+    <listener-class>
+       org.apache.commons.fileupload.servlet.FileCleanerCleanup
+    </listener-class>
+  </listener>
+    
+  <!-- Servlets -->
+  <servlet>
+    <servlet-name>deviceServlet</servlet-name>
+    <servlet-class>org.eclipse.kura.web.server.GwtDeviceServiceImpl</servlet-class>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>deviceServlet</servlet-name>
+    <url-pattern>/denali/device</url-pattern>
+  </servlet-mapping>
+  
+  <!-- Default page to serve -->
+  <welcome-file-list>
+    <welcome-file>denali.html</welcome-file>
+  </welcome-file-list>
+
+</web-app>
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/denali.css b/kura/org.eclipse.kura.web/src/main/webapp/denali.css
new file mode 100644
index 0000000000000000000000000000000000000000..a7904d6637c953eae60eaa4950d619692803d040
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/webapp/denali.css
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Eurotech
+ */
+/** Add css rules here for your application. */
+
+
+/** Example rules used by the template application (remove for your app) */
+h1 {
+  font-size: 2em;
+  font-weight: bold;
+  color: #777777;
+  margin: 40px 0px 70px;
+  text-align: center;
+}
+
+.sendButton {
+  display: block;
+  font-size: 16pt;
+}
+
+/** Most GWT widgets already have a style name defined */
+.gwt-DialogBox {
+  width: 400px;
+}
+
+.dialogVPanel {
+  margin: 5px;
+}
+
+.serverResponseLabelError {
+  color: red;
+}
+
+/** Set ids using widget.getElement().setId("idOfElement") */
+#closeButton {
+  margin: 15px 6px 6px;
+}
+
+.x-tree3-node-icon {
+    margin-top: 2px;    
+}
+
+fieldset#configuration-form > div.x-form-label-left > div.x-component {
+    padding-bottom: 10px;   
+    padding-right: 25px;   
+}
+
+img.x-tree3-node-icon {
+	background-size: 100%;
+}
+
+/******************************
+***
+*** Custom CSS rules 
+***
+*******************************/
+/** Fix for unwanted vertical scrollbars in Chrome */
+.x-grid3-scroller {
+	overflow-x:			hidden;
+}
+
+/** Prevent input boxes from resizing after changing input */
+.kura-combobox input {
+	width: 225px !important;
+}
+
+.kura-textfield {
+	width: 242px !important;
+}
+
+.kura-textfield input {
+	width: 242px !important;
+}
+
+.kura-textfield + img {
+	left: 426px !important;
+}
+
+#ssid-input input {
+	width: 218px !important;
+}
+
+#wifi-password input {
+	width: 218px !important;
+}
+
+/** Custom tooltip box */
+.tool-tip-textarea {
+	top: 41px;
+	font: normal 12px tahoma, arial, helvetica, sans-serif;
+	padding: 1px 3px;
+	width: 242px;
+}
+
+.tool-tip-label {
+	background: url(../gxt/images/default/window/icon-info.gif) no-repeat center left #eee;
+	background-size: 6%;
+	height: 18px;
+	width: 222px;
+	padding-left: 26px;
+	font: bold 12px tahoma, arial, helvetica, sans-serif;
+}
+
+
+div.headerLogo { 
+	height: 			38px;
+	width: 				127px;
+	margin: 			5px 0px 5px 15px;
+	vertical-align: 	baseline;
+	background: 		url(eclipse/kura/icons/kura_logo_small.png);
+	background-repeat: 	no-repeat;
+	background-size: 	contain;
+}
+
+div.headerLogo-ie8 {
+	height:	           38px;
+	width:             127px;
+	margin:	           5px 0px 5px 15px;
+	vertical-align:    baseline;
+	background-repeat: no-repeat;
+	background-size:   contain;
+	/* IE 8 Hack */
+	filter:            progid:DXImageTransform.Microsoft.AlphaImageLoader(src='kura/org/eclipse/kura/images/kura_logo_small.png',sizingMethod='scale');
+	-ms-filter:        "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='kura/org/eclipse/kura/images/kura_logo_small.png',sizingMethod='scale')";
+}
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/denali.html b/kura/org.eclipse.kura.web/src/main/webapp/denali.html
new file mode 100644
index 0000000000000000000000000000000000000000..31528da9b59d5e317e4ac1a50f72b8493285e620
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/webapp/denali.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<!-- The DOCTYPE declaration above will set the    -->
+<!-- browser's rendering engine into               -->
+<!-- "Standards Mode". Replacing this declaration  -->
+<!-- with a "Quirks Mode" doctype may lead to some -->
+<!-- differences in layout.                        -->
+
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta http-equiv="x-ua-compatible" content="IE=9">
+
+    <!--                                                               -->
+    <!-- Consider inlining CSS to reduce the number of requested files -->
+    <!--                                                               -->
+    <link type="text/css" rel="stylesheet" href="gxt/css/gxt-all.css">
+    <link type="text/css" rel="stylesheet" href="denali.css">
+
+    <!--                                           -->
+    <!-- Any title is fine                         -->
+    <!--                                           -->
+    <title>Kura Admin</title>
+
+    <!--                                           -->
+    <!-- This script loads your compiled module.   -->
+    <!-- If you add any GWT meta tags, they must   -->
+    <!-- be added before this line.                -->
+    <!--                                           -->
+    <script type="text/javascript" language="javascript" src="denali/denali.nocache.js"></script>
+  </head>
+
+  <!--                                           -->
+  <!-- The body can have arbitrary html, or      -->
+  <!-- you can leave the body empty if you want  -->
+  <!-- to create a completely dynamic UI.        -->
+  <!--                                           -->
+  <body>
+
+    <!-- OPTIONAL: include this if you want history support -->
+    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
+
+    <!-- RECOMMENDED if your web app will not function without JavaScript enabled -->
+    <noscript>
+      <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
+        Your web browser must have JavaScript enabled
+        in order for this application to display correctly.
+      </div>
+    </noscript>
+
+  </body>
+</html>
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/denali/blank.html b/kura/org.eclipse.kura.web/src/main/webapp/denali/blank.html
new file mode 100644
index 0000000000000000000000000000000000000000..6c70bcfe4d48d15f8a6531d6b491e65d641a377c
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/webapp/denali/blank.html
@@ -0,0 +1 @@
+<html></html>
\ No newline at end of file
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/denali/clear.gif b/kura/org.eclipse.kura.web/src/main/webapp/denali/clear.gif
new file mode 100644
index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/webapp/denali/clear.gif differ
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/denali/hosted.html b/kura/org.eclipse.kura.web/src/main/webapp/denali/hosted.html
new file mode 100644
index 0000000000000000000000000000000000000000..f6c5d82329a5832da4b7daa6765382b6009cf3b4
--- /dev/null
+++ b/kura/org.eclipse.kura.web/src/main/webapp/denali/hosted.html
@@ -0,0 +1,364 @@
+<html>
+<head><script>
+var $wnd = parent;
+var $doc = $wnd.document;
+var $moduleName, $moduleBase, $entry
+,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null
+,$sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null;
+// Lightweight metrics
+if ($stats) {
+  var moduleFuncName = location.search.substr(1);
+  var moduleFunc = $wnd[moduleFuncName];
+  var moduleName = moduleFunc ? moduleFunc.moduleName : "unknown";
+  $stats({moduleName:moduleName,sessionId:$sessionId,subSystem:'startup',evtGroup:'moduleStartup',millis:(new Date()).getTime(),type:'moduleEvalStart'});
+}
+var $hostedHtmlVersion="2.1";
+
+var gwtOnLoad;
+var $hosted = "localhost:9997";
+
+function loadIframe(url) {
+  var topDoc = window.top.document;
+
+  // create an iframe
+  var iframeDiv = topDoc.createElement("div");
+  iframeDiv.innerHTML = "<iframe scrolling=no frameborder=0 src='" + url + "'>";
+  var iframe = iframeDiv.firstChild;
+  
+  // mess with the iframe style a little
+  var iframeStyle = iframe.style;
+  iframeStyle.position = "absolute";
+  iframeStyle.borderWidth = "0";
+  iframeStyle.left = "0";
+  iframeStyle.top = "0";
+  iframeStyle.width = "100%";
+  iframeStyle.backgroundColor = "#ffffff";
+  iframeStyle.zIndex = "1";
+  iframeStyle.height = "100%";
+
+  // update the top window's document's body's style
+  var hostBodyStyle = window.top.document.body.style; 
+  hostBodyStyle.margin = "0";
+  hostBodyStyle.height = iframeStyle.height;
+  hostBodyStyle.overflow = "hidden";
+
+  // insert the iframe
+  topDoc.body.insertBefore(iframe, topDoc.body.firstChild);
+}
+
+var ua = navigator.userAgent.toLowerCase();
+if (ua.indexOf("gecko") != -1) {
+  // install eval wrapper on FF to avoid EvalError problem
+  var __eval = window.eval;
+  window.eval = function(s) {
+    return __eval(s);
+  }
+}
+if (ua.indexOf("chrome") != -1) {
+  // work around __gwt_ObjectId appearing in JS objects
+  var hop = Object.prototype.hasOwnProperty;
+  Object.prototype.hasOwnProperty = function(prop) {
+    return prop != "__gwt_ObjectId" && hop.call(this, prop);
+  };
+  // do the same in our parent as well -- see issue 4486
+  // NOTE: this will have to be changed when we support non-iframe-based DevMode 
+  var hop2 = parent.Object.prototype.hasOwnProperty;
+  parent.Object.prototype.hasOwnProperty = function(prop) {
+    return prop != "__gwt_ObjectId" && hop2.call(this, prop);
+  };
+}
+
+// wrapper to call JS methods, which we need both to be able to supply a
+// different this for method lookup and to get the exception back
+function __gwt_jsInvoke(thisObj, methodName) {
+  try {
+    var args = Array.prototype.slice.call(arguments, 2);
+    return [0, window[methodName].apply(thisObj, args)];
+  } catch (e) {
+    return [1, e];
+  }
+}
+
+var __gwt_javaInvokes = [];
+function __gwt_makeJavaInvoke(argCount) {
+  return __gwt_javaInvokes[argCount] || __gwt_doMakeJavaInvoke(argCount);
+}
+
+function __gwt_doMakeJavaInvoke(argCount) {
+  // IE6 won't eval() anonymous functions except as r-values
+  var argList = "";
+  for (var i = 0; i < argCount; i++) {
+    argList += ",p" + i;
+  }
+  var argListNoComma = argList.substring(1);
+
+  return eval(
+    "__gwt_javaInvokes[" + argCount + "] =\n" +
+    "  function(thisObj, dispId" + argList + ") {\n" +
+    "    var result = __static(dispId, thisObj" + argList + ");\n" +
+    "    if (result[0]) {\n" +
+    "      throw result[1];\n" +
+    "    } else {\n" +
+    "      return result[1];\n" +
+    "    }\n" +
+    "  }\n"
+  ); 
+}
+
+/*
+ * This is used to create tear-offs of Java methods.  Each function corresponds
+ * to exactly one dispId, and also embeds the argument count.  We get the "this"
+ * value from the context in which the function is being executed.
+ * Function-object identity is preserved by caching in a sparse array.
+ */
+var __gwt_tearOffs = [];
+var __gwt_tearOffGenerators = [];
+function __gwt_makeTearOff(proxy, dispId, argCount) {
+  return __gwt_tearOffs[dispId] || __gwt_doMakeTearOff(dispId, argCount);
+}
+
+function __gwt_doMakeTearOff(dispId, argCount) {
+  return __gwt_tearOffs[dispId] = 
+      (__gwt_tearOffGenerators[argCount] || __gwt_doMakeTearOffGenerator(argCount))(dispId);
+}
+
+function __gwt_doMakeTearOffGenerator(argCount) {
+  // IE6 won't eval() anonymous functions except as r-values
+  var argList = "";
+  for (var i = 0; i < argCount; i++) {
+    argList += ",p" + i;
+  }
+  var argListNoComma = argList.substring(1);
+
+  return eval(
+    "__gwt_tearOffGenerators[" + argCount + "] =\n" +
+    "  function(dispId) {\n" +
+    "    return function(" + argListNoComma + ") {\n" +
+    "      var result = __static(dispId, this" + argList + ");\n" +
+    "      if (result[0]) {\n" +
+    "        throw result[1];\n" +
+    "      } else {\n" +
+    "        return result[1];\n" +
+    "      }\n" +
+    "    }\n" +
+    "  }\n"
+  ); 
+}
+
+function __gwt_makeResult(isException, result) {
+  return [isException, result];
+}
+
+function __gwt_disconnected() {
+  // Prevent double-invocation.
+  window.__gwt_disconnected = new Function();
+  // Do it in a timeout so we can be sure we have a clean stack.
+  window.setTimeout(__gwt_disconnected_impl, 1);
+}
+
+function __gwt_disconnected_impl() {
+  __gwt_displayGlassMessage('GWT Code Server Disconnected',
+      'Most likely, you closed GWT Development Mode. Or, you might have lost '
+      + 'network connectivity. To fix this, try restarting GWT Development Mode and '
+      + '<a style="color: #FFFFFF; font-weight: bold;" href="javascript:location.reload()">'
+      + 'REFRESH</a> this page.');
+}
+
+// Keep track of z-index to allow layering of multiple glass messages
+var __gwt_glassMessageZIndex = 2147483647;
+
+// Note this method is also used by ModuleSpace.java
+function __gwt_displayGlassMessage(summary, details) {
+  var topWin = window.top;
+  var topDoc = topWin.document;
+  var outer = topDoc.createElement("div");
+  // Do not insert whitespace or outer.firstChild will get a text node.
+  outer.innerHTML = 
+    '<div style="position:absolute;z-index:' + __gwt_glassMessageZIndex-- +
+    ';left:50px;top:50px;width:600px;color:#FFF;font-family:verdana;text-align:left;">' +
+    '<div style="font-size:30px;font-weight:bold;">' + summary + '</div>' +
+    '<div style="font-size:15px;">' + details + '</div>' +
+    '</div>' +
+    '<div style="position:absolute;z-index:' + __gwt_glassMessageZIndex-- +
+    ';left:0px;top:0px;right:0px;bottom:0px;filter:alpha(opacity=60);opacity:0.6;background-color:#000;"></div>'
+  ;
+  topDoc.body.appendChild(outer);
+  var glass = outer.firstChild;
+  var glassStyle = glass.style;
+
+  // Scroll to the top and remove scrollbars.
+  topWin.scrollTo(0, 0);
+  if (topDoc.compatMode == "BackCompat") {
+    topDoc.body.style["overflow"] = "hidden";
+  } else {
+    topDoc.documentElement.style["overflow"] = "hidden";
+  }
+
+  // Steal focus.
+  glass.focus();
+
+  if ((navigator.userAgent.indexOf("MSIE") >= 0) && (topDoc.compatMode == "BackCompat")) {
+    // IE quirks mode doesn't support right/bottom, but does support this.
+    glassStyle.width = "125%";
+    glassStyle.height = "100%";
+  } else if (navigator.userAgent.indexOf("MSIE 6") >= 0) {
+    // IE6 doesn't have a real standards mode, so we have to use hacks.
+    glassStyle.width = "125%"; // Get past scroll bar area.
+    // Nasty CSS; onresize would be better but the outer window won't let us add a listener IE.
+    glassStyle.setExpression("height", "document.documentElement.clientHeight");
+  }
+
+  $doc.title = summary + " [" + $doc.title + "]";
+}
+
+function findPluginObject() {
+  try {
+    return document.getElementById('pluginObject');
+  } catch (e) {
+    return null;
+  }
+}
+
+function findPluginEmbed() {
+  try {
+    return document.getElementById('pluginEmbed')
+  } catch (e) {
+    return null;
+  }
+}
+
+function findPluginXPCOM() {
+  try {
+    return __gwt_HostedModePlugin;
+  } catch (e) {
+    return null;
+  }
+}
+
+gwtOnLoad = function(errFn, modName, modBase){
+  $moduleName = modName;
+  $moduleBase = modBase;
+
+  // Note that the order is important
+  var pluginFinders = [
+    findPluginXPCOM,
+    findPluginObject,
+    findPluginEmbed,
+  ];
+  var topWin = window.top;
+  var url = topWin.location.href;
+  if (!topWin.__gwt_SessionID) {
+    var ASCII_EXCLAMATION = 33;
+    var ASCII_TILDE = 126;
+    var chars = [];
+    for (var i = 0; i < 16; ++i) {
+      chars.push(Math.floor(ASCII_EXCLAMATION
+          + Math.random() * (ASCII_TILDE - ASCII_EXCLAMATION + 1)));
+    }
+    topWin.__gwt_SessionID = String.fromCharCode.apply(null, chars);
+  }
+  var plugin = null;
+  for (var i = 0; i < pluginFinders.length; ++i) {
+    try {
+      var maybePlugin = pluginFinders[i]();
+      if (maybePlugin != null && maybePlugin.init(window)) {
+        plugin = maybePlugin;
+        break;
+      }
+    } catch (e) {
+    }
+  }
+  if (!plugin) {
+    // try searching for a v1 plugin for backwards compatibility
+    var found = false;
+    for (var i = 0; i < pluginFinders.length; ++i) {
+      try {
+        plugin = pluginFinders[i]();
+        if (plugin != null && plugin.connect($hosted, $moduleName, window)) {
+          return;
+        }
+      } catch (e) {
+      }
+    }
+    loadIframe("http://gwt.google.com/missing-plugin");
+  } else {
+    if (plugin.connect(url, topWin.__gwt_SessionID, $hosted, $moduleName,
+        $hostedHtmlVersion)) {
+      window.onUnload = function() {
+        try {
+          // wrap in try/catch since plugins are not required to supply this
+          plugin.disconnect();
+        } catch (e) {
+        }
+      };
+    } else {
+      if (errFn) {
+        errFn(modName);
+      } else {
+        __gwt_displayGlassMessage("Plugin failed to connect to Development Mode server at " +
+            simpleEscape($hosted),
+            "Follow the underlying troubleshooting instructions");
+        loadIframe("http://code.google.com/p/google-web-toolkit/wiki/TroubleshootingOOPHM");
+      }
+    }
+  }
+}
+
+function simpleEscape(originalString) {
+  return originalString.replace("&","&amp;")
+    .replace("<","&lt;")
+    .replace(">","&gt;")
+    .replace("\"","&quot;");
+}
+
+window.onunload = function() {
+};
+
+// Lightweight metrics
+window.fireOnModuleLoadStart = function(className) {
+  $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className});
+};
+
+window.__gwt_module_id = 0;
+</script></head>
+<body>
+<font face='arial' size='-1'>This html file is for Development Mode support.</font>
+<script><!--
+// Lightweight metrics
+$stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'moduleEvalEnd'});
+
+// OOPHM currently only supports IFrameLinker
+var query = parent.location.search;
+if (!findPluginXPCOM()) {
+  document.write('<embed id="pluginEmbed" type="application/x-gwt-hosted-mode" width="10" height="10">');
+  document.write('</embed>');
+  document.write('<object id="pluginObject" CLASSID="CLSID:1D6156B6-002B-49E7-B5CA-C138FB843B4E">');
+  document.write('</object>');
+}
+
+// look for the old query parameter if we don't find the new one
+var idx = query.indexOf("gwt.codesvr=");
+if (idx >= 0) {
+  idx += 12;  // "gwt.codesvr=".length() == 12
+} else {
+  idx = query.indexOf("gwt.hosted=");
+  if (idx >= 0) {
+    idx += 11;  // "gwt.hosted=".length() == 11
+  }
+}
+if (idx >= 0) {
+  var amp = query.indexOf("&", idx);
+  if (amp >= 0) {
+    $hosted = query.substring(idx, amp);
+  } else {
+    $hosted = query.substring(idx);
+  }
+
+  // According to RFC 3986, some of this component's characters (e.g., ':')
+  // are reserved and *may* be escaped.
+  $hosted = decodeURIComponent($hosted);
+}
+
+query = window.location.search.substring(1);
+if (query && $wnd[query]) setTimeout($wnd[query].onScriptLoad, 1);
+--></script></body></html>
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/eclipse/kura/icons/kura_logo_small.png b/kura/org.eclipse.kura.web/src/main/webapp/eclipse/kura/icons/kura_logo_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1db6adb24fdbcc092a5d913cc8a2b0f849a6cde
Binary files /dev/null and b/kura/org.eclipse.kura.web/src/main/webapp/eclipse/kura/icons/kura_logo_small.png differ
diff --git a/kura/org.eclipse.kura.web/src/main/webapp/gxt/.gitkeep b/kura/org.eclipse.kura.web/src/main/webapp/gxt/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/kura/org.eclipse.kura.web/www b/kura/org.eclipse.kura.web/www
new file mode 120000
index 0000000000000000000000000000000000000000..7f628be5a2bf04313ad128bbdcc558a34b80062e
--- /dev/null
+++ b/kura/org.eclipse.kura.web/www
@@ -0,0 +1 @@
+src/main/webapp/
\ No newline at end of file
diff --git a/kura/pom_pom.xml b/kura/pom_pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e6553e5386ac8a40bb5d2767220ee88600ca3aac
--- /dev/null
+++ b/kura/pom_pom.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+<project>
+
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.eclipse.kura</groupId>
+	<artifactId>kura</artifactId>
+	<version>0.7.0</version>
+
+	<packaging>pom</packaging>
+
+	<profiles>
+		<profile>
+			<id>default</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<modules>
+				<module>distrib</module>
+			</modules>
+		</profile>
+		<profile>
+			<id>web</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<modules>
+				<module>org.eclipse.kura.web</module>
+				<module>distrib</module>
+			</modules>
+		</profile>
+	</profiles>
+
+	<properties>
+		<tycho-version>0.18.1</tycho-version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8
+		</project.reporting.outputEncoding>
+		<maven.build.timestamp.format>yyyyMMddHHmm
+		</maven.build.timestamp.format>
+		<kura.basedir>${project.basedir}</kura.basedir>
+	</properties>
+
+	<repositories>
+		<repository>
+			<id>kura_addons</id>
+			<name>Kura Addons Maven Repository</name>
+			<url>https://raw.github.com/eurotech/kura_addons/mvn-repo/</url>
+			<snapshots>
+				<enabled>true</enabled>
+				<updatePolicy>always</updatePolicy>
+			</snapshots>
+		</repository>
+	</repositories>
+
+	<build>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-webdav-jackrabbit</artifactId>
+				<version>2.2</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<version>1.9</version>
+				<executions>
+					<execution>
+						<id>set-deployment-package-version</id>
+						<goals>
+							<goal>regex-property</goal>
+						</goals>
+						<configuration>
+							<name>deployment.package.version</name>
+							<value>${project.version}</value>
+							<regex>-SNAPSHOT</regex>
+							<replacement>.qualifier</replacement>
+							<failIfNoMatch>false</failIfNoMatch>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.7</version>
+				<executions>
+					<execution>
+						<id>store-bundle-version</id>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<propertyfile file="${kura.basedir}/distrib/build.properties" comment="Generated by maven">
+									<entry key="${project.name}.version" value="${project.version}" />
+								</propertyfile>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-site-plugin</artifactId>
+				<version>3.3</version>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/kura/target-definition/kura-equinox_3.8.1.target b/kura/target-definition/kura-equinox_3.8.1.target
new file mode 100644
index 0000000000000000000000000000000000000000..009f1538b4cf1090958f191f2539b31f028aa401
--- /dev/null
+++ b/kura/target-definition/kura-equinox_3.8.1.target
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+<target name="Kura Target Platform Equinox 3.8.1" sequenceNumber="42">
+  <locations>
+    <location path="${git_work_tree}/kura/target-definition/equinox_3.8.1/repository/plugins" type="Profile"/>
+    <location path="${git_work_tree}/kura/target-definition/common/repository/plugins" type="Profile"/>
+  </locations>
+</target>
diff --git a/kura/target-definition/pom.xml b/kura/target-definition/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bf482ff176240401925bf50ffd743c0a6e727d14
--- /dev/null
+++ b/kura/target-definition/pom.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2011, 2014 Eurotech and/or its affiliates
+
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+
+    Contributors:
+      Eurotech
+
+-->
+
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+
+        <parent>
+                <groupId>org.eclipse.kura</groupId>
+                <artifactId>kura</artifactId>
+                <version>0.7.0</version>
+                <relativePath>../manifest_pom.xml</relativePath>
+        </parent>
+
+	<artifactId>target-definition</artifactId>
+	<packaging>pom</packaging>
+	<name>Kura Target Definition</name>
+
+	<properties>
+		<kura.basedir>${project.basedir}/..</kura.basedir>
+	</properties>
+
+	<build>
+		<plugins>
+                        <plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+                                <artifactId>maven-antrun-plugin</artifactId>
+                                <executions>
+                                        <execution>
+                                                <id>initialize</id>
+                                                <phase>package</phase>
+                                                <goals>
+                                                        <goal>run</goal>
+                                                </goals>
+                                                <configuration>
+                                                        <tasks>
+                                                                <echo file="${project.basedir}/../distrib/build.properties" append="false">
+                                                                        kura.build.version=${kura.build.version}
+                                                                </echo>
+                                                        </tasks>
+                                                </configuration>
+                                        </execution>
+                                </executions>
+                        </plugin>
+<!--
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<version>1.3</version>
+				<executions>
+					<execution>
+						<id>attach-artifacts</id>
+						<phase>package</phase>
+						<goals>
+							<goal>attach-artifact</goal>
+						</goals>
+						<configuration>
+							<artifacts>
+								<artifact>
+									<file>kura-equinox_3.8.1.target</file>
+									<type>target</type>
+									<classifier>target</classifier>
+								</artifact>
+							</artifacts>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+-->
+			<plugin>
+	        <groupId>org.apache.maven.plugins</groupId>
+	        <artifactId>maven-site-plugin</artifactId>
+	        <version>3.3</version>
+	      </plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/target-platform/com.codeminders.hidapi/about.html b/target-platform/com.codeminders.hidapi/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..cb8d2a9725a3f11077381b230c092bf09665f4c1
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/about.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</p>
+		<p><em>
+		<strong>com.codeminders.hidapi_1.1.0.jar</strong> <br/><br/>
+		New BSD license
+		</em></p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/target-platform/com.codeminders.hidapi/about_files/LICENSE-bsd.txt b/target-platform/com.codeminders.hidapi/about_files/LICENSE-bsd.txt
new file mode 100755
index 0000000000000000000000000000000000000000..538cdf95cf63e6f8fab8e9c4c7222a35357b4ce1
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/about_files/LICENSE-bsd.txt
@@ -0,0 +1,26 @@
+Copyright (c) 2010, Alan Ott, Signal 11 Software
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of Signal 11 Software nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/target-platform/com.codeminders.hidapi/build.properties b/target-platform/com.codeminders.hidapi/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5d90481fa3ba53065fa04d571792332b06cabf2f
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/build.properties
@@ -0,0 +1,5 @@
+source.. = src/main/java/,src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               src/main/lib/
diff --git a/target-platform/com.codeminders.hidapi/pom.xml b/target-platform/com.codeminders.hidapi/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ba044baac1b25e2c99b2a2f5dcf1899af5e03396
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/pom.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <parent>
+        <groupId>org.eclipse.kura</groupId>
+        <artifactId>target-platform</artifactId>
+        <version>0.7.0</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>com.codeminders.hidapi</artifactId>
+    <version>1.1</version>
+    <packaging>bundle</packaging>
+
+    <name>Java API for working with Human Interface USB Devices (HID)</name>
+    <description>JNI wrapper around C/C++ HIDAPI library providing simple java API to work with devices such as USB gamepads, joysticks, keyboards etc.</description>
+    <url>http://code.google.com/p/javahidapi</url>
+
+    <licenses>
+        <license>
+            <name>New BSD License</name>
+            <url>http://opensource.org/licenses/BSD-3-Clause</url>
+            <distribution>repo</distribution>    
+        </license>
+    </licenses>
+    <scm>
+         <connection>scm:hg:http://code.google.com/p/javahidapi</connection>
+         <developerConnection>scm:hg:https://code.google.com/p/javahidapi</developerConnection>
+         <url>http://code.google.com/p/javahidapi</url>
+    </scm>
+    <developers>
+        <developer>
+            <id>lord</id>
+            <name>Vadim Zaliva</name>
+            <email>lord@codeminders.com</email>
+        </developer>
+        <developer>
+            <id>Alexander Sova</id>
+            <name>Vadim Zaliva</name>
+            <email>bird@codeminders.com</email>
+        </developer>
+        <developer>
+            <id>dshmyga</id>
+            <name>Denis Shmyga</name>
+            <email>dshmyga@codeminders.com</email>
+        </developer>
+    </developers>
+    
+    <properties>
+        <maven.compiler.source>1.6</maven.compiler.source>
+        <maven.compiler.target>1.6</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.codeminders</groupId>
+            <artifactId>hidapi</artifactId>
+            <version>1.1</version>
+        </dependency>
+    </dependencies>
+    
+    <build>
+    <resources>
+        <resource>
+            <directory>src/main/resources</directory>
+        </resource>
+        <resource>
+            <directory>.</directory>
+            <includes>
+                <include>plugin.xml</include>
+            </includes>
+        </resource>
+    </resources>
+    <plugins>
+        <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <version>2.7.2</version>
+            <configuration>
+                <systemPropertyVariables>
+                    <java.library.path>${project.basedir}/src/main/lib</java.library.path>
+                </systemPropertyVariables>
+            </configuration>
+        </plugin>
+        <plugin>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>maven-bundle-plugin</artifactId>
+            <version>2.3.5</version>
+            <extensions>true</extensions>
+            <configuration>
+            <manifestLocation>META-INF</manifestLocation>
+                <instructions>
+                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                    <Bundle-Name>${project.name}</Bundle-Name>
+                    <Bundle-Version>${project.version}</Bundle-Version>
+                    <Embed-Dependency>
+                        hidapi;groupId=com.codeminders;artifactId=hidapi;version=1.1;scope=runtime
+                    </Embed-Dependency>
+                    <Include-Resource>
+                        lib=${project.basedir}/src/lib,
+                        ${project.basedir}/about.html,
+                        about_files=${project.basedir}/about_files
+                    </Include-Resource>
+                    <Bundle-NativeCode>
+                        lib/native/linux/x86/libhidapi-jni.so; osname=Linux; processor=x86,
+			lib/native/linux/x86_64/libhidapi-jni.so; osname=Linux; processor=x86-64,
+                        lib/native/linux/armv6_hf/libhidapi-jni.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv7_hf))",
+                        lib/native/linux/armv5_sf/libhidapi-jni.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv7_sf))",
+                        lib/native/linux/armv5_sf/libhidapi-jni.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv6_hf))",
+                        lib/native/linux/armv5_sf/libhidapi-jni.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv6_sf))",
+                        lib/native/linux/armv5_sf/libhidapi-jni.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv5_sf))",
+                        lib/native/mac/libhidapi-jni-32.jnilib; osname=MacOSX; processor=x86,
+                        lib/native/mac/libhidapi-jni-64.jnilib; osname=MacOSX; processor=x86_64
+                    </Bundle-NativeCode>
+                    <Export-Package>
+                        com.codeminders.hidapi.*
+                    </Export-Package>
+                </instructions>
+            </configuration>
+        </plugin>
+            
+        <plugin>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <executions>
+                <execution>
+                    <id>copy-dependencies</id>
+                    <phase>package</phase>
+                    <goals>
+                      <goal>copy-dependencies</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
+       
+    </plugins>
+        <pluginManagement>
+            <plugins>
+                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>
+                                            org.apache.maven.plugins
+                                        </groupId>
+                                        <artifactId>
+                                            maven-dependency-plugin
+                                        </artifactId>
+                                        <versionRange>
+                                            [2.1,)
+                                        </versionRange>
+                                        <goals>
+                                            <goal>
+                                                copy-dependencies
+                                            </goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore></ignore>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/target-platform/com.codeminders.hidapi/src/AUTHORS.txt b/target-platform/com.codeminders.hidapi/src/AUTHORS.txt
new file mode 100755
index 0000000000000000000000000000000000000000..98c6acb2b5a7951860576bf7e3027facd912d5be
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/AUTHORS.txt
@@ -0,0 +1,23 @@
+
+HIDAPI Authors:
+
+Alan Ott <alan@signal11.us>:
+	Original Author and Maintainer
+	Linux, Windows, and Mac implementations
+
+Ludovic Rousseau <rousseau@debian.org>:
+	Formatting for Doxygen documentation
+	Bug fixes
+	Correctness fixes
+
+
+For a comprehensive list of contributions, see the commit list at github:
+	http://github.com/signal11/hidapi/commits/master
+
+
+Java binding Authors:
+
+Vadim Zaliva <lord@crocodile.org>
+Alex Sova <bird@codeminders.com>
+
+developemnt of Java bindings sponsored Codeminders: www.codeminders.com
diff --git a/target-platform/com.codeminders.hidapi/src/LICENSE-bsd.txt b/target-platform/com.codeminders.hidapi/src/LICENSE-bsd.txt
new file mode 100755
index 0000000000000000000000000000000000000000..538cdf95cf63e6f8fab8e9c4c7222a35357b4ce1
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/LICENSE-bsd.txt
@@ -0,0 +1,26 @@
+Copyright (c) 2010, Alan Ott, Signal 11 Software
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of Signal 11 Software nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/target-platform/com.codeminders.hidapi/src/LICENSE-gpl3.txt b/target-platform/com.codeminders.hidapi/src/LICENSE-gpl3.txt
new file mode 100755
index 0000000000000000000000000000000000000000..94a9ed024d3859793618152ea559a168bbcbb5e2
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/LICENSE-gpl3.txt
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 3 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, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/target-platform/com.codeminders.hidapi/src/LICENSE-orig.txt b/target-platform/com.codeminders.hidapi/src/LICENSE-orig.txt
new file mode 100755
index 0000000000000000000000000000000000000000..e3f33808299600e580b63aee36a0eb18daaae916
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/LICENSE-orig.txt
@@ -0,0 +1,9 @@
+ HIDAPI - Multi-Platform library for
+ communication with HID devices.
+
+ Copyright 2009, Alan Ott, Signal 11 Software.
+ All Rights Reserved.
+ 
+ This software may be used by anyone for any reason so
+ long as the copyright notice in the source files
+ remains intact.
diff --git a/target-platform/com.codeminders.hidapi/src/LICENSE.txt b/target-platform/com.codeminders.hidapi/src/LICENSE.txt
new file mode 100755
index 0000000000000000000000000000000000000000..3bbd95eb4e18b9ac4e2f7bd51b2ee643a95b5482
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/LICENSE.txt
@@ -0,0 +1,13 @@
+HIDAPI can be used under one of three licenses.
+
+1. The GNU Public License, version 3.0, in LICENSE-gpl3.txt
+2. A BSD-Style License, in LICENSE-bsd.txt.
+3. The more liberal original HIDAPI license. LICENSE-orig.txt
+
+The license chosen is at the discretion of the user of HIDAPI. For example:
+1. An author of GPL software would likely use HIDAPI under the terms of the
+GPL.
+
+2. An author of commercial closed-source software would likely use HIDAPI
+under the terms of the BSD-style license or the original HIDAPI license.
+
diff --git a/target-platform/com.codeminders.hidapi/src/README.pdf b/target-platform/com.codeminders.hidapi/src/README.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..d3f42e16c0542753569b9c61648e59bc3d406e8f
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/README.pdf differ
diff --git a/target-platform/com.codeminders.hidapi/src/hidapi/hidapi.h b/target-platform/com.codeminders.hidapi/src/hidapi/hidapi.h
new file mode 100755
index 0000000000000000000000000000000000000000..da840c84b990ee9de321f506c013e73252cd1eae
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/hidapi/hidapi.h
@@ -0,0 +1,383 @@
+/*******************************************************
+ HIDAPI - Multi-Platform library for
+ communication with HID devices.
+
+ Alan Ott
+ Signal 11 Software
+
+ 8/22/2009
+
+ Copyright 2009, All Rights Reserved.
+
+ At the discretion of the user of this library,
+ this software may be licensed under the terms of the
+ GNU Public License v3, a BSD-Style license, or the
+ original HIDAPI license as outlined in the LICENSE.txt,
+ LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
+ files located at the root of the source distribution.
+ These files may also be found in the public source
+ code repository located at:
+        http://github.com/signal11/hidapi .
+********************************************************/
+
+/** @file
+ * @defgroup API hidapi API
+ */
+
+#ifndef HIDAPI_H__
+#define HIDAPI_H__
+
+#include <wchar.h>
+
+#ifdef _WIN32
+      #define HID_API_EXPORT __declspec(dllexport)
+      #define HID_API_CALL
+#else
+      #define HID_API_EXPORT /**< API export macro */
+      #define HID_API_CALL /**< API call macro */
+#endif
+
+#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+        struct hid_device_;
+        typedef struct hid_device_ hid_device; /**< opaque hidapi structure */
+
+        /** hidapi info structure */
+        struct hid_device_info {
+            /** Platform-specific device path */
+            char *path;
+            /** Device Vendor ID */
+            unsigned short vendor_id;
+            /** Device Product ID */
+            unsigned short product_id;
+            /** Serial Number */
+            wchar_t *serial_number;
+            /** Device Release Number in binary-coded decimal,
+                also known as Device Version Number */
+            unsigned short release_number;
+            /** Manufacturer String */
+            wchar_t *manufacturer_string;
+            /** Product string */
+            wchar_t *product_string;
+            /** Usage Page for this Device/Interface
+                (Windows/Mac only). */
+            unsigned short usage_page;
+            /** Usage for this Device/Interface
+                (Windows/Mac only).*/
+            unsigned short usage;
+            /** The USB interface which this logical device
+                represents. Valid on both Linux implementations
+                in all cases, and valid on the Windows implementation
+                only if the device contains more than one interface. */
+            int interface_number;
+
+            /** Pointer to the next device */
+            struct hid_device_info *next;
+        };
+
+
+        /** @brief Initialize the HIDAPI library.
+
+            This function initializes the HIDAPI library. Calling it is not
+            strictly necessary, as it will be called automatically by
+            hid_enumerate() and any of the hid_open_*() functions if it is
+            needed.  This function should be called at the beginning of
+            execution however, if there is a chance of HIDAPI handles
+            being opened by different threads simultaneously.
+            
+            @ingroup API
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int HID_API_EXPORT HID_API_CALL hid_init(void);
+
+        /** @brief Finalize the HIDAPI library.
+
+            This function frees all of the static data associated with
+            HIDAPI. It should be called at the end of execution to avoid
+            memory leaks.
+
+            @ingroup API
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int HID_API_EXPORT HID_API_CALL hid_exit(void);
+
+        /** @brief Enumerate the HID Devices.
+
+            This function returns a linked list of all the HID devices
+            attached to the system which match vendor_id and product_id.
+            If @p vendor_id and @p product_id are both set to 0, then
+            all HID devices will be returned.
+
+            @ingroup API
+            @param vendor_id The Vendor ID (VID) of the types of device
+                to open.
+            @param product_id The Product ID (PID) of the types of
+                device to open.
+
+            @returns
+                This function returns a pointer to a linked list of type
+                struct #hid_device, containing information about the HID devices
+                attached to the system, or NULL in the case of failure. Free
+                this linked list by calling hid_free_enumeration().
+        */
+        struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
+
+        /** @brief Free an enumeration Linked List
+
+            This function frees a linked list created by hid_enumerate().
+
+            @ingroup API
+            @param devs Pointer to a list of struct_device returned from
+                      hid_enumerate().
+        */
+        void  HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs);
+
+        /** @brief Open a HID device using a Vendor ID (VID), Product ID
+            (PID) and optionally a serial number.
+
+            If @p serial_number is NULL, the first device with the
+            specified VID and PID is opened.
+
+            @ingroup API
+            @param vendor_id The Vendor ID (VID) of the device to open.
+            @param product_id The Product ID (PID) of the device to open.
+            @param serial_number The Serial Number of the device to open
+                               (Optionally NULL).
+
+            @returns
+                This function returns a pointer to a #hid_device object on
+                success or NULL on failure.
+        */
+		HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number);
+
+        /** @brief Open a HID device by its path name.
+
+            The path name be determined by calling hid_enumerate(), or a
+            platform-specific path name can be used (eg: /dev/hidraw0 on
+            Linux).
+
+            @ingroup API
+            @param path The path name of the device to open
+
+            @returns
+                This function returns a pointer to a #hid_device object on
+                success or NULL on failure.
+        */
+        HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path);
+
+        /** @brief Write an Output report to a HID device.
+
+            The first byte of @p data[] must contain the Report ID. For
+            devices which only support a single report, this must be set
+            to 0x0. The remaining bytes contain the report data. Since
+            the Report ID is mandatory, calls to hid_write() will always
+            contain one more byte than the report contains. For example,
+            if a hid report is 16 bytes long, 17 bytes must be passed to
+            hid_write(), the Report ID (or 0x0, for devices with a
+            single report), followed by the report data (16 bytes). In
+            this example, the length passed in would be 17.
+
+            hid_write() will send the data on the first OUT endpoint, if
+            one exists. If it does not, it will send the data through
+            the Control Endpoint (Endpoint 0).
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param data The data to send, including the report number as
+                the first byte.
+            @param length The length in bytes of the data to send.
+
+            @returns
+                This function returns the actual number of bytes written and
+                -1 on error.
+        */
+        int  HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length);
+    
+        /** @brief Read an Input report from a HID device with timeout.
+
+            Input reports are returned
+            to the host through the INTERRUPT IN endpoint. The first byte will
+            contain the Report number if the device uses numbered reports.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param data A buffer to put the read data into.
+            @param length The number of bytes to read. For devices with
+                multiple reports, make sure to read an extra byte for
+                the report number.
+            @param milliseconds timeout in milliseconds or -1 for blocking wait.
+
+            @returns
+                This function returns the actual number of bytes read and
+                -1 on error.
+        */
+        int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);
+
+        /** @brief Read an Input report from a HID device.
+
+            Input reports are returned
+            to the host through the INTERRUPT IN endpoint. The first byte will
+            contain the Report number if the device uses numbered reports.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param data A buffer to put the read data into.
+            @param length The number of bytes to read. For devices with
+                multiple reports, make sure to read an extra byte for
+                the report number.
+
+            @returns
+                This function returns the actual number of bytes read and
+                -1 on error.
+        */
+        int  HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);
+
+        /** @brief Set the device handle to be non-blocking.
+
+            In non-blocking mode calls to hid_read() will return
+            immediately with a value of 0 if there is no data to be
+            read. In blocking mode, hid_read() will wait (block) until
+            there is data to read before returning.
+
+            Nonblocking can be turned on and off at any time.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param nonblock enable or not the nonblocking reads
+             - 1 to enable nonblocking
+             - 0 to disable nonblocking.
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int  HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock);
+
+        /** @brief Send a Feature report to the device.
+
+            Feature reports are sent over the Control endpoint as a
+            Set_Report transfer.  The first byte of @p data[] must
+            contain the Report ID. For devices which only support a
+            single report, this must be set to 0x0. The remaining bytes
+            contain the report data. Since the Report ID is mandatory,
+            calls to hid_send_feature_report() will always contain one
+            more byte than the report contains. For example, if a hid
+            report is 16 bytes long, 17 bytes must be passed to
+            hid_send_feature_report(): the Report ID (or 0x0, for
+            devices which do not use numbered reports), followed by the
+            report data (16 bytes). In this example, the length passed
+            in would be 17.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param data The data to send, including the report number as
+                the first byte.
+            @param length The length in bytes of the data to send, including
+                the report number.
+
+            @returns
+                This function returns the actual number of bytes written and
+                -1 on error.
+        */
+        int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length);
+
+        /** @brief Get a feature report from a HID device.
+
+            Make sure to set the first byte of @p data[] to the Report
+            ID of the report to be read.  Make sure to allow space for
+            this extra byte in @p data[].
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param data A buffer to put the read data into, including
+                the Report ID. Set the first byte of @p data[] to the
+                Report ID of the report to be read.
+            @param length The number of bytes to read, including an
+                extra byte for the report ID. The buffer can be longer
+                than the actual report.
+
+            @returns
+                This function returns the number of bytes read and
+                -1 on error.
+        */
+        int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);
+
+        /** @brief Close a HID device.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+        */
+        void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device);
+
+        /** @brief Get The Manufacturer String from a HID device.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param string A wide string buffer to put the data into.
+            @param maxlen The length of the buffer in multiples of wchar_t.
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen);
+
+        /** @brief Get The Product String from a HID device.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param string A wide string buffer to put the data into.
+            @param maxlen The length of the buffer in multiples of wchar_t.
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen);
+
+        /** @brief Get The Serial Number String from a HID device.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param string A wide string buffer to put the data into.
+            @param maxlen The length of the buffer in multiples of wchar_t.
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen);
+
+        /** @brief Get a string from a HID device, based on its string index.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+            @param string_index The index of the string to get.
+            @param string A wide string buffer to put the data into.
+            @param maxlen The length of the buffer in multiples of wchar_t.
+
+            @returns
+                This function returns 0 on success and -1 on error.
+        */
+        int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen);
+
+        /** @brief Get a string describing the last error which occurred.
+
+            @ingroup API
+            @param device A device handle returned from hid_open().
+
+            @returns
+                This function returns a string containing the last error
+                which occurred or NULL if none has occurred.
+        */
+        HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/target-platform/com.codeminders.hidapi/src/jni-impl/HIDDevice.cpp b/target-platform/com.codeminders.hidapi/src/jni-impl/HIDDevice.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..47d56f8773bbad1daeb5bcad7b9bd1055aa95a61
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-impl/HIDDevice.cpp
@@ -0,0 +1,306 @@
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include <jni-stubs/com_codeminders_hidapi_HIDDevice.h>
+#include "hidapi/hidapi.h"
+#include "hid-java.h"
+
+#define MAX_BUFFER_SIZE 2014
+
+static hid_device* getPeer(JNIEnv *env, jobject self)
+{
+    jclass cls = env->FindClass(DEV_CLASS);
+    assert(cls!=NULL);
+    if (cls == NULL) 
+        return NULL;
+    jfieldID fid = env->GetFieldID(cls, "peer", "J");
+    return (hid_device*)(env->GetLongField(self, fid));
+}
+
+static void setPeer(JNIEnv *env, jobject self, hid_device *peer)
+{
+    jclass cls = env->FindClass(DEV_CLASS);
+    assert(cls!=NULL);
+    if (cls == NULL) 
+        return; //TODO: exception will be raised by FindClass
+    jfieldID fid = env->GetFieldID(cls, "peer", "J");
+    jlong peerj = (jlong)peer;
+    env->SetLongField(self, fid, peerj);     
+}
+
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDDevice_close
+  (JNIEnv *env, jobject self)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer) 
+    {
+        throwIOException(env, peer);
+        return; /* not an error, freed previously */ 
+    }
+    hid_close(peer);
+    setPeer(env, self, NULL);
+}
+
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_write
+  (JNIEnv *env, jobject self, jbyteArray data)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer) 
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+
+    jsize bufsize = env->GetArrayLength(data);
+    jbyte *buf = env->GetByteArrayElements(data, NULL);
+    int res = hid_write(peer, (const unsigned char*) buf, bufsize);
+    env->ReleaseByteArrayElements(data, buf, JNI_ABORT);
+    if(res==-1)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    return res;
+}
+
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_read
+  (JNIEnv *env, jobject self, jbyteArray data)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer) 
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+
+    jsize bufsize = env->GetArrayLength(data);
+    jbyte *buf = env->GetByteArrayElements(data, NULL);
+    int read = hid_read(peer, (unsigned char*) buf, bufsize);
+    env->ReleaseByteArrayElements(data, buf, read==-1?JNI_ABORT:0);
+    if(read==-1)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    return read;
+}
+
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_readTimeout
+(JNIEnv *env, jobject self, jbyteArray data, jint milliseconds )
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer) 
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    
+    jsize bufsize = env->GetArrayLength(data);
+    jbyte *buf = env->GetByteArrayElements(data, NULL);
+    int read = hid_read_timeout(peer, (unsigned char*) buf, bufsize, milliseconds);
+    env->ReleaseByteArrayElements(data, buf, read==-1?JNI_ABORT:0);
+    if(read == 0) /* time out */
+    {
+        return 0;
+    }
+    else if(read == -1)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    return read;
+}
+
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDDevice_enableBlocking
+  (JNIEnv *env, jobject self)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return; /* not an error, freed previously */ 
+    }
+    int res = hid_set_nonblocking(peer,0);
+    if(res!=0)
+    {
+        throwIOException(env, peer);
+        return; /* not an error, freed previously */ 
+    }
+}
+
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDDevice_disableBlocking
+  (JNIEnv *env, jobject self)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return; /* not an error, freed previously */ 
+    }
+    int res = hid_set_nonblocking(peer, 1);
+    if(res!=0)
+    {
+        throwIOException(env, peer);
+        return; /* not an error, freed previously */ 
+    }
+}
+
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_sendFeatureReport
+  (JNIEnv *env, jobject self, jbyteArray data)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    jsize bufsize = env->GetArrayLength(data);
+    jbyte *buf = env->GetByteArrayElements(data, NULL);
+    int res = hid_send_feature_report(peer, (const unsigned char*) buf, bufsize);
+    env->ReleaseByteArrayElements(data, buf, JNI_ABORT);
+    if(res==-1)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    
+    return res;
+}
+
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_getFeatureReport
+  (JNIEnv *env, jobject self, jbyteArray data)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+
+    jsize bufsize = env->GetArrayLength(data);
+    jbyte *buf = env->GetByteArrayElements(data, NULL);
+    int res = hid_get_feature_report(peer, (unsigned char*) buf, bufsize);
+    env->ReleaseByteArrayElements(data, buf, res==-1?JNI_ABORT:0);
+    if(res==-1)
+    {
+        throwIOException(env, peer);
+        return 0; /* not an error, freed previously */ 
+    }
+    
+    return res;
+}
+
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getManufacturerString
+  (JNIEnv *env, jobject self)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return NULL; /* not an error, freed previously */ 
+    }
+
+    wchar_t data[MAX_BUFFER_SIZE];
+    int res = hid_get_manufacturer_string(peer, data, MAX_BUFFER_SIZE);
+    if(res < 0)
+    {
+        /* We decided not to treat this as an error, but return an empty string in this case
+           throwIOException(env, peer);
+           return NULL;
+        */
+        data[0] = 0;
+    }
+        
+    char *u8 = convertToUTF8(env, data);
+    jstring string = env->NewStringUTF(u8);
+    free(u8);
+    
+    return string;
+}
+
+#include <stdlib.h>
+
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getProductString
+  (JNIEnv *env, jobject self)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return NULL; /* not an error, freed previously */ 
+    }
+
+    wchar_t data[MAX_BUFFER_SIZE];
+    int res = hid_get_product_string(peer, data, MAX_BUFFER_SIZE);
+    if(res < 0)
+    {
+        /* We decided not to treat this as an error, but return an empty string in this case
+        throwIOException(env, peer);
+        return NULL;
+        */
+        data[0] = 0;
+    }
+       
+    char *u8 = convertToUTF8(env, data);
+    jstring string = env->NewStringUTF(u8);
+    free(u8);
+    
+    return string;
+}
+
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getSerialNumberString
+  (JNIEnv *env, jobject self)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return NULL; /* not an error, freed previously */ 
+    }
+
+    wchar_t data[MAX_BUFFER_SIZE];
+    int res = hid_get_serial_number_string(peer, data, MAX_BUFFER_SIZE);
+    if(res < 0)
+    {
+        /* We decided not to treat this as an error, but return an empty string in this case
+        throwIOException(env, peer);
+        return NULL;
+        */
+        data[0] = 0;
+    }
+        
+    char *u8 = convertToUTF8(env, data);
+    jstring string = env->NewStringUTF(u8);
+    free(u8);
+    
+    return string;
+}
+    
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getIndexedString
+  (JNIEnv *env, jobject self, jint index)
+{
+    hid_device *peer = getPeer(env, self);
+    if(!peer)
+    {
+        throwIOException(env, peer);
+        return NULL; /* not an error, freed previously */ 
+    }
+
+    wchar_t data[MAX_BUFFER_SIZE];
+    int res = hid_get_indexed_string(peer, index, data, MAX_BUFFER_SIZE);
+    if(res < 0)
+    {
+        /* We decided not to treat this as an error, but return an empty string in this case
+        throwIOException(env, peer);
+        return NULL;
+        */
+        data[0] = 0;
+    }
+        
+    char *u8 = convertToUTF8(env, data);
+    jstring string = env->NewStringUTF(u8);
+    free(u8);
+    
+    return string;
+}
diff --git a/target-platform/com.codeminders.hidapi/src/jni-impl/HIDDeviceInfo.cpp b/target-platform/com.codeminders.hidapi/src/jni-impl/HIDDeviceInfo.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..8a7b56477ce539d1ccbf3eea69a902bfa77158f0
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-impl/HIDDeviceInfo.cpp
@@ -0,0 +1,38 @@
+
+#include "jni-stubs/com_codeminders_hidapi_HIDDeviceInfo.h"
+#include "hidapi/hidapi.h"
+#include "hid-java.h"
+
+JNIEXPORT jobject JNICALL Java_com_codeminders_hidapi_HIDDeviceInfo_open
+  (JNIEnv *env, jobject obj)
+{
+    jclass thiscls = env->FindClass(DEVINFO_CLASS);
+    if (!thiscls)
+        return NULL;
+    
+    jfieldID path_field_id = env->GetFieldID(thiscls, "path", "Ljava/lang/String;");
+    jstring jpathstr = (jstring) env->GetObjectField(obj, path_field_id);
+
+    const char *jpathbytes = env->GetStringUTFChars(jpathstr, NULL);
+    if(!jpathbytes)
+        return NULL;
+    
+    hid_device *dev = hid_open_path(jpathbytes);
+    env->ReleaseStringUTFChars(jpathstr, jpathbytes); 
+    if(!dev)
+        return NULL;
+    
+    jlong peer = (jlong)dev;
+    // Construct and return object
+    jclass cls = env->FindClass(DEV_CLASS);
+    if (cls == NULL) {
+        return NULL; /* exception thrown */
+    }
+
+    jmethodID cid = env->GetMethodID(cls,
+                                        "<init>", "(J)V");
+    if (cid == NULL) {
+        return NULL; /* exception thrown */
+    }
+    return env->NewObject(cls, cid, peer);
+}
diff --git a/target-platform/com.codeminders.hidapi/src/jni-impl/HIDManager.cpp b/target-platform/com.codeminders.hidapi/src/jni-impl/HIDManager.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..54deeff7d1adfbb485bc9cd0c38f6ed817f37e9f
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-impl/HIDManager.cpp
@@ -0,0 +1,369 @@
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "jni-stubs/com_codeminders_hidapi_HIDManager.h"
+#include "hidapi/hidapi.h"
+#include "hid-java.h"
+
+#ifdef MAC_OS_X
+#include <CoreFoundation/CoreFoundation.h>
+#include <unistd.h>
+#include <pthread.h>
+#endif
+
+#ifdef MAC_OS_X
+#define HID_RUN_LOOP
+#endif
+
+#define JNI_DEBUG 0
+
+
+static JNIEnv *m_env = NULL;
+static JavaVM *m_vm = NULL;
+
+/* JNI reference count */
+static int jni_ref_count = 0;
+
+#ifdef  HID_RUN_LOOP 
+#define SLEEP_TIME    100 * 1000
+static volatile int squit = 0;
+static int hid_mgr_init = 0;
+static int cond = FALSE;
+static pthread_cond_t condition;
+static pthread_t runloop_thread = NULL;
+static CFRunLoopRef run_loop = NULL;
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#endif
+
+static int init_hid_mgr()
+{
+#ifdef HID_RUN_LOOP 
+    if(hid_mgr_init)
+    {
+        pthread_mutex_lock(&mutex);
+        while(cond == FALSE){
+            pthread_cond_wait(&condition, &mutex);
+        }
+        pthread_mutex_unlock(&mutex);
+        return 1;
+    }
+    return 0;
+#else
+    return 1;
+#endif
+}
+
+#ifdef  HID_RUN_LOOP 
+
+static void *hid_runloop_thread(void *param)
+{
+    SInt32 code = 0;
+    
+    if( NULL == m_env )
+        return NULL;
+    
+    int res = m_vm->AttachCurrentThread( (void**) &m_env, NULL );
+    if(res < 0){
+    #if JNI_DEBUG        
+        printf("Attached failed\n");
+    #endif
+        return NULL;
+    }  
+    
+    run_loop = CFRunLoopGetCurrent();
+   
+    pthread_mutex_lock(&mutex);
+    
+    if(hid_init() == -1){
+        pthread_cond_destroy(&condition);
+        hid_mgr_init = 0;
+        return NULL;
+    }
+  
+    cond = true;
+    pthread_cond_signal(&condition);
+    pthread_mutex_unlock(&mutex);
+    while(!squit)
+    {
+        code = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, false);
+        if( code == kCFRunLoopRunFinished ||  code == kCFRunLoopRunStopped )
+        {
+            break;
+        }
+#if JNI_DEBUG        
+        printf("HID run loop thread\n");
+#endif
+        usleep(SLEEP_TIME);
+    }
+    if(m_vm){
+       m_vm->DetachCurrentThread();
+    }
+    return NULL;
+}
+
+static int hid_runloop_startup()
+{  
+    if(hid_mgr_init)
+        return 0;
+    
+    hid_mgr_init = 1;
+    
+    if(squit)
+    { 
+        pthread_cond_destroy(&condition);
+        pthread_join(runloop_thread, NULL);
+        squit = 0;
+    }
+    else 
+    {
+        pthread_attr_t attr;
+        pthread_attr_init( &attr );
+        pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );
+        pthread_cond_init(&condition, NULL);
+        squit = 0;
+        pthread_create(&runloop_thread, &attr, hid_runloop_thread, NULL);
+    }
+    hid_mgr_init = 1;
+    return 0;
+}
+
+static void hid_runloop_exit()
+{
+    squit = 1;
+    pthread_cond_destroy(&condition);
+    pthread_join(runloop_thread, NULL);
+    m_env = NULL;
+    m_vm = NULL;
+}
+
+static int hid_init_loop()
+{
+    return hid_runloop_startup();
+}
+
+static int hid_exit_loop()
+{
+    if(init_hid_mgr()){
+       hid_runloop_exit();
+       hid_mgr_init = 0;
+    }
+    return 0;
+}
+
+#endif
+
+static jobject getPeer(JNIEnv *env, jobject self)
+{
+    jclass cls = env->FindClass(HID_MANAGER_CLASS);
+    assert(cls!=NULL);
+    if (cls == NULL) 
+        return NULL;
+    jfieldID fid = env->GetFieldID(cls, "peer", "J");
+    return (jobject)(env->GetLongField(self, fid));
+}
+
+static void setPeer(JNIEnv *env, jobject self, jobject peer)
+{
+    jclass cls = env->FindClass(HID_MANAGER_CLASS);
+    assert(cls!=NULL);
+    if (cls == NULL) 
+        return; 
+    jfieldID fid = env->GetFieldID(cls, "peer", "J");
+    jlong peerj = (jlong)peer;
+    env->SetLongField(self, fid, peerj);     
+}
+
+static void setIntField(JNIEnv *env,
+                        jclass cls,
+                        jobject obj,
+                        const char *name,
+                        int val)
+{
+    jfieldID fid = env->GetFieldID(cls, name, "I");
+    env->SetIntField(obj, fid, val);
+}
+
+static void setStringField(JNIEnv *env,
+                           jclass cls,
+                           jobject obj,
+                           const char *name,
+                           const char *val)
+{
+    jfieldID fid = env->GetFieldID(cls, name, "Ljava/lang/String;");
+    env->SetObjectField(obj, fid,  val ? env->NewStringUTF(val) : NULL);
+}
+
+static void setUStringField(JNIEnv *env,
+                           jclass cls,
+                           jobject obj,
+                           const char *name,
+                           const wchar_t *val)
+{
+    jfieldID fid = env->GetFieldID(cls, name, "Ljava/lang/String;");
+
+    if(val)
+    {
+        char *u8 = convertToUTF8(env, val);
+        env->SetObjectField(obj, fid, env->NewStringUTF(u8));
+        free(u8);
+    }
+    else
+        env->SetObjectField(obj, fid, NULL);
+}
+
+
+static jobject createHIDDeviceInfo(JNIEnv *env, jclass cls, struct hid_device_info *dev)
+{
+    jmethodID cid = env->GetMethodID(cls, "<init>", "()V");
+    if (cid == NULL) 
+        return NULL; /* exception thrown. */ 
+    
+    if (dev == NULL)
+        return NULL;
+
+    jobject result = env->NewObject(cls, cid);
+
+    setIntField(env, cls, result, "vendor_id", dev->vendor_id);
+    setIntField(env, cls, result, "product_id", dev->product_id);
+    setIntField(env, cls, result, "release_number", dev->release_number);
+    setIntField(env, cls, result, "usage_page", dev->usage_page);
+    setIntField(env, cls, result, "usage", dev->usage);
+    setIntField(env, cls, result, "interface_number", dev->interface_number);
+    
+    setStringField(env, cls, result, "path", dev->path);
+    setUStringField(env, cls, result, "serial_number", dev->serial_number);
+    setUStringField(env, cls, result, "manufacturer_string", dev->manufacturer_string);
+    setUStringField(env, cls, result, "product_string", dev->product_string);
+
+    return result;
+}
+JNIEXPORT jobjectArray JNICALL
+Java_com_codeminders_hidapi_HIDManager_listDevices(JNIEnv *env, jobject obj)
+{
+    struct hid_device_info *devs, *cur_dev;
+    int res = 0;
+    
+#ifdef HID_RUN_LOOP    
+    res = hid_init_loop(); 
+#else
+    res = hid_init();
+#endif    
+    if(res != 0){
+        throwIOException(env, NULL);
+        return NULL;
+    }
+    if(!init_hid_mgr())
+    {
+        throwIOException(env, NULL);
+        return NULL;
+    }
+    
+    devs = hid_enumerate(0x0, 0x0);
+    if(devs == NULL)
+    {
+     /* no exception thrown */
+     //throwIOException(env, NULL);
+#if JNI_DEBUG        
+      printf("No attached devices\n");
+#endif
+       return NULL;
+    }
+    
+    cur_dev = devs;
+    int size=0;
+    while(cur_dev)
+    {
+       size++;
+       cur_dev = cur_dev->next;
+    }
+
+    jclass infoCls = env->FindClass(DEVINFO_CLASS);
+    if (infoCls == NULL) {
+        return NULL; /* exception thrown */
+    }
+    jobjectArray result= env->NewObjectArray(size, infoCls, NULL);
+    cur_dev = devs;
+    int i=0;
+    while(cur_dev)
+    {
+        jobject x = createHIDDeviceInfo(env, infoCls, cur_dev);
+        if(x == NULL)
+           return NULL; /* exception thrown */ 
+
+        env->SetObjectArrayElement(result, i, x);
+        env->DeleteLocalRef(x);
+        i++;
+        cur_dev = cur_dev->next;
+    }
+    hid_free_enumeration(devs);
+    
+    return result;
+}
+
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDManager_init(JNIEnv *env, jobject obj)
+{
+    int res = 0;
+    jobject jobjRef = 0;
+    if(NULL == m_env)
+    {
+      m_env = env;
+      m_env->GetJavaVM( &m_vm );
+    }
+    
+    if(jni_ref_count == 0)
+    {
+#ifdef HID_RUN_LOOP    
+    res = hid_init_loop(); 
+#else
+    res = hid_init();
+#endif    
+    } 
+    if(res !=0 )
+    {
+       throwIOException(env, NULL);
+       return;
+    }
+    
+    jobjRef = env->NewGlobalRef(obj);
+    setPeer(env, obj, jobjRef);
+#if JNI_DEBUG        
+    printf("JNI - init peer(objRef) =  %p \n", jobjRef);
+#endif
+        
+    jni_ref_count++;
+}
+    
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDManager_release(JNIEnv *env, jobject obj )
+{
+    int res = 0;
+    jobject jobjRef = (jobject)getPeer(env, obj);
+#if JNI_DEBUG        
+    printf("JNI - release peer(jobjRef) =  %p \n", jobjRef);
+#endif
+    if(jobjRef){
+        env->DeleteGlobalRef(jobjRef);
+        setPeer(env,obj,0);
+        jni_ref_count--;
+    }
+#if JNI_DEBUG        
+    printf("jni_ref_count = %d\n", jni_ref_count);
+#endif
+    if(jni_ref_count>0){ 
+       return;     
+    }
+#ifdef HID_RUN_LOOP    
+    res = hid_exit_loop(); 
+#else
+    res = hid_exit();
+#endif
+    if(res !=0 )
+    {
+       throwIOException(env, NULL);
+    }
+#if JNI_DEBUG        
+    printf("JNI Release library!\n");
+#endif
+}
diff --git a/target-platform/com.codeminders.hidapi/src/jni-impl/hid-java.cpp b/target-platform/com.codeminders.hidapi/src/jni-impl/hid-java.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..7c531bf39cee4af4f0da7f49c4e852656e08ab7f
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-impl/hid-java.cpp
@@ -0,0 +1,90 @@
+#include <stdlib.h>
+#include <assert.h>
+#include <jni.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <iconv.h>
+#endif
+
+#include "hidapi/hidapi.h"
+#include "hid-java.h"
+
+void throwIOException(JNIEnv *env, hid_device *device)
+{
+    jclass exceptionClass;
+    char *message = NULL;
+    
+    exceptionClass = env->FindClass("java/io/IOException");
+    if (exceptionClass == NULL) 
+    {
+        /* Unable to find the exception class, give up. */
+        assert(0);
+        return;
+    }
+    
+    if(device)
+    {
+        const wchar_t *error = hid_error(device);
+        if(error) 
+            message = convertToUTF8(env, error);
+    }
+    
+    env->ThrowNew(exceptionClass, message ? message : ""); 
+    
+    free(message);
+}
+
+char* convertToUTF8(JNIEnv *env, const wchar_t *str)
+{
+#ifdef _WIN32
+    int sz = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);    
+    char *ret = (char *) malloc(sz + 1); 
+    WideCharToMultiByte(CP_UTF8, 0, str, -1, ret, sz, NULL, NULL);    
+    return ret;
+#else
+    iconv_t cd = iconv_open ("UTF-8", "WCHAR_T");
+    if (cd == (iconv_t) -1)
+    {
+        /* Something went wrong. We could not recover from this  */
+        
+        jclass exceptionClass = env->FindClass("java/lang/Error");
+        if (exceptionClass == NULL) 
+        {
+            /* Unable to find the exception class, give up. */
+            assert(0);
+            return NULL;
+        }
+    
+        env->ThrowNew(exceptionClass, "iconv_open failed"); 
+        return NULL;
+    }
+    size_t len = wcslen(str);
+    size_t ulen = len*sizeof(wchar_t);
+    char *uval = (char *)str;
+    
+    size_t u8l = len*6+3; //BOM+chars
+    char *u8 = (char *) malloc(u8l+1);
+    char *u8p = u8;
+    int nconv = iconv(cd, &uval, &ulen, &u8p, &u8l);
+    if(nconv == (size_t)-1)
+    {
+        iconv_close(cd);
+        free(u8);
+        jclass exceptionClass = env->FindClass("java/lang/Error");
+        if (exceptionClass == NULL) 
+        {
+            /* Unable to find the exception class, give up. */
+            assert(0);
+            return NULL;
+        }
+        env->ThrowNew(exceptionClass, "iconv failed"); 
+        return NULL;
+    }
+    *u8p='\0';
+
+    iconv_close(cd);
+    return u8;
+#endif
+}
diff --git a/target-platform/com.codeminders.hidapi/src/jni-impl/hid-java.h b/target-platform/com.codeminders.hidapi/src/jni-impl/hid-java.h
new file mode 100755
index 0000000000000000000000000000000000000000..723db31513d1d997688b93b08bfb6305990ed5d6
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-impl/hid-java.h
@@ -0,0 +1,28 @@
+#ifndef __HID_JAVA_H__
+#define __HID_JAVA_H__
+
+#define DEV_CLASS "com/codeminders/hidapi/HIDDevice"
+#define DEVINFO_CLASS "com/codeminders/hidapi/HIDDeviceInfo"
+#define HID_MANAGER_CLASS "com/codeminders/hidapi/HIDManager"
+
+
+#if defined(__APPLE__)
+#define MAC_OS_X
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void throwIOException(JNIEnv *env, hid_device *device);
+
+/* this call allocate buffer dynamically. return value should be
+   released with free() routine */
+char* convertToUTF8(JNIEnv *env, const wchar_t *str); 
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __HID_JAVA_H__
diff --git a/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDDevice.h b/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDDevice.h
new file mode 100644
index 0000000000000000000000000000000000000000..84701d962e24cb5cc71c886baa7a9843d5910ba0
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDDevice.h
@@ -0,0 +1,109 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_codeminders_hidapi_HIDDevice */
+
+#ifndef _Included_com_codeminders_hidapi_HIDDevice
+#define _Included_com_codeminders_hidapi_HIDDevice
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    close
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDDevice_close
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    write
+ * Signature: ([B)I
+ */
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_write
+  (JNIEnv *, jobject, jbyteArray);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    read
+ * Signature: ([B)I
+ */
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_read
+  (JNIEnv *, jobject, jbyteArray);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    readTimeout
+ * Signature: ([BI)I
+ */
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_readTimeout
+  (JNIEnv *, jobject, jbyteArray, jint);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    enableBlocking
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDDevice_enableBlocking
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    disableBlocking
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDDevice_disableBlocking
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    sendFeatureReport
+ * Signature: ([B)I
+ */
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_sendFeatureReport
+  (JNIEnv *, jobject, jbyteArray);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    getFeatureReport
+ * Signature: ([B)I
+ */
+JNIEXPORT jint JNICALL Java_com_codeminders_hidapi_HIDDevice_getFeatureReport
+  (JNIEnv *, jobject, jbyteArray);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    getManufacturerString
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getManufacturerString
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    getProductString
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getProductString
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    getSerialNumberString
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getSerialNumberString
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDDevice
+ * Method:    getIndexedString
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_codeminders_hidapi_HIDDevice_getIndexedString
+  (JNIEnv *, jobject, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDDeviceInfo.h b/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDDeviceInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..9c36de326293d3010bc912dbe86bc05a7f0eecd5
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDDeviceInfo.h
@@ -0,0 +1,21 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_codeminders_hidapi_HIDDeviceInfo */
+
+#ifndef _Included_com_codeminders_hidapi_HIDDeviceInfo
+#define _Included_com_codeminders_hidapi_HIDDeviceInfo
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_codeminders_hidapi_HIDDeviceInfo
+ * Method:    open
+ * Signature: ()Lcom/codeminders/hidapi/HIDDevice;
+ */
+JNIEXPORT jobject JNICALL Java_com_codeminders_hidapi_HIDDeviceInfo_open
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDManager.h b/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..72fb8007ad5aca6a9b076c761139e6d1c5a8b07c
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/jni-stubs/com_codeminders_hidapi_HIDManager.h
@@ -0,0 +1,38 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_codeminders_hidapi_HIDManager */
+
+#ifndef _Included_com_codeminders_hidapi_HIDManager
+#define _Included_com_codeminders_hidapi_HIDManager
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* Inaccessible static: instance */
+/*
+ * Class:     com_codeminders_hidapi_HIDManager
+ * Method:    listDevices
+ * Signature: ()[Lcom/codeminders/hidapi/HIDDeviceInfo;
+ */
+JNIEXPORT jobjectArray JNICALL Java_com_codeminders_hidapi_HIDManager_listDevices
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDManager
+ * Method:    init
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDManager_init
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     com_codeminders_hidapi_HIDManager
+ * Method:    release
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_codeminders_hidapi_HIDManager_release
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/com.codeminders.hidapi/src/lib/maven-ant-tasks-2.1.3.jar b/target-platform/com.codeminders.hidapi/src/lib/maven-ant-tasks-2.1.3.jar
new file mode 100755
index 0000000000000000000000000000000000000000..bec446fff5f05d21bee64a25d037c46604d510e0
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/maven-ant-tasks-2.1.3.jar differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/armv5_sf/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/armv5_sf/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..8b9e3b9b19416d89e712356fe4a461d1fc3c0004
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/armv5_sf/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/armv6_hf/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/armv6_hf/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..57b5caa4878de62f7adf6a6b3d48b63d7e6cd3c6
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/armv6_hf/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..9e18282711a5f25026249718d44357fc640685a9
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/linux32/libhidapi-jni-32.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/linux32/libhidapi-jni-32.so
new file mode 100755
index 0000000000000000000000000000000000000000..9567d74fdc098859a16505cbeced144a492e66df
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/linux32/libhidapi-jni-32.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/linux64/libhidapi-jni-64.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/linux64/libhidapi-jni-64.so
new file mode 100755
index 0000000000000000000000000000000000000000..14f5a204d0e9cf1f111bba5e28a13abe794ffd31
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/linux64/libhidapi-jni-64.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/mini-gateway/yocto_1.2.1/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/mini-gateway/yocto_1.2.1/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..0224bc70f090c6337eb68c9105b4ccfa1c800f3c
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/mini-gateway/yocto_1.2.1/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/raspberry-pi/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/raspberry-pi/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..57b5caa4878de62f7adf6a6b3d48b63d7e6cd3c6
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/old/raspberry-pi/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/x86/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/x86/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..b3790b31444c9b251fe4e638f540c8a52957bc52
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/x86/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/linux/x86_64/libhidapi-jni.so b/target-platform/com.codeminders.hidapi/src/lib/native/linux/x86_64/libhidapi-jni.so
new file mode 100755
index 0000000000000000000000000000000000000000..c6123993ea06b728908d48e070766f9a3d405f65
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/linux/x86_64/libhidapi-jni.so differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/mac/libhidapi-jni-32.jnilib b/target-platform/com.codeminders.hidapi/src/lib/native/mac/libhidapi-jni-32.jnilib
new file mode 100755
index 0000000000000000000000000000000000000000..b0567a50438d25e9a864703dfcedb31cca83ce96
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/mac/libhidapi-jni-32.jnilib differ
diff --git a/target-platform/com.codeminders.hidapi/src/lib/native/mac/libhidapi-jni-64.jnilib b/target-platform/com.codeminders.hidapi/src/lib/native/mac/libhidapi-jni-64.jnilib
new file mode 100755
index 0000000000000000000000000000000000000000..6fbd5fb55fe5ab9e99483c78ce804bee11c01c52
Binary files /dev/null and b/target-platform/com.codeminders.hidapi/src/lib/native/mac/libhidapi-jni-64.jnilib differ
diff --git a/target-platform/com.codeminders.hidapi/src/linux/Makefile b/target-platform/com.codeminders.hidapi/src/linux/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..64d2c2e934fadf5f3ad1bebf263704964cd567f9
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/linux/Makefile
@@ -0,0 +1,49 @@
+###########################################
+# Simple Makefile for HIDAPI test program
+#
+# Alan Ott
+# Signal 11 Software
+# 2010-06-01
+###########################################
+
+
+JNIOBJS=HIDManager.o HIDDeviceInfo.o HIDDevice.o hid-java.o
+JAVA5HEADERS=-I/opt/jdk1.5.0/include/ -I/opt/jdk1.5.0/include/linux
+JAVA6HEADERS=-I/usr/lib/jvm/java-6-openjdk/include/ -I/usr/lib/jvm/java-6-openjdk/include/linux
+JAVA7HEADERS=-I/usr/lib/jvm/jdk1.7.0/include/ -I/usr/lib/jvm/jdk1.7.0/include/linux
+JNIINCLUDES=-I.. -I../jni-impl $(JAVA5HEADERS) $(JAVA6HEADERS) $(JAVA7HEADERS)
+JNILIBS=
+JNISHAREDLIB=libhidapi-jni.so
+JNISHAREDLIBVER=1.0
+
+CC=gcc
+CXX=g++
+COBJS=hid-libusb.o
+CPPOBJS=../hidtest/hidtest.o
+#OBJS=$(COBJS) $(CPPOBJS) $(JNIOBJS)
+OBJS=$(COBJS) $(JNIOBJS)
+CFLAGS+=-fPIC -I../hidapi -g -c `pkg-config libusb-1.0 --cflags` $(JNIINCLUDES)
+LIBS=`pkg-config libusb-1.0 libudev --libs` -ludev -lpthread $(JNILIBS)
+
+all: $(JNISHAREDLIB)
+#all: hidtest $(JNISHAREDLIB)
+
+$(JNISHAREDLIB): $(OBJS)
+	$(CXX) -shared $(COBJS) $(JNIOBJS) $(LIBS) -o $(JNISHAREDLIB)
+
+#hidtest: $(OBJS)
+#	g++ -Wall -g $^ $(LIBS) -o hidtest
+
+%.o: ../jni-impl/%.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+$(COBJS): %.o: %.c
+	$(CC) $(CFLAGS) $< -o $@
+
+$(CPPOBJS): %.o: %.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+clean:
+	rm -f $(OBJS) hidtest $(JNISHAREDLIB)
+
+.PHONY: clean
diff --git a/target-platform/com.codeminders.hidapi/src/linux/Makefile.poky.gateway b/target-platform/com.codeminders.hidapi/src/linux/Makefile.poky.gateway
new file mode 100755
index 0000000000000000000000000000000000000000..7f8b70a748cf4fdfe1bc794e632104ef2cce5994
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/linux/Makefile.poky.gateway
@@ -0,0 +1,49 @@
+###########################################
+# Simple Makefile for HIDAPI test program
+#
+# Alan Ott
+# Signal 11 Software
+# 2010-06-01
+###########################################
+
+
+JNIOBJS=HIDManager.o HIDDeviceInfo.o HIDDevice.o hid-java.o
+JAVA5HEADERS=-I/opt/jdk1.5.0/include/ -I/opt/jdk1.5.0/include/linux
+JAVA6HEADERS=-I/usr/lib/jvm/java-6-openjdk/include/ -I/usr/lib/jvm/java-6-openjdk/include/linux
+JAVA7HEADERS=-I/usr/lib/jvm/jdk1.7.0/include/ -I/usr/lib/jvm/jdk1.7.0/include/linux
+JNIINCLUDES=-I.. -I../jni-impl -I$(JAVA_HOME)/include $(JAVA5HEADERS) $(JAVA6HEADERS) $(JAVA7HEADERS)
+JNILIBS=
+JNISHAREDLIB=libhidapi-jni.so
+JNISHAREDLIBVER=1.0
+
+#CC=gcc
+#CXX=g++
+COBJS=hid-libusb.o
+CPPOBJS=../hidtest/hidtest.o
+#OBJS=$(COBJS) $(CPPOBJS) $(JNIOBJS)
+OBJS=$(COBJS) $(JNIOBJS)
+CFLAGS+=-fPIC -I../hidapi -g -c `pkg-config libusb-1.0 --cflags` $(JNIINCLUDES)
+LIBS=`pkg-config libusb-1.0 libudev --libs` -ludev -lpthread $(JNILIBS)
+
+all: $(JNISHAREDLIB)
+#all: hidtest $(JNISHAREDLIB)
+
+$(JNISHAREDLIB): $(OBJS)
+	$(CXX) -shared $(COBJS) $(JNIOBJS) $(LIBS) -o $(JNISHAREDLIB)
+
+#hidtest: $(OBJS)
+#	g++ -Wall -g $^ $(LIBS) -o hidtest
+
+%.o: ../jni-impl/%.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+$(COBJS): %.o: %.c
+	$(CC) $(CFLAGS) $< -o $@
+
+$(CPPOBJS): %.o: %.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+clean:
+	rm -f $(OBJS) hidtest $(JNISHAREDLIB)
+
+.PHONY: clean
diff --git a/target-platform/com.codeminders.hidapi/src/linux/Makefile.poky.gateway_sf b/target-platform/com.codeminders.hidapi/src/linux/Makefile.poky.gateway_sf
new file mode 100755
index 0000000000000000000000000000000000000000..646a5821d3de4c11e61c69cbed9e30bf002ddf72
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/linux/Makefile.poky.gateway_sf
@@ -0,0 +1,49 @@
+###########################################
+# Simple Makefile for HIDAPI test program
+#
+# Alan Ott
+# Signal 11 Software
+# 2010-06-01
+###########################################
+
+
+JNIOBJS=HIDManager.o HIDDeviceInfo.o HIDDevice.o hid-java.o
+JAVA5HEADERS=-I/opt/jdk1.5.0/include/ -I/opt/jdk1.5.0/include/linux
+JAVA6HEADERS=-I/usr/lib/jvm/java-6-openjdk/include/ -I/usr/lib/jvm/java-6-openjdk/include/linux
+JAVA7HEADERS=-I/usr/lib/jvm/jdk1.7.0/include/ -I/usr/lib/jvm/jdk1.7.0/include/linux
+JNIINCLUDES=-I.. -I../jni-impl -I$(JAVA_HOME)/include $(JAVA5HEADERS) $(JAVA6HEADERS) $(JAVA7HEADERS)
+JNILIBS=
+JNISHAREDLIB=libhidapi-jni.so
+JNISHAREDLIBVER=1.0
+
+#CC=gcc
+#CXX=g++
+COBJS=hid-libusb.o
+CPPOBJS=../hidtest/hidtest.o
+#OBJS=$(COBJS) $(CPPOBJS) $(JNIOBJS)
+OBJS=$(COBJS) $(JNIOBJS)
+CFLAGS+=-msoft-float -fPIC -I../hidapi -g -c `pkg-config libusb-1.0 --cflags` $(JNIINCLUDES)
+LIBS=`pkg-config libusb-1.0 libudev --libs` -ludev -lpthread $(JNILIBS)
+
+all: $(JNISHAREDLIB)
+#all: hidtest $(JNISHAREDLIB)
+
+$(JNISHAREDLIB): $(OBJS)
+	$(CXX) -shared $(COBJS) $(JNIOBJS) $(LIBS) -o $(JNISHAREDLIB)
+
+#hidtest: $(OBJS)
+#	g++ -Wall -g $^ $(LIBS) -o hidtest
+
+%.o: ../jni-impl/%.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+$(COBJS): %.o: %.c
+	$(CC) $(CFLAGS) $< -o $@
+
+$(CPPOBJS): %.o: %.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+clean:
+	rm -f $(OBJS) hidtest $(JNISHAREDLIB)
+
+.PHONY: clean
diff --git a/target-platform/com.codeminders.hidapi/src/linux/README.txt b/target-platform/com.codeminders.hidapi/src/linux/README.txt
new file mode 100755
index 0000000000000000000000000000000000000000..f11d19d904a57e942fca731ebf56bacbbe7f4cf2
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/linux/README.txt
@@ -0,0 +1,63 @@
+
+There are two implementations of HIDAPI for Linux. One (hid.c) uses the
+Linux hidraw driver, and the other (hid-libusb.c) uses libusb. Which one you
+use depends on your application. Complete functionality of the hidraw
+version depends on patches to the Linux kernel which are not currently in
+the mainline. These patches have to do with sending and receiving feature
+reports. The libusb implementation uses libusb to talk directly to the
+device, bypassing any Linux HID driver. The disadvantage of the libusb
+version is that it will only work with USB devices, while the hidraw
+implementation will work with Bluetooth devices as well.
+
+To use HIDAPI, simply drop either hid.c or hid-libusb.c into your
+application and build using the build parameters in the Makefile.
+
+By default, on Linux, the Makefile in this directory is configured to use
+the libusb implementation. To switch to the hidraw implementation, simply
+change hid-libusb.c to hid.c in the Makefile.
+
+
+Libusb Implementation notes
+----------------------------
+For the libusb implementation, libusb-1.0 must be installed. Libusb 1.0 is
+different than the legacy libusb 0.1 which is installed on many systems.  To
+install libusb-1.0 on Ubuntu and other Debian-based systems, run:
+	sudo apt-get install libusb-1.0-0-dev
+
+
+Hidraw Implementation notes
+----------------------------
+For the hidraw implementation, libudev headers and libraries are required to
+build hidapi programs.  To install libudev libraries on Ubuntu,
+and other Debian-based systems, run:
+	sudo apt-get install libudev-dev
+
+On Redhat-based systems, run the following as root:
+	yum install libudev-devel
+
+Unfortunately, the hidraw driver, which the linux version of hidapi is based
+on, contains bugs in kernel versions < 2.6.36, which the client application
+should be aware of.
+
+Bugs (hidraw implementation only):
+-----------------------------------
+On Kernel versions < 2.6.34, if your device uses numbered reports, an extra
+byte will be returned at the beginning of all reports returned from read()
+for hidraw devices. This is worked around in the libary. No action should be
+necessary in the client library.
+
+On Kernel versions < 2.6.35, reports will only be sent using a Set_Report
+transfer on the CONTROL endpoint. No data will ever be sent on an Interrupt
+Out endpoint if one exists. This is fixed in 2.6.35. In 2.6.35, OUTPUT
+reports will be sent to the device on the first INTERRUPT OUT endpoint if it
+exists; If it does not exist, OUTPUT reports will be sent on the CONTROL
+endpoint.
+
+On Kernel versions < 2.6.36, add an extra byte containing the report number
+to sent reports if numbered reports are used, and the device does not
+contain an INTERRPUT OUT endpoint for OUTPUT transfers.  For example, if
+your device uses numbered reports and wants to send {0x2 0xff 0xff 0xff} to
+the device (0x2 is the report number), you must send {0x2 0x2 0xff 0xff
+0xff}. If your device has the optional Interrupt OUT endpoint, this does not
+apply (but really on 2.6.35 only, because 2.6.34 won't use the interrupt
+out endpoint).
diff --git a/target-platform/com.codeminders.hidapi/src/linux/hid-libusb.c b/target-platform/com.codeminders.hidapi/src/linux/hid-libusb.c
new file mode 100644
index 0000000000000000000000000000000000000000..a28af96d2b9103ddfa0dea8db609459d953a0f26
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/linux/hid-libusb.c
@@ -0,0 +1,1424 @@
+/*******************************************************
+ HIDAPI - Multi-Platform library for
+ communication with HID devices.
+
+ Alan Ott
+ Signal 11 Software
+
+ 8/22/2009
+ Linux Version - 6/2/2010
+ Libusb Version - 8/13/2010
+ FreeBSD Version - 11/1/2011
+
+ Copyright 2009, All Rights Reserved.
+ 
+ At the discretion of the user of this library,
+ this software may be licensed under the terms of the
+ GNU Public License v3, a BSD-Style license, or the
+ original HIDAPI license as outlined in the LICENSE.txt,
+ LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
+ files located at the root of the source distribution.
+ These files may also be found in the public source
+ code repository located at:
+        http://github.com/signal11/hidapi .
+********************************************************/
+
+#define _GNU_SOURCE // needed for wcsdup() before glibc 2.10
+
+/* C */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <locale.h>
+#include <errno.h>
+
+/* Unix */
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <wchar.h>
+
+/* GNU / LibUSB */
+#include "libusb.h"
+#include "iconv.h"
+
+#include "hidapi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef DEBUG_PRINTF
+#define LOG(...) fprintf(stderr, __VA_ARGS__)
+#else
+#define LOG(...) do {} while (0)
+#endif
+
+#ifndef __FreeBSD__
+#define DETACH_KERNEL_DRIVER
+#endif
+
+/* Uncomment to enable the retrieval of Usage and Usage Page in
+hid_enumerate(). Warning, on platforms different from FreeBSD
+this is very invasive as it requires the detach
+and re-attach of the kernel driver. See comments inside hid_enumerate().
+libusb HIDAPI programs are encouraged to use the interface number
+instead to differentiate between interfaces on a composite HID device. */
+/*#define INVASIVE_GET_USAGE*/
+
+/* Linked List of input reports received from the device. */
+struct input_report {
+	uint8_t *data;
+	size_t len;
+	struct input_report *next;
+};
+
+
+struct hid_device_ {
+	/* Handle to the actual device. */
+	libusb_device_handle *device_handle;
+	
+	/* Endpoint information */
+	int input_endpoint;
+	int output_endpoint;
+	int input_ep_max_packet_size;
+
+	/* The interface number of the HID */	
+	int interface;
+	
+	/* Indexes of Strings */
+	int manufacturer_index;
+	int product_index;
+	int serial_index;
+	
+	/* Whether blocking reads are used */
+	int blocking; /* boolean */
+	
+	/* Read thread objects */
+	pthread_t thread;
+	pthread_mutex_t mutex; /* Protects input_reports */
+	pthread_cond_t condition;
+	pthread_barrier_t barrier; /* Ensures correct startup sequence */
+	int shutdown_thread;
+	struct libusb_transfer *transfer;
+
+	/* List of received input reports. */
+	struct input_report *input_reports;
+};
+
+static libusb_context *usb_context = NULL;
+
+uint16_t get_usb_code_for_current_locale(void);
+static int return_data(hid_device *dev, unsigned char *data, size_t length);
+
+static hid_device *new_hid_device(void)
+{
+	hid_device *dev = calloc(1, sizeof(hid_device));
+	dev->blocking = 1;
+	
+	pthread_mutex_init(&dev->mutex, NULL);
+	pthread_cond_init(&dev->condition, NULL);
+	pthread_barrier_init(&dev->barrier, NULL, 2);
+	
+	return dev;
+}
+
+static void free_hid_device(hid_device *dev)
+{
+	/* Clean up the thread objects */
+	pthread_barrier_destroy(&dev->barrier);
+	pthread_cond_destroy(&dev->condition);
+	pthread_mutex_destroy(&dev->mutex);
+
+	/* Free the device itself */
+	free(dev);
+}
+
+#if 0
+//TODO: Implement this funciton on hidapi/libusb..
+static void register_error(hid_device *device, const char *op)
+{
+
+}
+#endif
+
+#ifdef INVASIVE_GET_USAGE
+/* Get bytes from a HID Report Descriptor.
+   Only call with a num_bytes of 0, 1, 2, or 4. */
+static uint32_t get_bytes(uint8_t *rpt, size_t len, size_t num_bytes, size_t cur)
+{
+	/* Return if there aren't enough bytes. */
+	if (cur + num_bytes >= len)
+		return 0;
+
+	if (num_bytes == 0)
+		return 0;
+	else if (num_bytes == 1) {
+		return rpt[cur+1];
+	}
+	else if (num_bytes == 2) {
+		return (rpt[cur+2] * 256 + rpt[cur+1]);
+	}
+	else if (num_bytes == 4) {
+		return (rpt[cur+4] * 0x01000000 +
+		        rpt[cur+3] * 0x00010000 +
+		        rpt[cur+2] * 0x00000100 +
+		        rpt[cur+1] * 0x00000001);
+	}
+	else
+		return 0;
+}
+
+/* Retrieves the device's Usage Page and Usage from the report
+   descriptor. The algorithm is simple, as it just returns the first
+   Usage and Usage Page that it finds in the descriptor.
+   The return value is 0 on success and -1 on failure. */
+static int get_usage(uint8_t *report_descriptor, size_t size,
+                     unsigned short *usage_page, unsigned short *usage)
+{
+	int i = 0;
+	int size_code;
+	int data_len, key_size;
+	int usage_found = 0, usage_page_found = 0;
+	
+	while (i < size) {
+		int key = report_descriptor[i];
+		int key_cmd = key & 0xfc;
+
+		//printf("key: %02hhx\n", key);
+		
+		if ((key & 0xf0) == 0xf0) {
+			/* This is a Long Item. The next byte contains the
+			   length of the data section (value) for this key.
+			   See the HID specification, version 1.11, section
+			   6.2.2.3, titled "Long Items." */
+			if (i+1 < size)
+				data_len = report_descriptor[i+1];
+			else
+				data_len = 0; /* malformed report */
+			key_size = 3;
+		}
+		else {
+			/* This is a Short Item. The bottom two bits of the
+			   key contain the size code for the data section
+			   (value) for this key.  Refer to the HID
+			   specification, version 1.11, section 6.2.2.2,
+			   titled "Short Items." */
+			size_code = key & 0x3;
+			switch (size_code) {
+			case 0:
+			case 1:
+			case 2:
+				data_len = size_code;
+				break;
+			case 3:
+				data_len = 4;
+				break;
+			default:
+				/* Can't ever happen since size_code is & 0x3 */
+				data_len = 0;
+				break;
+			};
+			key_size = 1;
+		}
+		
+		if (key_cmd == 0x4) {
+			*usage_page  = get_bytes(report_descriptor, size, data_len, i);
+			usage_page_found = 1;
+			//printf("Usage Page: %x\n", (uint32_t)*usage_page);
+		}
+		if (key_cmd == 0x8) {
+			*usage = get_bytes(report_descriptor, size, data_len, i);
+			usage_found = 1;
+			//printf("Usage: %x\n", (uint32_t)*usage);
+		}
+
+		if (usage_page_found && usage_found)
+			return 0; /* success */
+		
+		/* Skip over this key and it's associated data */
+		i += data_len + key_size;
+	}
+	
+	return -1; /* failure */
+}
+#endif // INVASIVE_GET_USAGE
+
+#ifdef __FreeBSD__
+/* The FreeBSD version of libusb doesn't have this funciton. In mainline
+   libusb, it's inlined in libusb.h. This function will bear a striking
+   resemblence to that one, because there's about one way to code it.
+
+   Note that the data parameter is Unicode in UTF-16LE encoding.
+   Return value is the number of bytes in data, or LIBUSB_ERROR_*.
+ */
+static inline int libusb_get_string_descriptor(libusb_device_handle *dev,
+	uint8_t descriptor_index, uint16_t lang_id,
+	unsigned char *data, int length)
+{
+	return libusb_control_transfer(dev,
+		LIBUSB_ENDPOINT_IN | 0x0, /* Endpoint 0 IN */
+		LIBUSB_REQUEST_GET_DESCRIPTOR,
+		(LIBUSB_DT_STRING << 8) | descriptor_index,
+		lang_id, data, (uint16_t) length, 1000);
+}
+
+#endif
+
+
+/* Get the first language the device says it reports. This comes from
+   USB string #0. */
+static uint16_t get_first_language(libusb_device_handle *dev)
+{
+	uint16_t buf[32];
+	int len;
+	
+	/* Get the string from libusb. */
+	len = libusb_get_string_descriptor(dev,
+			0x0, /* String ID */
+			0x0, /* Language */
+			(unsigned char*)buf,
+			sizeof(buf));
+	if (len < 4)
+		return 0x0;
+	
+	return buf[1]; // First two bytes are len and descriptor type.
+}
+
+static int is_language_supported(libusb_device_handle *dev, uint16_t lang)
+{
+	uint16_t buf[32];
+	int len;
+	int i;
+	
+	/* Get the string from libusb. */
+	len = libusb_get_string_descriptor(dev,
+			0x0, /* String ID */
+			0x0, /* Language */
+			(unsigned char*)buf,
+			sizeof(buf));
+	if (len < 4)
+		return 0x0;
+	
+	
+	len /= 2; /* language IDs are two-bytes each. */
+	/* Start at index 1 because there are two bytes of protocol data. */
+	for (i = 1; i < len; i++) {
+		if (buf[i] == lang)
+			return 1;
+	}
+
+	return 0;
+}
+
+
+/* This function returns a newly allocated wide string containing the USB
+   device string numbered by the index. The returned string must be freed
+   by using free(). */
+static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
+{
+	char buf[512];
+	int len;
+	wchar_t *str = NULL;
+	wchar_t wbuf[256];
+
+	/* iconv variables */
+	iconv_t ic;
+	size_t inbytes;
+	size_t outbytes;
+	size_t res;
+#ifdef __FreeBSD__
+	const char *inptr;
+#else
+	char *inptr;
+#endif
+	char *outptr;
+
+	/* Determine which language to use. */
+	uint16_t lang;
+	lang = get_usb_code_for_current_locale();
+	if (!is_language_supported(dev, lang))
+		lang = get_first_language(dev);
+		
+	/* Get the string from libusb. */
+	len = libusb_get_string_descriptor(dev,
+			idx,
+			lang,
+			(unsigned char*)buf,
+			sizeof(buf));
+	if (len < 0)
+		return NULL;
+	
+	/* buf does not need to be explicitly NULL-terminated because
+	   it is only passed into iconv() which does not need it. */
+	
+	/* Initialize iconv. */
+	ic = iconv_open("WCHAR_T", "UTF-16LE");
+	if (ic == (iconv_t)-1) {
+		LOG("iconv_open() failed\n");
+		return NULL;
+	}
+	
+	/* Convert to native wchar_t (UTF-32 on glibc/BSD systems).
+	   Skip the first character (2-bytes). */
+	inptr = buf+2;
+	inbytes = len-2;
+	outptr = (char*) wbuf;
+	outbytes = sizeof(wbuf);
+	res = iconv(ic, &inptr, &inbytes, &outptr, &outbytes);
+	if (res == (size_t)-1) {
+		LOG("iconv() failed\n");
+		goto err;
+	}
+
+	/* Write the terminating NULL. */
+	wbuf[sizeof(wbuf)/sizeof(wbuf[0])-1] = 0x00000000;
+	if (outbytes >= sizeof(wbuf[0]))
+		*((wchar_t*)outptr) = 0x00000000;
+	
+	/* Allocate and copy the string. */
+	str = wcsdup(wbuf);
+
+err:
+	iconv_close(ic);
+	
+	return str;
+}
+
+static char *make_path(libusb_device *dev, int interface_number)
+{
+	char str[64];
+	snprintf(str, sizeof(str), "%04x:%04x:%02x",
+		libusb_get_bus_number(dev),
+		libusb_get_device_address(dev),
+		interface_number);
+	str[sizeof(str)-1] = '\0';
+	
+	return strdup(str);
+}
+
+
+int HID_API_EXPORT hid_init(void)
+{
+	if (!usb_context) {
+		const char *locale;
+
+		/* Init Libusb */
+		if (libusb_init(&usb_context))
+			return -1;
+
+		/* Set the locale if it's not set. */
+		locale = setlocale(LC_CTYPE, NULL);
+		if (!locale)
+			setlocale(LC_CTYPE, "");
+	}
+
+	return 0;
+}
+
+int HID_API_EXPORT hid_exit(void)
+{
+	if (usb_context) {
+		libusb_exit(usb_context);
+		usb_context = NULL;
+	}
+
+	return 0;
+}
+
+struct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id)
+{
+	libusb_device **devs;
+	libusb_device *dev;
+	libusb_device_handle *handle;
+	ssize_t num_devs;
+	int i = 0;
+	
+	struct hid_device_info *root = NULL; // return object
+	struct hid_device_info *cur_dev = NULL;
+	
+	hid_init();
+
+	num_devs = libusb_get_device_list(usb_context, &devs);
+	if (num_devs < 0)
+		return NULL;
+	while ((dev = devs[i++]) != NULL) {
+		struct libusb_device_descriptor desc;
+		struct libusb_config_descriptor *conf_desc = NULL;
+		int j, k;
+		int interface_num = 0;
+
+		int res = libusb_get_device_descriptor(dev, &desc);
+		unsigned short dev_vid = desc.idVendor;
+		unsigned short dev_pid = desc.idProduct;
+		
+		/* HID's are defined at the interface level. */
+		if (desc.bDeviceClass != LIBUSB_CLASS_PER_INTERFACE)
+			continue;
+
+		res = libusb_get_active_config_descriptor(dev, &conf_desc);
+		if (res < 0)
+			libusb_get_config_descriptor(dev, 0, &conf_desc);
+		if (conf_desc) {
+			for (j = 0; j < conf_desc->bNumInterfaces; j++) {
+				const struct libusb_interface *intf = &conf_desc->interface[j];
+				for (k = 0; k < intf->num_altsetting; k++) {
+					const struct libusb_interface_descriptor *intf_desc;
+					intf_desc = &intf->altsetting[k];
+					if (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) {
+						interface_num = intf_desc->bInterfaceNumber;
+
+						/* Check the VID/PID against the arguments */
+						if ((vendor_id == 0x0 && product_id == 0x0) ||
+						    (vendor_id == dev_vid && product_id == dev_pid)) {
+							struct hid_device_info *tmp;
+
+							/* VID/PID match. Create the record. */
+							tmp = calloc(1, sizeof(struct hid_device_info));
+							if (cur_dev) {
+								cur_dev->next = tmp;
+							}
+							else {
+								root = tmp;
+							}
+							cur_dev = tmp;
+							
+							/* Fill out the record */
+							cur_dev->next = NULL;
+							cur_dev->path = make_path(dev, interface_num);
+							
+							res = libusb_open(dev, &handle);
+
+							if (res >= 0) {
+								/* Serial Number */
+								if (desc.iSerialNumber > 0)
+									cur_dev->serial_number =
+										get_usb_string(handle, desc.iSerialNumber);
+
+								/* Manufacturer and Product strings */
+								if (desc.iManufacturer > 0)
+									cur_dev->manufacturer_string =
+										get_usb_string(handle, desc.iManufacturer);
+								if (desc.iProduct > 0)
+									cur_dev->product_string =
+										get_usb_string(handle, desc.iProduct);
+
+#ifdef INVASIVE_GET_USAGE
+							/*
+							This section is removed because it is too
+							invasive on the system. Getting a Usage Page
+							and Usage requires parsing the HID Report
+							descriptor. Getting a HID Report descriptor
+							involves claiming the interface. Claiming the
+							interface involves detaching the kernel driver.
+							Detaching the kernel driver is hard on the system
+							because it will unclaim interfaces (if another
+							app has them claimed) and the re-attachment of
+							the driver will sometimes change /dev entry names.
+							It is for these reasons that this section is
+							#if 0. For composite devices, use the interface
+							field in the hid_device_info struct to distinguish
+							between interfaces. */
+								unsigned char data[256];
+#ifdef DETACH_KERNEL_DRIVER
+								int detached = 0;
+								/* Usage Page and Usage */
+								res = libusb_kernel_driver_active(handle, interface_num);
+								if (res == 1) {
+									res = libusb_detach_kernel_driver(handle, interface_num);
+									if (res < 0)
+										LOG("Couldn't detach kernel driver, even though a kernel driver was attached.");
+									else
+										detached = 1;
+								}
+#endif
+								res = libusb_claim_interface(handle, interface_num);
+								if (res >= 0) {
+									/* Get the HID Report Descriptor. */
+									res = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_INTERFACE, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_REPORT << 8)|interface_num, 0, data, sizeof(data), 5000);
+									if (res >= 0) {
+										unsigned short page=0, usage=0;
+										/* Parse the usage and usage page
+										   out of the report descriptor. */
+										get_usage(data, res,  &page, &usage);
+										cur_dev->usage_page = page;
+										cur_dev->usage = usage;
+									}
+									else
+										LOG("libusb_control_transfer() for getting the HID report failed with %d\n", res);
+
+									/* Release the interface */
+									res = libusb_release_interface(handle, interface_num);
+									if (res < 0)
+										LOG("Can't release the interface.\n");
+								}
+								else
+									LOG("Can't claim interface %d\n", res);
+#ifdef DETACH_KERNEL_DRIVER
+								/* Re-attach kernel driver if necessary. */
+								if (detached) {
+									res = libusb_attach_kernel_driver(handle, interface_num);
+									if (res < 0)
+										LOG("Couldn't re-attach kernel driver.\n");
+								}
+#endif
+
+#endif // INVASIVE_GET_USAGE
+
+								libusb_close(handle);
+							}
+							/* VID/PID */
+							cur_dev->vendor_id = dev_vid;
+							cur_dev->product_id = dev_pid;
+
+							/* Release Number */
+							cur_dev->release_number = desc.bcdDevice;
+							
+							/* Interface Number */
+							cur_dev->interface_number = interface_num;
+						}
+					}
+				} /* altsettings */
+			} /* interfaces */
+			libusb_free_config_descriptor(conf_desc);
+		}
+	}
+
+	libusb_free_device_list(devs, 1);
+
+	return root;
+}
+
+void  HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs)
+{
+	struct hid_device_info *d = devs;
+	while (d) {
+		struct hid_device_info *next = d->next;
+		free(d->path);
+		free(d->serial_number);
+		free(d->manufacturer_string);
+		free(d->product_string);
+		free(d);
+		d = next;
+	}
+}
+
+hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)
+{
+	struct hid_device_info *devs, *cur_dev;
+	const char *path_to_open = NULL;
+	hid_device *handle = NULL;
+	
+	devs = hid_enumerate(vendor_id, product_id);
+	cur_dev = devs;
+	while (cur_dev) {
+		if (cur_dev->vendor_id == vendor_id &&
+		    cur_dev->product_id == product_id) {
+			if (serial_number) {
+				if (wcscmp(serial_number, cur_dev->serial_number) == 0) {
+					path_to_open = cur_dev->path;
+					break;
+				}
+			}
+			else {
+				path_to_open = cur_dev->path;
+				break;
+			}
+		}
+		cur_dev = cur_dev->next;
+	}
+
+	if (path_to_open) {
+		/* Open the device */
+		handle = hid_open_path(path_to_open);
+	}
+
+	hid_free_enumeration(devs);
+	
+	return handle;
+}
+
+static void read_callback(struct libusb_transfer *transfer)
+{
+	hid_device *dev = transfer->user_data;
+	int res;
+	
+	if (transfer->status == LIBUSB_TRANSFER_COMPLETED) {
+
+		struct input_report *rpt = malloc(sizeof(*rpt));
+		rpt->data = malloc(transfer->actual_length);
+		memcpy(rpt->data, transfer->buffer, transfer->actual_length);
+		rpt->len = transfer->actual_length;
+		rpt->next = NULL;
+
+		pthread_mutex_lock(&dev->mutex);
+
+		/* Attach the new report object to the end of the list. */
+		if (dev->input_reports == NULL) {
+			/* The list is empty. Put it at the root. */
+			dev->input_reports = rpt;
+			pthread_cond_signal(&dev->condition);
+		}
+		else {
+			/* Find the end of the list and attach. */
+			struct input_report *cur = dev->input_reports;
+			int num_queued = 0;
+			while (cur->next != NULL) {
+				cur = cur->next;
+				num_queued++;
+			}
+			cur->next = rpt;
+			
+			/* Pop one off if we've reached 30 in the queue. This
+			   way we don't grow forever if the user never reads
+			   anything from the device. */
+			if (num_queued > 30) {
+				return_data(dev, NULL, 0);
+			}			
+		}
+		pthread_mutex_unlock(&dev->mutex);
+	}
+	else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {
+		dev->shutdown_thread = 1;
+		return;
+	}
+	else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) {
+		dev->shutdown_thread = 1;
+		return;
+	}
+	else if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) {
+		//LOG("Timeout (normal)\n");
+	}
+	else {
+		LOG("Unknown transfer code: %d\n", transfer->status);
+	}
+	
+	/* Re-submit the transfer object. */
+	res = libusb_submit_transfer(transfer);
+	if (res != 0) {
+		LOG("Unable to submit URB. libusb error code: %d\n", res);
+		dev->shutdown_thread = 1;
+	}
+}
+
+
+static void *read_thread(void *param)
+{
+	hid_device *dev = param;
+	unsigned char *buf;
+	const size_t length = dev->input_ep_max_packet_size;
+
+	/* Set up the transfer object. */
+	buf = malloc(length);
+	dev->transfer = libusb_alloc_transfer(0);
+	libusb_fill_interrupt_transfer(dev->transfer,
+		dev->device_handle,
+		dev->input_endpoint,
+		buf,
+		length,
+		read_callback,
+		dev,
+		5000/*timeout*/);
+	
+	/* Make the first submission. Further submissions are made
+	   from inside read_callback() */
+	libusb_submit_transfer(dev->transfer);
+
+	// Notify the main thread that the read thread is up and running.
+	pthread_barrier_wait(&dev->barrier);
+	
+	/* Handle all the events. */
+	while (!dev->shutdown_thread) {
+		int res;
+		res = libusb_handle_events(usb_context);
+		if (res < 0) {
+			/* There was an error. */
+			LOG("read_thread(): libusb reports error # %d\n", res);
+
+			/* Break out of this loop only on fatal error.*/
+			if (res != LIBUSB_ERROR_BUSY &&
+			    res != LIBUSB_ERROR_TIMEOUT &&
+			    res != LIBUSB_ERROR_OVERFLOW &&
+			    res != LIBUSB_ERROR_INTERRUPTED) {
+				break;
+			}
+		}
+	}
+	
+	/* Cancel any transfer that may be pending. This call will fail
+	   if no transfers are pending, but that's OK. */
+	if (libusb_cancel_transfer(dev->transfer) == 0) {
+		/* The transfer was cancelled, so wait for its completion. */
+		libusb_handle_events(usb_context);
+	}
+	
+	/* Now that the read thread is stopping, Wake any threads which are
+	   waiting on data (in hid_read_timeout()). Do this under a mutex to
+	   make sure that a thread which is about to go to sleep waiting on
+	   the condition acutally will go to sleep before the condition is
+	   signaled. */
+	pthread_mutex_lock(&dev->mutex);
+	pthread_cond_broadcast(&dev->condition);
+	pthread_mutex_unlock(&dev->mutex);
+
+	/* The dev->transfer->buffer and dev->transfer objects are cleaned up
+	   in hid_close(). They are not cleaned up here because this thread
+	   could end either due to a disconnect or due to a user
+	   call to hid_close(). In both cases the objects can be safely
+	   cleaned up after the call to pthread_join() (in hid_close()), but
+	   since hid_close() calls libusb_cancel_transfer(), on these objects,
+	   they can not be cleaned up here. */
+	
+	return NULL;
+}
+
+
+hid_device * HID_API_EXPORT hid_open_path(const char *path)
+{
+	hid_device *dev = NULL;
+
+	dev = new_hid_device();
+
+	libusb_device **devs;
+	libusb_device *usb_dev;
+	ssize_t num_devs;
+	int res;
+	int d = 0;
+	int good_open = 0;
+	
+	hid_init();
+
+	num_devs = libusb_get_device_list(usb_context, &devs);
+	while ((usb_dev = devs[d++]) != NULL) {
+		struct libusb_device_descriptor desc;
+		struct libusb_config_descriptor *conf_desc = NULL;
+		int i,j,k;
+		libusb_get_device_descriptor(usb_dev, &desc);
+
+		if (libusb_get_active_config_descriptor(usb_dev, &conf_desc) < 0)
+			continue;
+		for (j = 0; j < conf_desc->bNumInterfaces; j++) {
+			const struct libusb_interface *intf = &conf_desc->interface[j];
+			for (k = 0; k < intf->num_altsetting; k++) {
+				const struct libusb_interface_descriptor *intf_desc;
+				intf_desc = &intf->altsetting[k];
+				if (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) {
+					char *dev_path = make_path(usb_dev, intf_desc->bInterfaceNumber);
+					if (!strcmp(dev_path, path)) {
+						/* Matched Paths. Open this device */
+
+						// OPEN HERE //
+						res = libusb_open(usb_dev, &dev->device_handle);
+						if (res < 0) {
+							LOG("can't open device\n");
+							free(dev_path);
+ 							break;
+						}
+						good_open = 1;
+#ifdef DETACH_KERNEL_DRIVER
+						/* Detach the kernel driver, but only if the
+						   device is managed by the kernel */
+						if (libusb_kernel_driver_active(dev->device_handle, intf_desc->bInterfaceNumber) == 1) {
+							res = libusb_detach_kernel_driver(dev->device_handle, intf_desc->bInterfaceNumber);
+							if (res < 0) {
+								libusb_close(dev->device_handle);
+								LOG("Unable to detach Kernel Driver\n");
+								free(dev_path);
+								good_open = 0;
+								break;
+							}
+						}
+#endif
+						res = libusb_claim_interface(dev->device_handle, intf_desc->bInterfaceNumber);
+						if (res < 0) {
+							LOG("can't claim interface %d: %d\n", intf_desc->bInterfaceNumber, res);
+							free(dev_path);
+							libusb_close(dev->device_handle);
+							good_open = 0;
+							break;
+						}
+
+						/* Store off the string descriptor indexes */
+						dev->manufacturer_index = desc.iManufacturer;
+						dev->product_index      = desc.iProduct;
+						dev->serial_index       = desc.iSerialNumber;
+
+						/* Store off the interface number */
+						dev->interface = intf_desc->bInterfaceNumber;
+												
+						/* Find the INPUT and OUTPUT endpoints. An
+						   OUTPUT endpoint is not required. */
+						for (i = 0; i < intf_desc->bNumEndpoints; i++) {
+							const struct libusb_endpoint_descriptor *ep
+								= &intf_desc->endpoint[i];
+
+							/* Determine the type and direction of this
+							   endpoint. */
+							int is_interrupt =
+								(ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK)
+							      == LIBUSB_TRANSFER_TYPE_INTERRUPT;
+							int is_output = 
+								(ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK)
+							      == LIBUSB_ENDPOINT_OUT;
+							int is_input = 
+								(ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK)
+							      == LIBUSB_ENDPOINT_IN;
+
+							/* Decide whether to use it for intput or output. */
+							if (dev->input_endpoint == 0 &&
+							    is_interrupt && is_input) {
+								/* Use this endpoint for INPUT */
+								dev->input_endpoint = ep->bEndpointAddress;
+								dev->input_ep_max_packet_size = ep->wMaxPacketSize;
+							}
+							if (dev->output_endpoint == 0 &&
+							    is_interrupt && is_output) {
+								/* Use this endpoint for OUTPUT */
+								dev->output_endpoint = ep->bEndpointAddress;
+							}
+						}
+						
+						pthread_create(&dev->thread, NULL, read_thread, dev);
+						
+						// Wait here for the read thread to be initialized.
+						pthread_barrier_wait(&dev->barrier);
+						
+					}
+					free(dev_path);
+				}
+			}
+		}
+		libusb_free_config_descriptor(conf_desc);
+
+	}
+
+	libusb_free_device_list(devs, 1);
+	
+	// If we have a good handle, return it.
+	if (good_open) {
+		return dev;
+	}
+	else {
+		// Unable to open any devices.
+		free_hid_device(dev);
+		return NULL;
+	}
+}
+
+
+int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length)
+{
+	int res;
+	int report_number = data[0];
+	int skipped_report_id = 0;
+
+	if (report_number == 0x0) {
+		data++;
+		length--;
+		skipped_report_id = 1;
+	}
+
+
+	if (dev->output_endpoint <= 0) {
+		/* No interrput out endpoint. Use the Control Endpoint */
+		res = libusb_control_transfer(dev->device_handle,
+			LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
+			0x09/*HID Set_Report*/,
+			(2/*HID output*/ << 8) | report_number,
+			dev->interface,
+			(unsigned char *)data, length,
+			1000/*timeout millis*/);
+		
+		if (res < 0)
+			return -1;
+		
+		if (skipped_report_id)
+			length++;
+		
+		return length;
+	}
+	else {
+		/* Use the interrupt out endpoint */
+		int actual_length;
+		res = libusb_interrupt_transfer(dev->device_handle,
+			dev->output_endpoint,
+			(unsigned char*)data,
+			length,
+			&actual_length, 1000);
+		
+		if (res < 0)
+			return -1;
+		
+		if (skipped_report_id)
+			actual_length++;
+		
+		return actual_length;
+	}
+}
+
+/* Helper function, to simplify hid_read().
+   This should be called with dev->mutex locked. */
+static int return_data(hid_device *dev, unsigned char *data, size_t length)
+{
+	/* Copy the data out of the linked list item (rpt) into the
+	   return buffer (data), and delete the liked list item. */
+	struct input_report *rpt = dev->input_reports;
+	size_t len = (length < rpt->len)? length: rpt->len;
+	if (len > 0)
+		memcpy(data, rpt->data, len);
+	dev->input_reports = rpt->next;
+	free(rpt->data);
+	free(rpt);
+	return len;
+}
+
+static void cleanup_mutex(void *param)
+{
+	hid_device *dev = param;
+	pthread_mutex_unlock(&dev->mutex);
+}
+
+
+int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)
+{
+	int bytes_read = -1;
+
+#if 0
+	int transferred;
+	int res = libusb_interrupt_transfer(dev->device_handle, dev->input_endpoint, data, length, &transferred, 5000);
+	LOG("transferred: %d\n", transferred);
+	return transferred;
+#endif
+
+	pthread_mutex_lock(&dev->mutex);
+	pthread_cleanup_push(&cleanup_mutex, dev);
+
+	/* There's an input report queued up. Return it. */
+	if (dev->input_reports) {
+		/* Return the first one */
+		bytes_read = return_data(dev, data, length);
+		goto ret;
+	}
+	
+	if (dev->shutdown_thread) {
+		/* This means the device has been disconnected.
+		   An error code of -1 should be returned. */
+		bytes_read = -1;
+		goto ret;
+	}
+	
+	if (milliseconds == -1) {
+		/* Blocking */
+		while (!dev->input_reports && !dev->shutdown_thread) {
+			pthread_cond_wait(&dev->condition, &dev->mutex);
+		}
+		if (dev->input_reports) {
+			bytes_read = return_data(dev, data, length);
+		}
+	}
+	else if (milliseconds > 0) {
+		/* Non-blocking, but called with timeout. */
+		int res;
+		struct timespec ts;
+		clock_gettime(CLOCK_REALTIME, &ts);
+		ts.tv_sec += milliseconds / 1000;
+		ts.tv_nsec += (milliseconds % 1000) * 1000000;
+		if (ts.tv_nsec >= 1000000000L) {
+			ts.tv_sec++;
+			ts.tv_nsec -= 1000000000L;
+		}
+		
+		while (!dev->input_reports && !dev->shutdown_thread) {
+			res = pthread_cond_timedwait(&dev->condition, &dev->mutex, &ts);
+			if (res == 0) {
+				if (dev->input_reports) {
+					bytes_read = return_data(dev, data, length);
+					break;
+				}
+				
+				/* If we're here, there was a spurious wake up
+				   or the read thread was shutdown. Run the
+				   loop again (ie: don't break). */
+			}
+			else if (res == ETIMEDOUT) {
+				/* Timed out. */
+				bytes_read = 0;
+				break;
+			}
+			else {
+				/* Error. */
+				bytes_read = -1;
+				break;
+			}
+		}
+	}
+	else {
+		/* Purely non-blocking */
+		bytes_read = 0;
+	}
+
+ret:
+	pthread_mutex_unlock(&dev->mutex);
+	pthread_cleanup_pop(0);
+
+	return bytes_read;
+}
+
+int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length)
+{
+	return hid_read_timeout(dev, data, length, dev->blocking ? -1 : 0);
+}
+
+int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock)
+{
+	dev->blocking = !nonblock;
+	
+	return 0;
+}
+
+
+int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)
+{
+	int res = -1;
+	int skipped_report_id = 0;
+	int report_number = data[0];
+
+	if (report_number == 0x0) {
+		data++;
+		length--;
+		skipped_report_id = 1;
+	}
+
+	res = libusb_control_transfer(dev->device_handle,
+		LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
+		0x09/*HID set_report*/,
+		(3/*HID feature*/ << 8) | report_number,
+		dev->interface,
+		(unsigned char *)data, length,
+		1000/*timeout millis*/);
+	
+	if (res < 0)
+		return -1;
+	
+	/* Account for the report ID */
+	if (skipped_report_id)
+		length++;
+	
+	return length;
+}
+
+int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)
+{
+	int res = -1;
+	int skipped_report_id = 0;
+	int report_number = data[0];
+
+	if (report_number == 0x0) {
+		/* Offset the return buffer by 1, so that the report ID
+		   will remain in byte 0. */
+		data++;
+		length--;
+		skipped_report_id = 1;
+	}
+	res = libusb_control_transfer(dev->device_handle,
+		LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
+		0x01/*HID get_report*/,
+		(3/*HID feature*/ << 8) | report_number,
+		dev->interface,
+		(unsigned char *)data, length,
+		1000/*timeout millis*/);
+	
+	if (res < 0)
+		return -1;
+
+	if (skipped_report_id)
+		res++;
+	
+	return res;
+}
+
+
+void HID_API_EXPORT hid_close(hid_device *dev)
+{
+	if (!dev)
+		return;
+	
+	/* Cause read_thread() to stop. */
+	dev->shutdown_thread = 1;
+	libusb_cancel_transfer(dev->transfer);
+
+	/* Wait for read_thread() to end. */
+	pthread_join(dev->thread, NULL);
+	
+	/* Clean up the Transfer objects allocated in read_thread(). */
+	free(dev->transfer->buffer);
+	libusb_free_transfer(dev->transfer);
+	
+	/* release the interface */
+	libusb_release_interface(dev->device_handle, dev->interface);
+	
+	/* Close the handle */
+	libusb_close(dev->device_handle);
+	
+	/* Clear out the queue of received reports. */
+	pthread_mutex_lock(&dev->mutex);
+	while (dev->input_reports) {
+		return_data(dev, NULL, 0);
+	}
+	pthread_mutex_unlock(&dev->mutex);
+	
+	free_hid_device(dev);
+}
+
+
+int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return hid_get_indexed_string(dev, dev->manufacturer_index, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return hid_get_indexed_string(dev, dev->product_index, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return hid_get_indexed_string(dev, dev->serial_index, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)
+{
+	wchar_t *str;
+
+	str = get_usb_string(dev->device_handle, string_index);
+	if (str) {
+		wcsncpy(string, str, maxlen);
+		string[maxlen-1] = L'\0';
+		free(str);
+		return 0;
+	}
+	else
+		return -1;
+}
+
+
+HID_API_EXPORT const wchar_t * HID_API_CALL  hid_error(hid_device *dev)
+{
+	return NULL;
+}
+
+
+struct lang_map_entry {
+	const char *name;
+	const char *string_code;
+	uint16_t usb_code;
+};
+
+#define LANG(name,code,usb_code) { name, code, usb_code }
+static struct lang_map_entry lang_map[] = {
+	LANG("Afrikaans", "af", 0x0436),
+	LANG("Albanian", "sq", 0x041C),
+	LANG("Arabic - United Arab Emirates", "ar_ae", 0x3801),
+	LANG("Arabic - Bahrain", "ar_bh", 0x3C01),
+	LANG("Arabic - Algeria", "ar_dz", 0x1401),
+	LANG("Arabic - Egypt", "ar_eg", 0x0C01),
+	LANG("Arabic - Iraq", "ar_iq", 0x0801),
+	LANG("Arabic - Jordan", "ar_jo", 0x2C01),
+	LANG("Arabic - Kuwait", "ar_kw", 0x3401),
+	LANG("Arabic - Lebanon", "ar_lb", 0x3001),
+	LANG("Arabic - Libya", "ar_ly", 0x1001),
+	LANG("Arabic - Morocco", "ar_ma", 0x1801),
+	LANG("Arabic - Oman", "ar_om", 0x2001),
+	LANG("Arabic - Qatar", "ar_qa", 0x4001),
+	LANG("Arabic - Saudi Arabia", "ar_sa", 0x0401),
+	LANG("Arabic - Syria", "ar_sy", 0x2801),
+	LANG("Arabic - Tunisia", "ar_tn", 0x1C01),
+	LANG("Arabic - Yemen", "ar_ye", 0x2401),
+	LANG("Armenian", "hy", 0x042B),
+	LANG("Azeri - Latin", "az_az", 0x042C),
+	LANG("Azeri - Cyrillic", "az_az", 0x082C),
+	LANG("Basque", "eu", 0x042D),
+	LANG("Belarusian", "be", 0x0423),
+	LANG("Bulgarian", "bg", 0x0402),
+	LANG("Catalan", "ca", 0x0403),
+	LANG("Chinese - China", "zh_cn", 0x0804),
+	LANG("Chinese - Hong Kong SAR", "zh_hk", 0x0C04),
+	LANG("Chinese - Macau SAR", "zh_mo", 0x1404),
+	LANG("Chinese - Singapore", "zh_sg", 0x1004),
+	LANG("Chinese - Taiwan", "zh_tw", 0x0404),
+	LANG("Croatian", "hr", 0x041A),
+	LANG("Czech", "cs", 0x0405),
+	LANG("Danish", "da", 0x0406),
+	LANG("Dutch - Netherlands", "nl_nl", 0x0413),
+	LANG("Dutch - Belgium", "nl_be", 0x0813),
+	LANG("English - Australia", "en_au", 0x0C09),
+	LANG("English - Belize", "en_bz", 0x2809),
+	LANG("English - Canada", "en_ca", 0x1009),
+	LANG("English - Caribbean", "en_cb", 0x2409),
+	LANG("English - Ireland", "en_ie", 0x1809),
+	LANG("English - Jamaica", "en_jm", 0x2009),
+	LANG("English - New Zealand", "en_nz", 0x1409),
+	LANG("English - Phillippines", "en_ph", 0x3409),
+	LANG("English - Southern Africa", "en_za", 0x1C09),
+	LANG("English - Trinidad", "en_tt", 0x2C09),
+	LANG("English - Great Britain", "en_gb", 0x0809),
+	LANG("English - United States", "en_us", 0x0409),
+	LANG("Estonian", "et", 0x0425),
+	LANG("Farsi", "fa", 0x0429),
+	LANG("Finnish", "fi", 0x040B),
+	LANG("Faroese", "fo", 0x0438),
+	LANG("French - France", "fr_fr", 0x040C),
+	LANG("French - Belgium", "fr_be", 0x080C),
+	LANG("French - Canada", "fr_ca", 0x0C0C),
+	LANG("French - Luxembourg", "fr_lu", 0x140C),
+	LANG("French - Switzerland", "fr_ch", 0x100C),
+	LANG("Gaelic - Ireland", "gd_ie", 0x083C),
+	LANG("Gaelic - Scotland", "gd", 0x043C),
+	LANG("German - Germany", "de_de", 0x0407),
+	LANG("German - Austria", "de_at", 0x0C07),
+	LANG("German - Liechtenstein", "de_li", 0x1407),
+	LANG("German - Luxembourg", "de_lu", 0x1007),
+	LANG("German - Switzerland", "de_ch", 0x0807),
+	LANG("Greek", "el", 0x0408),
+	LANG("Hebrew", "he", 0x040D),
+	LANG("Hindi", "hi", 0x0439),
+	LANG("Hungarian", "hu", 0x040E),
+	LANG("Icelandic", "is", 0x040F),
+	LANG("Indonesian", "id", 0x0421),
+	LANG("Italian - Italy", "it_it", 0x0410),
+	LANG("Italian - Switzerland", "it_ch", 0x0810),
+	LANG("Japanese", "ja", 0x0411),
+	LANG("Korean", "ko", 0x0412),
+	LANG("Latvian", "lv", 0x0426),
+	LANG("Lithuanian", "lt", 0x0427),
+	LANG("F.Y.R.O. Macedonia", "mk", 0x042F),
+	LANG("Malay - Malaysia", "ms_my", 0x043E),
+	LANG("Malay – Brunei", "ms_bn", 0x083E),
+	LANG("Maltese", "mt", 0x043A),
+	LANG("Marathi", "mr", 0x044E),
+	LANG("Norwegian - Bokml", "no_no", 0x0414),
+	LANG("Norwegian - Nynorsk", "no_no", 0x0814),
+	LANG("Polish", "pl", 0x0415),
+	LANG("Portuguese - Portugal", "pt_pt", 0x0816),
+	LANG("Portuguese - Brazil", "pt_br", 0x0416),
+	LANG("Raeto-Romance", "rm", 0x0417),
+	LANG("Romanian - Romania", "ro", 0x0418),
+	LANG("Romanian - Republic of Moldova", "ro_mo", 0x0818),
+	LANG("Russian", "ru", 0x0419),
+	LANG("Russian - Republic of Moldova", "ru_mo", 0x0819),
+	LANG("Sanskrit", "sa", 0x044F),
+	LANG("Serbian - Cyrillic", "sr_sp", 0x0C1A),
+	LANG("Serbian - Latin", "sr_sp", 0x081A),
+	LANG("Setsuana", "tn", 0x0432),
+	LANG("Slovenian", "sl", 0x0424),
+	LANG("Slovak", "sk", 0x041B),
+	LANG("Sorbian", "sb", 0x042E),
+	LANG("Spanish - Spain (Traditional)", "es_es", 0x040A),
+	LANG("Spanish - Argentina", "es_ar", 0x2C0A),
+	LANG("Spanish - Bolivia", "es_bo", 0x400A),
+	LANG("Spanish - Chile", "es_cl", 0x340A),
+	LANG("Spanish - Colombia", "es_co", 0x240A),
+	LANG("Spanish - Costa Rica", "es_cr", 0x140A),
+	LANG("Spanish - Dominican Republic", "es_do", 0x1C0A),
+	LANG("Spanish - Ecuador", "es_ec", 0x300A),
+	LANG("Spanish - Guatemala", "es_gt", 0x100A),
+	LANG("Spanish - Honduras", "es_hn", 0x480A),
+	LANG("Spanish - Mexico", "es_mx", 0x080A),
+	LANG("Spanish - Nicaragua", "es_ni", 0x4C0A),
+	LANG("Spanish - Panama", "es_pa", 0x180A),
+	LANG("Spanish - Peru", "es_pe", 0x280A),
+	LANG("Spanish - Puerto Rico", "es_pr", 0x500A),
+	LANG("Spanish - Paraguay", "es_py", 0x3C0A),
+	LANG("Spanish - El Salvador", "es_sv", 0x440A),
+	LANG("Spanish - Uruguay", "es_uy", 0x380A),
+	LANG("Spanish - Venezuela", "es_ve", 0x200A),
+	LANG("Southern Sotho", "st", 0x0430),
+	LANG("Swahili", "sw", 0x0441),
+	LANG("Swedish - Sweden", "sv_se", 0x041D),
+	LANG("Swedish - Finland", "sv_fi", 0x081D),
+	LANG("Tamil", "ta", 0x0449),
+	LANG("Tatar", "tt", 0X0444),
+	LANG("Thai", "th", 0x041E),
+	LANG("Turkish", "tr", 0x041F),
+	LANG("Tsonga", "ts", 0x0431),
+	LANG("Ukrainian", "uk", 0x0422),
+	LANG("Urdu", "ur", 0x0420),
+	LANG("Uzbek - Cyrillic", "uz_uz", 0x0843),
+	LANG("Uzbek – Latin", "uz_uz", 0x0443),
+	LANG("Vietnamese", "vi", 0x042A),
+	LANG("Xhosa", "xh", 0x0434),
+	LANG("Yiddish", "yi", 0x043D),
+	LANG("Zulu", "zu", 0x0435),
+	LANG(NULL, NULL, 0x0),	
+};
+
+uint16_t get_usb_code_for_current_locale(void)
+{
+	char *locale;
+	char search_string[64];
+	char *ptr;
+	
+	/* Get the current locale. */
+	locale = setlocale(0, NULL);
+	if (!locale)
+		return 0x0;
+	
+	/* Make a copy of the current locale string. */
+	strncpy(search_string, locale, sizeof(search_string));
+	search_string[sizeof(search_string)-1] = '\0';
+	
+	/* Chop off the encoding part, and make it lower case. */
+	ptr = search_string;
+	while (*ptr) {
+		*ptr = tolower(*ptr);
+		if (*ptr == '.') {
+			*ptr = '\0';
+			break;
+		}
+		ptr++;
+	}
+
+	/* Find the entry which matches the string code of our locale. */
+	struct lang_map_entry *lang = lang_map;
+	while (lang->string_code) {
+		if (!strcmp(lang->string_code, search_string)) {
+			return lang->usb_code;
+		}	
+		lang++;
+	}
+	
+	/* There was no match. Find with just the language only. */
+	/* Chop off the variant. Chop it off at the '_'. */
+	ptr = search_string;
+	while (*ptr) {
+		*ptr = tolower(*ptr);
+		if (*ptr == '_') {
+			*ptr = '\0';
+			break;
+		}
+		ptr++;
+	}
+	
+#if 0 // TODO: Do we need this?
+	/* Find the entry which matches the string code of our language. */
+	lang = lang_map;
+	while (lang->string_code) {
+		if (!strcmp(lang->string_code, search_string)) {
+			return lang->usb_code;
+		}	
+		lang++;
+	}
+#endif
+	
+	/* Found nothing. */
+	return 0x0;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/target-platform/com.codeminders.hidapi/src/linux/hid.c b/target-platform/com.codeminders.hidapi/src/linux/hid.c
new file mode 100755
index 0000000000000000000000000000000000000000..0d5599615137f1e4412708b2235fa4794d10de50
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/linux/hid.c
@@ -0,0 +1,791 @@
+/*******************************************************
+ HIDAPI - Multi-Platform library for
+ communication with HID devices.
+
+ Alan Ott
+ Signal 11 Software
+
+ 8/22/2009
+ Linux Version - 6/2/2009
+
+ Copyright 2009, All Rights Reserved.
+ 
+ At the discretion of the user of this library,
+ this software may be licensed under the terms of the
+ GNU Public License v3, a BSD-Style license, or the
+ original HIDAPI license as outlined in the LICENSE.txt,
+ LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
+ files located at the root of the source distribution.
+ These files may also be found in the public source
+ code repository located at:
+        http://github.com/signal11/hidapi .
+********************************************************/
+
+/* C */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <errno.h>
+
+/* Unix */
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <fcntl.h>
+#include <poll.h>
+
+/* Linux */
+#include <linux/hidraw.h>
+#include <linux/version.h>
+#include <linux/input.h>
+#include <libudev.h>
+
+#include "hidapi.h"
+
+/* Definitions from linux/hidraw.h. Since these are new, some distros
+   may not have header files which contain them. */
+#ifndef HIDIOCSFEATURE
+#define HIDIOCSFEATURE(len)    _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len)
+#endif
+#ifndef HIDIOCGFEATURE
+#define HIDIOCGFEATURE(len)    _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len)
+#endif
+
+
+/* USB HID device property names */
+const char *device_string_names[] = {
+	"manufacturer",
+	"product",
+	"serial",
+};
+
+/* Symbolic names for the properties above */
+enum device_string_id {
+	DEVICE_STRING_MANUFACTURER,
+	DEVICE_STRING_PRODUCT,
+	DEVICE_STRING_SERIAL,
+
+	DEVICE_STRING_COUNT,
+};
+
+struct hid_device_ {
+	int device_handle;
+	int blocking;
+	int uses_numbered_reports;
+};
+
+
+static __u32 kernel_version = 0;
+
+hid_device *new_hid_device()
+{
+	hid_device *dev = calloc(1, sizeof(hid_device));
+	dev->device_handle = -1;
+	dev->blocking = 1;
+	dev->uses_numbered_reports = 0;
+
+	return dev;
+}
+
+static void register_error(hid_device *device, const char *op)
+{
+
+}
+
+/* The caller must free the returned string with free(). */
+static wchar_t *utf8_to_wchar_t(const char *utf8)
+{
+	wchar_t *ret = NULL;
+
+	if (utf8) {
+		size_t wlen = mbstowcs(NULL, utf8, 0);
+		if (wlen < 0) {
+			return wcsdup(L"");
+		}
+		ret = calloc(wlen+1, sizeof(wchar_t));
+		mbstowcs(ret, utf8, wlen+1);
+		ret[wlen] = 0x0000;
+	}
+
+	return ret;
+}
+
+/* Get an attribute value from a udev_device and return it as a whar_t
+   string. The returned string must be freed with free() when done.*/
+static wchar_t *copy_udev_string(struct udev_device *dev, const char *udev_name)
+{
+	return utf8_to_wchar_t(udev_device_get_sysattr_value(dev, udev_name));
+}
+
+/* uses_numbered_reports() returns 1 if report_descriptor describes a device
+   which contains numbered reports. */ 
+static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) {
+	int i = 0;
+	int size_code;
+	int data_len, key_size;
+	
+	while (i < size) {
+		int key = report_descriptor[i];
+
+		/* Check for the Report ID key */
+		if (key == 0x85/*Report ID*/) {
+			/* This device has a Report ID, which means it uses
+			   numbered reports. */
+			return 1;
+		}
+		
+		//printf("key: %02hhx\n", key);
+		
+		if ((key & 0xf0) == 0xf0) {
+			/* This is a Long Item. The next byte contains the
+			   length of the data section (value) for this key.
+			   See the HID specification, version 1.11, section
+			   6.2.2.3, titled "Long Items." */
+			if (i+1 < size)
+				data_len = report_descriptor[i+1];
+			else
+				data_len = 0; /* malformed report */
+			key_size = 3;
+		}
+		else {
+			/* This is a Short Item. The bottom two bits of the
+			   key contain the size code for the data section
+			   (value) for this key.  Refer to the HID
+			   specification, version 1.11, section 6.2.2.2,
+			   titled "Short Items." */
+			size_code = key & 0x3;
+			switch (size_code) {
+			case 0:
+			case 1:
+			case 2:
+				data_len = size_code;
+				break;
+			case 3:
+				data_len = 4;
+				break;
+			default:
+				/* Can't ever happen since size_code is & 0x3 */
+				data_len = 0;
+				break;
+			};
+			key_size = 1;
+		}
+		
+		/* Skip over this key and it's associated data */
+		i += data_len + key_size;
+	}
+	
+	/* Didn't find a Report ID key. Device doesn't use numbered reports. */
+	return 0;
+}
+
+/*
+ * The caller is responsible for free()ing the (newly-allocated) character
+ * strings pointed to by serial_number_utf8 and product_name_utf8 after use.
+ */
+int
+parse_uevent_info(const char *uevent, int *bus_type,
+	unsigned short *vendor_id, unsigned short *product_id,
+	char **serial_number_utf8, char **product_name_utf8)
+{
+	char *tmp = strdup(uevent);
+	char *saveptr = NULL;
+	char *line;
+	char *key;
+	char *value;
+
+	int found_id = 0;
+	int found_serial = 0;
+	int found_name = 0;
+
+	line = strtok_r(tmp, "\n", &saveptr);
+	while (line != NULL) {
+		/* line: "KEY=value" */
+		key = line;
+		value = strchr(line, '=');
+		if (!value) {
+			goto next_line;
+		}
+		*value = '\0';
+		value++;
+
+		if (strcmp(key, "HID_ID") == 0) {
+			/**
+			 *        type vendor   product
+			 * HID_ID=0003:000005AC:00008242
+			 **/
+			int ret = sscanf(value, "%x:%hx:%hx", bus_type, vendor_id, product_id);
+			if (ret == 3) {
+				found_id = 1;
+			}
+		} else if (strcmp(key, "HID_NAME") == 0) {
+			/* The caller has to free the product name */
+			*product_name_utf8 = strdup(value);
+			found_name = 1;
+		} else if (strcmp(key, "HID_UNIQ") == 0) {
+			/* The caller has to free the serial number */
+			*serial_number_utf8 = strdup(value);
+			found_serial = 1;
+		}
+
+next_line:
+		line = strtok_r(NULL, "\n", &saveptr);
+	}
+
+	free(tmp);
+	return (found_id && found_name && found_serial);
+}
+
+
+static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t *string, size_t maxlen)
+{
+	struct udev *udev;
+	struct udev_device *udev_dev, *parent, *hid_dev;
+	struct stat s;
+	int ret = -1;
+
+	/* Create the udev object */
+	udev = udev_new();
+	if (!udev) {
+		printf("Can't create udev\n");
+		return -1;
+	}
+
+	/* Get the dev_t (major/minor numbers) from the file handle. */
+	fstat(dev->device_handle, &s);
+	/* Open a udev device from the dev_t. 'c' means character device. */
+	udev_dev = udev_device_new_from_devnum(udev, 'c', s.st_rdev);
+	if (udev_dev) {
+		hid_dev = udev_device_get_parent_with_subsystem_devtype(
+			udev_dev,
+			"hid",
+			NULL);
+		if (hid_dev) {
+			unsigned short dev_vid;
+			unsigned short dev_pid;
+			char *serial_number_utf8 = NULL;
+			char *product_name_utf8 = NULL;
+			int bus_type;
+
+			ret = parse_uevent_info(
+			           udev_device_get_sysattr_value(hid_dev, "uevent"),
+			           &bus_type,
+			           &dev_vid,
+			           &dev_pid,
+			           &serial_number_utf8,
+			           &product_name_utf8);
+
+			if (bus_type == BUS_BLUETOOTH) {
+				switch (key) {
+					case DEVICE_STRING_MANUFACTURER:
+						wcsncpy(string, L"", maxlen);
+						ret = 0;
+						break;
+					case DEVICE_STRING_PRODUCT:
+						ret = mbstowcs(string, product_name_utf8, maxlen);
+						ret = (ret == (size_t)-1)? -1: 0;
+						break;
+					case DEVICE_STRING_SERIAL:
+						ret = mbstowcs(string, serial_number_utf8, maxlen);
+						ret = (ret == (size_t)-1)? -1: 0;
+						break;
+					default:
+						ret = -1;
+						break;
+				}
+			}
+			else {
+				/* This is a USB device. Find its parent USB Device node. */
+				parent = udev_device_get_parent_with_subsystem_devtype(
+					   udev_dev,
+					   "usb",
+					   "usb_device");
+				if (parent) {
+					const char *str;
+					const char *key_str = NULL;
+
+					if (key >= 0 && key < DEVICE_STRING_COUNT) {
+						key_str = device_string_names[key];
+					} else {
+						ret = -1;
+						goto end;
+					}
+
+					str = udev_device_get_sysattr_value(parent, key_str);
+					if (str) {
+						/* Convert the string from UTF-8 to wchar_t */
+						ret = mbstowcs(string, str, maxlen);
+						ret = (ret == (size_t)-1)? -1: 0;
+						goto end;
+					}
+				}
+			}
+
+			free(serial_number_utf8);
+			free(product_name_utf8);
+		}
+	}
+
+end:
+	udev_device_unref(udev_dev);
+	// parent and hid_dev don't need to be (and can't be) unref'd.
+	// I'm not sure why, but they'll throw double-free() errors.
+	udev_unref(udev);
+
+	return ret;
+}
+
+int HID_API_EXPORT hid_init(void)
+{
+	const char *locale;
+
+	/* Set the locale if it's not set. */
+	locale = setlocale(LC_CTYPE, NULL);
+	if (!locale)
+		setlocale(LC_CTYPE, "");
+
+	return 0;
+}
+
+int HID_API_EXPORT hid_exit(void)
+{
+	/* Nothing to do for this in the Linux/hidraw implementation. */
+	return 0;
+}
+
+
+struct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id)
+{
+	struct udev *udev;
+	struct udev_enumerate *enumerate;
+	struct udev_list_entry *devices, *dev_list_entry;
+	
+	struct hid_device_info *root = NULL; // return object
+	struct hid_device_info *cur_dev = NULL;
+	struct hid_device_info *prev_dev = NULL; // previous device
+
+	hid_init();
+
+	/* Create the udev object */
+	udev = udev_new();
+	if (!udev) {
+		printf("Can't create udev\n");
+		return NULL;
+	}
+
+	/* Create a list of the devices in the 'hidraw' subsystem. */
+	enumerate = udev_enumerate_new(udev);
+	udev_enumerate_add_match_subsystem(enumerate, "hidraw");
+	udev_enumerate_scan_devices(enumerate);
+	devices = udev_enumerate_get_list_entry(enumerate);
+	/* For each item, see if it matches the vid/pid, and if so
+	   create a udev_device record for it */
+	udev_list_entry_foreach(dev_list_entry, devices) {
+		const char *sysfs_path;
+		const char *dev_path;
+		const char *str;
+		struct udev_device *raw_dev; // The device's hidraw udev node.
+		struct udev_device *hid_dev; // The device's HID udev node.
+		struct udev_device *usb_dev; // The device's USB udev node.
+		struct udev_device *intf_dev; // The device's interface (in the USB sense).
+		unsigned short dev_vid;
+		unsigned short dev_pid;
+		char *serial_number_utf8 = NULL;
+		char *product_name_utf8 = NULL;
+		int bus_type;
+		int result;
+
+		/* Get the filename of the /sys entry for the device
+		   and create a udev_device object (dev) representing it */
+		sysfs_path = udev_list_entry_get_name(dev_list_entry);
+		raw_dev = udev_device_new_from_syspath(udev, sysfs_path);
+		dev_path = udev_device_get_devnode(raw_dev);
+
+		hid_dev = udev_device_get_parent_with_subsystem_devtype(
+			raw_dev,
+			"hid",
+			NULL);
+
+		if (!hid_dev) {
+			/* Unable to find parent hid device. */
+			goto next;
+		}
+
+		result = parse_uevent_info(
+			udev_device_get_sysattr_value(hid_dev, "uevent"),
+			&bus_type,
+			&dev_vid,
+			&dev_pid,
+			&serial_number_utf8,
+			&product_name_utf8);
+
+		if (!result) {
+			/* parse_uevent_info() failed for at least one field. */
+			goto next;
+		}
+
+		if (bus_type != BUS_USB && bus_type != BUS_BLUETOOTH) {
+			/* We only know how to handle USB and BT devices. */
+			goto next;
+		}
+
+		/* Check the VID/PID against the arguments */
+		if ((vendor_id == 0x0 && product_id == 0x0) ||
+		    (vendor_id == dev_vid && product_id == dev_pid)) {
+			struct hid_device_info *tmp;
+
+			/* VID/PID match. Create the record. */
+			tmp = malloc(sizeof(struct hid_device_info));
+			if (cur_dev) {
+				cur_dev->next = tmp;
+			}
+			else {
+				root = tmp;
+			}
+			prev_dev = cur_dev;
+			cur_dev = tmp;
+
+			/* Fill out the record */
+			cur_dev->next = NULL;
+			cur_dev->path = dev_path? strdup(dev_path): NULL;
+
+			/* VID/PID */
+			cur_dev->vendor_id = dev_vid;
+			cur_dev->product_id = dev_pid;
+
+			/* Serial Number */
+			cur_dev->serial_number = utf8_to_wchar_t(serial_number_utf8);
+
+			/* Release Number */
+			cur_dev->release_number = 0x0;
+
+			/* Interface Number */
+			cur_dev->interface_number = -1;
+
+			switch (bus_type) {
+				case BUS_USB:
+					/* The device pointed to by raw_dev contains information about
+					   the hidraw device. In order to get information about the
+					   USB device, get the parent device with the
+					   subsystem/devtype pair of "usb"/"usb_device". This will
+					   be several levels up the tree, but the function will find
+					   it. */
+					usb_dev = udev_device_get_parent_with_subsystem_devtype(
+							raw_dev,
+							"usb",
+							"usb_device");
+
+					if (!usb_dev) {
+						/* Free this device */
+						free(cur_dev->serial_number);
+						free(cur_dev->path);
+						free(cur_dev);
+
+						/* Take it off the device list. */
+						if (prev_dev) {
+							prev_dev->next = NULL;
+							cur_dev = prev_dev;
+						}
+						else {
+							cur_dev = root = NULL;
+						}
+
+						goto next;
+					}
+
+					/* Manufacturer and Product strings */
+					cur_dev->manufacturer_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_MANUFACTURER]);
+					cur_dev->product_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_PRODUCT]);
+
+					/* Release Number */
+					str = udev_device_get_sysattr_value(usb_dev, "bcdDevice");
+					cur_dev->release_number = (str)? strtol(str, NULL, 16): 0x0;
+
+					/* Get a handle to the interface's udev node. */
+					intf_dev = udev_device_get_parent_with_subsystem_devtype(
+							raw_dev,
+							"usb",
+							"usb_interface");
+					if (intf_dev) {
+						str = udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber");
+						cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1;
+					}
+
+					break;
+
+				case BUS_BLUETOOTH:
+					/* Manufacturer and Product strings */
+					cur_dev->manufacturer_string = wcsdup(L"");
+					cur_dev->product_string = utf8_to_wchar_t(product_name_utf8);
+
+					break;
+
+				default:
+					/* Unknown device type - this should never happen, as we
+					 * check for USB and Bluetooth devices above */
+					break;
+			}
+		}
+
+	next:
+		free(serial_number_utf8);
+		free(product_name_utf8);
+		udev_device_unref(raw_dev);
+		/* hid_dev, usb_dev and intf_dev don't need to be (and can't be)
+		   unref()d.  It will cause a double-free() error.  I'm not
+		   sure why.  */
+	}
+	/* Free the enumerator and udev objects. */
+	udev_enumerate_unref(enumerate);
+	udev_unref(udev);
+	
+	return root;
+}
+
+void  HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs)
+{
+	struct hid_device_info *d = devs;
+	while (d) {
+		struct hid_device_info *next = d->next;
+		free(d->path);
+		free(d->serial_number);
+		free(d->manufacturer_string);
+		free(d->product_string);
+		free(d);
+		d = next;
+	}
+}
+
+hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)
+{
+	struct hid_device_info *devs, *cur_dev;
+	const char *path_to_open = NULL;
+	hid_device *handle = NULL;
+	
+	devs = hid_enumerate(vendor_id, product_id);
+	cur_dev = devs;
+	while (cur_dev) {
+		if (cur_dev->vendor_id == vendor_id &&
+		    cur_dev->product_id == product_id) {
+			if (serial_number) {
+				if (wcscmp(serial_number, cur_dev->serial_number) == 0) {
+					path_to_open = cur_dev->path;
+					break;
+				}
+			}
+			else {
+				path_to_open = cur_dev->path;
+				break;
+			}
+		}
+		cur_dev = cur_dev->next;
+	}
+
+	if (path_to_open) {
+		/* Open the device */
+		handle = hid_open_path(path_to_open);
+	}
+
+	hid_free_enumeration(devs);
+	
+	return handle;
+}
+
+hid_device * HID_API_EXPORT hid_open_path(const char *path)
+{
+	hid_device *dev = NULL;
+
+	hid_init();
+
+	dev = new_hid_device();
+
+	if (kernel_version == 0) {
+		struct utsname name;
+		int major, minor, release;
+		int ret;
+		uname(&name);
+		ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
+		if (ret == 3) {
+			kernel_version = major << 16 | minor << 8 | release;
+			//printf("Kernel Version: %d\n", kernel_version);
+		}
+		else {
+			printf("Couldn't sscanf() version string %s\n", name.release);
+		}
+	}
+
+	// OPEN HERE //
+	dev->device_handle = open(path, O_RDWR);
+
+	// If we have a good handle, return it.
+	if (dev->device_handle > 0) {
+
+		/* Get the report descriptor */
+		int res, desc_size = 0;
+		struct hidraw_report_descriptor rpt_desc;
+
+		memset(&rpt_desc, 0x0, sizeof(rpt_desc));
+
+		/* Get Report Descriptor Size */
+		res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size);
+		if (res < 0)
+			perror("HIDIOCGRDESCSIZE");
+
+
+		/* Get Report Descriptor */
+		rpt_desc.size = desc_size;
+		res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc);
+		if (res < 0) {
+			perror("HIDIOCGRDESC");
+		} else {
+			/* Determine if this device uses numbered reports. */
+			dev->uses_numbered_reports =
+				uses_numbered_reports(rpt_desc.value,
+				                      rpt_desc.size);
+		}
+		
+		return dev;
+	}
+	else {
+		// Unable to open any devices.
+		free(dev);
+		return NULL;
+	}
+}
+
+
+int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length)
+{
+	int bytes_written;
+
+	bytes_written = write(dev->device_handle, data, length);
+
+	return bytes_written;
+}
+
+
+int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)
+{
+	int bytes_read;
+
+	if (milliseconds != 0) {
+		/* milliseconds is -1 or > 0. In both cases, we want to
+		   call poll() and wait for data to arrive. -1 means
+		   INFINITE. */
+		int ret;
+		struct pollfd fds;
+
+		fds.fd = dev->device_handle;
+		fds.events = POLLIN;
+		fds.revents = 0;
+		ret = poll(&fds, 1, milliseconds);
+		if (ret == -1 || ret == 0)
+			/* Error or timeout */
+			return ret;
+	}
+
+	bytes_read = read(dev->device_handle, data, length);
+	if (bytes_read < 0 && errno == EAGAIN)
+		bytes_read = 0;
+	
+	if (bytes_read >= 0 &&
+	    kernel_version < KERNEL_VERSION(2,6,34) &&
+	    dev->uses_numbered_reports) {
+		/* Work around a kernel bug. Chop off the first byte. */
+		memmove(data, data+1, bytes_read);
+		bytes_read--;
+	}
+
+	return bytes_read;
+}
+
+int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length)
+{
+	return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0);
+}
+
+int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock)
+{
+	int flags, res;
+
+	flags = fcntl(dev->device_handle, F_GETFL, 0);
+	if (flags >= 0) {
+		if (nonblock)
+			res = fcntl(dev->device_handle, F_SETFL, flags | O_NONBLOCK);
+		else
+			res = fcntl(dev->device_handle, F_SETFL, flags & ~O_NONBLOCK);
+	}
+	else
+		return -1;
+
+	if (res < 0) {
+		return -1;
+	}
+	else {
+		dev->blocking = !nonblock;
+		return 0; /* Success */
+	}
+}
+
+
+int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)
+{
+	int res;
+
+	res = ioctl(dev->device_handle, HIDIOCSFEATURE(length), data);
+	if (res < 0)
+		perror("ioctl (SFEATURE)");
+
+	return res;
+}
+
+int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)
+{
+	int res;
+
+	res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data);
+	if (res < 0)
+		perror("ioctl (GFEATURE)");
+
+
+	return res;
+}
+
+
+void HID_API_EXPORT hid_close(hid_device *dev)
+{
+	if (!dev)
+		return;
+	close(dev->device_handle);
+	free(dev);
+}
+
+
+int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return get_device_string(dev, DEVICE_STRING_MANUFACTURER, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return get_device_string(dev, DEVICE_STRING_PRODUCT, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return get_device_string(dev, DEVICE_STRING_SERIAL, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)
+{
+	return -1;
+}
+
+
+HID_API_EXPORT const wchar_t * HID_API_CALL  hid_error(hid_device *dev)
+{
+	return NULL;
+}
diff --git a/target-platform/com.codeminders.hidapi/src/mac/Makefile b/target-platform/com.codeminders.hidapi/src/mac/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..c24e9bb5abcefaa1d2b6f6541b55fe281411e8f8
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/mac/Makefile
@@ -0,0 +1,47 @@
+###########################################
+# Simple Makefile for HIDAPI test program
+#
+# Alan Ott
+# Signal 11 Software
+# 2010-07-03
+###########################################
+
+#ARCHFLAGS=-m32
+
+JNIOBJS=HIDManager.o HIDDeviceInfo.o HIDDevice.o hid-java.o
+JNIINCLUDES=-I.. -I../jni-impl -I/System/Library/Frameworks/JavaVM.framework/Headers 
+JNILIBS=-l iconv
+JNISHAREDLIB=libhidapi-jni.jnilib
+JNISHAREDLIBVER=1.0
+
+CC=gcc
+CXX=g++
+COBJS=hid.o
+CPPOBJS=../hidtest/hidtest.o
+#OBJS=$(COBJS) $(CPPOBJS) $(JNIOBJS)
+OBJS=$(COBJS) $(JNIOBJS)
+CFLAGS+=$(ARCHFLAGS) -I../hidapi -g -c $(JNIINCLUDES)
+LIBS=-framework IOKit -framework CoreFoundation $(JNILIBS)
+
+#all: hidtest $(JNISHAREDLIB)
+all: $(JNISHAREDLIB)
+
+$(JNISHAREDLIB): $(OBJS)
+	$(CXX) $(ARCHFLAGS) -dynamiclib -current_version $(JNISHAREDLIBVER) $(COBJS) $(JNIOBJS) $(LIBS) -o $(JNISHAREDLIB)
+
+#hidtest: $(OBJS)
+#	$(CXX) $(ARCHFLAGS) -g $^ $(LIBS) -o hidtest
+
+%.o: ../jni-impl/%.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+$(COBJS): %.o: %.c
+	$(CC) $(CFLAGS) $< -o $@
+
+$(CPPOBJS): %.o: %.cpp
+	$(CXX) $(CFLAGS) $< -o $@
+
+clean:
+	rm -f *.o hidtest $(CPPOBJS) $(JNISHAREDLIB)
+
+.PHONY: clean
diff --git a/target-platform/com.codeminders.hidapi/src/mac/hid.c b/target-platform/com.codeminders.hidapi/src/mac/hid.c
new file mode 100755
index 0000000000000000000000000000000000000000..3a6200f7b59abcb81e552b5f18730636212d40f1
--- /dev/null
+++ b/target-platform/com.codeminders.hidapi/src/mac/hid.c
@@ -0,0 +1,1152 @@
+/*******************************************************
+ HIDAPI - Multi-Platform library for
+ communication with HID devices.
+ 
+ Alan Ott
+ Signal 11 Software
+
+ 2010-07-03
+
+ Copyright 2010, All Rights Reserved.
+ 
+ At the discretion of the user of this library,
+ this software may be licensed under the terms of the
+ GNU Public License v3, a BSD-Style license, or the
+ original HIDAPI license as outlined in the LICENSE.txt,
+ LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
+ files located at the root of the source distribution.
+ These files may also be found in the public source
+ code repository located at:
+        http://github.com/signal11/hidapi .
+********************************************************/
+
+/* See Apple Technical Note TN2187 for details on IOHidManager. */
+
+#include <IOKit/hid/IOHIDManager.h>
+#include <IOKit/hid/IOHIDKeys.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <wchar.h>
+#include <locale.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include "hidapi.h"
+
+/* Barrier implementation because Mac OSX doesn't have pthread_barrier.
+   It also doesn't have clock_gettime(). So much for POSIX and SUSv2.
+   This implementation came from Brent Priddy and was posted on
+   StackOverflow. It is used with his permission. */
+typedef int pthread_barrierattr_t;
+typedef struct pthread_barrier {
+    pthread_mutex_t mutex;
+    pthread_cond_t cond;
+    int count;
+    int trip_count;
+} pthread_barrier_t;
+
+static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count)
+{
+	if(count == 0) {
+		errno = EINVAL;
+		return -1;
+	}
+	
+	if(pthread_mutex_init(&barrier->mutex, 0) < 0) {
+		return -1;
+	}
+	if(pthread_cond_init(&barrier->cond, 0) < 0) {
+		pthread_mutex_destroy(&barrier->mutex);
+		return -1;
+	}
+	barrier->trip_count = count;
+	barrier->count = 0;
+
+	return 0;
+}
+
+static int pthread_barrier_destroy(pthread_barrier_t *barrier)
+{
+	pthread_cond_destroy(&barrier->cond);
+	pthread_mutex_destroy(&barrier->mutex);
+	return 0;
+}
+
+static int pthread_barrier_wait(pthread_barrier_t *barrier)
+{
+	pthread_mutex_lock(&barrier->mutex);
+	++(barrier->count);
+	if(barrier->count >= barrier->trip_count)
+	{
+		barrier->count = 0;
+		pthread_cond_broadcast(&barrier->cond);
+		pthread_mutex_unlock(&barrier->mutex);
+		return 1;
+	}
+	else
+	{
+		pthread_cond_wait(&barrier->cond, &(barrier->mutex));
+		pthread_mutex_unlock(&barrier->mutex);
+		return 0;
+	}
+}
+
+static int return_data(hid_device *dev, unsigned char *data, size_t length);
+
+/* Linked List of input reports received from the device. */
+struct input_report {
+	uint8_t *data;
+	size_t len;
+	struct input_report *next;
+};
+
+struct hid_device_ {
+	IOHIDDeviceRef device_handle;
+	int blocking;
+	int uses_numbered_reports;
+	int disconnected;
+	CFStringRef run_loop_mode;
+	CFRunLoopRef run_loop;
+	CFRunLoopSourceRef source;
+	uint8_t *input_report_buf;
+	CFIndex max_input_report_len;
+	struct input_report *input_reports;
+
+	pthread_t thread;
+	pthread_mutex_t mutex; /* Protects input_reports */
+	pthread_cond_t condition;
+	pthread_barrier_t barrier; /* Ensures correct startup sequence */
+	pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */
+	int shutdown_thread;
+	
+	hid_device *next;
+};
+
+/* Static list of all the devices open. This way when a device gets
+   disconnected, its hid_device structure can be marked as disconnected
+   from hid_device_removal_callback(). */
+static hid_device *device_list = NULL;
+static pthread_mutex_t device_list_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static hid_device *new_hid_device(void)
+{
+	hid_device *dev = calloc(1, sizeof(hid_device));
+	dev->device_handle = NULL;
+	dev->blocking = 1;
+	dev->uses_numbered_reports = 0;
+	dev->disconnected = 0;
+	dev->run_loop_mode = NULL;
+	dev->run_loop = NULL;
+	dev->source = NULL;
+	dev->input_report_buf = NULL;
+	dev->input_reports = NULL;
+	dev->shutdown_thread = 0;
+	dev->next = NULL;
+
+	/* Thread objects */
+	pthread_mutex_init(&dev->mutex, NULL);
+	pthread_cond_init(&dev->condition, NULL);
+	pthread_barrier_init(&dev->barrier, NULL, 2);
+	pthread_barrier_init(&dev->shutdown_barrier, NULL, 2);
+	
+	/* Add the new record to the device_list. */
+	pthread_mutex_lock(&device_list_mutex);
+	if (!device_list)
+		device_list = dev;
+	else {
+		hid_device *d = device_list;
+		while (d) {
+			if (!d->next) {
+				d->next = dev;
+				break;
+			}
+			d = d->next;
+		}
+	}
+	pthread_mutex_unlock(&device_list_mutex);
+	
+	return dev;
+}
+
+static void free_hid_device(hid_device *dev)
+{
+	if (!dev)
+		return;
+	
+	/* Delete any input reports still left over. */
+	struct input_report *rpt = dev->input_reports;
+	while (rpt) {
+		struct input_report *next = rpt->next;
+		free(rpt->data);
+		free(rpt);
+		rpt = next;
+	}
+
+	/* Free the string and the report buffer. The check for NULL
+	   is necessary here as CFRelease() doesn't handle NULL like
+	   free() and others do. */
+	if (dev->run_loop_mode)
+		CFRelease(dev->run_loop_mode);
+	if (dev->source)
+		CFRelease(dev->source);
+	free(dev->input_report_buf);
+
+	/* Clean up the thread objects */
+	pthread_barrier_destroy(&dev->shutdown_barrier);
+	pthread_barrier_destroy(&dev->barrier);
+	pthread_cond_destroy(&dev->condition);
+	pthread_mutex_destroy(&dev->mutex);
+
+	/* Remove it from the device list. */
+	pthread_mutex_lock(&device_list_mutex);
+	hid_device *d = device_list;
+	if (d == dev) {
+		device_list = d->next;
+	}
+	else {
+		while (d) {
+			if (d->next == dev) {
+				d->next = d->next->next;
+				break;
+			}
+			
+			d = d->next;
+		}
+	}
+	pthread_mutex_unlock(&device_list_mutex);
+
+	/* Free the structure itself. */
+	free(dev);
+}
+
+static 	IOHIDManagerRef hid_mgr = 0x0;
+
+
+#if 0
+static void register_error(hid_device *device, const char *op)
+{
+
+}
+#endif
+
+
+static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key)
+{
+	CFTypeRef ref;
+	int32_t value;
+	
+	ref = IOHIDDeviceGetProperty(device, key);
+	if (ref) {
+		if (CFGetTypeID(ref) == CFNumberGetTypeID()) {
+			CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value);
+			return value;
+		}
+	}
+	return 0;
+}
+
+static unsigned short get_vendor_id(IOHIDDeviceRef device)
+{
+	return get_int_property(device, CFSTR(kIOHIDVendorIDKey));
+}
+
+static unsigned short get_product_id(IOHIDDeviceRef device)
+{
+	return get_int_property(device, CFSTR(kIOHIDProductIDKey));
+}
+
+
+static int32_t get_max_report_length(IOHIDDeviceRef device)
+{
+	return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey));
+}
+
+static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len)
+{
+	CFStringRef str;
+	
+	if (!len)
+		return 0;
+
+	str = IOHIDDeviceGetProperty(device, prop);
+
+	buf[0] = 0;
+
+	if (str) {
+		len --;
+
+		CFIndex str_len = CFStringGetLength(str);
+		CFRange range;
+		range.location = 0;
+		range.length = (str_len > len)? len: str_len;
+		CFIndex used_buf_len;
+		CFIndex chars_copied;
+		chars_copied = CFStringGetBytes(str,
+			range,
+			kCFStringEncodingUTF32LE,
+			(char)'?',
+			FALSE,
+			(UInt8*)buf,
+			len,
+			&used_buf_len);
+
+		buf[chars_copied] = 0;
+		return 0;
+	}
+	else
+		return -1;
+		
+}
+
+static int get_string_property_utf8(IOHIDDeviceRef device, CFStringRef prop, char *buf, size_t len)
+{
+	CFStringRef str;
+	if (!len)
+		return 0;
+
+	str = IOHIDDeviceGetProperty(device, prop);
+
+	buf[0] = 0;
+
+	if (str) {
+		len--;
+
+		CFIndex str_len = CFStringGetLength(str);
+		CFRange range;
+		range.location = 0;
+		range.length = (str_len > len)? len: str_len;
+		CFIndex used_buf_len;
+		CFIndex chars_copied;
+		chars_copied = CFStringGetBytes(str,
+			range,
+			kCFStringEncodingUTF8,
+			(char)'?',
+			FALSE,
+			(UInt8*)buf,
+			len,
+			&used_buf_len);
+
+		buf[chars_copied] = 0;
+		return used_buf_len;
+	}
+	else
+		return 0;
+}
+
+
+static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len)
+{
+	return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len);
+}
+
+static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len)
+{
+	return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len);
+}
+
+static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len)
+{
+	return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len);
+}
+
+
+/* Implementation of wcsdup() for Mac. */
+static wchar_t *dup_wcs(const wchar_t *s)
+{
+	size_t len = wcslen(s);
+	wchar_t *ret = malloc((len+1)*sizeof(wchar_t));
+	wcscpy(ret, s);
+
+	return ret;
+}
+
+
+static int make_path(IOHIDDeviceRef device, char *buf, size_t len)
+{
+	int res;
+	unsigned short vid, pid;
+	char transport[32];
+
+	buf[0] = '\0';
+
+	res = get_string_property_utf8(
+		device, CFSTR(kIOHIDTransportKey),
+		transport, sizeof(transport));
+	
+	if (!res)
+		return -1;
+
+	vid = get_vendor_id(device);
+	pid = get_product_id(device);
+
+	res = snprintf(buf, len, "%s_%04hx_%04hx_%p",
+	                   transport, vid, pid, device);
+	
+	
+	buf[len-1] = '\0';
+	return res+1;
+}
+
+/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */
+static int init_hid_manager(void)
+{
+	IOReturn res;
+	
+	/* Initialize all the HID Manager Objects */
+	hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
+	if (hid_mgr) {
+		IOHIDManagerSetDeviceMatching(hid_mgr, NULL);
+		IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+		return 0;
+	}
+	
+	return -1;
+}
+
+/* Initialize the IOHIDManager if necessary. This is the public function, and
+   it is safe to call this function repeatedly. Return 0 for success and -1
+   for failure. */
+int HID_API_EXPORT hid_init(void)
+{
+	if (!hid_mgr) {
+		return init_hid_manager();
+	}
+
+	/* Already initialized. */
+	return 0;
+}
+
+int HID_API_EXPORT hid_exit(void)
+{
+	if (hid_mgr) {
+		/* Close the HID manager. */
+		IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone);
+		CFRelease(hid_mgr);
+		hid_mgr = NULL;
+	}
+		
+	return 0;
+}
+
+static void process_pending_events() {
+	SInt32 res;
+	do {
+		res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE);
+	} while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut);
+}
+
+struct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id)
+{
+	struct hid_device_info *root = NULL; // return object
+	struct hid_device_info *cur_dev = NULL;
+	CFIndex num_devices;
+	int i;
+	
+	/* Set up the HID Manager if it hasn't been done */
+	if (hid_init() < 0)
+		return NULL;
+	
+	/* give the IOHIDManager a chance to update itself */
+	process_pending_events();
+
+	/* Get a list of the Devices */
+	CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);
+
+	/* Convert the list into a C array so we can iterate easily. */	
+	num_devices = CFSetGetCount(device_set);
+	IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef));
+	CFSetGetValues(device_set, (const void **) device_array);
+
+	/* Iterate over each device, making an entry for it. */	
+	for (i = 0; i < num_devices; i++) {
+		unsigned short dev_vid;
+		unsigned short dev_pid;
+		#define BUF_LEN 256
+		wchar_t buf[BUF_LEN];
+		char cbuf[BUF_LEN];
+
+		IOHIDDeviceRef dev = device_array[i];
+
+        if (!dev) {
+            continue;
+        }
+		dev_vid = get_vendor_id(dev);
+		dev_pid = get_product_id(dev);
+
+		/* Check the VID/PID against the arguments */
+		if ((vendor_id == 0x0 && product_id == 0x0) ||
+		    (vendor_id == dev_vid && product_id == dev_pid)) {
+			struct hid_device_info *tmp;
+			size_t len;
+
+		    	/* VID/PID match. Create the record. */
+			tmp = malloc(sizeof(struct hid_device_info));
+			if (cur_dev) {
+				cur_dev->next = tmp;
+			}
+			else {
+				root = tmp;
+			}
+			cur_dev = tmp;
+
+			// Get the Usage Page and Usage for this device.
+			cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey));
+			cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey));
+
+			/* Fill out the record */
+			cur_dev->next = NULL;
+			len = make_path(dev, cbuf, sizeof(cbuf));
+			cur_dev->path = strdup(cbuf);
+
+			/* Serial Number */
+			get_serial_number(dev, buf, BUF_LEN);
+			cur_dev->serial_number = dup_wcs(buf);
+
+			/* Manufacturer and Product strings */
+			get_manufacturer_string(dev, buf, BUF_LEN);
+			cur_dev->manufacturer_string = dup_wcs(buf);
+			get_product_string(dev, buf, BUF_LEN);
+			cur_dev->product_string = dup_wcs(buf);
+			
+			/* VID/PID */
+			cur_dev->vendor_id = dev_vid;
+			cur_dev->product_id = dev_pid;
+
+			/* Release Number */
+			cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey));
+
+			/* Interface Number (Unsupported on Mac)*/
+			cur_dev->interface_number = -1;
+		}
+	}
+	
+	free(device_array);
+	CFRelease(device_set);
+	
+	return root;
+}
+
+void  HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs)
+{
+	/* This function is identical to the Linux version. Platform independent. */
+	struct hid_device_info *d = devs;
+	while (d) {
+		struct hid_device_info *next = d->next;
+		free(d->path);
+		free(d->serial_number);
+		free(d->manufacturer_string);
+		free(d->product_string);
+		free(d);
+		d = next;
+	}
+}
+
+hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)
+{
+	/* This function is identical to the Linux version. Platform independent. */
+	struct hid_device_info *devs, *cur_dev;
+	const char *path_to_open = NULL;
+	hid_device * handle = NULL;
+	
+	devs = hid_enumerate(vendor_id, product_id);
+	cur_dev = devs;
+	while (cur_dev) {
+		if (cur_dev->vendor_id == vendor_id &&
+		    cur_dev->product_id == product_id) {
+			if (serial_number) {
+				if (wcscmp(serial_number, cur_dev->serial_number) == 0) {
+					path_to_open = cur_dev->path;
+					break;
+				}
+			}
+			else {
+				path_to_open = cur_dev->path;
+				break;
+			}
+		}
+		cur_dev = cur_dev->next;
+	}
+
+	if (path_to_open) {
+		/* Open the device */
+		handle = hid_open_path(path_to_open);
+	}
+
+	hid_free_enumeration(devs);
+	
+	return handle;
+}
+
+static void hid_device_removal_callback(void *context, IOReturn result,
+                                        void *sender, IOHIDDeviceRef dev_ref)
+{
+	/* Stop the Run Loop for this device. */
+	pthread_mutex_lock(&device_list_mutex);
+	hid_device *d = device_list;
+	while (d) {
+		if (d->device_handle == dev_ref) {
+			d->disconnected = 1;
+			CFRunLoopStop(d->run_loop);
+		}
+		
+		d = d->next;
+	}
+	pthread_mutex_unlock(&device_list_mutex);
+}
+
+/* The Run Loop calls this function for each input report received.
+   This function puts the data into a linked list to be picked up by
+   hid_read(). */
+static void hid_report_callback(void *context, IOReturn result, void *sender,
+                         IOHIDReportType report_type, uint32_t report_id,
+                         uint8_t *report, CFIndex report_length)
+{
+	struct input_report *rpt;
+	hid_device *dev = context;
+
+	/* Make a new Input Report object */
+	rpt = calloc(1, sizeof(struct input_report));
+	rpt->data = calloc(1, report_length);
+	memcpy(rpt->data, report, report_length);
+	rpt->len = report_length;
+	rpt->next = NULL;
+
+	/* Lock this section */
+	pthread_mutex_lock(&dev->mutex);
+	
+	/* Attach the new report object to the end of the list. */
+	if (dev->input_reports == NULL) {
+		/* The list is empty. Put it at the root. */
+		dev->input_reports = rpt;
+	}
+	else {
+		/* Find the end of the list and attach. */
+		struct input_report *cur = dev->input_reports;
+		int num_queued = 0;
+		while (cur->next != NULL) {
+			cur = cur->next;
+			num_queued++;
+		}
+		cur->next = rpt;
+
+		/* Pop one off if we've reached 30 in the queue. This
+		   way we don't grow forever if the user never reads
+		   anything from the device. */
+		if (num_queued > 30) {
+			return_data(dev, NULL, 0);
+		}
+	}
+
+	/* Signal a waiting thread that there is data. */
+	pthread_cond_signal(&dev->condition);
+
+	/* Unlock */
+	pthread_mutex_unlock(&dev->mutex);
+
+}
+
+/* This gets called when the read_thred's run loop gets signaled by
+   hid_close(), and serves to stop the read_thread's run loop. */
+static void perform_signal_callback(void *context)
+{
+	hid_device *dev = context;
+	CFRunLoopStop(dev->run_loop); //TODO: CFRunLoopGetCurrent()
+}
+
+static void *read_thread(void *param)
+{
+	hid_device *dev = param;
+	
+	/* Move the device's run loop to this thread. */
+	IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode);
+
+	/* Create the RunLoopSource which is used to signal the
+	   event loop to stop when hid_close() is called. */
+	CFRunLoopSourceContext ctx;
+	memset(&ctx, 0, sizeof(ctx));
+	ctx.version = 0;
+	ctx.info = dev;
+	ctx.perform = &perform_signal_callback;
+	dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx);
+	CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode);
+	
+	/* Store off the Run Loop so it can be stopped from hid_close()
+	   and on device disconnection. */
+	dev->run_loop = CFRunLoopGetCurrent();
+
+	/* Notify the main thread that the read thread is up and running. */
+	pthread_barrier_wait(&dev->barrier);
+
+	/* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input
+	   reports into the hid_report_callback(). */
+	SInt32 code;
+	while (!dev->shutdown_thread && !dev->disconnected) {
+		code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE);
+		/* Return if the device has been disconnected */
+		if (code == kCFRunLoopRunFinished) {
+			dev->disconnected = 1;
+			break;
+		}
+
+
+		/* Break if The Run Loop returns Finished or Stopped. */
+		if (code != kCFRunLoopRunTimedOut &&
+		    code != kCFRunLoopRunHandledSource) {
+			/* There was some kind of error. Setting
+			   shutdown seems to make sense, but
+			   there may be something else more appropriate */
+			dev->shutdown_thread = 1;
+			break;
+		}
+	}
+
+	/* Now that the read thread is stopping, Wake any threads which are
+	   waiting on data (in hid_read_timeout()). Do this under a mutex to
+	   make sure that a thread which is about to go to sleep waiting on
+	   the condition acutally will go to sleep before the condition is
+	   signaled. */
+	pthread_mutex_lock(&dev->mutex);
+	pthread_cond_broadcast(&dev->condition);
+	pthread_mutex_unlock(&dev->mutex);
+
+	/* Wait here until hid_close() is called and makes it past
+	   the call to CFRunLoopWakeUp(). This thread still needs to
+	   be valid when that function is called on the other thread. */
+	pthread_barrier_wait(&dev->shutdown_barrier);
+
+	return NULL;
+}
+
+hid_device * HID_API_EXPORT hid_open_path(const char *path)
+{
+  	int i;
+	hid_device *dev = NULL;
+	CFIndex num_devices;
+	
+	dev = new_hid_device();
+
+	/* Set up the HID Manager if it hasn't been done */
+	if (hid_init() < 0)
+		return NULL;
+
+	/* give the IOHIDManager a chance to update itself */
+	process_pending_events();
+
+	CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);
+	
+	num_devices = CFSetGetCount(device_set);
+	IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef));
+	CFSetGetValues(device_set, (const void **) device_array);	
+	for (i = 0; i < num_devices; i++) {
+		char cbuf[BUF_LEN];
+		size_t len;
+		IOHIDDeviceRef os_dev = device_array[i];
+		
+		len = make_path(os_dev, cbuf, sizeof(cbuf));
+		if (!strcmp(cbuf, path)) {
+			// Matched Paths. Open this Device.
+			IOReturn ret = IOHIDDeviceOpen(os_dev, kIOHIDOptionsTypeNone);
+			if (ret == kIOReturnSuccess) {
+				char str[32];
+
+				free(device_array);
+				CFRetain(os_dev);
+				CFRelease(device_set);
+				dev->device_handle = os_dev;
+				
+				/* Create the buffers for receiving data */
+				dev->max_input_report_len = (CFIndex) get_max_report_length(os_dev);
+				dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t));
+				
+				/* Create the Run Loop Mode for this device.
+				   printing the reference seems to work. */
+				sprintf(str, "HIDAPI_%p", os_dev);
+				dev->run_loop_mode = 
+					CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII);
+				
+				/* Attach the device to a Run Loop */
+				IOHIDDeviceRegisterInputReportCallback(
+					os_dev, dev->input_report_buf, dev->max_input_report_len,
+					&hid_report_callback, dev);
+				IOHIDManagerRegisterDeviceRemovalCallback(hid_mgr, hid_device_removal_callback, NULL);
+				
+				/* Start the read thread */
+				pthread_create(&dev->thread, NULL, read_thread, dev);
+
+				/* Wait here for the read thread to be initialized. */
+				pthread_barrier_wait(&dev->barrier);
+				
+				return dev;
+			}
+			else {
+				goto return_error;
+			}
+		}
+	}
+
+return_error:
+	free(device_array);
+	CFRelease(device_set);
+	free_hid_device(dev);
+	return NULL;
+}
+
+static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length)
+{
+	const unsigned char *data_to_send;
+	size_t length_to_send;
+	IOReturn res;
+
+	/* Return if the device has been disconnected. */
+   	if (dev->disconnected)
+   		return -1;
+
+	if (data[0] == 0x0) {
+		/* Not using numbered Reports.
+		   Don't send the report number. */
+		data_to_send = data+1;
+		length_to_send = length-1;
+	}
+	else {
+		/* Using numbered Reports.
+		   Send the Report Number */
+		data_to_send = data;
+		length_to_send = length;
+	}
+	
+	if (!dev->disconnected) {
+		res = IOHIDDeviceSetReport(dev->device_handle,
+					   type,
+					   data[0], /* Report ID*/
+					   data_to_send, length_to_send);
+	
+		if (res == kIOReturnSuccess) {
+			return length;
+		}
+		else
+			return -1;
+	}
+	
+	return -1;
+}
+
+int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length)
+{
+	return set_report(dev, kIOHIDReportTypeOutput, data, length);
+}
+
+/* Helper function, so that this isn't duplicated in hid_read(). */
+static int return_data(hid_device *dev, unsigned char *data, size_t length)
+{
+	/* Copy the data out of the linked list item (rpt) into the
+	   return buffer (data), and delete the liked list item. */
+	struct input_report *rpt = dev->input_reports;
+	size_t len = (length < rpt->len)? length: rpt->len;
+	memcpy(data, rpt->data, len);
+	dev->input_reports = rpt->next;
+	free(rpt->data);
+	free(rpt);
+	return len;
+}
+
+static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+	while (!dev->input_reports) {
+		int res = pthread_cond_wait(cond, mutex);
+		if (res != 0)
+			return res;
+
+		/* A res of 0 means we may have been signaled or it may
+		   be a spurious wakeup. Check to see that there's acutally
+		   data in the queue before returning, and if not, go back
+		   to sleep. See the pthread_cond_timedwait() man page for
+		   details. */
+		
+		if (dev->shutdown_thread || dev->disconnected)
+			return -1;
+	}
+	
+	return 0;
+}
+
+static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
+{
+	while (!dev->input_reports) {
+		int res = pthread_cond_timedwait(cond, mutex, abstime);
+		if (res != 0)
+			return res;
+
+		/* A res of 0 means we may have been signaled or it may
+		   be a spurious wakeup. Check to see that there's acutally
+		   data in the queue before returning, and if not, go back
+		   to sleep. See the pthread_cond_timedwait() man page for
+		   details. */
+		
+		if (dev->shutdown_thread || dev->disconnected)
+			return -1;
+	}
+	
+	return 0;
+
+}
+
+int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)
+{
+	int bytes_read = -1;
+
+	/* Lock the access to the report list. */
+	pthread_mutex_lock(&dev->mutex);
+	
+	/* There's an input report queued up. Return it. */
+	if (dev->input_reports) {
+		/* Return the first one */
+		bytes_read = return_data(dev, data, length);
+		goto ret;
+	}
+
+	/* Return if the device has been disconnected. */
+	if (dev->disconnected) {
+		bytes_read = -1;
+		goto ret;
+	}
+	
+	if (dev->shutdown_thread) {
+		/* This means the device has been closed (or there
+		   has been an error. An error code of -1 should
+		   be returned. */
+		bytes_read = -1;
+		goto ret;
+	}
+
+	/* There is no data. Go to sleep and wait for data. */
+	
+	if (milliseconds == -1) {
+		/* Blocking */
+		int res;
+		res = cond_wait(dev, &dev->condition, &dev->mutex);
+		if (res == 0)
+			bytes_read = return_data(dev, data, length);
+		else {
+			/* There was an error, or a device disconnection. */
+			bytes_read = -1;
+		}
+	}
+	else if (milliseconds > 0) {
+		/* Non-blocking, but called with timeout. */
+		int res;
+		struct timespec ts;
+		struct timeval tv;
+		gettimeofday(&tv, NULL);
+		TIMEVAL_TO_TIMESPEC(&tv, &ts);
+		ts.tv_sec += milliseconds / 1000;
+		ts.tv_nsec += (milliseconds % 1000) * 1000000;
+		if (ts.tv_nsec >= 1000000000L) {
+			ts.tv_sec++;
+			ts.tv_nsec -= 1000000000L;
+		}
+		
+		res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts);
+		if (res == 0)
+			bytes_read = return_data(dev, data, length);
+		else if (res == ETIMEDOUT)
+			bytes_read = 0;
+		else
+			bytes_read = -1;
+	}
+	else {
+		/* Purely non-blocking */
+		bytes_read = 0;
+	}
+
+ret:
+	/* Unlock */
+	pthread_mutex_unlock(&dev->mutex);
+	return bytes_read;
+}
+
+int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length)
+{
+	return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0);
+}
+
+int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock)
+{
+	/* All Nonblocking operation is handled by the library. */
+	dev->blocking = !nonblock;
+	
+	return 0;
+}
+
+int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)
+{
+	return set_report(dev, kIOHIDReportTypeFeature, data, length);
+}
+
+int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)
+{
+	CFIndex len = length;
+	IOReturn res;
+
+	/* Return if the device has been unplugged. */
+	if (dev->disconnected)
+		return -1;
+
+	res = IOHIDDeviceGetReport(dev->device_handle,
+	                           kIOHIDReportTypeFeature,
+	                           data[0], /* Report ID */
+	                           data, &len);
+	if (res == kIOReturnSuccess)
+		return len;
+	else
+		return -1;
+}
+
+
+void HID_API_EXPORT hid_close(hid_device *dev)
+{
+	if (!dev)
+		return;
+
+	/* Disconnect the report callback before close. */
+	if (!dev->disconnected) {
+		IOHIDDeviceRegisterInputReportCallback(
+			dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
+			NULL, dev);
+		IOHIDManagerRegisterDeviceRemovalCallback(hid_mgr, NULL, dev);
+		IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode);
+		IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
+	}
+	
+	/* Cause read_thread() to stop. */
+	dev->shutdown_thread = 1;
+	
+	/* Wake up the run thread's event loop so that the thread can exit. */
+	CFRunLoopSourceSignal(dev->source);
+	CFRunLoopWakeUp(dev->run_loop);
+	
+	/* Notify the read thread that it can shut down now. */
+	pthread_barrier_wait(&dev->shutdown_barrier);
+
+	/* Wait for read_thread() to end. */
+	pthread_join(dev->thread, NULL);
+
+	/* Close the OS handle to the device, but only if it's not
+	   been unplugged. If it's been unplugged, then calling
+	   IOHIDDeviceClose() will crash. */
+	if (!dev->disconnected) {
+		IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
+	}
+	
+	/* Clear out the queue of received reports. */
+	pthread_mutex_lock(&dev->mutex);
+	while (dev->input_reports) {
+		return_data(dev, NULL, 0);
+	}
+	pthread_mutex_unlock(&dev->mutex);
+	CFRelease(dev->device_handle);
+
+	free_hid_device(dev);
+}
+
+int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return get_manufacturer_string(dev->device_handle, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return get_product_string(dev->device_handle, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)
+{
+	return get_serial_number(dev->device_handle, string, maxlen);
+}
+
+int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)
+{
+	// TODO:
+
+	return 0;
+}
+
+
+HID_API_EXPORT const wchar_t * HID_API_CALL  hid_error(hid_device *dev)
+{
+	// TODO:
+
+	return NULL;
+}
+
+
+
+
+
+
+#if 0
+static int32_t get_location_id(IOHIDDeviceRef device)
+{
+	return get_int_property(device, CFSTR(kIOHIDLocationIDKey));
+}
+
+static int32_t get_usage(IOHIDDeviceRef device)
+{
+	int32_t res;
+	res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey));
+	if (!res)
+		res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey));
+	return res;
+}
+
+static int32_t get_usage_page(IOHIDDeviceRef device)
+{
+	int32_t res;
+	res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey));
+	if (!res)
+		res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey));
+	return res;
+}
+
+static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len)
+{
+	return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len);
+}
+
+
+int main(void)
+{
+	IOHIDManagerRef mgr;
+	int i;
+	
+	mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
+	IOHIDManagerSetDeviceMatching(mgr, NULL);
+	IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone);
+	
+	CFSetRef device_set = IOHIDManagerCopyDevices(mgr);
+	
+	CFIndex num_devices = CFSetGetCount(device_set);
+	IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef));
+	CFSetGetValues(device_set, (const void **) device_array);
+	
+	for (i = 0; i < num_devices; i++) {
+		IOHIDDeviceRef dev = device_array[i];
+		printf("Device: %p\n", dev);
+		printf("  %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev));
+
+		wchar_t serial[256], buf[256];
+		char cbuf[256];
+		get_serial_number(dev, serial, 256);
+
+		
+		printf("  Serial: %ls\n", serial);
+		printf("  Loc: %ld\n", get_location_id(dev));
+		get_transport(dev, buf, 256);
+		printf("  Trans: %ls\n", buf);
+		make_path(dev, cbuf, 256);
+		printf("  Path: %s\n", cbuf);
+		
+	}
+	
+	return 0;
+}
+#endif
diff --git a/target-platform/javax.usb.api/about.html b/target-platform/javax.usb.api/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..654e9e3904984f6450d465c8da55623ed14204b9
--- /dev/null
+++ b/target-platform/javax.usb.api/about.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</p>
+		<p><em>
+		<strong>javax.usb.api-1.0.2.jar</strong> <br/><br/>
+		Common Public License 1.0
+		</em></p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/target-platform/javax.usb.api/about_files/cpl-v10.html b/target-platform/javax.usb.api/about_files/cpl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..186fbc80e099675a6f0532d213cb2255252e6fb7
--- /dev/null
+++ b/target-platform/javax.usb.api/about_files/cpl-v10.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Common Public License - v 1.0</TITLE>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
+
+
+<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
+
+<P><FONT SIZE="2"><B>Updated 16 Apr 2009</B></FONT>
+
+<P><FONT SIZE="2"><B>As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. 
+Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.</B></FONT>
+
+<P><B></B><FONT SIZE="3"></FONT>
+<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
+<P><FONT SIZE="2">"Contribution" means:</FONT>
+
+<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
+b) in the case of each subsequent Contributor:</FONT></UL>
+
+
+<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
+
+
+<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
+
+
+<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
+
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
+<P><FONT SIZE="2"><B></B></FONT>
+<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
+
+<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
+<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
+
+<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
+
+
+<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
+
+
+<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
+
+
+<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
+
+
+<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
+
+
+<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
+
+
+<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
+
+<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
+
+<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
+
+
+<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
+
+<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
+<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
+<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
+<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
+<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+
+</BODY>
+
+</HTML>
\ No newline at end of file
diff --git a/target-platform/javax.usb.api/build.properties b/target-platform/javax.usb.api/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5d90481fa3ba53065fa04d571792332b06cabf2f
--- /dev/null
+++ b/target-platform/javax.usb.api/build.properties
@@ -0,0 +1,5 @@
+source.. = src/main/java/,src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               src/main/lib/
diff --git a/target-platform/javax.usb.api/pom.xml b/target-platform/javax.usb.api/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..40a7ed2a2ad980b76f89b3c11226d38a4750706c
--- /dev/null
+++ b/target-platform/javax.usb.api/pom.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>target-platform</artifactId>
+    <version>0.7.0</version>
+  </parent>
+
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>javax.usb.api</artifactId>
+    <version>1.0.2</version>
+    <packaging>bundle</packaging>
+
+    <name>javax.usb API from javax-usb</name>
+    <description>javax.usb API from javax-usb</description>
+
+    <properties>
+        <maven.compiler.source>1.6</maven.compiler.source>
+        <maven.compiler.target>1.6</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>javax.usb</groupId>
+            <artifactId>javax.usb.api</artifactId>
+            <version>1.0.2</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/lib/javax.usb.api-1.0.2.jar</systemPath>
+        </dependency>
+
+        <!-- Test -->
+<!--
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-legacy</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-junit4</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+-->
+    </dependencies>
+
+
+    <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+      <resource>
+        <directory>.</directory>
+        <includes>
+          <include>plugin.xml</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>src/dependency</directory>
+      </resource>
+    </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+                <configuration>
+                    <systemPropertyVariables>
+                        <java.library.path>${project.basedir}/src/main/lib</java.library.path>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+		    <manifestLocation>META-INF</manifestLocation>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Name>${project.name}</Bundle-Name>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Embed-Dependency>
+                            javax.usb.api;groupId=javax.usb;artifactId=javax.usb.api;version=1.0.2;scope=runtime
+                        </Embed-Dependency>
+                        <Include-Resource>
+                            ${project.basedir}/src/main,
+                            ${project.basedir}/about.html,
+                            about_files=${project.basedir}/about_files/
+                        </Include-Resource>
+                        <Export-Package>
+                            javax.usb.*;version="1.0.2"
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            
+	    <plugin>
+        	<artifactId>maven-dependency-plugin</artifactId>
+        	<executions>
+        	  <execution>
+        	    <id>copy-dependencies</id>
+        	    <phase>package</phase>
+        	    <goals>
+        	      <goal>copy-dependencies</goal>
+        	    </goals>
+        	  </execution>
+        	</executions>
+	   </plugin>
+	   
+        </plugins>
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.apache.maven.plugins
+        								</groupId>
+        								<artifactId>
+        									maven-dependency-plugin
+        								</artifactId>
+        								<versionRange>
+        									[2.1,)
+        								</versionRange>
+        								<goals>
+        									<goal>
+        										copy-dependencies
+        									</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/target-platform/javax.usb.api/src/lib/javax.usb.api-1.0.2.jar b/target-platform/javax.usb.api/src/lib/javax.usb.api-1.0.2.jar
new file mode 100644
index 0000000000000000000000000000000000000000..bc0a56f0f0ef7fe6b45e46e91e606f6b4b345ab7
Binary files /dev/null and b/target-platform/javax.usb.api/src/lib/javax.usb.api-1.0.2.jar differ
diff --git a/target-platform/javax.usb.api/src/main/resources/touch.txt b/target-platform/javax.usb.api/src/main/resources/touch.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/target-platform/javax.usb.common/about.html b/target-platform/javax.usb.common/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..7b3944bcdeeb98631920e36f09158a81f4339bd8
--- /dev/null
+++ b/target-platform/javax.usb.common/about.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</p>
+		<p><em>
+		<strong>javax.usb.common-1.0.2.jar</strong> <br/><br/>
+		Common Public License 1.0
+		</em></p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/target-platform/javax.usb.common/about_files/cpl-v10.html b/target-platform/javax.usb.common/about_files/cpl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..186fbc80e099675a6f0532d213cb2255252e6fb7
--- /dev/null
+++ b/target-platform/javax.usb.common/about_files/cpl-v10.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Common Public License - v 1.0</TITLE>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
+
+
+<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
+
+<P><FONT SIZE="2"><B>Updated 16 Apr 2009</B></FONT>
+
+<P><FONT SIZE="2"><B>As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. 
+Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.</B></FONT>
+
+<P><B></B><FONT SIZE="3"></FONT>
+<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
+<P><FONT SIZE="2">"Contribution" means:</FONT>
+
+<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
+b) in the case of each subsequent Contributor:</FONT></UL>
+
+
+<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
+
+
+<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
+
+
+<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
+
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
+<P><FONT SIZE="2"><B></B></FONT>
+<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
+
+<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
+<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
+
+<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
+
+
+<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
+
+
+<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
+
+
+<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
+
+
+<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
+
+
+<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
+
+
+<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
+
+<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
+
+<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
+
+
+<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
+
+<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
+<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
+<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
+<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
+<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+
+</BODY>
+
+</HTML>
\ No newline at end of file
diff --git a/target-platform/javax.usb.common/build.properties b/target-platform/javax.usb.common/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5d90481fa3ba53065fa04d571792332b06cabf2f
--- /dev/null
+++ b/target-platform/javax.usb.common/build.properties
@@ -0,0 +1,5 @@
+source.. = src/main/java/,src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               src/main/lib/
diff --git a/target-platform/javax.usb.common/pom.xml b/target-platform/javax.usb.common/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e5751c85863e160e14760f49fb37a10a6dbd433a
--- /dev/null
+++ b/target-platform/javax.usb.common/pom.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>target-platform</artifactId>
+    <version>0.7.0</version>
+  </parent>
+
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>javax.usb.common</artifactId>
+    <version>1.0.2</version>
+    <packaging>bundle</packaging>
+
+    <name>javax.usb Common from javax-usb</name>
+    <description>javax.usb Common from javax-usb</description>
+
+
+    <properties>
+        <maven.compiler.source>1.6</maven.compiler.source>
+        <maven.compiler.target>1.6</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>javax.usb</groupId>
+            <artifactId>javax.usb.common</artifactId>
+            <version>1.0.2</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/lib/javax.usb.common-1.0.2.jar</systemPath>
+        </dependency>
+
+        <!-- Test -->
+<!--
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-legacy</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-junit4</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+-->
+    </dependencies>
+
+
+    <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+      <resource>
+        <directory>.</directory>
+        <includes>
+          <include>plugin.xml</include>
+        </includes>
+      </resource>
+    </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+                <configuration>
+                    <systemPropertyVariables>
+                        <java.library.path>${project.basedir}/src/main/lib</java.library.path>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+		    <manifestLocation>META-INF</manifestLocation>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Name>${project.name}</Bundle-Name>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Embed-Dependency>
+                            javax.usb.common;groupId=javax.usb;artifactId=javax.usb.common;version=1.0.2;scope=runtime
+                        </Embed-Dependency>
+                        <Include-Resource>
+                            ${project.basedir}/src/main,
+                            ${project.basedir}/about.html,
+                            about_files=${project.basedir}/about_files/
+                        </Include-Resource>
+                        <Export-Package>
+                            com.ibm.jusb.*;version="1.0.2"
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            
+	    <plugin>
+        	<artifactId>maven-dependency-plugin</artifactId>
+        	<executions>
+        	  <execution>
+        	    <id>copy-dependencies</id>
+        	    <phase>package</phase>
+        	    <goals>
+        	      <goal>copy-dependencies</goal>
+        	    </goals>
+        	  </execution>
+        	</executions>
+	   </plugin>
+	   
+        </plugins>
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.apache.maven.plugins
+        								</groupId>
+        								<artifactId>
+        									maven-dependency-plugin
+        								</artifactId>
+        								<versionRange>
+        									[2.1,)
+        								</versionRange>
+        								<goals>
+        									<goal>
+        										copy-dependencies
+        									</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/target-platform/javax.usb.common/src/lib/javax.usb.common-1.0.2.jar b/target-platform/javax.usb.common/src/lib/javax.usb.common-1.0.2.jar
new file mode 100644
index 0000000000000000000000000000000000000000..888b7ecf1276740d9b7a8a57085e48d78dcb1f05
Binary files /dev/null and b/target-platform/javax.usb.common/src/lib/javax.usb.common-1.0.2.jar differ
diff --git a/target-platform/javax.usb.common/src/main/resources/touch.txt b/target-platform/javax.usb.common/src/main/resources/touch.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/target-platform/javax.usb.linux/about.html b/target-platform/javax.usb.linux/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..00784996b1831748cfc8fc280de48a48de61af73
--- /dev/null
+++ b/target-platform/javax.usb.linux/about.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</p>
+		<p><em>
+		<strong>javax.usb.linux_1.0.3.jar</strong> <br/><br/>
+		Common Public License 1.0
+		</em></p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/target-platform/javax.usb.linux/about_files/cpl-v10.html b/target-platform/javax.usb.linux/about_files/cpl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..186fbc80e099675a6f0532d213cb2255252e6fb7
--- /dev/null
+++ b/target-platform/javax.usb.linux/about_files/cpl-v10.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Common Public License - v 1.0</TITLE>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
+
+
+<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
+
+<P><FONT SIZE="2"><B>Updated 16 Apr 2009</B></FONT>
+
+<P><FONT SIZE="2"><B>As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. 
+Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.</B></FONT>
+
+<P><B></B><FONT SIZE="3"></FONT>
+<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
+<P><FONT SIZE="2">"Contribution" means:</FONT>
+
+<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
+b) in the case of each subsequent Contributor:</FONT></UL>
+
+
+<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
+
+
+<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
+
+
+<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
+
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
+<P><FONT SIZE="2"><B></B></FONT>
+<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
+
+<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+
+<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
+
+
+<UL><FONT SIZE="2"></FONT></UL>
+
+<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
+<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
+
+<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
+
+
+<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
+
+
+<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
+
+
+<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
+
+
+<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
+
+
+<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
+
+
+<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
+
+<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
+
+<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
+
+
+<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
+
+<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
+<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
+<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
+<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
+<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
+<P><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
+<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
+<P><FONT SIZE="2"></FONT>
+
+</BODY>
+
+</HTML>
\ No newline at end of file
diff --git a/target-platform/javax.usb.linux/build.properties b/target-platform/javax.usb.linux/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5d90481fa3ba53065fa04d571792332b06cabf2f
--- /dev/null
+++ b/target-platform/javax.usb.linux/build.properties
@@ -0,0 +1,5 @@
+source.. = src/main/java/,src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               src/main/lib/
diff --git a/target-platform/javax.usb.linux/pom.xml b/target-platform/javax.usb.linux/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f7a42c1633bbae2434e506092accf9931c089ee6
--- /dev/null
+++ b/target-platform/javax.usb.linux/pom.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>target-platform</artifactId>
+    <version>0.7.0</version>
+  </parent>
+
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>javax.usb.linux</artifactId>
+    <version>1.0.3</version>
+    <packaging>bundle</packaging>
+
+    <name>javax.usb Linux implementation from javax-usb</name>
+    <description>javax.usb Linux implementation from javax-usb</description>
+
+    <properties>
+        <maven.compiler.source>1.6</maven.compiler.source>
+        <maven.compiler.target>1.6</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+<!--
+        <dependency>
+            <groupId>javax.usb</groupId>
+            <artifactId>javax.usb.linux</artifactId>
+            <version>1.0.3</version>
+        </dependency>
+-->
+
+        <!-- Test -->
+<!--
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-legacy</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-junit4</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+-->
+    </dependencies>
+
+
+    <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+      <resource>
+        <directory>.</directory>
+        <includes>
+          <include>plugin.xml</include>
+        </includes>
+      </resource>
+    </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+                <configuration>
+                    <systemPropertyVariables>
+                        <java.library.path>${project.basedir}/src/main/lib</java.library.path>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+		    <manifestLocation>META-INF</manifestLocation>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Name>${project.name}</Bundle-Name>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Embed-Dependency>
+                            javax.usb.linux;groupId=javax.usb;artifactId=javax.usb.linux;version=1.0.3;scope=runtime
+                        </Embed-Dependency>
+                        <Include-Resource>
+                            lib=${project.basedir}/src/main/lib,
+                            ${project.basedir}/about.html,
+                            about_files=${project.basedir}/about_files/
+                        </Include-Resource>
+                        <Bundle-NativeCode>
+                        	lib/linux/x86/libJavaxUsb.so; osname=Linux; processor=x86,
+				lib/linux/x86_64/libJavaxUsb.so; osname=Linux; processor=x86-64,
+                        	lib/linux/armv6_hf/libJavaxUsb.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv7_hf))",
+                        	lib/linux/armv5_sf/libJavaxUsb.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv7_sf))",
+                        	lib/linux/armv6_hf/libJavaxUsb.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv6_hf))",
+                        	lib/linux/armv5_sf/libJavaxUsb.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv6_sf))",
+                        	lib/linux/armv5_sf/libJavaxUsb.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv5_sf))"
+                        </Bundle-NativeCode>
+                        <Export-Package>
+                            com.ibm.jusb.os.linux.*;version="1.0.3"
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            
+	    <plugin>
+        	<artifactId>maven-dependency-plugin</artifactId>
+        	<executions>
+        	  <execution>
+        	    <id>copy-dependencies</id>
+        	    <phase>package</phase>
+        	    <goals>
+        	      <goal>copy-dependencies</goal>
+        	    </goals>
+        	  </execution>
+        	</executions>
+	   </plugin>
+	   
+        </plugins>
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.apache.maven.plugins
+        								</groupId>
+        								<artifactId>
+        									maven-dependency-plugin
+        								</artifactId>
+        								<versionRange>
+        									[2.1,)
+        								</versionRange>
+        								<goals>
+        									<goal>
+        										copy-dependencies
+        									</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsb.h b/target-platform/javax.usb.linux/src/main/c/JavaxUsb.h
new file mode 100644
index 0000000000000000000000000000000000000000..a93fa5dccbef18861cc4eca3c40e3b79378592a9
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsb.h
@@ -0,0 +1,289 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAXUSBUTIL_H
+#define _JAVAXUSBUTIL_H
+
+#include "com_ibm_jusb_os_linux_JavaxUsb.h"
+#include "JavaxUsbLog.h"
+#include "JavaxUsbChecks.h"
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/poll.h>
+#include <sys/time.h>
+#include <sys/dir.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <pthread.h>
+#include <errno.h>
+
+/* Need to include this last or gcc will give warnings */
+#include "JavaxUsbKernel.h"
+
+#define MAX_LINE_LENGTH 255
+#define MAX_KEY_LENGTH 255
+#define MAX_PATH_LENGTH 255
+
+#define MAX_POLLING_ERRORS 64
+
+/* These must match the defines in JavaxUsb.java */
+#define SPEED_UNKNOWN 0
+#define SPEED_LOW 1
+#define SPEED_FULL 2
+
+//******************************************************************************
+// Descriptor structs 
+
+struct jusb_device_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned short bcdUSB;
+	unsigned char bDeviceClass;
+	unsigned char bDeviceSubClass;
+	unsigned char bDeviceProtocol;
+	unsigned char bMaxPacketSize0;
+	unsigned short idVendor;
+	unsigned short idProduct;
+	unsigned short bcdDevice;
+	unsigned char iManufacturer;
+	unsigned char iProduct;
+	unsigned char iSerialNumber;
+	unsigned char bNumConfigurations;
+};
+
+struct jusb_config_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned short wTotalLength;
+	unsigned char bNumInterfaces;
+	unsigned char bConfigurationValue;
+	unsigned char iConfiguration;
+	unsigned char bmAttributes;
+	unsigned char bMaxPower;
+};
+
+struct jusb_interface_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned char bInterfaceNumber;
+	unsigned char bAlternateSetting;
+	unsigned char bNumEndpoints;
+	unsigned char bInterfaceClass;
+	unsigned char bInterfaceSubClass;
+	unsigned char bInterfaceProtocol;
+	unsigned char iInterface;
+};
+
+struct jusb_endpoint_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned char bEndpointAddress;
+	unsigned char bmAttributes;
+	unsigned short wMaxPacketSize;
+	unsigned char bInterval;
+};
+
+struct jusb_string_descriptor {
+	unsigned char bLength;
+	unsigned char bDescriptorType;
+	unsigned char bString[254];
+};
+
+//******************************************************************************
+// Request methods
+
+int pipe_request( JNIEnv *env, int fd, jobject linuxRequest );
+int isochronous_request( JNIEnv *env, int fd, jobject linuxRequest );
+
+void cancel_pipe_request( JNIEnv *env, int fd, jobject linuxRequest );
+void cancel_isochronous_request( JNIEnv *env, int fd, jobject linuxRequest );
+
+int complete_pipe_request( JNIEnv *env, jobject linuxRequest );
+int complete_isochronous_request( JNIEnv *env, jobject linuxRequest );
+
+int set_configuration( JNIEnv *env, int fd, jobject linuxRequest );
+int set_interface( JNIEnv *env, int fd, jobject linuxRequest );
+
+int claim_interface( JNIEnv *env, int fd, int claim, jobject linuxRequest );
+int is_claimed( JNIEnv *env, int fd, jobject linuxRequest );
+
+int control_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int bulk_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int interrupt_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int isochronous_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+
+int complete_control_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int complete_bulk_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int complete_interrupt_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+int complete_isochronous_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb );
+
+//******************************************************************************
+// Config and Interface active checking methods
+
+/* Pick a way to determine active config.
+ *
+ * Most of these generate bus traffic to one or more devices.
+ * This is BAD when using non-queueing (up to 2.5.44) UHCI Host Controller Driver,
+ * as it can interfere with other drivers and the results are unpredictable - ranging
+ * from nothing to complete loss of use of the device(s).
+ *
+ * CONFIG_SETTING_ASK_DEVICE:
+ * Asking the device directly is the best available way,
+ * as bus traffic is generated only for the specific device in question,
+ * and only 1 standard request.
+ *
+ * CONFIG_SETTING_USE_DEVICES_FILE:
+ * Reading/parsing the /proc/bus/usb/devices file generates bus traffic,
+ * by asking ALL connected devices for their 3 standard String-descriptors;
+ * Manufacturer, Product, and SerialNumber.  This is a lot of bus traffic and
+ * can cause problems with any or all connected devices (if using a non-queueing UHCI driver).
+ *
+ * CONFIG_SETTING_1_ALWAYS_ACTIVE:
+ * This does not communicate with the device at all, but always marks the first
+ * configuration (number 1, as configs must be numbered consecutively starting with 1)
+ * as active.  This should work for all devices, but will produce incorrect results
+ * for devices whose active configuration has been changed outside of the current javax.usb
+ * instance.
+ *
+ * All or none may be used, attempts are in order shown, failure moves to the next one.
+ * If none are defined (or all fail) then the result will be no configs active, i.e.
+ * the device will appear to be (but will not really be) in a Not Configured state.
+ *
+ * Most people want at least the CONFIG_1_ALWAYS_ACTIVE define, as it is always
+ * the last attempted and will do the right thing in many more cases than leaving the
+ * device to appear as Not Configured.
+ */
+#define CONFIG_SETTING_ASK_DEVICE
+#undef CONFIG_SETTING_USE_DEVICES_FILE
+#define CONFIG_SETTING_1_ALWAYS_ACTIVE
+
+/* Pick a way to determine active interface alternate setting.
+ *
+ * INTERFACE_SETTING_ASK_DEVICE:
+ * This directly asks the device in the same manner as above.  The only difference is,
+ * to communicate with an interface, the interface must be claimed;
+ * for a device that already has a driver (which is usually most devices)
+ * this will not work since the interface will already be claimed.
+ *
+ * INTERFACE_SETTING_USE_DEVICES_FILE:
+ * This uses the /proc/bus/usb/devices file in the same manner as above.
+ * However, until kernel 2.5.XX, the devices file does not provide active
+ * interface setting information, so this will fail on those kernels.
+ *
+ * If none are defined (or all fail) then the result will be first setting is active.
+ */
+#undef INTERFACE_SETTING_ASK_DEVICE
+#undef INTERFACE_SETTING_USE_DEVICES_FILE
+
+int getActiveConfig( JNIEnv *env, int fd, unsigned char bus, unsigned char dev );
+int getActiveInterfaceSetting( JNIEnv *env, int fd, unsigned char bus, unsigned char dev, unsigned char interface );
+
+//******************************************************************************
+// Utility methods
+
+static inline unsigned short bcd( unsigned char msb, unsigned char lsb ) 
+{
+    return ( (msb << 8) & 0xff00 ) | ( lsb & 0x00ff );
+}
+
+static inline int open_device( JNIEnv *env, jstring javaKey, int oflag ) 
+{
+	const char *node;
+	int filed;
+
+	node = (*env)->GetStringUTFChars( env, javaKey, NULL );
+	log( LOG_INFO, "Opening node %s", node );
+	if (0 > (filed = open( node, oflag )))
+		log( LOG_ERROR, "Could not open node %s : %s", node, strerror(errno) );
+	(*env)->ReleaseStringUTFChars( env, javaKey, node );
+	return filed;
+}
+
+static inline int bus_node_to_name( int bus, int node, char *name )
+{
+	sprintf( name, usbdevfs_sprintf_node(), bus, node );
+	return strlen( name );
+}
+
+static inline int get_busnum_from_name( const char *name )
+{
+	int bus, node;
+	if (1 > (sscanf( name, usbdevfs_sscanf_node(), &bus, &node )))
+		return -1;
+	else return bus;
+}
+
+static inline int get_busnum_from_jname( JNIEnv *env, jstring jname )
+{
+	const char *name = (*env)->GetStringUTFChars( env, jname, NULL );
+	int busnum = get_busnum_from_name( name );
+	(*env)->ReleaseStringUTFChars( env, jname, name );
+	return busnum;
+}
+
+static inline int get_devnum_from_name( const char *name )
+{
+	int bus, node;
+	if (2 > (sscanf( name, usbdevfs_sscanf_node(), &bus, &node )))
+		return -1;
+	else return node;
+}
+
+static inline int get_devnum_from_jname( JNIEnv *env, jstring jname )
+{
+	const char *name = (*env)->GetStringUTFChars( env, jname, NULL );
+	int devnum = get_devnum_from_name( name );
+	(*env)->ReleaseStringUTFChars( env, jname, name );
+	return devnum;
+}
+
+/**
+ * Debug a URB.
+ * @env The JNIEnv*.
+ * @param calling_method The name of the calling method.
+ * @param urb The usbdevfs_urb.
+ */
+static inline void debug_urb( JNIEnv *env, char *calling_method, struct usbdevfs_urb *urb )
+{
+	if (!tracing)
+		return;
+
+//FIXME - add device number and/or other dev info
+	log( LOG_URB_METADATA, "%s : URB address = %p", calling_method, urb );
+	log( LOG_URB_METADATA, "%s : URB endpoint = %x status = %d signal = %x", calling_method, urb->endpoint, urb->status, urb->signr );
+	log( LOG_URB_METADATA, "%s : URB buffer length = %d actual length = %d", calling_method, urb->buffer_length, urb->actual_length );
+
+	if (urb->buffer && (0 < urb->buffer_length)) {
+		static const char hex[] = "0123456789abcdef";
+		int i, loglen = (3*urb->buffer_length);
+		char logbuf[loglen], *bufp = logbuf;
+		char* p = (char *)urb->buffer;
+		for (i=0; i<urb->buffer_length; i++) {
+			int c = *p++;
+			*bufp++ = hex[(c>>4)&0xf]; // index to array
+			*bufp++ = hex[c&0xf]; // index to array
+			*bufp++ = ' ';
+		}
+		logbuf[loglen-1] = 0; // null terminate string
+		log( LOG_URB_DATA, "%s : URB data = %s", calling_method, logbuf );
+ 	} else {
+ 		log( LOG_URB_DATA, "%s : URB data empty", calling_method );
+ 	}
+}
+
+#endif /* _JAVAXUSBUTIL_H */
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbActive.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbActive.c
new file mode 100644
index 0000000000000000000000000000000000000000..357dcb72da90138e5d6c19d1d3164b4348a4858f
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbActive.c
@@ -0,0 +1,392 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+/* This file uses getline(), a GNU extention */
+#define _GNU_SOURCE
+
+#include "JavaxUsb.h"
+
+#ifdef CONFIG_SETTING_USE_DEVICES_FILE
+static int config_use_devices_file( JNIEnv *env, unsigned char bus, unsigned char dev )
+{
+	FILE *file = NULL;
+#define LINELEN 1024
+	ssize_t linelen, len;
+	char *line = NULL, busstr[32], devstr[32];
+	int in_dev = 0;
+	int ret = -1;
+	int config;
+
+	if (!(line = malloc(LINELEN))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto end;
+	}
+
+	linelen = LINELEN - 1;
+
+	sprintf(busstr, "Bus=%2.2d", bus);
+	sprintf(devstr, "Dev#=%3d", dev);
+#define cfgstr "Cfg#=%2d"
+
+	errno = 0;
+	if (!(file = fopen(usbdevfs_devices_filename(), "r"))) {
+		log( LOG_HOTPLUG_ERROR, "Could not open %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+		ret = -errno
+		goto end;
+	}
+
+	log( LOG_HOTPLUG_OTHER, "Checking %s", usbdevfs_devices_filename() );
+
+	while (1) {
+		memset(line, 0, LINELEN);
+
+		errno = 0;
+		if (0 > (len = getline(&line, &linelen, file))) {
+			log( LOG_HOTPLUG_ERROR, "Could not read from %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+			ret = -errno;
+			break;
+		}
+
+		if (!len) {
+			log( LOG_HOTPLUG_ERROR, "No device matching %s/%s found!", busstr, devstr );
+			ret = -ENODEV;
+			break;
+		}
+
+		if (strstr(line, "T:")) {
+			if (in_dev) {
+				log( LOG_HOTPLUG_ERROR, "No active config found in device %s/%s!", cfgstr, busstr, devstr );
+				ret = -EINVAL;
+				break;
+			}
+			if (strstr(line, busstr) && strstr(line, devstr)) {
+				log( LOG_HOTPLUG_OTHER, "Found section for device %s/%s", busstr, devstr );
+				in_dev = 1;
+				continue;
+			}
+		}
+
+		if (in_dev && strstr(line, "C:*")) {
+			if (1 == sscanf(line, cfgstr, config)) {
+				ret = config;
+				break;
+			}
+		}
+	}
+
+end:
+	if (line) free(line);
+	if (file) fclose(file);
+
+	return ret;
+}
+#endif /* CONFIG_SETTING_USE_DEVICES_FILE */
+
+#ifdef INTERFACE_SETTING_USE_DEVICES_FILE
+static int interface_use_devices_file( JNIEnv *env, unsigned char bus, unsigned char dev, unsigned char interface )
+{
+	FILE *file = NULL;
+#define LINELEN 1024
+	ssize_t linelen, len;
+	char *line = NULL, busstr[32], devstr[32], cfgstr[32], ifstr[32];
+	int in_dev = 0, in_cfg = 0;
+	int ret = -1;
+	int setting;
+
+	if (!(line = malloc(LINELEN))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		goto end;
+	}
+
+	linelen = LINELEN - 1;
+
+	sprintf(busstr, "Bus=%2.2d", bus);
+	sprintf(devstr, "Dev#=%3d", dev);
+	sprintf(ifstr, "If#=%2d", interface );
+#define setstr "Alt=%2d"
+
+	errno = 0;
+	if (!(file = fopen(usbdevfs_devices_filename(), "r"))) {
+		log( LOG_HOTPLUG_ERROR, "Could not open %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+		ret = -errno;
+		goto end;
+	}
+
+	log( LOG_HOTPLUG_OTHER, "Checking %s", usbdevfs_devices_filename() );
+
+	while (1) {
+		memset(line, 0, LINELEN);
+
+		errno = 0;
+		if (0 > (len = getline(&line, &linelen, file))) {
+			log( LOG_HOTPLUG_ERROR, "Could not read from %s : %s", usbdevfs_devices_filename(), strerror(errno) );
+			ret = -errno;
+			break;
+		}
+
+		if (!len) {
+			log( LOG_HOTPLUG_ERROR, "No device matching %s/%s found!", busstr, devstr );
+			ret = -ENODEV;
+			break;
+		}
+
+		if (strstr(line, "T:")) {
+			if (in_dev) {
+				log( LOG_HOTPLUG_ERROR, "No config matching %s found in device %s/%s!", cfgstr, busstr, devstr );
+				ret = -EINVAL;
+				break;
+			}
+			if (strstr(line, busstr) && strstr(line, devstr)) {
+				log( LOG_HOTPLUG_OTHER, "Found section for device %s/%s", busstr, devstr );
+				in_dev = 1;
+				continue;
+			}
+		}
+
+		if (in_dev && strstr(line, "C:*")) {
+			in_cfg = 1;
+			continue;
+		}
+
+		if (in_cfg) {
+			if (strstr(line, "C:")) {
+				log( LOG_HOTPLUG_ERROR, "No active interface matching %s found in device %s/%s for active config!", ifstr, busstr, devstr );
+				ret = -EINVAL;
+				break;
+			}
+			if (strstr(line, ifstr) && strstr(line, "I:*")) {
+				if (1 == sscanf(line, setstr, setting)) {
+					ret = setting;
+					break;
+				}
+			}
+		}
+	}
+
+end:
+	if (line) free(line);
+	if (file) fclose(file);
+
+	return ret;
+}
+#endif /* INTERFACE_SETTING_USE_DEVICES_FILE */
+
+#ifdef CONFIG_SETTING_ASK_DEVICE
+#define CONFIG_ASK_DEVICE_TIMEOUT 500 /* ms */
+static int config_ask_device( JNIEnv *env, int fd )
+{
+	int ret = 0;
+
+	struct usbdevfs_ctrltransfer *ctrl = NULL;
+	unsigned char *actconfig = NULL;
+
+	if (!(ctrl = malloc(sizeof(*ctrl))) || !(actconfig = malloc(1))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto CONFIG_ASK_DEVICE_END;
+	}
+
+	*actconfig = 0;
+
+	ctrl->bmRequestType = (unsigned char)0x80;
+	ctrl->bRequest = 0x08;
+	ctrl->wValue = 0x00;
+	ctrl->wIndex = 0x00;
+	ctrl->wLength = 1;
+	ctrl->timeout = CONFIG_ASK_DEVICE_TIMEOUT;
+	ctrl->data = actconfig;
+
+	errno = 0;
+	if (0 > (ioctl(fd, USBDEVFS_CONTROL, ctrl))) {
+		log( LOG_HOTPLUG_ERROR, "Could not get active configuration from device : %s", strerror(errno) );
+		ret = -errno;
+	} else {
+		log( LOG_HOTPLUG_OTHER, "Active device configuration is %d", *actconfig );
+		ret = *actconfig;
+	}
+
+CONFIG_ASK_DEVICE_END:
+	if (ctrl) free(ctrl);
+	if (actconfig) free(actconfig);
+
+	return ret;
+}
+#endif /* CONFIG_SETTING_ASK_DEVICE */
+
+#ifdef INTERFACE_SETTING_ASK_DEVICE
+#define INTERFACE_ASK_DEVICE_TIMEOUT 500 /* ms */
+static int interface_ask_device( JNIEnv *env, int fd, unsigned char interface )
+{
+	int ret = 0;
+
+	struct javaxusb_usbdevfs_ctrltransfer *ctrl = NULL;
+	unsigned char *actsetting = NULL;
+
+	if (!(ctrl = malloc(sizeof(*ctrl))) || !(actsetting = malloc(1))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto INTERFACE_ASK_DEVICE_END;
+	}
+
+	*actsetting = 0;
+
+	ctrl->bmRequestType = (unsigned char)0x81;
+	ctrl->bRequest = 0x0a;
+	ctrl->wValue = 0x00;
+	ctrl->wIndex = interface;
+	ctrl->wLength = 1;
+	ctrl->timeout = INTERFACE_ASK_DEVICE_TIMEOUT;
+	ctrl->data = actsetting;
+
+	errno = 0;
+	if (0 > (ioctl(fd, USBDEVFS_CONTROL, ctrl))) {
+		log( LOG_HOTPLUG_ERROR, "Could not get active interface %d setting from device : %s", interface, strerror(errno) );
+		ret = -errno;
+	} else {
+		log( LOG_HOTPLUG_OTHER, "Active interface %d setting is %d", interface, *actsetting );
+		ret = *actsetting;
+	}
+
+INTERFACE_ASK_DEVICE_END:
+	if (ctrl) free(ctrl);
+	if (actsetting) free(actsetting);
+
+	return ret;
+}
+#endif /* INTERFACE_SETTING_ASK_DEVICE */
+
+int getActiveConfig( JNIEnv *env, int fd, unsigned char bus, unsigned char dev )
+{
+	int ret = -1; /* -1 = failure */
+
+#ifdef CONFIG_SETTING_ASK_DEVICE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active config using GET_CONFIGURATION standard request." );
+		ret = config_ask_device( env, fd );
+		log( LOG_HOTPLUG_OTHER, "Device returned %d%s.", ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+#ifdef CONFIG_SETTING_USE_DEVICES_FILE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active config using %s.", usbdevfs_devices_filename() );
+		ret = config_use_devices_file( env, bus, dev );
+		log( LOG_HOTPLUG_OTHER, "%s returned %d%s.", usbdevfs_devices_filename(), ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+#ifdef CONFIG_SETTING_1_ALWAYS_ACTIVE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Returning config 1 as active; no checking." );
+		ret = 1;
+	}
+#endif
+
+	return ret;
+}
+
+int getActiveInterfaceSetting( JNIEnv *env, int fd, unsigned char bus, unsigned char dev, unsigned char interface )
+{
+	int ret = -1; /* -1 = failure  */
+
+#ifdef INTERFACE_SETTING_ASK_DEVICE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active interface %d setting using GET_INTERFACE standard request.", interface );
+		ret = interface_ask_device( env, fd, interface );
+		log( LOG_HOTPLUG_OTHER, "Device returned %d%s.", ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+#ifdef INTERFACE_SETTING_USE_DEVICES_FILE
+	if (0 > ret) {
+		log( LOG_HOTPLUG_OTHER, "Getting active interface %d setting using %s.", interface, usbdevfs_devices_filename() );
+		ret = interface_use_devices_file( env, bus, dev, interface );
+		log( LOG_HOTPLUG_OTHER, "%s returned %d%s.", usbdevfs_devices_filename(), ret, 0>ret ? " (failure)" : "" );
+	}
+#endif
+
+	return ret;
+}
+
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveConfigurationNumber
+(JNIEnv *env, jclass JavaxUsb, jobject linuxDeviceOsImp)
+{
+	int fd;
+	unsigned char busnum, devnum;
+	int configNumber;
+
+	jclass LinuxDeviceOsImp = NULL, LinuxDeviceProxy = NULL;
+	jobject linuxDeviceProxy = NULL;
+	jfieldID linuxDeviceProxyID;
+	jmethodID getKey;
+	jstring jname = NULL;
+
+	LinuxDeviceOsImp = CheckedGetObjectClass( env, linuxDeviceOsImp );
+	linuxDeviceProxyID = CheckedGetFieldID( env, LinuxDeviceOsImp, "linuxDeviceProxy", "Lcom/ibm/jusb/os/linux/LinuxDeviceProxy;" );
+	linuxDeviceProxy = (*env)->GetObjectField( env, linuxDeviceOsImp, linuxDeviceProxyID );
+	LinuxDeviceProxy = CheckedGetObjectClass( env, linuxDeviceProxy );
+	getKey = CheckedGetMethodID( env, LinuxDeviceProxy, "getKey", "()Ljava/lang/String;" );
+	jname = (jstring)CheckedCallObjectMethod( env, linuxDeviceProxy, getKey );
+	(*env)->DeleteLocalRef( env, LinuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, linuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, LinuxDeviceOsImp );
+
+	if (0 > (fd = open_device( env, jname, O_RDWR ))) {
+		(*env)->DeleteLocalRef( env, jname );
+		return errno ? -errno : -1;
+	}
+
+	busnum = (unsigned char)get_busnum_from_jname( env, jname );
+	devnum = (unsigned char)get_devnum_from_jname( env, jname );
+
+	configNumber = getActiveConfig( env, fd, busnum, devnum );
+
+	close(fd);
+	(*env)->DeleteLocalRef( env, jname );
+
+	return (jint)configNumber;
+}
+
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveInterfaceSettingNumber
+(JNIEnv *env, jclass JavaxUsb, jobject linuxDeviceOsImp, jint interfaceNumber)
+{
+	int fd;
+	unsigned char busnum, devnum;
+	int settingNumber;
+
+	jclass LinuxDeviceOsImp = NULL, LinuxDeviceProxy = NULL;
+	jobject linuxDeviceProxy = NULL;
+	jfieldID linuxDeviceProxyID;
+	jmethodID getKey;
+	jstring jname = NULL;
+
+	LinuxDeviceOsImp = CheckedGetObjectClass( env, linuxDeviceOsImp );
+	linuxDeviceProxyID = CheckedGetFieldID( env, LinuxDeviceOsImp, "linuxDeviceProxy", "Lcom/ibm/jusb/os/linux/LinuxDeviceProxy;" );
+	linuxDeviceProxy = (*env)->GetObjectField( env, linuxDeviceOsImp, linuxDeviceProxyID );
+	LinuxDeviceProxy = CheckedGetObjectClass( env, linuxDeviceProxy );
+	getKey = CheckedGetMethodID( env, LinuxDeviceProxy, "getKey", "()Ljava/lang/String;" );
+	jname = (jstring)CheckedCallObjectMethod( env, linuxDeviceProxy, getKey );
+	(*env)->DeleteLocalRef( env, LinuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, linuxDeviceProxy );
+	(*env)->DeleteLocalRef( env, LinuxDeviceOsImp );
+
+	if (0 > (fd = open_device( env, jname, O_RDWR ))) {
+		(*env)->DeleteLocalRef( env, jname );
+		return errno ? -errno : -1;
+	}
+
+	busnum = (unsigned char)get_busnum_from_jname( env, jname );
+	devnum = (unsigned char)get_devnum_from_jname( env, jname );
+
+	settingNumber = getActiveInterfaceSetting( env, fd, busnum, devnum, (unsigned char)interfaceNumber );
+
+	close(fd);
+	(*env)->DeleteLocalRef( env, jname );
+
+	return (jint)settingNumber;	
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbBulkRequest.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbBulkRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..db50e9ec84047bc37ed193eede02d2c9b33ac72b
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbBulkRequest.c
@@ -0,0 +1,94 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Submit a bulk pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int bulk_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer );
+
+	urb->type = getBulkType();
+	urb->flags = getBulkFlags(urb->flags);
+
+	debug_urb( env, "bulk_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a bulk pipe request.
+ * @param env The JNIEnv.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_bulk_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxPipeRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer );
+
+	CheckedCallVoidMethod( env, linuxPipeRequest, setActualLength, urb->actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->status;
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbChecks.h b/target-platform/javax.usb.linux/src/main/c/JavaxUsbChecks.h
new file mode 100644
index 0000000000000000000000000000000000000000..f879c2ba3e46ba9c5b491f1991c13d75087a0aef
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbChecks.h
@@ -0,0 +1,164 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAXUSBCHECKS_H
+#define _JAVAXUSBCHECKS_H
+
+/* exception checks */
+
+#define check_for_exception(env) get_exception(env,1)
+#define check_for_exception_noexit(env) get_exception(env,0)
+
+/* Non-static checked JNI function wrappers */
+
+#define CheckedGetObjectClass(env,object) debugGetObjectClass(__FILE__,__func__,__LINE__,env,object,#env","#object)
+#define CheckedGetMethodID(env,class,name,id) debugGetMethodID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+#define CheckedGetFieldID(env,class,name,id) debugGetFieldID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+#define CheckedNewStringUTF(env,string) debugNewStringUTF(__FILE__,__func__,__LINE__,env,string,#env","#string)
+#define CheckedNewGlobalRef(env,object) debugNewGlobalRef(__FILE__,__func__,__LINE__,env,object,#env","#object)
+#define CheckedDeleteLocalRef(env,object) debugDeleteLocalRef(__FILE__,__func__,__LINE__,env,object,#env","#object)
+#define CheckedDeleteGlobalRef(env,object) debugDeleteGlobalRef(__FILE__,__func__,__LINE__,env,object,#env","#object)
+
+#define CheckedGetByteArrayRegion(env,array,offset,length,buffer) debugGetByteArrayRegion(__FILE__,__func__,__LINE__,env,array,offset,length,buffer,#env","#array","#offset","#length","#buffer)
+#define CheckedSetByteArrayRegion(env,array,offset,length,buffer) debugSetByteArrayRegion(__FILE__,__func__,__LINE__,env,array,offset,length,buffer,#env","#array","#offset","#length","#buffer)
+#define CheckedGetArrayLength(env,array) debugGetArrayLength(__FILE__,__func__,__LINE__,env,array,#env","#array)
+
+//FIXME - implement
+#define CheckedCallObjectMethod(env,object,method,args...) (*env)->CallObjectMethod(env,object,method,##args)
+#define CheckedCallLongMethod(env,object,method,args...) (*env)->CallLongMethod(env,object,method,##args)
+#define CheckedCallIntMethod(env,object,method,args...) (*env)->CallIntMethod(env,object,method,##args)
+#define CheckedCallShortMethod(env,object,method,args...) (*env)->CallShortMethod(env,object,method,##args)
+#define CheckedCallByteMethod(env,object,method,args...) (*env)->CallByteMethod(env,object,method,##args)
+#define CheckedCallBooleanMethod(env,object,method,args...) (*env)->CallBooleanMethod(env,object,method,##args)
+#define CheckedCallVoidMethod(env,object,method,args...) (*env)->CallVoidMethod(env,object,method,##args)
+
+/* Static checked JNI function wrappers */
+
+#define CheckedGetStaticMethodID(env,class,name,id) debugGetStaticMethodID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+#define CheckedGetStaticFieldID(env,class,name,id) debugGetStaticFieldID(__FILE__,__func__,__LINE__,env,class,name,id,#env","#class","#name","#id)
+
+//FIXME - implement
+#define CheckedCallStaticObjectMethod(env,class,method,args...) (*env)->CallStaticObjectMethod(env,class,method,##args)
+#define CheckedCallStaticLongMethod(env,class,method,args...) (*env)->CallStaticLongMethod(env,class,method,##args)
+#define CheckedCallStaticIntMethod(env,class,method,args...) (*env)->CallStaticIntMethod(env,class,method,##args)
+#define CheckedCallStaticShortMethod(env,class,method,args...) (*env)->CallStaticShortMethod(env,class,method,##args)
+#define CheckedCallStaticByteMethod(env,class,method,args...) (*env)->CallStaticByteMethod(env,class,method,##args)
+#define CheckedCallStaticBooleanMethod(env,class,method,args...) (*env)->CallStaticBooleanMethod(env,class,method,##args)
+#define CheckedCallStaticVoidMethod(env,class,method,args...) (*env)->CallStaticVoidMethod(env,class,method,##args)
+
+/*
+ * Check for and return an exception, or null.
+ *
+ * @should_exit If the JVM should exit immediately and without warning if there is an Exception.
+ */
+static inline jthrowable get_exception( JNIEnv *env, int should_exit )
+{
+	jthrowable e = (*env)->ExceptionOccurred( env );
+
+	if (e) {
+		log( LOG_CRITICAL, "Exception occured!\n" );
+		if (should_exit)
+			exit(1);
+	}
+
+	return e;
+}
+
+static inline void debug_exception( JNIEnv *env, const char *file, const char *func, int line, char *jnicall, char *args )
+{
+	if (JNI_TRUE == (*env)->ExceptionCheck(env)) {
+		log( LOG_CRITICAL, "!! JNI Exception : file (%s) function (%s) line (%d)\n", file, func, line );
+		log( LOG_CRITICAL, "!!!!! Failure at : (*env)->%s(%s)\n", jnicall, args );
+		exit(1);
+	}
+}
+
+static inline jclass debugGetObjectClass( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	jclass class = (*env)->GetObjectClass( env, object );
+	debug_exception( env, file, func, line, "GetObjectClass", args );
+	return class;
+}
+
+static inline jmethodID debugGetMethodID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jmethodID method = (*env)->GetMethodID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetMethodID", args );
+	return method;
+}
+
+static inline jfieldID debugGetFieldID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jfieldID field = (*env)->GetFieldID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetFieldID", args );
+	return field;
+}
+
+static inline jstring debugNewStringUTF( const char *file, const char *func, int line, JNIEnv *env, char *str, char *args )
+{
+	jstring string = (*env)->NewStringUTF( env, str );
+	debug_exception( env, file, func, line, "NewStringUTF", args );
+	return string;
+}
+
+static inline jobject debugNewGlobalRef( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	jobject newObject = (*env)->NewGlobalRef( env , object );
+	debug_exception( env, file, func, line, "NewGlobalRef", args );
+	return newObject;
+}
+
+static inline void debugDeleteLocalRef( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	(*env)->DeleteLocalRef( env, object );
+	debug_exception( env, file, func, line, "DeleteLocalRef", args );
+}
+
+static inline void debugDeleteGlobalRef( const char *file, const char *func, int line, JNIEnv *env, jobject object, char *args )
+{
+	(*env)->DeleteGlobalRef( env, object );
+	debug_exception( env, file, func, line, "DeleteGlobalRef", args );
+}
+
+static inline void debugGetByteArrayRegion( const char *file, const char *func, int line, JNIEnv *env, jbyteArray array, jsize offset, jsize length, jbyte *buffer, char *args )
+{
+	(*env)->GetByteArrayRegion( env, array, offset, length, buffer );
+	debug_exception( env, file, func, line, "GetByteArrayRegion", args );
+}
+
+static inline void debugSetByteArrayRegion( const char *file, const char *func, int line, JNIEnv *env, jbyteArray array, jsize offset, jsize length, jbyte *buffer, char *args )
+{
+	(*env)->SetByteArrayRegion( env, array, offset, length, buffer );
+	debug_exception( env, file, func, line, "SetByteArrayRegion", args );
+}
+
+static inline jsize debugGetArrayLength( const char *file, const char *func, int line, JNIEnv *env, jarray array, char *args )
+{
+	jsize size = (*env)->GetArrayLength( env, array );
+	debug_exception( env, file, func, line, "GetArrayLength", args );
+	return size;
+}
+
+static inline jmethodID debugGetStaticMethodID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jmethodID method = (*env)->GetStaticMethodID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetStaticMethodID", args );
+	return method;
+}
+
+static inline jfieldID debugGetStaticFieldID( const char *file, const char *func, int line, JNIEnv *env, jclass class, char *name, char *id, char *args )
+{
+	jfieldID field = (*env)->GetStaticFieldID( env, class, name, id );
+	debug_exception( env, file, func, line, "GetStaticFieldID", args );
+	return field;
+}
+
+#endif /* _JAVAXUSBCHECKS_H */
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbControlRequest.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbControlRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..75f876d38835e271994a05a84d7cf3752e4b5799
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbControlRequest.c
@@ -0,0 +1,191 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Submit a control pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxControlRequest The LinuxControlRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int control_pipe_request( JNIEnv *env, int fd, jobject linuxControlRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxControlRequest = NULL;
+	jmethodID getSetupPacket, getData, getOffset, getLength;
+	jbyteArray setupPacket = NULL, data = NULL;
+
+	LinuxControlRequest = CheckedGetObjectClass( env, linuxControlRequest );
+	getSetupPacket = CheckedGetMethodID( env, LinuxControlRequest, "getSetupPacket", "()[B" );
+	getData = CheckedGetMethodID( env, LinuxControlRequest, "getData", "()[B" );
+	getOffset = CheckedGetMethodID( env, LinuxControlRequest, "getOffset", "()I" );
+	getLength = CheckedGetMethodID( env, LinuxControlRequest, "getLength", "()I" );
+	setupPacket = CheckedCallObjectMethod( env, linuxControlRequest, getSetupPacket );
+	data = CheckedCallObjectMethod( env, linuxControlRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxControlRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length + 8))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, setupPacket, 0, 8, urb->buffer );
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer + 8 );
+
+	/* Add 8 for the setup packet */
+	urb->buffer_length += 8;
+
+	urb->type = getControlType();
+	urb->flags = getControlFlags(urb->flags);
+
+	debug_urb( env, "control_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (setupPacket) CheckedDeleteLocalRef( env, setupPacket );
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a control pipe request.
+ * @param env The JNIEnv.
+ * @param linuxControlRequest The LinuxControlRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_control_pipe_request( JNIEnv *env, jobject linuxControlRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxControlRequest = CheckedGetObjectClass( env, linuxControlRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxControlRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxControlRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxControlRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxControlRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxControlRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxControlRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxControlRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer + 8 );
+
+	CheckedCallVoidMethod( env, linuxControlRequest, setActualLength, urb->actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->status;
+}
+
+/**
+ * Set a configuration.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxSetConfigurationRequest The LinuxSetConfigurationRequest.
+ * @return The error, or 0.
+ */
+int set_configuration( JNIEnv *env, int fd, jobject linuxSetConfigurationRequest )
+{
+	unsigned int *configuration = NULL;
+	int ret = 0;
+
+	jclass LinuxSetConfigurationRequest;
+	jmethodID getConfiguration;
+
+	LinuxSetConfigurationRequest = CheckedGetObjectClass( env, linuxSetConfigurationRequest );
+	getConfiguration = CheckedGetMethodID( env, LinuxSetConfigurationRequest, "getConfiguration", "()I" );
+	CheckedDeleteLocalRef( env, LinuxSetConfigurationRequest );
+
+	if (!(configuration = malloc(sizeof(*configuration)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return -ENOMEM;
+	}
+
+	*configuration = (unsigned int)CheckedCallIntMethod( env, linuxSetConfigurationRequest, getConfiguration );
+
+	log( LOG_XFER_META, "Setting configuration to %d", *configuration );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SETCONFIGURATION, configuration )))
+		ret = -errno;
+
+	if (ret)
+		log( LOG_XFER_ERROR, "Could not set configuration (errno %d)", ret );
+	else
+		log( LOG_XFER_META, "set_configuration : Set configuration" );
+
+	free(configuration);
+
+	return ret;
+}
+
+/**
+ * Set a interface setting.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxSetInterfaceRequest The LinuxSetInterfaceRequest.
+ * @return The error, or 0.
+ */
+int set_interface( JNIEnv *env, int fd, jobject linuxSetInterfaceRequest )
+{
+	struct usbdevfs_setinterface *interface = NULL;
+	int ret = 0;
+
+	jclass LinuxSetInterfaceRequest;
+	jmethodID getInterface, getSetting;
+
+	LinuxSetInterfaceRequest = CheckedGetObjectClass( env, linuxSetInterfaceRequest );
+	getInterface = CheckedGetMethodID( env, LinuxSetInterfaceRequest, "getInterface", "()I" );
+	getSetting = CheckedGetMethodID( env, LinuxSetInterfaceRequest, "getSetting", "()I" );
+	CheckedDeleteLocalRef( env, LinuxSetInterfaceRequest );
+
+	if (!(interface = malloc(sizeof(*interface)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return -ENOMEM;
+	}
+
+	interface->interface = (unsigned int)CheckedCallIntMethod( env, linuxSetInterfaceRequest, getInterface );
+	interface->altsetting = (unsigned int)CheckedCallIntMethod( env, linuxSetInterfaceRequest, getSetting );
+
+	log( LOG_XFER_META, "Setting interface %d to setting %d", interface->interface, interface->altsetting );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SETINTERFACE, interface )))
+		ret = -errno;
+
+	if (ret)
+		log( LOG_XFER_ERROR, "Could not set interface (errno %d)", ret );
+	else
+		log( LOG_XFER_META, "Set interface" );
+
+	free(interface);
+
+	return ret;
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbDeviceProxy.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbDeviceProxy.c
new file mode 100644
index 0000000000000000000000000000000000000000..12bf9d9ca04a807dca9a67aa7767d379aa447a4a
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbDeviceProxy.c
@@ -0,0 +1,253 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/* These MUST match those defined in com/ibm/jusb/os/linux/LinuxRequest.java */
+#define LINUX_PIPE_REQUEST 1
+#define LINUX_SET_INTERFACE_REQUEST 2
+#define LINUX_SET_CONFIGURATION_REQUEST 3
+#define LINUX_CLAIM_INTERFACE_REQUEST 4
+#define LINUX_IS_CLAIMED_INTERFACE_REQUEST 5
+#define LINUX_RELEASE_INTERFACE_REQUEST 6
+#define LINUX_ISOCHRONOUS_REQUEST 7
+
+static void submitRequest( JNIEnv *env, int fd, jobject linuxRequest );
+static void cancelRequest( JNIEnv *env, int fd, jobject linuxRequest );
+static void completeRequest( JNIEnv *env, jobject linuxRequest );
+
+/*
+ * Proxy for all I/O with a device
+ * @author Dan Streetman
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeDeviceProxy
+  ( JNIEnv *env, jclass JavaxUsb, jobject linuxDeviceProxy )
+{
+	int fd = 0;
+	struct usbdevfs_urb *urb;
+
+	jclass LinuxDeviceProxy;
+	jobject linuxRequest;
+	jstring jkey;
+	jmethodID startCompleted, isRequestWaiting, getReadyRequest, getCancelRequest;
+	jmethodID getKey;
+
+	LinuxDeviceProxy = CheckedGetObjectClass( env, linuxDeviceProxy );
+	startCompleted = CheckedGetMethodID( env, LinuxDeviceProxy, "startCompleted", "(I)V" );
+	isRequestWaiting = CheckedGetMethodID( env, LinuxDeviceProxy, "isRequestWaiting", "()Z" );
+	getReadyRequest = CheckedGetMethodID( env, LinuxDeviceProxy, "getReadyRequest", "()Lcom/ibm/jusb/os/linux/LinuxRequest;" );
+	getCancelRequest = CheckedGetMethodID( env, LinuxDeviceProxy, "getCancelRequest", "()Lcom/ibm/jusb/os/linux/LinuxRequest;" );
+	getKey = CheckedGetMethodID( env, LinuxDeviceProxy, "getKey", "()Ljava/lang/String;" );
+	jkey = CheckedCallObjectMethod( env, linuxDeviceProxy, getKey );
+	CheckedDeleteLocalRef( env, LinuxDeviceProxy );
+
+	errno = 0;
+	fd = open_device( env, jkey, O_RDWR );
+	CheckedDeleteLocalRef( env, jkey );
+
+	if (0 > fd) {
+		log( LOG_XFER_ERROR, "Could not open node for device!" );
+		CheckedCallVoidMethod( env, linuxDeviceProxy, startCompleted, errno );
+		return;
+	}
+
+	CheckedCallVoidMethod( env, linuxDeviceProxy, startCompleted, 0 );
+
+	/* run forever...? */
+	while (1) {
+		usleep( 1000 ); // Sleep 1 ms to avoid too much polling
+
+		if (JNI_TRUE == CheckedCallBooleanMethod( env, linuxDeviceProxy, isRequestWaiting )) {
+			if ((linuxRequest = CheckedCallObjectMethod( env, linuxDeviceProxy, getReadyRequest ))) {
+				log( LOG_XFER_REQUEST, "Got Request" );
+				submitRequest( env, fd, linuxRequest );
+				CheckedDeleteLocalRef( env, linuxRequest );
+				log( LOG_XFER_REQUEST, "Completed Request" );
+			}
+
+			if ((linuxRequest = CheckedCallObjectMethod( env, linuxDeviceProxy, getCancelRequest ))) {
+				log( LOG_XFER_REQUEST, "Got Abort Request" );
+				cancelRequest( env, fd, linuxRequest );
+				CheckedDeleteLocalRef( env, linuxRequest );
+				log( LOG_XFER_REQUEST, "Completed Abort Request" );
+			}
+		}
+
+		errno = 0;
+		if (!(ioctl( fd, USBDEVFS_REAPURBNDELAY, &urb ))) {
+			log( LOG_XFER_REQUEST, "Got completed URB" );
+			linuxRequest = urb->usercontext;
+			completeRequest( env, linuxRequest );
+			CheckedDeleteGlobalRef( env, linuxRequest );
+			log( LOG_XFER_REQUEST, "Finished completed URB" );
+		} else if (ENODEV == errno) {
+			break;
+		}
+	}
+
+	log( LOG_XFER_OTHER, "Device Proxy exiting." );
+
+	close( fd );
+}
+
+/**
+ * Submit a LinuxRequest.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ */
+static void submitRequest( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	int type, err, sync = 0;
+
+	jclass LinuxRequest;
+	jmethodID getType, setError, setCompleted;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getType = CheckedGetMethodID( env, LinuxRequest, "getType", "()I" );
+	setCompleted = CheckedGetMethodID( env, LinuxRequest, "setCompleted", "(Z)V" );
+	setError = CheckedGetMethodID( env, LinuxRequest, "setError", "(I)V" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	type = CheckedCallIntMethod( env, linuxRequest, getType );
+
+	log( LOG_XFER_OTHER, "Submitting Request.");
+
+	switch (type) {
+	case LINUX_PIPE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting Pipe Request.");
+		err = pipe_request( env, fd, linuxRequest );
+		break;
+	case LINUX_SET_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting SetInterface Request.");
+		err = set_interface( env, fd, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_SET_CONFIGURATION_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting SetConfiguration Request.");
+		err = set_configuration( env, fd, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_CLAIM_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting ClaimInterface Request.");
+		err = claim_interface( env, fd, 1, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_RELEASE_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting ReleaseInterface Request.");
+		err = claim_interface( env, fd, 0, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_IS_CLAIMED_INTERFACE_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting IsClaimed Request.");
+		err = is_claimed( env, fd, linuxRequest );
+		sync = 1;
+		break;
+	case LINUX_ISOCHRONOUS_REQUEST:
+		log( LOG_XFER_OTHER, "Submitting Isochronous Request.");
+		err = isochronous_request( env, fd, linuxRequest );
+		break;
+	default: /* ? */
+		log( LOG_XFER_ERROR, "Unknown Request type %d", type );
+		err = -EINVAL;
+		break;
+	}
+
+	if (err)
+		CheckedCallVoidMethod( env, linuxRequest, setError, err );
+
+	if (sync || err)
+		CheckedCallVoidMethod( env, linuxRequest, setCompleted, JNI_TRUE );
+}
+
+/**
+ * Cancel a LinuxRequest.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ */
+static void cancelRequest( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	int type;
+
+	jclass LinuxRequest;
+	jmethodID getType;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getType = CheckedGetMethodID( env, LinuxRequest, "getType", "()I" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	type = CheckedCallIntMethod( env, linuxRequest, getType );
+
+	switch (type) {
+	case LINUX_PIPE_REQUEST:
+		cancel_pipe_request( env, fd, linuxRequest );
+		break;
+	case LINUX_SET_INTERFACE_REQUEST:
+	case LINUX_SET_CONFIGURATION_REQUEST:
+	case LINUX_CLAIM_INTERFACE_REQUEST:
+	case LINUX_IS_CLAIMED_INTERFACE_REQUEST:
+	case LINUX_RELEASE_INTERFACE_REQUEST:
+		/* cannot abort these synchronous requests */
+		break;
+	case LINUX_ISOCHRONOUS_REQUEST:
+		cancel_isochronous_request( env, fd, linuxRequest );
+		break;
+	default: /* ? */
+		log( LOG_XFER_ERROR, "Unknown Request type %d", type );
+		break;
+	}	
+}
+
+/**
+ * Complete a LinuxRequest.
+ * @param env The JNIEnv.
+ * @param linuxRequest The LinuxRequest.
+ */
+static void completeRequest( JNIEnv *env, jobject linuxRequest )
+{
+	int type, err;
+
+	jclass LinuxRequest;
+	jmethodID getType, setError, setCompleted;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getType = CheckedGetMethodID( env, LinuxRequest, "getType", "()I" );
+	setCompleted = CheckedGetMethodID( env, LinuxRequest, "setCompleted", "(Z)V" );
+	setError = CheckedGetMethodID( env, LinuxRequest, "setError", "(I)V" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	type = CheckedCallIntMethod( env, linuxRequest, getType );
+
+	switch (type) {
+	case LINUX_PIPE_REQUEST:
+		err = complete_pipe_request( env, linuxRequest );
+		break;
+	case LINUX_SET_INTERFACE_REQUEST:
+	case LINUX_SET_CONFIGURATION_REQUEST:
+	case LINUX_CLAIM_INTERFACE_REQUEST:
+	case LINUX_IS_CLAIMED_INTERFACE_REQUEST:
+	case LINUX_RELEASE_INTERFACE_REQUEST:
+		/* these are synchronous, completion happens during submit */
+		break;
+	case LINUX_ISOCHRONOUS_REQUEST:
+		err = complete_isochronous_request( env, linuxRequest );
+		break;
+	default: /* ? */
+		log( LOG_XFER_ERROR, "Unknown Request type %d", type );
+		err = -EINVAL;
+		break;
+	}
+
+	if (err)
+		CheckedCallVoidMethod( env, linuxRequest, setError, err );
+
+	CheckedCallVoidMethod( env, linuxRequest, setCompleted, JNI_TRUE );
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbError.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbError.c
new file mode 100644
index 0000000000000000000000000000000000000000..a7b99e0dcfc6a1e52c11736ccc5cc832bad5a501
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbError.c
@@ -0,0 +1,66 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/*
+ * Get String message for specified error number
+ * @author Dan Streetman
+ */
+JNIEXPORT jstring JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetErrorMessage
+  (JNIEnv *env, jclass JavaxUsb, jint error) {
+	if (0 > error) error = -error;
+
+	switch (error) {
+		case EPERM			: return CheckedNewStringUTF( env, "Operation not permitted" );
+		case ENOENT		: return CheckedNewStringUTF( env, "Submission aborted" );
+		case EINTR			: return CheckedNewStringUTF( env, "Interrupted system call" );
+		case EIO			: return CheckedNewStringUTF( env, "I/O error" );
+		case ENXIO			: return CheckedNewStringUTF( env, "Cannot queue certain submissions on Universal Host Controller (unsupported in Linux driver)" );
+		case EAGAIN		: return CheckedNewStringUTF( env, "Temporarily busy, try again" );
+		case ENOMEM		: return CheckedNewStringUTF( env, "Out of memory" );
+		case EACCES		: return CheckedNewStringUTF( env, "Permission denied" );
+		case EBUSY			: return CheckedNewStringUTF( env, "Device or resource busy" );
+		case ENODEV		: return CheckedNewStringUTF( env, "Device removed (or no such device)" );
+		case EINVAL		: return CheckedNewStringUTF( env, "Invalid" );
+		case ENOSYS		: return CheckedNewStringUTF( env, "Function not implemented" );
+		case ENODATA		: return CheckedNewStringUTF( env, "No data available" );
+		case ERESTART		: return CheckedNewStringUTF( env, "Interrupted system call should be restarted" );
+		case EOPNOTSUPP	: return CheckedNewStringUTF( env, "Operation not supported on transport endpoint" );
+		case ECONNRESET	: return CheckedNewStringUTF( env, "Connection reset by peer" );
+		case ENOBUFS 		: return CheckedNewStringUTF( env, "No buffer space available" );
+		case ETIMEDOUT		: return CheckedNewStringUTF( env, "Timed out" );
+		case ECONNREFUSED	: return CheckedNewStringUTF( env, "Connection refused" );
+		case EALREADY		: return CheckedNewStringUTF( env, "Operation already in progress" );
+		case EINPROGRESS	: return CheckedNewStringUTF( env, "Operation now in progress" );
+		default				: {
+			char err[32];
+			sprintf(err, "Error %d", (int)error);
+			return CheckedNewStringUTF( env, err );
+		}
+	}
+}
+
+/*
+ * Check if specified error is serious (continued error condition)
+ * @author Dan Streetman
+ */
+JNIEXPORT jboolean JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeIsErrorSerious
+  (JNIEnv *env, jclass JavaxUsb, jint error) {
+	if (0 < error) error = -error;
+
+	switch (error) {
+		case -ENODEV :
+		case -EPIPE :
+			return JNI_TRUE;
+		default :
+			return JNI_FALSE;
+	}
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbInterfaceRequest.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbInterfaceRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..b5da448829d69290726094a0db95d0e5f15ba10a
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbInterfaceRequest.c
@@ -0,0 +1,156 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/*
+ * JavaxUsbInterfaceRequest.c
+ *
+ * This handles requests to claim/release interfaces
+ *
+ */
+
+/**
+ * Disconnect the driver from the specified interface.
+ * @param end The JNIEnv.
+ * @param fd The file descriptor.
+ * @param interface The interface number.
+ */
+void disconnect_interface_driver(JNIEnv *env, int fd, int interface)
+{
+	struct usbdevfs_ioctl *disc_ioctl = NULL;
+
+	if (!(disc_ioctl = malloc(sizeof(*disc_ioctl)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return;
+	}
+
+	disc_ioctl->ifno = interface;
+	disc_ioctl->ioctl_code = USBDEVFS_DISCONNECT;
+	disc_ioctl->data = NULL;
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_IOCTL, disc_ioctl ))) {
+		if (ENODATA == errno)
+			log( LOG_ERROR, "No driver associated with interface %d.", interface );
+		else if (ENOSYS == errno)
+			log( LOG_ERROR, "This kernel does not support driver disconnection via USBDEVFS_DISCONNECT." );
+		else
+			log( LOG_ERROR, "Could not disconnect driver from interface %d : %s", interface, strerror(errno) );
+	} else {
+		log( LOG_INFO, "Disconnected driver from interface %d", interface );
+	}
+
+	free(disc_ioctl);
+}
+
+/**
+ * Claim or release a specified interface.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param claim Whether to claim or release.
+ * @param linuxRequest The request.
+ * @return error.
+ */
+int claim_interface( JNIEnv *env, int fd, int claim, jobject linuxRequest )
+{
+	int ret = 0, *interface = NULL;
+	int triedDisconnect = 0;
+
+	jclass LinuxRequest = NULL;
+	jmethodID getInterfaceNumber, getForceClaim;
+	jboolean forceClaim;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getInterfaceNumber = CheckedGetMethodID( env, LinuxRequest, "getInterfaceNumber", "()I" );
+	getForceClaim = CheckedGetMethodID( env, LinuxRequest, "getForceClaim", "()Z" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+	forceClaim = CheckedCallBooleanMethod( env, linuxRequest, getForceClaim );
+
+	if (!(interface = malloc(sizeof(*interface)))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		return -ENOMEM;
+	}
+
+	*interface = CheckedCallIntMethod( env, linuxRequest, getInterfaceNumber );
+
+	while(1) {
+		ret = 0;
+
+		log( LOG_FUNC, "%s interface %d", claim ? "Claiming" : "Releasing", *interface );
+
+		errno = 0;
+		if (0 > (ioctl( fd, claim ? USBDEVFS_CLAIMINTERFACE : USBDEVFS_RELEASEINTERFACE, interface )))
+			ret = -errno;
+
+		if (ret)
+			log( LOG_ERROR, "Could not %s interface %d : errno %d", claim ? "claim" : "release", *interface, ret );
+		else
+			log( LOG_FUNC, "%s interface %d", claim ? "Claimed" : "Released", *interface );
+
+		if (ret && claim && !triedDisconnect && (JNI_TRUE == forceClaim)) {
+			triedDisconnect = 1;
+			disconnect_interface_driver(env, fd, *interface);
+		} else
+			break;
+	}
+
+	free(interface);
+
+	return ret;
+}
+
+/**
+ * Check if an interface is claimed.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ */
+int is_claimed( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	struct usbdevfs_getdriver *gd;
+	int ret = 0;
+
+	jclass LinuxRequest;
+	jmethodID getInterfaceNumber, setClaimed;
+
+	LinuxRequest = CheckedGetObjectClass( env, linuxRequest );
+	getInterfaceNumber = CheckedGetMethodID( env, LinuxRequest, "getInterfaceNumber", "()I" );
+	setClaimed = CheckedGetMethodID( env, LinuxRequest, "setClaimed", "(Z)V" );
+	CheckedDeleteLocalRef( env, LinuxRequest );
+
+	if (!(gd = malloc(sizeof(*gd)))) {
+		log( LOG_CRITICAL, "Out of memory!");
+		return -ENOMEM;
+	}
+
+	memset(gd, 0, sizeof(*gd));
+
+	gd->interface = CheckedCallIntMethod( env, linuxRequest, getInterfaceNumber );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_GETDRIVER, gd ))) {
+		ret = -errno;
+
+		if (-ENODATA == ret)
+			log( LOG_INFO, "Interface %d is not claimed.", gd->interface );
+		else
+			log( LOG_ERROR, "Could not determine if interface %d is claimed.", gd->interface );
+	} else {
+		log( LOG_INFO, "Interface %d is claimed by driver %s.", gd->interface, gd->driver );
+	}
+
+	CheckedCallVoidMethod( env, linuxRequest, setClaimed, (ret ? JNI_FALSE : JNI_TRUE) );
+
+	free(gd);
+
+	return (-ENODATA == ret ? 0 : ret);
+}
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbInterruptRequest.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbInterruptRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..e043f0a4cb039a0ab1fc4d3c1757a357e357173d
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbInterruptRequest.c
@@ -0,0 +1,94 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Submit a interrupt pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int interrupt_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer );
+
+	urb->type = getInterruptType();
+	urb->flags = getInterruptFlags(urb->flags);
+
+	debug_urb( env, "interrupt_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a interrupt pipe request.
+ * @param env The JNIEnv.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_interrupt_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxPipeRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer );
+
+	CheckedCallVoidMethod( env, linuxPipeRequest, setActualLength, urb->actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->status;
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbIsochronousRequest.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbIsochronousRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..4bf2003d5ecf46afbaba4f8ba9b7a66f4618e579
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbIsochronousRequest.c
@@ -0,0 +1,331 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/* simple isochronous functions */
+
+/**
+ * Submit a simple isochronous pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param usb The usbdevfs_urb.
+ * @return The error that occurred, or 0.
+ */
+int isochronous_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	int offset = 0;
+	int ret = 0;
+
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	urb->buffer_length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto END_SUBMIT;
+	}
+
+	CheckedGetByteArrayRegion( env, data, offset, urb->buffer_length, urb->buffer );
+
+	urb->type = getIsochronousType();
+	urb->flags = getIsochronousFlags(urb->flags);
+	urb->number_of_packets = 1;
+	urb->iso_frame_desc[0].length = urb->buffer_length;
+
+	debug_urb( env, "isochronous_pipe_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+END_SUBMIT:
+	if (ret)
+		if (urb->buffer) free(urb->buffer);
+
+	if (data) CheckedDeleteLocalRef( env, data );
+
+	return ret;
+}
+
+/**
+ * Complete a simple isochronous pipe request.
+ * @param env The JNIEnv.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ * @param urb the usbdevfs_usb.
+ * @return The error that occurred, or 0.
+ */
+int complete_isochronous_pipe_request( JNIEnv *env, jobject linuxPipeRequest, struct usbdevfs_urb *urb )
+{
+	jclass LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	jmethodID setActualLength = CheckedGetMethodID( env, LinuxPipeRequest, "setActualLength", "(I)V" );
+	jmethodID getData = CheckedGetMethodID( env, LinuxPipeRequest, "getData", "()[B" );
+	jmethodID getOffset = CheckedGetMethodID( env, LinuxPipeRequest, "getOffset", "()I" );
+	jmethodID getLength = CheckedGetMethodID( env, LinuxPipeRequest, "getLength", "()I" );
+	jbyteArray data = CheckedCallObjectMethod( env, linuxPipeRequest, getData );
+	unsigned int offset = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getOffset );
+	unsigned int length = (unsigned int)CheckedCallIntMethod( env, linuxPipeRequest, getLength );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (length < urb->actual_length) {
+		log( LOG_XFER_ERROR, "Actual length %d greater than requested length %d", urb->actual_length, length );
+		urb->actual_length = length;
+	}
+
+	CheckedSetByteArrayRegion( env, data, offset, urb->actual_length, urb->buffer );
+
+	CheckedCallVoidMethod( env, linuxPipeRequest, setActualLength, urb->iso_frame_desc[0].actual_length );
+
+	if (data) CheckedDeleteLocalRef( env, data );
+	if (urb->buffer) free(urb->buffer);
+
+	return urb->iso_frame_desc[0].status;
+}
+
+/* Complex isochronous functions */
+
+static inline int create_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb );
+static inline int destroy_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb );
+
+/**
+ * Submit a complex isochronous pipe request.
+ * Note that this does not support _disabling_ short packets.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxIsochronousRequest The LinuxIsochronousRequest.
+ * @return The error that occurred, or 0.
+ */
+int isochronous_request( JNIEnv *env, int fd, jobject linuxIsochronousRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret = 0, npackets, bufsize, urbsize;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getAcceptShortPacket, getTotalLength, size, setUrbAddress, getEndpointAddress;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getAcceptShortPacket = CheckedGetMethodID( env, LinuxIsochronousRequest, "getAcceptShortPacket", "()Z" );
+	getTotalLength = CheckedGetMethodID( env, LinuxIsochronousRequest, "getTotalLength", "()I" );
+	size = CheckedGetMethodID( env, LinuxIsochronousRequest, "size", "()I" );
+	setUrbAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "setUrbAddress", "(J)V" );
+	getEndpointAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "getEndpointAddress", "()B" );
+	npackets = (unsigned int)CheckedCallIntMethod( env, linuxIsochronousRequest, size );
+	bufsize = (unsigned int)CheckedCallIntMethod( env, linuxIsochronousRequest, getTotalLength );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	urbsize = sizeof(*urb) + (npackets * sizeof(struct usbdevfs_iso_packet_desc));
+
+	if (!(urb = malloc(urbsize))) {
+		log( LOG_CRITICAL, "Out of memory! (%d bytes needed)", urbsize );
+		ret = -ENOMEM;
+		goto ISOCHRONOUS_REQUEST_END;
+	}
+
+	memset(urb, 0, urbsize);
+
+	urb->number_of_packets = npackets;
+	urb->buffer_length = bufsize;
+
+	if (!(urb->buffer = malloc(urb->buffer_length))) {
+		log( LOG_CRITICAL, "Out of memory! (%d needed)", urb->buffer_length );
+		ret = -ENOMEM;
+		goto ISOCHRONOUS_REQUEST_END;
+	}
+
+	memset(urb->buffer, 0, urb->buffer_length);
+
+	if ((ret = create_iso_buffer( env, linuxIsochronousRequest, urb )))
+		goto ISOCHRONOUS_REQUEST_END;
+
+	urb->type = getIsochronousType();
+	urb->usercontext = CheckedNewGlobalRef( env, linuxIsochronousRequest );
+	urb->endpoint = (unsigned char)CheckedCallByteMethod( env, linuxIsochronousRequest, getEndpointAddress );
+	urb->flags = getIsochronousFlags(urb->flags);
+
+	log( LOG_XFER_OTHER, "Submitting URB" );
+	debug_urb( env, "isochronous_request", urb );
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_SUBMITURB, urb )))
+		ret = -errno;
+
+	if (ret) {
+		log( LOG_XFER_ERROR, "Could not submit URB (errno %d)", ret );
+	} else {
+		log( LOG_XFER_OTHER, "isochronous_request : Submitted URB" );
+		CheckedCallVoidMethod( env, linuxIsochronousRequest, setUrbAddress, urb );
+	}
+
+ISOCHRONOUS_REQUEST_END:
+	if (ret) {
+		if (urb) {
+			if (urb->usercontext) CheckedDeleteGlobalRef( env, urb->usercontext);
+			if (urb->buffer) free(urb->buffer);
+			free(urb);
+		}
+	}
+
+	return ret;
+}
+
+/**
+ * Cancel a complex isochronous request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxIsochronousRequest The LinuxIsochronousRequest.
+ */
+void cancel_isochronous_request( JNIEnv *env, int fd, jobject linuxIsochronousRequest )
+{
+	struct usbdevfs_urb *urb;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getUrbAddress;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getUrbAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "getUrbAddress", "()J" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	log( LOG_XFER_OTHER, "Canceling URB" );
+
+	urb = (struct usbdevfs_urb *)CheckedCallLongMethod( env, linuxIsochronousRequest, getUrbAddress );
+
+	if (!urb) {
+		log( LOG_XFER_ERROR, "No URB to cancel" );
+		return;
+	}
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_DISCARDURB, urb )))
+		log( LOG_XFER_ERROR, "Could not unlink urb %p (error %d)", urb, -errno );
+}
+
+/**
+ * Complete a complex isochronous pipe request.
+ * @param env The JNIEnv.
+ * @param linuxIsochronousRequest The LinuxIsochronousRequest.
+ * @return The error that occurred, or 0.
+ */
+int complete_isochronous_request( JNIEnv *env, jobject linuxIsochronousRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getUrbAddress;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getUrbAddress = CheckedGetMethodID( env, LinuxIsochronousRequest, "getUrbAddress", "()J" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	if (!(urb = (struct usbdevfs_urb*)CheckedCallLongMethod( env, linuxIsochronousRequest, getUrbAddress ))) {
+		log( LOG_XFER_ERROR, "No URB to complete!" );
+		return -EINVAL;
+	}
+
+	log( LOG_XFER_OTHER, "Completing URB" );
+	debug_urb( env, "complete_isochronous_request", urb );
+
+	ret = destroy_iso_buffer( env, linuxIsochronousRequest, urb );
+
+	free(urb->buffer);
+	free(urb);
+
+	log( LOG_XFER_OTHER, "Completed URB" );
+
+	return ret;
+}
+
+/**
+ * Create the multi-packet ISO buffer and iso_frame_desc's.
+ */
+static inline int create_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb )
+{
+	int i, offset = 0, buffer_offset = 0;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getDirection, getData, getOffset, getLength;
+	jbyteArray jbuf;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getDirection = CheckedGetMethodID( env, LinuxIsochronousRequest, "getDirection", "()B" );
+	getData = CheckedGetMethodID( env, LinuxIsochronousRequest, "getData", "(I)[B" );
+	getOffset = CheckedGetMethodID( env, LinuxIsochronousRequest, "getOffset", "(I)I" );
+	getLength = CheckedGetMethodID( env, LinuxIsochronousRequest, "getLength", "(I)I" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	for (i=0; i<urb->number_of_packets; i++) {
+	  if (!(jbuf = CheckedCallObjectMethod( env, linuxIsochronousRequest, getData, i ))) {
+		log( LOG_XFER_ERROR, "Could not access data at index %d", i );
+		return -EINVAL;
+	  }
+
+	  offset = CheckedCallIntMethod( env, linuxIsochronousRequest, getOffset, i );
+	  urb->iso_frame_desc[i].length = CheckedCallIntMethod( env, linuxIsochronousRequest, getLength, i );
+	  CheckedGetByteArrayRegion( env, jbuf, offset, urb->iso_frame_desc[i].length, urb->buffer + buffer_offset );
+	  buffer_offset += urb->iso_frame_desc[i].length;
+
+	  CheckedDeleteLocalRef( env, jbuf );
+	}
+
+	return 0;
+}
+
+/**
+ * Destroy the multi-packet ISO buffer and iso_frame_desc's.
+ */
+static inline int destroy_iso_buffer( JNIEnv *env, jobject linuxIsochronousRequest, struct usbdevfs_urb *urb )
+{
+	int i, offset = 0, buffer_offset = 0, actual_length = 0;
+
+	jclass LinuxIsochronousRequest;
+	jmethodID getDirection, getData, getOffset, setActualLength, setError;
+	jbyteArray jbuf;
+
+	LinuxIsochronousRequest = CheckedGetObjectClass( env, linuxIsochronousRequest );
+	getDirection = CheckedGetMethodID( env, LinuxIsochronousRequest, "getDirection", "()B" );
+	getData = CheckedGetMethodID( env, LinuxIsochronousRequest, "getData", "(I)[B" );
+	getOffset = CheckedGetMethodID( env, LinuxIsochronousRequest, "getOffset", "(I)I" );
+	setActualLength = CheckedGetMethodID( env, LinuxIsochronousRequest, "setActualLength", "(II)V" );
+	setError = CheckedGetMethodID( env, LinuxIsochronousRequest, "setError", "(II)V" );
+	CheckedDeleteLocalRef( env, LinuxIsochronousRequest );
+
+	for (i=0; i<urb->number_of_packets; i++) {
+	  if (!(jbuf = CheckedCallObjectMethod( env, linuxIsochronousRequest, getData, i ))) {
+		log( LOG_XFER_ERROR, "Could not access data buffer at index %d", i );
+		return -EINVAL;
+	  }
+
+	  offset = CheckedCallIntMethod( env, linuxIsochronousRequest, getOffset, i );
+	  actual_length = urb->iso_frame_desc[i].actual_length;
+	  if ((offset + actual_length) > CheckedGetArrayLength( env, jbuf )) {
+		log( LOG_XFER_ERROR, "Data buffer %d too small, data truncated!", i );
+		actual_length = CheckedGetArrayLength( env, jbuf ) - offset;
+	  }
+	  CheckedSetByteArrayRegion( env, jbuf, offset, actual_length, urb->buffer + buffer_offset );
+	  CheckedCallVoidMethod( env, linuxIsochronousRequest, setActualLength, i, actual_length );
+	  if (0 > urb->iso_frame_desc[i].status)
+		CheckedCallVoidMethod( env, linuxIsochronousRequest, setError, i, urb->iso_frame_desc[i].status );
+	  buffer_offset += urb->iso_frame_desc[i].length;
+
+	  CheckedDeleteLocalRef( env, jbuf );
+	}
+			
+//FIXME - what should we return here, this or something based on each packet's status?
+	return urb->status;
+}
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbKernel.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbKernel.c
new file mode 100644
index 0000000000000000000000000000000000000000..22440ff85176e103c65f8e43b439770385926d63
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbKernel.c
@@ -0,0 +1,152 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+static int kernel_version = 0;
+
+#define KERNEL_VERSION(version,patchlevel,sublevel) ((version<<16) | (patchlevel<<8) | sublevel)
+
+// This is defined as various names in different kernel versions but the number is always the same
+#define NO_ACCEPT_SHORT_PACKET 0x0001
+
+// This is defined only in 2.4 kernels.
+#define QUEUE_BULK 0x10
+#define QUEUE_BULK_LAST_KERNEL_VERSION KERNEL_VERSION(2,4,29)
+
+// 2.4 USB subsystems do not allow queued interrupt transfers but do allow (encourage?) interrupt-using-bulk
+#define INTERRUPT_USES_BULK_LAST_KERNEL_VERSION KERNEL_VERSION(2,4,99)
+
+static void setKernelVersion(void)
+{
+	struct utsname name;
+
+	if (!uname(&name)) {
+		char *p = name.release;
+		int num[3], i;
+
+		for (i=0; i<3; i++) {
+		  			errno = 0;
+ 			if (((int)*p < '0') || ((int)*p > '9')) {
+		  				log(LOG_ERROR, "Could not parse release string %s : %s", name.release, strerror(errno));
+		  				break;
+		  			} else {
+                        num[i] = strtol(p, &p,0);
+		  				p++;
+			}
+		}
+		if (3 == i) {
+			log(LOG_INFO, "Kernel version string %s parsed as %d.%d.%d",name.release,num[0],num[1],num[2]);
+			kernel_version = KERNEL_VERSION(num[0],num[1],num[2]);
+			return;
+		}
+	}
+
+	log(LOG_CRITICAL, "Could not determine kernel version : %s", strerror(errno));
+	log(LOG_ERROR, "Using (most likely wrong) kernel version of 2.4.0");
+	kernel_version = KERNEL_VERSION(2,4,0);
+}
+
+static int getKernelVersion(void)
+{
+	if (!kernel_version)
+		setKernelVersion();
+
+	return kernel_version;
+}
+
+/* Get the flag for queueing bulk transfers, only used on older kernels. */
+static int getQueueBulkFlag(void)
+{
+	return (QUEUE_BULK_LAST_KERNEL_VERSION >= getKernelVersion() ? QUEUE_BULK : 0);
+}
+
+/* Get the flag for accepting/rejecting short packets.
+ * The parameter is whether short packets should be accepted or not.
+ */
+int getShortPacketFlag(int accept) { return ( accept ? 0 : NO_ACCEPT_SHORT_PACKET ); }
+
+/* This sets/clears flags as appropriate to the transfer type.
+ * The parameter is the existing flags, the return is the modified flags.
+ */
+int getIsochronousFlags(int flags) { return (~NO_ACCEPT_SHORT_PACKET & (USBDEVFS_URB_ISO_ASAP | flags)); }
+int getControlFlags(int flags) { return flags; }
+int getBulkFlags(int flags) { return getQueueBulkFlag() | flags; }
+int getInterruptFlags(int flags)
+{
+	return ((INTERRUPT_USES_BULK_LAST_KERNEL_VERSION >= getKernelVersion()) ? (getBulkFlags(flags)) : flags);
+}
+
+// These #defined values have never changed name
+int getIsochronousType(void) { return USBDEVFS_URB_TYPE_ISO; }
+int getControlType(void) { return USBDEVFS_URB_TYPE_CONTROL; }
+int getBulkType(void) { return USBDEVFS_URB_TYPE_BULK; }
+int getInterruptType(void)
+{
+	return (INTERRUPT_USES_BULK_LAST_KERNEL_VERSION >= getKernelVersion() ? getBulkType() : USBDEVFS_URB_TYPE_INTERRUPT);
+}
+
+
+// These are probably not the best way to determine where the usbfs is but it's simple.
+
+#define USBDEVFS_PATH_OLD "/proc/bus/usb"
+#define USBDEVFS_DEVICES_OLD "/proc/bus/usb/devices"
+#define USBDEVFS_SPRINTF_NODE_OLD "/proc/bus/usb/%3.03d/%3.03d"
+#define USBDEVFS_SSCANF_NODE_OLD "/proc/bus/usb/%3d/%3d"
+
+#define USBDEVFS_PATH_NEW "/dev/bus/usb"
+#define USBDEVFS_DEVICES_NEW "/dev/bus/usb/devices"
+#define USBDEVFS_SPRINTF_NODE_NEW1 "/dev/bus/usb/%3.03d/%3.03d"
+#define USBDEVFS_SPRINTF_NODE_NEW2 "/dev/bus/usb/%d/%d"
+#define USBDEVFS_SSCANF_NODE_NEW1 "/dev/bus/usb/%3d/%3d"
+#define USBDEVFS_SSCANF_NODE_NEW2 "/dev/bus/usb/%d/%d"
+#define USBDEVFS_CHECK_NODE_NEW1 "/dev/bus/usb/001/001"
+#define USBDEVFS_CHECK_NODE_NEW2 "/dev/bus/usb/1/1"
+
+char *usbdevfs_path()
+{
+	struct stat buf;
+	if ((0 == stat(USBDEVFS_PATH_NEW, &buf)) && S_ISDIR(buf.st_mode))
+		return USBDEVFS_PATH_NEW;
+	else
+		return USBDEVFS_PATH_OLD;
+}
+
+char *usbdevfs_devices_filename()
+{
+	struct stat buf;
+	if (0 == stat(USBDEVFS_DEVICES_NEW, &buf))
+		return USBDEVFS_DEVICES_NEW;
+	else
+		return USBDEVFS_DEVICES_OLD;
+}
+
+char *usbdevfs_sscanf_node()
+{
+	struct stat buf;
+	if ((0 == stat(USBDEVFS_CHECK_NODE_NEW1, &buf)))
+		return USBDEVFS_SSCANF_NODE_NEW1;
+	else if ((0 == stat(USBDEVFS_CHECK_NODE_NEW2, &buf)))
+		return USBDEVFS_SSCANF_NODE_NEW2;
+	else
+		return USBDEVFS_SSCANF_NODE_OLD;
+}
+
+char *usbdevfs_sprintf_node()
+{
+	struct stat buf;
+	if ((0 == stat(USBDEVFS_CHECK_NODE_NEW1, &buf)))
+		return USBDEVFS_SPRINTF_NODE_NEW1;
+	else if ((0 == stat(USBDEVFS_CHECK_NODE_NEW2, &buf)))
+		return USBDEVFS_SPRINTF_NODE_NEW2;
+	else
+		return USBDEVFS_SPRINTF_NODE_OLD;
+}
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbKernel.h b/target-platform/javax.usb.linux/src/main/c/JavaxUsbKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..909495bce874792909cf6f11ffaa02ea4dc47668
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbKernel.h
@@ -0,0 +1,155 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAX_USB_KERNEL_H
+#define _JAVAX_USB_KERNEL_H
+
+//******************************************************************************
+// Kernel-specific
+
+#include <sys/utsname.h>
+
+// I give up - the kernel guys can't keep their headers clean enough to include them from userspace programs.
+// So everything we need is redefined here.
+
+#define USB_DT_DEVICE			0x01
+#define USB_DT_CONFIG			0x02
+#define USB_DT_STRING			0x03
+#define USB_DT_INTERFACE		0x04
+#define USB_DT_ENDPOINT			0x05
+
+#define USB_DT_HID			0x21
+#define USB_DT_REPORT			0x22
+#define USB_DT_PHYSICAL			0x23
+#define USB_DT_HUB			0x29
+
+/*
+ * Descriptor sizes per descriptor type
+ */
+#define USB_DT_DEVICE_SIZE		18
+#define USB_DT_CONFIG_SIZE		9
+#define USB_DT_INTERFACE_SIZE		9
+#define USB_DT_ENDPOINT_SIZE		7
+#define USB_DT_ENDPOINT_AUDIO_SIZE	9	/* Audio extension */
+#define USB_DT_HUB_NONVAR_SIZE		7
+
+#define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
+#define USB_CLASS_AUDIO			1
+#define USB_CLASS_COMM			2
+#define USB_CLASS_HID			3
+#define USB_CLASS_PRINTER		7
+#define USB_CLASS_PTP			6
+#define USB_CLASS_MASS_STORAGE		8
+#define USB_CLASS_HUB			9
+#define USB_CLASS_DATA			10
+#define USB_CLASS_VENDOR_SPEC		0xff
+
+#define USBDEVFS_URB_SHORT_NOT_OK          1
+#define USBDEVFS_URB_ISO_ASAP              2
+
+#define USBDEVFS_URB_TYPE_ISO		   0
+#define USBDEVFS_URB_TYPE_INTERRUPT	   1
+#define USBDEVFS_URB_TYPE_CONTROL	   2
+#define USBDEVFS_URB_TYPE_BULK		   3
+
+struct usbdevfs_ctrltransfer {
+	unsigned char bmRequestType;
+	unsigned char bRequest;
+	unsigned short wValue;
+	unsigned short wIndex;
+	unsigned short wLength;
+	unsigned int timeout;  /* in milliseconds */
+	void *data;
+};
+
+struct usbdevfs_setinterface {
+	unsigned int interface;
+	unsigned int altsetting;
+};
+
+struct usbdevfs_iso_packet_desc {
+	unsigned int length;
+	unsigned int actual_length;
+	unsigned int status;
+};
+
+struct usbdevfs_urb {
+	unsigned char type;
+	unsigned char endpoint;
+	int status;
+	unsigned int flags;
+	void  *buffer;
+	int buffer_length;
+	int actual_length;
+	int start_frame;
+	int number_of_packets;
+	int error_count;
+	unsigned int signr;  /* signal to be sent on error, -1 if none should be sent */
+	void *usercontext;
+	struct usbdevfs_iso_packet_desc iso_frame_desc[0];
+};
+
+#define USBDEVFS_MAXDRIVERNAME 255
+
+struct usbdevfs_getdriver {
+	unsigned int interface;
+	char driver[USBDEVFS_MAXDRIVERNAME + 1];
+};
+
+struct usbdevfs_connectinfo {
+	unsigned int devnum;
+	unsigned char slow;
+};
+
+struct usbdevfs_ioctl {
+	int	ifno;		/* interface 0..N ; negative numbers reserved */
+	int	ioctl_code;	/* MUST encode size + direction of data so the
+				 * macros in <asm/ioctl.h> give correct values */
+	void  *data;	/* param buffer (in, or out) */
+};
+
+struct usbdevfs_hub_portinfo {
+	char nports;		/* number of downstream ports in this hub */
+	char port [127];	/* e.g. port 3 connects to device 27 */
+};
+
+#define USBDEVFS_CONTROL           _IOWR('U', 0, struct usbdevfs_ctrltransfer)
+#define USBDEVFS_SETINTERFACE      _IOR('U', 4, struct usbdevfs_setinterface)
+#define USBDEVFS_SETCONFIGURATION  _IOR('U', 5, unsigned int)
+#define USBDEVFS_GETDRIVER         _IOW('U', 8, struct usbdevfs_getdriver)
+#define USBDEVFS_SUBMITURB         _IOR('U', 10, struct usbdevfs_urb)
+#define USBDEVFS_DISCARDURB        _IO('U', 11)
+#define USBDEVFS_REAPURB           _IOW('U', 12, void *)
+#define USBDEVFS_REAPURBNDELAY     _IOW('U', 13, void *)
+#define USBDEVFS_CLAIMINTERFACE    _IOR('U', 15, unsigned int)
+#define USBDEVFS_RELEASEINTERFACE  _IOR('U', 16, unsigned int)
+#define USBDEVFS_CONNECTINFO       _IOW('U', 17, struct usbdevfs_connectinfo)
+#define USBDEVFS_IOCTL             _IOWR('U', 18, struct usbdevfs_ioctl)
+#define USBDEVFS_HUB_PORTINFO      _IOR('U', 19, struct usbdevfs_hub_portinfo)
+#define USBDEVFS_DISCONNECT        _IO('U', 22)
+
+int getShortPacketFlag(int accept);
+
+int getIsochronousFlags(int flags);
+int getInterruptFlags(int flags);
+int getControlFlags(int flags);
+int getBulkFlags(int flags);
+
+int getIsochronousType(void);
+int getInterruptType(void);
+int getControlType(void);
+int getBulkType(void);
+
+char *usbdevfs_path();
+char *usbdevfs_devices_filename();
+char *usbdevfs_sscanf_node();
+char *usbdevfs_sprintf_node();
+
+#endif /* _JAVAX_USB_KERNEL_H */
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbLog.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbLog.c
new file mode 100644
index 0000000000000000000000000000000000000000..227d48d59c12587bc1ed469f5985c95ef07b2069
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbLog.c
@@ -0,0 +1,91 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+#define JAVAXUSB_CLASSNAME "com/ibm/jusb/os/linux/JavaxUsb"
+
+jboolean tracing = JNI_TRUE;
+jboolean trace_default = JNI_TRUE;
+jboolean trace_hotplug = JNI_TRUE;
+jboolean trace_xfer = JNI_TRUE;
+jboolean trace_urb = JNI_FALSE;
+int trace_level = LOG_CRITICAL;
+FILE *trace_output = NULL;
+
+//FIXME - add parameter to modify this!!!
+jboolean trace_flush = JNI_TRUE;
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTracing
+(JNIEnv *env, jclass JavaxUsb, jboolean enable)
+{
+	tracing = enable;
+}
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceType
+(JNIEnv *env, jclass JavaxUsb, jboolean setting, jstring jname)
+{
+	const char *name = (*env)->GetStringUTFChars( env, jname, NULL );
+	if (!strcmp("default", name))
+		trace_default = setting;
+	else if (!strcmp("hotplug", name))
+		trace_hotplug = setting;
+	else if (!strcmp("xfer", name))
+		trace_xfer = setting;
+	else if (!strcmp("urb", name))
+		trace_urb = setting;
+	else
+		log( LOG_ERROR, "No match for log type %s", name );
+	(*env)->ReleaseStringUTFChars( env, jname, name );
+}
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceLevel
+(JNIEnv *env, jclass JavaxUsb, jint level)
+{
+	if (LOG_LEVEL_MIN > level || LOG_LEVEL_MAX < level)
+		log( LOG_ERROR, "Invalid trace level %d", level );
+	else
+		trace_level = level;
+}
+
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceOutput
+(JNIEnv *env, jclass JavaxUsb, jint output, jstring filename)
+{
+	switch (output) {
+		case 1:
+			trace_output = stdout;
+			break;
+
+		case 2:
+			trace_output = stderr;
+			break;
+
+		case 3:
+		case 4:
+			{
+				const char *name = (*env)->GetStringUTFChars( env, filename, NULL );
+				FILE *f = NULL;
+				const char *mode = (3 == output ? "w" : "a"); /* w = trunc, a = append */
+
+				if ((f = fopen(name, mode)))
+					trace_output = f;
+				else
+					log( LOG_ERROR, "Could not open file %s for JNI tracing : %s\n", name, strerror(errno) );
+
+				(*env)->ReleaseStringUTFChars( env, filename, name );
+			}
+			break;
+
+		default:
+			log( LOG_ERROR, "Invalid trace output setting %d\n", output );
+			break;
+	}
+}
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbLog.h b/target-platform/javax.usb.linux/src/main/c/JavaxUsbLog.h
new file mode 100644
index 0000000000000000000000000000000000000000..d917a2898d3f1c1e676c6488c190ab16c9031afd
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbLog.h
@@ -0,0 +1,109 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#ifndef _JAVAXUSBLOG_H
+#define _JAVAXUSBLOG_H
+
+#include <jni.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern jboolean tracing;
+extern jboolean trace_default;
+extern jboolean trace_hotplug;
+extern jboolean trace_xfer;
+extern jboolean trace_urb;
+extern int trace_level;
+extern FILE *trace_output;
+extern jboolean trace_flush;
+
+/* Log to trace_output FILE* (stderr by default). */
+#define log(level,args...) do { \
+  if (!tracing || (trace_level < LOG_LEVEL(level))) break; \
+  if (LOG_XFER_FLAG&level) log_xfer(level,args); \
+  else if (LOG_HOTPLUG_FLAG&level) log_hotplug(level,args); \
+  else if (LOG_URB_FLAG&level) log_urb(level,args); \
+  else log_default(level,args); \
+} while(0)
+
+#define LOG_LEVEL(level) (LOG_LEVEL_MASK&level)
+#define LOG_TYPE(type) (LOG_FLAG_MASK&level)
+
+#define LOG_LEVEL_MASK    0x00ff
+#define LOG_LEVEL_MIN     0x0000
+#define LOG_LEVEL_MAX     0x00ff
+#define LOG_FLAG_MASK     0x0f00
+#define LOG_XFER_FLAG     0x0100
+#define LOG_HOTPLUG_FLAG  0x0200
+#define LOG_URB_FLAG      0x0400
+
+/* Logging levels: */
+#define LOG_CRITICAL  0x00 /* critical messages, this is the default */
+#define LOG_ERROR     0x01 /* error messages */
+#define LOG_INFO      0x02 /* function internal */
+#define LOG_FUNC      0x03 /* function entry/exit */
+#define LOG_DEBUG     0x04 /* debugging */
+#define LOG_OTHER     0x05 /* all other logging */
+
+/* Log data transfers */
+#define log_xfer(level,args...) do { if (trace_xfer) log_named(level,"xfer",args); } while(0)
+#define LOG_XFER_CRITICAL  (LOG_XFER_FLAG | 0x00) /* critical xfers errors */
+#define LOG_XFER_ERROR     (LOG_XFER_FLAG | 0x01) /* xfer errors */
+#define LOG_XFER_REQUEST   (LOG_XFER_FLAG | 0x02) /* request received or completed */
+#define LOG_XFER_META      (LOG_XFER_FLAG | 0x03) /* metadata (device, endpoint, setup, etc) */
+#define LOG_XFER_DATA      (LOG_XFER_FLAG | 0x04) /* raw data only */
+#define LOG_XFER_OTHER     (LOG_XFER_FLAG | 0x05) /* all other transfer logging */
+
+/* Log hotplug / initialization */
+#define log_hotplug(level,args...) do { if (trace_hotplug) log_named(level,"hotplug",args); } while(0)
+#define LOG_HOTPLUG_CRITICAL (LOG_HOTPLUG_FLAG | 0x00) /* critical hotplug errors */
+#define LOG_HOTPLUG_ERROR    (LOG_HOTPLUG_FLAG | 0x01) /* hotplug errors */
+#define LOG_HOTPLUG_CHANGE   (LOG_HOTPLUG_FLAG | 0x02) /* connect/disconnect notices */
+#define LOG_HOTPLUG_DEVICE   (LOG_HOTPLUG_FLAG | 0x03) /* device information */
+#define LOG_HOTPLUG_OTHER    (LOG_HOTPLUG_FLAG | 0x04) /* all other logging */
+
+/* Log urb data */
+#define log_urb(level,args...) do { if (trace_urb) log_named(level,"urb",args); } while(0)
+#define LOG_URB_METADATA (LOG_URB_FLAG | 0x02) /* URB fields */
+#define LOG_URB_DATA     (LOG_URB_FLAG | 0x03) /* Actual URB data */
+
+#define log_default(level,args...) do { if (trace_default) log_named(level,"default",args); } while(0)
+
+static char *log_oom = "Out of memory while logging!";
+#define DEFAULT_LOG_LEN 256
+#define OLD_GLIBC_MAX_LOG_LEN 1024 /* If glibc is 2.0 or lower, snprintf does not report needed length, so set this as max */
+#define log_named(level,logname,args...) \
+do { \
+  char buf1[DEFAULT_LOG_LEN], *buf2 = NULL, *buffer = buf1; \
+  int real_len; \
+  real_len = snprintf(buffer, DEFAULT_LOG_LEN, args); \
+  if (0 > real_len || DEFAULT_LOG_LEN <= real_len) { \
+    int full_len = (0 > real_len ? OLD_GLIBC_MAX_LOG_LEN : real_len+1); \
+    if (!(buf2 = malloc(full_len))) { \
+      buffer = log_oom; \
+    } else { \
+      buffer = buf2; \
+      real_len = snprintf(buffer, full_len, args); \
+      buffer[((real_len < full_len-1 && 0 <= real_len) ? real_len : full_len-1)] = 0; \
+    } \
+  } \
+  do_log(logname,(LOG_LEVEL_MASK&level),__FILE__,__func__,__LINE__,buffer); \
+  if (buf2) free(buf2); \
+} while (0)
+
+#define do_log(logname, level, file, func, line, msg) do { \
+	if (trace_output) { \
+		fprintf(trace_output, "[%s](%d) %s.%s[%d] %s\n",logname,level,file,func,line,msg); \
+		if (JNI_TRUE == trace_flush) fflush(trace_output); \
+	} \
+} while(0)
+
+#endif /* _JAVAXUSBLOG_H */
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbPipeRequest.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbPipeRequest.c
new file mode 100644
index 0000000000000000000000000000000000000000..8ef2085cc6385c010fafedfc23c41288f7317cfb
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbPipeRequest.c
@@ -0,0 +1,160 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/* These MUST match those defined in com/ibm/jusb/os/linux/LinuxPipeRequest.java */
+#define PIPE_CONTROL 1
+#define PIPE_BULK 2
+#define PIPE_INTERRUPT 3
+#define PIPE_ISOCHRONOUS 4
+
+/**
+ * Submit a pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxRequest The LinuxRequest.
+ * @return The error, or 0.
+ */
+int pipe_request( JNIEnv *env, int fd, jobject linuxRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret = 0, type, urbsize;
+
+	jclass LinuxPipeRequest = NULL;
+	jobject linuxPipeRequest = NULL;
+	jmethodID setUrbAddress, getAcceptShortPacket, getEndpointAddress, getPipeType;
+	jboolean acceptShortPacket;
+
+	linuxPipeRequest = CheckedNewGlobalRef( env, linuxRequest );
+	LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	getEndpointAddress = CheckedGetMethodID( env, LinuxPipeRequest, "getEndpointAddress", "()B" );
+	getPipeType = CheckedGetMethodID( env, LinuxPipeRequest, "getPipeType", "()I" );
+	type = CheckedCallIntMethod( env, linuxPipeRequest, getPipeType );
+	setUrbAddress = CheckedGetMethodID( env, LinuxPipeRequest, "setUrbAddress", "(J)V" );
+	getAcceptShortPacket = CheckedGetMethodID( env, LinuxPipeRequest, "getAcceptShortPacket", "()Z" );
+	acceptShortPacket = CheckedCallBooleanMethod( env, linuxPipeRequest, getAcceptShortPacket );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	urbsize = sizeof(*urb);
+	if (PIPE_ISOCHRONOUS == type)
+		urbsize += sizeof(struct usbdevfs_iso_packet_desc);
+
+	if (!(urb = malloc(urbsize))) {
+		log( LOG_CRITICAL, "Out of memory!" );
+		ret = -ENOMEM;
+		goto end;
+	}
+
+	memset(urb, 0, sizeof(*urb));
+
+	urb->endpoint = (unsigned char)CheckedCallByteMethod( env, linuxPipeRequest, getEndpointAddress );
+	urb->usercontext = linuxPipeRequest;
+	urb->flags |= getShortPacketFlag(acceptShortPacket);
+
+	log( LOG_XFER_REQUEST, "Submitting URB" );
+
+	switch (type) {
+	case PIPE_CONTROL: ret = control_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	case PIPE_BULK: ret = bulk_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	case PIPE_INTERRUPT: ret = interrupt_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	case PIPE_ISOCHRONOUS: ret = isochronous_pipe_request( env, fd, linuxPipeRequest, urb ); break;
+	default: log( LOG_XFER_ERROR, "Unknown pipe type %d", type ); ret = -EINVAL; break;
+	}
+
+	if (ret) {
+		log( LOG_XFER_ERROR, "Could not submit URB (errno %d)", ret );
+	} else {
+		log( LOG_XFER_REQUEST, "Submitted URB" );
+		CheckedCallVoidMethod( env, linuxPipeRequest, setUrbAddress, urb );
+	}
+
+end:
+	if (ret) {
+			if (linuxPipeRequest) CheckedDeleteGlobalRef( env, linuxPipeRequest );
+			if (urb) free(urb);
+	}
+
+	return ret;
+}
+
+/**
+ * Complete a pipe request.
+ * @param env The JNIEnv.
+ * @param linuxRequest The LinuxRequest.
+ * @return The error or 0.
+ */
+int complete_pipe_request( JNIEnv *env, jobject linuxPipeRequest )
+{
+	struct usbdevfs_urb *urb;
+	int ret = 0, type;
+
+	jclass LinuxPipeRequest;
+	jmethodID getPipeType, getUrbAddress;
+
+	LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	getPipeType = CheckedGetMethodID( env, LinuxPipeRequest, "getPipeType", "()I" );
+	getUrbAddress = CheckedGetMethodID( env, LinuxPipeRequest, "getUrbAddress", "()J" );
+	type = CheckedCallIntMethod( env, linuxPipeRequest, getPipeType );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	if (!(urb = (struct usbdevfs_urb*)CheckedCallLongMethod( env, linuxPipeRequest, getUrbAddress ))) {
+		log( LOG_XFER_ERROR, "No URB to complete." );
+		return -EINVAL;
+	}
+
+	log( LOG_XFER_REQUEST, "Completing URB." );
+	debug_urb( env, "complete_pipe_request", urb );
+
+	switch (type) {
+	case PIPE_CONTROL: ret = complete_control_pipe_request( env, linuxPipeRequest, urb ); break;
+	case PIPE_BULK: ret = complete_bulk_pipe_request( env, linuxPipeRequest, urb ); break;
+	case PIPE_INTERRUPT: ret = complete_interrupt_pipe_request( env, linuxPipeRequest, urb ); break;
+	case PIPE_ISOCHRONOUS: ret = complete_isochronous_pipe_request( env, linuxPipeRequest, urb ); break;
+	default: log( LOG_XFER_ERROR, "Unknown pipe type %d", type); ret = -EINVAL; break;
+	}
+
+	free(urb);
+
+	log( LOG_XFER_REQUEST, "Completed URB." );
+
+	return ret;
+}
+
+/**
+ * Abort a pipe request.
+ * @param env The JNIEnv.
+ * @param fd The file descriptor.
+ * @param linuxPipeRequest The LinuxPipeRequest.
+ */
+void cancel_pipe_request( JNIEnv *env, int fd, jobject linuxPipeRequest )
+{
+	struct usbdevfs_urb *urb;
+
+	jclass LinuxPipeRequest;
+	jmethodID getUrbAddress;
+
+	LinuxPipeRequest = CheckedGetObjectClass( env, linuxPipeRequest );
+	getUrbAddress = CheckedGetMethodID( env, LinuxPipeRequest, "getUrbAddress", "()J" );
+	CheckedDeleteLocalRef( env, LinuxPipeRequest );
+
+	log( LOG_XFER_REQUEST, "Canceling URB." );
+
+	urb = (struct usbdevfs_urb *)CheckedCallLongMethod( env, linuxPipeRequest, getUrbAddress );
+
+	if (!urb) {
+		log( LOG_XFER_ERROR, "No URB to cancel." );
+		return;
+	}
+
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_DISCARDURB, urb )))
+		log( LOG_XFER_ERROR, "Could not unlink urb %p (error %d)", urb, -errno );
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbTopologyListener.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbTopologyListener.c
new file mode 100644
index 0000000000000000000000000000000000000000..4824ccd947bb5f23c9c2dde4c1f559c68ce21ca3
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbTopologyListener.c
@@ -0,0 +1,76 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+/**
+ * Listener for connect/disconnect events
+ * @author Dan Streetman
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyListener
+			( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices ) {
+	struct pollfd devpoll;
+	int poll_timeout = -1;
+	int descriptor = 0;
+	int error = 0;
+	unsigned int pollingError = 0;
+
+	jclass LinuxUsbServices = CheckedGetObjectClass( env, linuxUsbServices );
+
+	jmethodID topologyChange = CheckedGetMethodID( env, LinuxUsbServices, "topologyChange", "()V" );
+
+	errno = 0;
+	descriptor = open( usbdevfs_devices_filename(), O_RDONLY, 0 );
+	if ( 0 >= descriptor ) {
+		log( LOG_HOTPLUG_CRITICAL, "Could not open %s", usbdevfs_devices_filename() );
+		error = errno;
+		goto TOPOLOGY_LISTENER_CLEANUP;
+	}
+
+	devpoll.fd = descriptor;
+	devpoll.events = POLLIN;
+
+	while ( 1 ) {
+		poll(&devpoll, 1, poll_timeout);
+
+		// Skip empty wake-ups
+		if ( 0x0 == devpoll.revents ) continue;
+
+		// Polling Error...strange...
+		if ( devpoll.revents & POLLERR ) {
+			log( LOG_HOTPLUG_ERROR, "Topology Polling error." );
+			if (MAX_POLLING_ERRORS < ++pollingError) {
+				log( LOG_HOTPLUG_CRITICAL, "%d polling errors; aborting!", pollingError );
+				error = -ENOLINK; /* gotta pick one of 'em */
+				break;
+			} else continue;
+		}
+
+		// Connect/Disconnect event...
+		if ( devpoll.revents & POLLIN ) {
+			log( LOG_HOTPLUG_CHANGE, "Got topology change event." );
+			CheckedCallVoidMethod( env, linuxUsbServices, topologyChange );
+			continue;
+		}
+
+		// Freak event...
+		log( LOG_HOTPLUG_CHANGE, "Unknown event received = 0x%x", devpoll.revents );
+	}
+
+	/* This should NOT happen! */
+	log( LOG_HOTPLUG_CRITICAL, "TopologyListener Exiting!" );
+	close( descriptor );
+
+TOPOLOGY_LISTENER_CLEANUP:
+	CheckedDeleteLocalRef( env, LinuxUsbServices );
+
+	return error;
+}
+
diff --git a/target-platform/javax.usb.linux/src/main/c/JavaxUsbTopologyUpdater.c b/target-platform/javax.usb.linux/src/main/c/JavaxUsbTopologyUpdater.c
new file mode 100644
index 0000000000000000000000000000000000000000..7fe47bda5ac07248627f2ef767b997fbb24f2d90
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/JavaxUsbTopologyUpdater.c
@@ -0,0 +1,353 @@
+
+/** 
+ * Copyright (c) 1999 - 2001, International Business Machines Corporation.
+ * All Rights Reserved.
+ *
+ * This software is provided and licensed under the terms and conditions
+ * of the Common Public License:
+ * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+ */
+
+#include "JavaxUsb.h"
+
+static inline int build_device( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices, unsigned char bus, unsigned char dev,
+	jobject parent, int parentport, jobject connectedDevices, jobject disconnectedDevices );
+
+static inline int build_config( JNIEnv *env, jclass JavaxUsb, int fd, jobject device, unsigned char bus, unsigned char dev );
+
+static inline jobject build_interface( JNIEnv *env, jclass JavaxUsb, int fd, jobject config, struct jusb_interface_descriptor *if_desc, unsigned char bus, unsigned char dev );
+
+static inline void build_endpoint( JNIEnv *env, jclass JavaxUsb, jobject interface, struct jusb_endpoint_descriptor *ep_desc );
+
+static inline void *get_descriptor( JNIEnv *env, int fd );
+
+static int select_usbfs(const struct dirent *entry);
+
+/**
+ * Update topology tree
+ * @author Dan Streetman
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyUpdater
+			( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices, jobject connectedDevices, jobject disconnectedDevices )
+{
+	int busses, port, devices = 0;
+	struct dirent **buslist = NULL;
+
+	jclass LinuxUsbServices = CheckedGetObjectClass( env, linuxUsbServices );
+	jmethodID getRootUsbHubImp = CheckedGetMethodID( env, LinuxUsbServices, "getRootUsbHubImp", "()Lcom/ibm/jusb/UsbHubImp;" );
+	jobject rootHub = CheckedCallObjectMethod( env, linuxUsbServices, getRootUsbHubImp );
+	CheckedDeleteLocalRef( env, LinuxUsbServices );
+
+	if (0 > (*env)->EnsureLocalCapacity(env, 40)) {
+		log( LOG_CRITICAL, "Could not reserve enough local references, Out of Memory!\n");
+		return -ENOMEM;
+	}
+
+ 	if (!rootHub) {
+		log( LOG_ERROR, "Could not get rootHub!\n");
+		return -EINVAL;
+	}
+
+	errno = 0;
+	if (0 > (busses = scandir(usbdevfs_path(), &buslist, select_usbfs, alphasort)) ) {
+		log( LOG_ERROR, "Could not access %s : %s", usbdevfs_path(), strerror(errno) );
+		return -errno;
+	}
+
+	for (port=0; port<busses; port++) {
+		struct dirent **devlist = NULL;
+		int bus, hcAddress, devs;
+		int busdir_len = strlen(usbdevfs_path()) + strlen(buslist[port]->d_name) + 2;
+		char busdir[busdir_len];
+
+		sprintf(busdir, "%s/%s", usbdevfs_path(), buslist[port]->d_name);
+		bus = atoi( buslist[port]->d_name );
+
+		errno = 0;
+		devs = scandir(busdir, &devlist, select_usbfs, alphasort);
+
+		if (0 > devs) {
+			log( LOG_ERROR, "Could not access device nodes in %s : %s", busdir, strerror(errno) );
+		} else if (!devs) {
+			log( LOG_ERROR, "No device nodes found in %s : %s", busdir, strerror(errno) );
+		} else {
+			/* Hopefully, the host controller has the lowest numbered address on this bus! */
+			hcAddress = atoi( devlist[0]->d_name );
+			devices += build_device( env, JavaxUsb, linuxUsbServices, bus, hcAddress, rootHub, port, connectedDevices, disconnectedDevices );
+		}
+
+		while (0 < devs) free(devlist[--devs]);
+		if (devlist) free(devlist);
+
+		free(buslist[port]);
+	}
+	free(buslist);
+
+	if (rootHub) CheckedDeleteLocalRef( env, rootHub );
+
+	return 0;
+}
+
+static inline int build_device( JNIEnv *env, jclass JavaxUsb, jobject linuxUsbServices, unsigned char bus, unsigned char dev,
+	jobject parent, int parentport, jobject connectedDevices, jobject disconnectedDevices )
+{
+	int fd = 0, port, ncfg;
+	int devices = 0, speed = SPEED_UNKNOWN;
+	struct usbdevfs_ioctl *usbioctl = NULL;
+	struct usbdevfs_hub_portinfo *portinfo = NULL;
+	struct usbdevfs_connectinfo *connectinfo = NULL;
+	struct jusb_device_descriptor *dev_desc = NULL;
+	int node_len = strlen(usbdevfs_path()) + 1 + 3 + 1 + 3 + 1;
+	char node[node_len];
+
+	jobject device = NULL, existingDevice = NULL;
+	jstring keyString = NULL;
+
+	jclass LinuxUsbServices = CheckedGetObjectClass( env, linuxUsbServices );
+	jmethodID createUsbHubImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbHubImp", "(Ljava/lang/String;I)Lcom/ibm/jusb/UsbHubImp;" );
+	jmethodID createUsbDeviceImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbDeviceImp", "(Ljava/lang/String;)Lcom/ibm/jusb/UsbDeviceImp;" );
+	jmethodID configureUsbDeviceImp = CheckedGetStaticMethodID( env, JavaxUsb, "configureUsbDeviceImp", "(Lcom/ibm/jusb/UsbDeviceImp;BBBBBBBBBBSSSSI)V" );
+	jmethodID checkUsbDeviceImp = CheckedGetMethodID( env, LinuxUsbServices, "checkUsbDeviceImp", "(Lcom/ibm/jusb/UsbHubImp;ILcom/ibm/jusb/UsbDeviceImp;Ljava/util/List;Ljava/util/List;)Lcom/ibm/jusb/UsbDeviceImp;" );
+	CheckedDeleteLocalRef( env, LinuxUsbServices );
+
+	sprintf(node, usbdevfs_sprintf_node(), (0xff&bus), (0xff&dev));
+
+	keyString = CheckedNewStringUTF( env, node );
+
+	log( LOG_HOTPLUG_DEVICE, "Building device %s", node );
+
+	fd = open( node, O_RDWR );
+	if ( 0 >= fd ) {
+		log( LOG_ERROR, "Could not access %s", node );
+		goto BUILD_DEVICE_EXIT;
+	}
+
+	if (!(dev_desc = get_descriptor( env, fd ))) {
+		log( LOG_ERROR, "Short read on device descriptor" );
+		goto BUILD_DEVICE_EXIT;
+	}
+
+	if (dev_desc->bDeviceClass == USB_CLASS_HUB) {
+		usbioctl = malloc(sizeof(*usbioctl));
+		portinfo = malloc(sizeof(*portinfo));
+		usbioctl->ioctl_code = USBDEVFS_HUB_PORTINFO;
+		usbioctl->ifno = 0;
+		usbioctl->data = portinfo;
+		errno = 0;
+		if (0 >= ioctl( fd, USBDEVFS_IOCTL, usbioctl )) {
+			log( LOG_ERROR, "Could not get portinfo from hub, error = %d", errno );
+			goto BUILD_DEVICE_EXIT;
+		} else {
+		  log( LOG_HOTPLUG_DEVICE, "Device is hub with %d ports",portinfo->nports );
+		}
+		free(usbioctl);
+		usbioctl = NULL;
+		device = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbHubImp, keyString, portinfo->nports );
+	} else {
+	  device = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbDeviceImp, keyString );
+	}
+
+	connectinfo = malloc(sizeof(*connectinfo));
+	errno = 0;
+	if (0 > (ioctl( fd, USBDEVFS_CONNECTINFO, connectinfo ))) {
+		log( LOG_ERROR, "Could not get connectinfo from device, error = %d", errno );
+		goto BUILD_DEVICE_EXIT;
+	} else {
+	  log( LOG_HOTPLUG_OTHER, "Device speed is %s", (connectinfo->slow?"1.5 Mbps":"12 Mbps") );
+	}
+	speed = ( connectinfo->slow ? SPEED_LOW : SPEED_FULL );
+	free(connectinfo);
+	connectinfo = NULL;
+
+	CheckedCallStaticVoidMethod( env, JavaxUsb, configureUsbDeviceImp, device, 
+		dev_desc->bLength, dev_desc->bDescriptorType,
+		dev_desc->bDeviceClass, dev_desc->bDeviceSubClass, dev_desc->bDeviceProtocol,
+		dev_desc->bMaxPacketSize0, dev_desc->iManufacturer, dev_desc->iProduct, dev_desc->iSerialNumber,
+		dev_desc->bNumConfigurations, dev_desc->idVendor, dev_desc->idProduct,
+		dev_desc->bcdDevice, dev_desc->bcdUSB, speed );
+
+	/* Build config descriptors */
+	for (ncfg=0; ncfg<dev_desc->bNumConfigurations; ncfg++) {
+		if (build_config( env, JavaxUsb, fd, device, bus, dev )) {
+			log( LOG_ERROR, "Could not get config %d for device %d", ncfg, dev );
+			goto BUILD_DEVICE_EXIT;
+		}
+	}
+
+	existingDevice = CheckedCallObjectMethod( env, linuxUsbServices, checkUsbDeviceImp, parent, parentport+1, device, connectedDevices, disconnectedDevices );
+	CheckedDeleteLocalRef( env, device );
+	device = existingDevice;
+
+	/* This device is set up and ready! */
+	devices = 1;
+	close( fd );
+	fd = 0;
+
+	if ((dev_desc->bDeviceClass == USB_CLASS_HUB) && portinfo)
+		for (port=0; port<(portinfo->nports); port++)
+			if (portinfo->port[port]) {
+				log( LOG_HOTPLUG_OTHER, "Building device %d attached to port %d", portinfo->port[port], port);
+				devices += build_device( env, JavaxUsb, linuxUsbServices, bus, portinfo->port[port], device, port, connectedDevices, disconnectedDevices );
+			}
+
+BUILD_DEVICE_EXIT:
+	if (fd) close(fd);
+	if (device) CheckedDeleteLocalRef( env, device );
+	if (connectinfo) free(connectinfo);
+	if (dev_desc) free(dev_desc);
+	if (usbioctl) free(usbioctl);
+	if (portinfo) free(portinfo);
+	if (keyString) CheckedDeleteLocalRef( env, keyString );
+
+	return devices;
+}
+
+static inline int build_config( JNIEnv *env, jclass JavaxUsb, int fd, jobject device, unsigned char bus, unsigned char dev )
+{
+	int result = -1;
+	struct jusb_config_descriptor *cfg_desc = NULL;
+	unsigned char *desc = NULL;
+	unsigned short wTotalLength;
+	unsigned int pos;
+	jobject config = NULL, interface = NULL;
+	jmethodID createUsbConfigurationImp;
+
+	if (!(cfg_desc = get_descriptor( env, fd ))) {
+		log( LOG_ERROR, "Short read on config desriptor." );
+		goto BUILD_CONFIG_EXIT;
+	}
+
+	createUsbConfigurationImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbConfigurationImp", "(Lcom/ibm/jusb/UsbDeviceImp;BBSBBBBB)Lcom/ibm/jusb/UsbConfigurationImp;" );
+
+	log( LOG_HOTPLUG_OTHER, "Building config %d", cfg_desc->bConfigurationValue );
+
+	wTotalLength = cfg_desc->wTotalLength;
+	pos = cfg_desc->bLength;
+
+	config = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbConfigurationImp, device,
+		cfg_desc->bLength, cfg_desc->bDescriptorType, wTotalLength,
+		cfg_desc->bNumInterfaces, cfg_desc->bConfigurationValue, cfg_desc->iConfiguration,
+		cfg_desc->bmAttributes, cfg_desc->bMaxPower );
+
+	while (pos < wTotalLength) {
+		desc = get_descriptor( env, fd );
+		if ((!desc) || (2 > desc[0])) {
+			log( LOG_ERROR, "Short read on descriptor" );
+			goto BUILD_CONFIG_EXIT;
+		}
+		pos += desc[0];
+		switch( desc[1] ) {
+			case USB_DT_DEVICE:
+				log( LOG_ERROR, "Got device descriptor inside of config descriptor" );
+				goto BUILD_CONFIG_EXIT;
+
+			case USB_DT_CONFIG:
+				log( LOG_ERROR, "Got config descriptor inside of config descriptor" );
+				goto BUILD_CONFIG_EXIT;
+
+			case USB_DT_INTERFACE:
+				if (interface) CheckedDeleteLocalRef( env, interface );
+				interface = build_interface( env, JavaxUsb, fd, config, (struct jusb_interface_descriptor*)desc, bus, dev );
+				break;
+
+			case USB_DT_ENDPOINT:
+				build_endpoint( env, JavaxUsb, interface, (struct jusb_endpoint_descriptor*)desc );
+				break;
+
+			default:
+				/* Ignore proprietary descriptor */
+				break;
+		}
+		free(desc);
+		desc = NULL;
+	}
+
+	result = 0;
+
+BUILD_CONFIG_EXIT:
+	if (config) CheckedDeleteLocalRef( env, config );
+	if (interface) CheckedDeleteLocalRef( env, interface );
+	if (cfg_desc) free(cfg_desc);
+	if (desc) free(desc);
+
+	return result;
+}
+
+static inline jobject build_interface( JNIEnv *env, jclass JavaxUsb, int fd, jobject config, struct jusb_interface_descriptor *if_desc, unsigned char bus, unsigned char dev )
+{
+	jobject interface;
+
+	jmethodID createUsbInterfaceImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbInterfaceImp", "(Lcom/ibm/jusb/UsbConfigurationImp;BBBBBBBBB)Lcom/ibm/jusb/UsbInterfaceImp;" );
+
+	log( LOG_HOTPLUG_OTHER, "Building interface %d", if_desc->bInterfaceNumber );
+
+	interface = CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbInterfaceImp, config,
+		if_desc->bLength, if_desc->bDescriptorType,
+		if_desc->bInterfaceNumber, if_desc->bAlternateSetting, if_desc->bNumEndpoints, if_desc->bInterfaceClass,
+		if_desc->bInterfaceSubClass, if_desc->bInterfaceProtocol, if_desc->iInterface );
+
+	return interface;
+}
+
+static inline void build_endpoint( JNIEnv *env, jclass JavaxUsb, jobject interface, struct jusb_endpoint_descriptor *ep_desc )
+{
+	jmethodID createUsbEndpointImp = CheckedGetStaticMethodID( env, JavaxUsb, "createUsbEndpointImp", "(Lcom/ibm/jusb/UsbInterfaceImp;BBBBBS)Lcom/ibm/jusb/UsbEndpointImp;" );
+
+	log( LOG_HOTPLUG_OTHER, "Building endpoint 0x%2.02x", ep_desc->bEndpointAddress );
+
+	if (!interface) {
+		log( LOG_ERROR, "Interface is NULL");
+		return;
+	}
+
+	CheckedCallStaticObjectMethod( env, JavaxUsb, createUsbEndpointImp, interface,
+		ep_desc->bLength, ep_desc->bDescriptorType,
+		ep_desc->bEndpointAddress, ep_desc->bmAttributes, ep_desc->bInterval, ep_desc->wMaxPacketSize );
+}
+
+static inline void *get_descriptor( JNIEnv *env, int fd )
+{
+	unsigned char *buffer = NULL, *len = NULL;
+	int nread;
+
+	len = malloc(1);
+	if (1 > read( fd, len, 1 )) {
+		log( LOG_ERROR, "Cannot read from file!" );
+		goto GET_DESCRIPTOR_EXIT;
+	}
+
+	if (*len == 0) {
+		log( LOG_ERROR, "Zero-length descriptor?" );
+		goto GET_DESCRIPTOR_EXIT;
+	}
+
+	buffer = malloc(*len);
+	buffer[0] = *len;
+	free(len);
+	len = NULL;
+
+	nread = read( fd, buffer+1, buffer[0]-1 );
+	if (buffer[0]-1 != nread) {
+		if (buffer[0]-1 > nread) log( LOG_ERROR, "Short read on file" );
+		else log( LOG_ERROR, "Long read on file" );
+		free(buffer);
+		buffer = NULL;
+	}
+
+GET_DESCRIPTOR_EXIT:
+	if (len) free(len);
+
+	return buffer;
+}
+
+static int select_usbfs(const struct dirent *entry)
+{
+	/* This originally used entry->d_type, however Linux 2.4 doesn't implement d_type,
+	 * and POSIX apparently doesn't define it either.  So let's just do name matching.
+	 * Hope that doesn't change.
+	 */
+	int n = atoi(entry->d_name);
+	/* If the number conversion of the name is 1-999, it's (hopefully) ok.
+	 */
+	return (0 < n) && (n < 1000);
+}
diff --git a/target-platform/javax.usb.linux/src/main/c/Makefile b/target-platform/javax.usb.linux/src/main/c/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e9cfd06e7f31f70b91a1fd01d43cbe751ae036eb
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/Makefile
@@ -0,0 +1,56 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Java Usb
+#
+# Dan Streetman
+#
+
+# Uncomment for Poky cross compile support
+#CROSS = arm-poky-linux-gnueabi-
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	JavaxUsbKernel.o \
+	JavaxUsbLog.o \
+	JavaxUsbTopologyUpdater.o JavaxUsbTopologyListener.o JavaxUsbActive.o \
+	JavaxUsbDeviceProxy.o \
+	JavaxUsbPipeRequest.o JavaxUsbInterfaceRequest.o \
+	JavaxUsbControlRequest.o JavaxUsbBulkRequest.o JavaxUsbInterruptRequest.o JavaxUsbIsochronousRequest.o \
+	JavaxUsbError.o
+HEADER = com_ibm_jusb_os_linux_JavaxUsb.h
+
+JSR80_CC = $(CROSS)gcc
+JSR80_CCLD = $(JSR80_CC)
+
+JSR80_INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I. $(CINCLUDES)
+
+JSR80_CFLAGS = -Wall -fPIC $(JUSB_FLAGS) $(CFLAGS)
+JSR80_SOFLAGS = -shared $(SOFLAGS)
+
+JSR80_COMPILE = $(JSR80_CC) $(JSR80_INCLUDES) $(JSR80_CFLAGS)
+JSR80_LINK = $(JSR80_CCLD) $(JSR80_CFLAGS) -o $@
+
+# This is the final shared library
+all: libJavaxUsb.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(JSR80_COMPILE) -c $<
+
+# Build the shared library
+libJavaxUsb.so: $(OBJECTS)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libJavaxUsb.so
+	$(JSR80_LINK) $(JSR80_SOFLAGS) $(OBJECTS)
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libJavaxUsb.so $(OBJECTS) *.o *.so
diff --git a/target-platform/javax.usb.linux/src/main/c/Makefile.poky.arm_sf b/target-platform/javax.usb.linux/src/main/c/Makefile.poky.arm_sf
new file mode 100644
index 0000000000000000000000000000000000000000..ce48e004b0acd90fb965dcf49f1fee87df3cfb2a
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/Makefile.poky.arm_sf
@@ -0,0 +1,56 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Java Usb
+#
+# Dan Streetman
+#
+
+# Uncomment for Poky cross compile support
+#CROSS = arm-poky-linux-gnueabi-
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	JavaxUsbKernel.o \
+	JavaxUsbLog.o \
+	JavaxUsbTopologyUpdater.o JavaxUsbTopologyListener.o JavaxUsbActive.o \
+	JavaxUsbDeviceProxy.o \
+	JavaxUsbPipeRequest.o JavaxUsbInterfaceRequest.o \
+	JavaxUsbControlRequest.o JavaxUsbBulkRequest.o JavaxUsbInterruptRequest.o JavaxUsbIsochronousRequest.o \
+	JavaxUsbError.o
+HEADER = com_ibm_jusb_os_linux_JavaxUsb.h
+
+JSR80_CC = $(CC)
+JSR80_CCLD = $(JSR80_CC)
+
+JSR80_INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I. $(CINCLUDES)
+
+JSR80_CFLAGS = -msoft-float -Wall -fPIC $(JUSB_FLAGS) $(CFLAGS)
+JSR80_SOFLAGS = -shared $(SOFLAGS)
+
+JSR80_COMPILE = $(JSR80_CC) $(JSR80_INCLUDES) $(JSR80_CFLAGS)
+JSR80_LINK = $(JSR80_CCLD) $(JSR80_CFLAGS) -o $@
+
+# This is the final shared library
+all: libJavaxUsb.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(JSR80_COMPILE) -c $<
+
+# Build the shared library
+libJavaxUsb.so: $(OBJECTS)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libJavaxUsb.so
+	$(JSR80_LINK) $(JSR80_SOFLAGS) $(OBJECTS)
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libJavaxUsb.so $(OBJECTS) *.o *.so
diff --git a/target-platform/javax.usb.linux/src/main/c/Makefile.poky.i586 b/target-platform/javax.usb.linux/src/main/c/Makefile.poky.i586
new file mode 100644
index 0000000000000000000000000000000000000000..250d449b19d88a99e8cae3c20e1b18693c95dec9
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/Makefile.poky.i586
@@ -0,0 +1,56 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Java Usb
+#
+# Dan Streetman
+#
+
+# Uncomment for Poky cross compile support
+#CROSS = arm-poky-linux-gnueabi-
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	JavaxUsbKernel.o \
+	JavaxUsbLog.o \
+	JavaxUsbTopologyUpdater.o JavaxUsbTopologyListener.o JavaxUsbActive.o \
+	JavaxUsbDeviceProxy.o \
+	JavaxUsbPipeRequest.o JavaxUsbInterfaceRequest.o \
+	JavaxUsbControlRequest.o JavaxUsbBulkRequest.o JavaxUsbInterruptRequest.o JavaxUsbIsochronousRequest.o \
+	JavaxUsbError.o
+HEADER = com_ibm_jusb_os_linux_JavaxUsb.h
+
+JSR80_CC = $(CC)
+JSR80_CCLD = $(JSR80_CC)
+
+JSR80_INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I. $(CINCLUDES)
+
+JSR80_CFLAGS = -Wall -fPIC $(JUSB_FLAGS) $(CFLAGS)
+JSR80_SOFLAGS = -shared $(SOFLAGS)
+
+JSR80_COMPILE = $(JSR80_CC) $(JSR80_INCLUDES) $(JSR80_CFLAGS)
+JSR80_LINK = $(JSR80_CCLD) $(JSR80_CFLAGS) -o $@
+
+# This is the final shared library
+all: libJavaxUsb.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(JSR80_COMPILE) -c $<
+
+# Build the shared library
+libJavaxUsb.so: $(OBJECTS)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libJavaxUsb.so
+	$(JSR80_LINK) $(JSR80_SOFLAGS) $(OBJECTS)
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libJavaxUsb.so $(OBJECTS) *.o *.so
diff --git a/target-platform/javax.usb.linux/src/main/c/Makefile.poky.x86_64 b/target-platform/javax.usb.linux/src/main/c/Makefile.poky.x86_64
new file mode 100644
index 0000000000000000000000000000000000000000..250d449b19d88a99e8cae3c20e1b18693c95dec9
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/Makefile.poky.x86_64
@@ -0,0 +1,56 @@
+
+# Copyright (c) 1999 - 2001, International Business Machines Corporation.
+# All Rights Reserved.
+#
+# This software is provided and licensed under the terms and conditions
+# of the Common Public License:
+# http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
+
+# Makefile for Linux Java Usb
+#
+# Dan Streetman
+#
+
+# Uncomment for Poky cross compile support
+#CROSS = arm-poky-linux-gnueabi-
+
+# Object and header dependencies - these are removed by 'make clean'
+OBJECTS = \
+	JavaxUsbKernel.o \
+	JavaxUsbLog.o \
+	JavaxUsbTopologyUpdater.o JavaxUsbTopologyListener.o JavaxUsbActive.o \
+	JavaxUsbDeviceProxy.o \
+	JavaxUsbPipeRequest.o JavaxUsbInterfaceRequest.o \
+	JavaxUsbControlRequest.o JavaxUsbBulkRequest.o JavaxUsbInterruptRequest.o JavaxUsbIsochronousRequest.o \
+	JavaxUsbError.o
+HEADER = com_ibm_jusb_os_linux_JavaxUsb.h
+
+JSR80_CC = $(CC)
+JSR80_CCLD = $(JSR80_CC)
+
+JSR80_INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I. $(CINCLUDES)
+
+JSR80_CFLAGS = -Wall -fPIC $(JUSB_FLAGS) $(CFLAGS)
+JSR80_SOFLAGS = -shared $(SOFLAGS)
+
+JSR80_COMPILE = $(JSR80_CC) $(JSR80_INCLUDES) $(JSR80_CFLAGS)
+JSR80_LINK = $(JSR80_CCLD) $(JSR80_CFLAGS) -o $@
+
+# This is the final shared library
+all: libJavaxUsb.so
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(JSR80_COMPILE) -c $<
+
+# Build the shared library
+libJavaxUsb.so: $(OBJECTS)
+	@[ -f ${HEADER} ] || (echo "Could not find ${HEADER} header file!";exit 1)
+	@rm -f libJavaxUsb.so
+	$(JSR80_LINK) $(JSR80_SOFLAGS) $(OBJECTS)
+
+# Cleanup all object and shared files and JAVAH-generated headers (not all headers!!)
+clean:
+	rm -f libJavaxUsb.so $(OBJECTS) *.o *.so
diff --git a/target-platform/javax.usb.linux/src/main/c/com_ibm_jusb_os_linux_JavaxUsb.h b/target-platform/javax.usb.linux/src/main/c/com_ibm_jusb_os_linux_JavaxUsb.h
new file mode 100644
index 0000000000000000000000000000000000000000..06d5e0a12b14920480270ca294a005794d17c0b8
--- /dev/null
+++ b/target-platform/javax.usb.linux/src/main/c/com_ibm_jusb_os_linux_JavaxUsb.h
@@ -0,0 +1,100 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_ibm_jusb_os_linux_JavaxUsb */
+
+#ifndef _Included_com_ibm_jusb_os_linux_JavaxUsb
+#define _Included_com_ibm_jusb_os_linux_JavaxUsb
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* Inaccessible static: msgLevelTable */
+#undef com_ibm_jusb_os_linux_JavaxUsb_SPEED_UNKNOWN
+#define com_ibm_jusb_os_linux_JavaxUsb_SPEED_UNKNOWN 0L
+#undef com_ibm_jusb_os_linux_JavaxUsb_SPEED_LOW
+#define com_ibm_jusb_os_linux_JavaxUsb_SPEED_LOW 1L
+#undef com_ibm_jusb_os_linux_JavaxUsb_SPEED_FULL
+#define com_ibm_jusb_os_linux_JavaxUsb_SPEED_FULL 2L
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTracing
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTracing
+  (JNIEnv *, jclass, jboolean);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTraceType
+ * Signature: (ZLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceType
+  (JNIEnv *, jclass, jboolean, jstring);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTraceLevel
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceLevel
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeSetTraceOutput
+ * Signature: (ILjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeSetTraceOutput
+  (JNIEnv *, jclass, jint, jstring);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeTopologyUpdater
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxUsbServices;Ljava/util/List;Ljava/util/List;)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyUpdater
+  (JNIEnv *, jclass, jobject, jobject, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeGetActiveConfigurationNumber
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxDeviceOsImp;)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveConfigurationNumber
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeGetActiveInterfaceSettingNumber
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxDeviceOsImp;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetActiveInterfaceSettingNumber
+  (JNIEnv *, jclass, jobject, jint);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeTopologyListener
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxUsbServices;)I
+ */
+JNIEXPORT jint JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeTopologyListener
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeDeviceProxy
+ * Signature: (Lcom/ibm/jusb/os/linux/LinuxDeviceProxy;)V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeDeviceProxy
+  (JNIEnv *, jclass, jobject);
+
+/*
+ * Class:     com_ibm_jusb_os_linux_JavaxUsb
+ * Method:    nativeGetErrorMessage
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_ibm_jusb_os_linux_JavaxUsb_nativeGetErrorMessage
+  (JNIEnv *, jclass, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/armv5_sf/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/armv5_sf/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..dfc9dcd38fdf12eea2c81f302103c9c2070d51e9
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/armv5_sf/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/armv6_hf/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/armv6_hf/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..96fb85df20e14fec8e09059412ea20209e6151bf
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/armv6_hf/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..e55df4d829839f56be76a9d2e5d347d7149f13fd
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/old/mini-gateway/yocto_1.2.1/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/old/mini-gateway/yocto_1.2.1/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..5b383d2bcd9f815701f6b05240f1c4d61f619253
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/old/mini-gateway/yocto_1.2.1/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/old/raspberry-pi/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/old/raspberry-pi/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..96fb85df20e14fec8e09059412ea20209e6151bf
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/old/raspberry-pi/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/old/wrl/wrl_4.3_glibc_std/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/old/wrl/wrl_4.3_glibc_std/libJavaxUsb.so
new file mode 100644
index 0000000000000000000000000000000000000000..7d31bcc668b32a06436f05c97a2618d2eac1156d
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/old/wrl/wrl_4.3_glibc_std/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/old/x86/linux32/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/old/x86/linux32/libJavaxUsb.so
new file mode 100644
index 0000000000000000000000000000000000000000..7d31bcc668b32a06436f05c97a2618d2eac1156d
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/old/x86/linux32/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/x86/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/x86/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..d7d32d097245ef57a98878ab853bb55cf430f348
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/x86/libJavaxUsb.so differ
diff --git a/target-platform/javax.usb.linux/src/main/lib/linux/x86_64/libJavaxUsb.so b/target-platform/javax.usb.linux/src/main/lib/linux/x86_64/libJavaxUsb.so
new file mode 100755
index 0000000000000000000000000000000000000000..e93af2b9c764c65e1a679b4c4a2c5a8daa5ad63f
Binary files /dev/null and b/target-platform/javax.usb.linux/src/main/lib/linux/x86_64/libJavaxUsb.so differ
diff --git a/target-platform/org.eclipse.paho/about.html b/target-platform/org.eclipse.paho/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/target-platform/org.eclipse.paho/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/target-platform/org.eclipse.paho/about_files/epl-v10.html b/target-platform/org.eclipse.paho/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/target-platform/org.eclipse.paho/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/target-platform/org.eclipse.paho/build.properties b/target-platform/org.eclipse.paho/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4b642b6c8dbf70bf511fb7232858500b64824b0a
--- /dev/null
+++ b/target-platform/org.eclipse.paho/build.properties
@@ -0,0 +1,4 @@
+source.. = src/main/java/,src/main/resources/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .
diff --git a/target-platform/org.eclipse.paho/pom.xml b/target-platform/org.eclipse.paho/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5847ff8d5648a238a48e830b3aa65a06ad17ddff
--- /dev/null
+++ b/target-platform/org.eclipse.paho/pom.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>target-platform</artifactId>
+    <version>0.7.0</version>
+  </parent>
+
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>mqtt-client</artifactId>
+    <version>0.4.0</version>
+    <packaging>bundle</packaging>
+
+    <name>Eclipse Paho MQTT Client</name>
+    <description>Eclipse Paho MQTT Client</description>
+
+    <repositories>
+        <repository>
+            <id>eclipse-nexus-paho-repository</id>
+            <name>Eclipse Nexus Paho repository</name>
+            <url>https://repo.eclipse.org/content/groups/paho/</url>
+        </repository>
+    </repositories>
+
+    <properties>
+        <maven.compiler.source>1.6</maven.compiler.source>
+        <maven.compiler.target>1.6</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.paho</groupId>
+            <artifactId>mqtt-client</artifactId>
+            <version>0.4.0</version>
+        </dependency>
+
+        <!-- Test -->
+<!--
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-legacy</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-junit4</artifactId>
+            <version>2.5.1</version>
+            <scope>test</scope>
+        </dependency>
+-->
+    </dependencies>
+
+
+    <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+      <resource>
+        <directory>.</directory>
+        <includes>
+          <include>plugin.xml</include>
+        </includes>
+      </resource>
+    </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+		    <manifestLocation>META-INF</manifestLocation>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId};singleton:=true</Bundle-SymbolicName>
+                        <Bundle-Name>${project.name}</Bundle-Name>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Include-Resource>
+                            org/eclipse/paho/client/mqttv3/internal/nls=${project.basedir}/src/main/resources,
+                            ${project.basedir}/about.html,
+                            about_files=${project.basedir}/about_files/
+                        </Include-Resource>
+                        <Import-Package>
+			    javax.net;resolution:=optional,
+			    javax.net.ssl;resolution:=optional
+                        </Import-Package>
+                        <Export-Package>
+			    org.eclipse.paho.client.mqttv3,
+			    org.eclipse.paho.client.mqttv3.logging,
+			    org.eclipse.paho.client.mqttv3.persist,
+			    org.eclipse.paho.client.mqttv3.util,
+			    org.eclipse.paho.client.mqttv3.internal,
+			    org.eclipse.paho.client.mqttv3.internal.security,
+			    org.eclipse.paho.client.mqttv3.internal.wire
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            
+	    <plugin>
+        	<artifactId>maven-dependency-plugin</artifactId>
+        	<executions>
+        	  <execution>
+        	    <id>copy-dependencies</id>
+        	    <phase>package</phase>
+        	    <goals>
+        	      <goal>copy-dependencies</goal>
+        	    </goals>
+        	  </execution>
+        	</executions>
+	   </plugin>
+	   
+        </plugins>
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.apache.maven.plugins
+        								</groupId>
+        								<artifactId>
+        									maven-dependency-plugin
+        								</artifactId>
+        								<versionRange>
+        									[2.1,)
+        								</versionRange>
+        								<goals>
+        									<goal>
+        										copy-dependencies
+        									</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/target-platform/org.eclipse.paho/src/main/resources/logcat.properties b/target-platform/org.eclipse.paho/src/main/resources/logcat.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4f7452389377ed6e0821a1c59217abbeac049529
--- /dev/null
+++ b/target-platform/org.eclipse.paho/src/main/resources/logcat.properties
@@ -0,0 +1,133 @@
+0=MQTT Catalog
+200=internalSend key={0} message={1} token={2}
+213=fail: token in use: key={0} message={1} token={2}
+208=failed: not connected
+224=failed: not disconnected
+214=state=CONNECTING
+207=connect failed: not disconnected {0}
+215=state=CONNECTED
+204=connect failed: rc={0}
+216=state=DISCONNECTING
+217=state=DISCONNECTED
+222=>
+223=failed: in closed state
+211=failed: already disconnected
+219=failed: already disconnecting
+210=failed: called on callback thread
+218=state=DISCONNECTING
+220=>
+212=connect failed: unexpected exception
+209=connect failed: unexpected exception
+221=>
+603=clearState
+602=key={0} exception
+601=key={0} message={1}
+600=>
+604=inbound QoS 2 publish key={0} message={1}
+605=outbound QoS 2 pubrel key={0} message={1}
+606=outbound QoS 2 completed key={0} message={1}
+607=outbound QoS 2 publish key={0} message={1}
+608=outbound QoS 1 publish key={0} message={1}
+609=removing orphaned pubrel key={0}
+610=QoS 2 publish key={0}
+611=QoS 2 pubrel key={0}
+612=QoS 1 publish key={0}
+613= sending {0} msgs at max inflight window
+628=pending publish key={0} qos={1} message={2}
+615=pending send key={0} message {1}
+618=key={0} QoS={1}
+620=ping needed. keepAlive={0} lastOutboundActivity={1} lastInboundActivity={2}
+619=Timed out as no activity, keepAlive={0} lastOutboundActivity={1} lastInboundActivity={2}
+644=wait for {0} ms for new work or for space in the inflight window
+621=no outstanding flows and not connected
+617=+1 inflightpubrels={0}
+623=+1 actualInFlight={0}
+622=inflight window full
+625=key={0}
+646=-1 actualInFlight={0}
+626=quiescing={0} actualInFlight={1} pendingFlows={2} inFlightPubRels={3} callbackQuiesce={4} tokens={5}
+627=received key={0} message={1}
+651=received key={0} message={1}
+629=received key={0} token={1} message={2}
+650=removed Qos 1 publish. key={0}
+645=removed QoS 2 publish/pubrel. key={0}, -1 inFlightPubRels={1}
+648=key{0}, msg={1}, excep={2}
+649=key={0},excep={1}
+631=connected
+632=reason {0}
+633=disconnected
+637=timeout={0}
+639=wait for outstanding: actualInFlight={0} pendingFlows={1} inFlightPubRels={2} tokens={3}
+640=finished
+638=notifying queueLock holders
+641=remove publish from persistence. key={0}
+700=stopping
+701=notify workAvailable and wait for run
+703=stopped
+704=wait for workAvailable
+706=notify spaceAvailable
+714=callback threw exception
+705=callback and notify for key={0}
+708=call connectionLost
+720=exception from connectionLost {0}
+716=call onSuccess key={0}
+717=call onFailure key {0}
+709=wait for spaceAvailable
+710=new msg avail, notify workAvailable
+711=quiesce notify spaceAvailable
+713=call messageArrived key={0} topic={1}
+715=new workAvailable. key={0}
+719=callback threw ex:
+855=starting
+850=stopping
+851=stopped
+852=network read message
+856=Stopping, MQttException
+853=Stopping due to IOException
+854=<
+800=stopping sender
+801=stopped
+802=network send key={0} msg={1}
+803=get message returned null, stopping}
+805=<
+804=exception
+308=<>
+306=key={0}
+302=existing key={0} message={1} token={2}
+303=creating new token key={0} message={1} token={2}
+300=key={0} message={1}
+307=key={0} token={1}
+309=resp={0}
+310=>
+311=>
+312=>
+305=> {0} tokens
+260=setEnabledCiphers ciphers={0}
+252=connect to host {0} port {1} timeout {2}
+250=Failed to create TCP socket
+407=key={0} wait max={1} token={2}
+406=key={0} timed out token={1}
+400=>key={0} timeout={1} sent={2} completed={3} hasException={4} response={5} token={6}
+408=key={0} wait max={1}
+401=failed with exception
+402=key={0} response={1}
+404=>key={0} response={1} excep={2}
+411=>key={0} response={1} excep={2}
+409=wait key={0}
+403=> key={0}
+410=> key={0}
+101=<init> ClientID={0} ServerURI={1} PersistenceType={2}
+116=URI={0}
+115=URI={0}
+103=cleanSession={0} connectionTimeout={1} TimekeepAlive={2} userName={3} password={4} will={5} userContext={6} callback={7}
+104=> quiesceTimeout={0} userContext={1} callback={2}
+105=< exception
+108=<
+106=Subscribe topic={0} userContext={1} callback={2}
+109=<
+107=Unsubscribe topic={0} userContext={1} callback={2}
+110=<
+111=< topic={0} message={1}userContext={1} callback={2}
+112=<
+113=<
+114=>
diff --git a/target-platform/org.eclipse.soda.dk.comm/OSGI-INF/l10n/bundle.properties b/target-platform/org.eclipse.soda.dk.comm/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..074c57426d59e5136316688bdb5a96e1f2a45261
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,14 @@
+#########################################################################
+# Copyright (c) 2007, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+bundle.copyright=Copyright (c) 2007, 2009 IBM.
+bundle.description=Comm
+bundle.name=Comm (Incubation)
+bundle.vendor=Eclipse.org
diff --git a/target-platform/org.eclipse.soda.dk.comm/OSGI-INF/l10n/bundle_en.properties b/target-platform/org.eclipse.soda.dk.comm/OSGI-INF/l10n/bundle_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..074c57426d59e5136316688bdb5a96e1f2a45261
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/OSGI-INF/l10n/bundle_en.properties
@@ -0,0 +1,14 @@
+#########################################################################
+# Copyright (c) 2007, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+bundle.copyright=Copyright (c) 2007, 2009 IBM.
+bundle.description=Comm
+bundle.name=Comm (Incubation)
+bundle.vendor=Eclipse.org
diff --git a/target-platform/org.eclipse.soda.dk.comm/TooManyListenersException.java b/target-platform/org.eclipse.soda.dk.comm/TooManyListenersException.java
new file mode 100644
index 0000000000000000000000000000000000000000..a087b1ea8f63984baa31d81ef233cd4904b9d02d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/TooManyListenersException.java
@@ -0,0 +1,49 @@
+
+package java.util;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * (c) Copyright IBM Corp. 1998, 2002  All Rights Reserved
+ */
+
+/**
+ * This exception is thrown when an attempt is made to add
+ * more than one listener to an event source which only
+ * supports a single listener. It is also thrown when the
+ * same listener is added more than once.
+ *
+ * @author		OTI
+ * @version		initial
+ *
+ * @see		java.lang.Exception
+ */
+public class TooManyListenersException extends Exception {
+
+	static final long serialVersionUID = 5074640544770687831L;
+
+/**
+ * Constructs a new instance of this class with its
+ * walkback filled in.
+ *
+ * @author		OTI
+ * @version		initial
+ */
+public TooManyListenersException () {
+	super();
+}
+
+/**
+ * Constructs a new instance of this class with its
+ * walkback and message filled in.
+ *
+ * @author		OTI
+ * @version		initial
+ *
+ * @param		detailMessage String
+ *				The detail message for the exception.
+ */
+public TooManyListenersException (String detailMessage) {
+	super(detailMessage);
+}
+
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/about.html b/target-platform/org.eclipse.soda.dk.comm/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b53f0cfd85638feeeb62985198de72c6ffc8e5ef
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>April 4, 2014</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/target-platform/org.eclipse.soda.dk.comm/about_files/epl-v10.html b/target-platform/org.eclipse.soda.dk.comm/about_files/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/about_files/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/target-platform/org.eclipse.soda.dk.comm/build.properties b/target-platform/org.eclipse.soda.dk.comm/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3e026f0611807f7d12744684202a855cdc123c20
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/build.properties
@@ -0,0 +1,15 @@
+#########################################################################
+# Copyright (c) 2006, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+additional.bundles=org.eclipse.osgi,org.eclipse.osgi.services
+bin.includes=.,META-INF/,copyright.txt,lib/,OSGI-INF/,OSGI-INF/l10n/,about.html
+output..=bin/
+source..=src/
+src.includes=copyright.txt
diff --git a/target-platform/org.eclipse.soda.dk.comm/copyright.txt b/target-platform/org.eclipse.soda.dk.comm/copyright.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4f69d3d19f1f14b95cba68dbdaeca17a81c92309
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/copyright.txt
@@ -0,0 +1,8 @@
+Copyright (c) 1999, 2009 IBM.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Eclipse Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/epl-v10.html
+
+Contributors:
+    IBM - initial API and implementation
\ No newline at end of file
diff --git a/target-platform/org.eclipse.soda.dk.comm/pom.xml b/target-platform/org.eclipse.soda.dk.comm/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4d365d378e4d4b99b7981c2d121b44a3417bebe5
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/pom.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>target-platform</artifactId>
+    <version>0.7.0</version>
+  </parent>
+
+    <groupId>org.eclipse.kura</groupId>
+    <artifactId>org.eclipse.soda.dk.comm</artifactId>
+    <version>1.2.0</version>
+    <packaging>bundle</packaging>
+
+    <name>Serial Device based on SODA DK comm</name>
+    <description>An implementation of the serialdevice.api, based on SODA DK comm</description>
+
+    <properties>
+        <maven.compiler.source>1.6</maven.compiler.source>
+        <maven.compiler.target>1.6</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+	<dependency>
+		<groupId>org.eclipse.tycho</groupId>
+		<artifactId>org.eclipse.osgi</artifactId>
+		<version>3.8.1.v20120830-144521</version>
+	</dependency>
+    </dependencies>
+
+    <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+      <resource>
+        <directory>.</directory>
+        <includes>
+          <include>plugin.xml</include>
+        </includes>
+      </resource>
+    </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+                <configuration>
+                    <systemPropertyVariables>
+                        <java.library.path>${project.basedir}/src/main/lib</java.library.path>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+<!--
+Manifest-Version: 1.0
+Bundle-Activator: org.eclipse.soda.dk.comm.bundle.Activator
+Bundle-Copyright: %bundle.copyright
+Bundle-Description: %bundle.description
+Bundle-Localization: OSGI-INF/l10n/bundle
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundle.name
+Bundle-SymbolicName: org.eclipse.soda.dk.comm
+Bundle-Vendor: %bundle.vendor
+Bundle-Version: 1.2.0.qualifier
+Export-Package: javax.comm;version="1.2.0",
+ org.eclipse.soda.dk.comm;version="1.2.0",
+ org.eclipse.soda.dk.comm.bundle;version="1.2.0",
+ org.eclipse.soda.dk.comm.internal;version="1.2.0"
+Import-Package: org.osgi.framework;version="1.4.0"
+-->
+		    <manifestLocation>META-INF</manifestLocation>
+                    <instructions>
+                        <Bundle-Activator>org.eclipse.soda.dk.comm.bundle.Activator</Bundle-Activator>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Name>%bundle.name</Bundle-Name>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+<!--
+                        <Embed-Dependency>
+                            rxtx;groupId=org.rxtx;artifactId=rxtx;version=2.2.0;scope=runtime
+                        </Embed-Dependency>
+-->
+                        <Include-Resource>
+                            lib=${project.basedir}/src/main/lib,
+                            ${project.basedir}/about.html,
+                            about_files=${project.basedir}/about_files/
+                        </Include-Resource>
+                        <Bundle-NativeCode>
+                        	lib/linux/x86/libdkcomm.so; osname=Linux; processor=x86,
+				lib/linux/x86_64/libdkcomm.so; osname=Linux; processor=x86-64,
+                        	lib/linux/armv6_hf/libdkcomm.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv7_hf))",
+                        	lib/linux/armv5_sf/libdkcomm.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv7_sf))",
+                        	lib/linux/armv6_hf/libdkcomm.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv6_hf))",
+                        	lib/linux/armv5_sf/libdkcomm.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv6_sf))",
+                        	lib/linux/armv5_sf/libdkcomm.so; osname=Linux; processor=ARM; selection-filter="(&amp;(kura.arch=armv5_sf))",
+                        	lib/mac/x86/libdkcomm.jnilib; osname=macosx; processor=x86_64,
+                        	*
+                        </Bundle-NativeCode>
+                        <Import-Package>
+				org.osgi.framework;version="[1.5.0,2.0.0)"
+                        </Import-Package>
+                        <Export-Package>
+				javax.comm;version="1.2.0",
+				org.eclipse.soda.dk.comm;version="1.2.0",
+				org.eclipse.soda.dk.comm.bundle;version="1.2.0",
+				org.eclipse.soda.dk.comm.internal;version="1.2.0"
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            
+	    <plugin>
+        	<artifactId>maven-dependency-plugin</artifactId>
+        	<executions>
+        	  <execution>
+        	    <id>copy-dependencies</id>
+        	    <phase>package</phase>
+        	    <goals>
+        	      <goal>copy-dependencies</goal>
+        	    </goals>
+        	  </execution>
+        	</executions>
+	   </plugin>
+	   
+        </plugins>
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.apache.maven.plugins
+        								</groupId>
+        								<artifactId>
+        									maven-dependency-plugin
+        								</artifactId>
+        								<versionRange>
+        									[2.1,)
+        								</versionRange>
+        								<goals>
+        									<goal>
+        										copy-dependencies
+        									</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/CommPortIdentifier.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/CommPortIdentifier.c
new file mode 100644
index 0000000000000000000000000000000000000000..195a20a97bc74822980e4b67e0fc0cdd03843bdd
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/CommPortIdentifier.c
@@ -0,0 +1,40 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "javax_comm_CommPortIdentifier.h"
+extern int w32CommPortIdentifier_monitorInterJVMDeviceAccessNC( JNIEnv *, jobject, jobject );
+#else
+#if _WIN32_WCE>=400
+#include "javax_comm_CommPortIdentifier.h"
+extern int w32CommPortIdentifier_monitorInterJVMDeviceAccessNC( JNIEnv *, jobject, jobject );
+#else //linux
+#include <javax_comm_CommPortIdentifier.h>
+#endif //_WIN32_WCE>=400
+#endif //WIN32
+/*
+ * Class:     javax_comm_CommPortIdentifier
+ * Method:    monitorInterJVMDeviceAccessNC
+ * Signature: (Ljava/lang/Thread;)I
+ *
+ * Currenty not Supported on Posix Devices
+ */
+JNIEXPORT jint JNICALL Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC
+				(JNIEnv *jenv, jobject jobj, jobject jtho) {
+#ifdef WIN32
+    return w32CommPortIdentifier_monitorInterJVMDeviceAccessNC( jenv, jobj, jtho );
+#else
+#if _WIN32_WCE>=400
+    return w32CommPortIdentifier_monitorInterJVMDeviceAccessNC( jenv, jobj, jtho );
+#else
+    return cygCommPortIdentifier_monitorInterJVMDeviceAccessNC( jenv, jobj, jtho );
+#endif
+#endif
+} /* Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpj b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpj
new file mode 100644
index 0000000000000000000000000000000000000000..6a09b0d2c1b6612b8d0712a36d6070ffb85c5b2b
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpj
@@ -0,0 +1,122 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+	Version="10.0"
+	VendorName="SlickEdit"
+	WorkingDir=".">
+	<Config
+		Name="Release"
+		OutputFile=""
+		CompilerConfigName="Latest Version">
+		<Menu>
+			<Target
+				Name="Compile"
+				MenuCaption="&amp;Compile"
+				CaptureOutputWith="ProcessBuffer"
+				SaveOption="SaveCurrent"
+				RunFromDir="%rw">
+				<Exec/>
+			</Target>
+			<Target
+				Name="Build"
+				MenuCaption="&amp;Build"
+				CaptureOutputWith="ProcessBuffer"
+				SaveOption="SaveWorkspaceFiles"
+				RunFromDir="%rw">
+				<Exec/>
+			</Target>
+			<Target
+				Name="Rebuild"
+				MenuCaption="&amp;Rebuild"
+				CaptureOutputWith="ProcessBuffer"
+				SaveOption="SaveWorkspaceFiles"
+				RunFromDir="%rw">
+				<Exec/>
+			</Target>
+			<Target
+				Name="Debug"
+				MenuCaption="&amp;Debug"
+				SaveOption="SaveNone"
+				RunFromDir="%rw">
+				<Exec/>
+			</Target>
+			<Target
+				Name="Execute"
+				MenuCaption="E&amp;xecute"
+				SaveOption="SaveNone"
+				RunFromDir="%rw">
+				<Exec CmdLine='"Javaxcommnatives.exe"'/>
+			</Target>
+		</Menu>
+	</Config>
+	<Files>
+		<Folder
+			Name="Source Files"
+			Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl">
+			<F N="CommPortIdentifier.c"/>
+			<F N="cygCommDriver.c"/>
+			<F N="cygCommPortIdentifier.c"/>
+			<F N="cygDeviceInputStream.c"/>
+			<F N="cygDeviceOutputStream.c"/>
+			<F N="cygParallelErrorEventThread.c"/>
+			<F N="cygParallelPort.c"/>
+			<F N="cygSerialDataEventThread.c"/>
+			<F N="cygSerialPort.c"/>
+			<F N="cygSerialStatusEventThread.c"/>
+			<F N="NSCommDriver.c"/>
+			<F N="NSCommLOG.c"/>
+			<F N="NSDeviceInputStream.c"/>
+			<F N="NSDeviceOutputStream.c"/>
+			<F N="NSParallelPort.c"/>
+			<F N="NSSerialPort.c"/>
+			<F N="ParallelErrorEventThread.c"/>
+			<F N="SerialDataEventThread.c"/>
+			<F N="SerialStatusEventThread.c"/>
+			<F N="SysVStyleSemaphore.c"/>
+			<F N="w32CommDriver.c"/>
+			<F N="w32CommPortIdentifier.c"/>
+			<F N="w32DeviceInputStream.c"/>
+			<F N="w32DeviceOutputStream.c"/>
+			<F N="w32ParallelErrorEventThread.c"/>
+			<F N="w32ParallelPort.c"/>
+			<F N="w32SerialDataEventThread.c"/>
+			<F N="w32SerialPort.c"/>
+			<F N="w32SerialStatusEventThread.c"/>
+		</Folder>
+		<Folder
+			Name="Header Files"
+			Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if">
+			<F N="org_eclipse_soda_dk_comm_NSCommDriver.h"/>
+			<F N="org_eclipse_soda_dk_comm_NSDeviceInputStream.h"/>
+			<F N="org_eclipse_soda_dk_comm_NSDeviceOutputStream.h"/>
+			<F N="org_eclipse_soda_dk_comm_NSParallelPort.h"/>
+			<F N="org_eclipse_soda_dk_comm_NSSerialPort.h"/>
+			<F N="org_eclipse_soda_dk_comm_ParallelErrorEventThread.h"/>
+			<F N="org_eclipse_soda_dk_comm_SerialDataEventThread.h"/>
+			<F N="org_eclipse_soda_dk_comm_SerialStatusEventThread.h"/>
+			<F N="org_eclipse_soda_dk_comm.h"/>
+			<F N="javax_comm_CommPortIdentifier.h"/>
+			<F N="NSCommLOG.h"/>
+			<F N="SysVStyleSemaphore.h"/>
+			<F N="w32ParallePort.h"/>
+			<F N="w32SerialPort.h"/>
+		</Folder>
+		<Folder
+			Name="Resource Files"
+			Filters="*.ico;*.cur;*.dlg"/>
+		<Folder
+			Name="Bitmaps"
+			Filters="*.bmp"/>
+		<Folder
+			Name="Other Files"
+			Filters="">
+			<F
+				N="makefile"
+				Type="Makefile"/>
+			<F N="makefile.linux"/>
+			<F N="makefile.qnx"/>
+			<F N="makefile.win32"/>
+			<F N="makefile.win32_down"/>
+			<F N="makefile.wince"/>
+		</Folder>
+	</Files>
+</Project>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpw b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpw
new file mode 100644
index 0000000000000000000000000000000000000000..7fedb951d7a46f8e4d9ae2a5c89e8c4d55e64f6c
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpw
@@ -0,0 +1,6 @@
+<!DOCTYPE Workspace SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpw.dtd">
+<Workspace Version="10.0" VendorName="SlickEdit">
+	<Projects>
+		<Project File="Javaxcommnatives.vpj"/>
+	</Projects>
+</Workspace>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpwhist b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpwhist
new file mode 100644
index 0000000000000000000000000000000000000000..19499cc7643c7ee0a5d67688393c5df92643f18a
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vpwhist
@@ -0,0 +1,37 @@
+[Global]
+CurrentProject=Javaxcommnatives.vpj
+[ProjectDates]
+Javaxcommnatives.vpj=20051005132710000
+[ActiveConfig]
+Javaxcommnatives.vpj=Release
+[State]
+SCREEN: 1400 1050 66 87 1050 719 0 0 M 0 0 0 0 1373 824
+CWD: ..\natives
+BUFFER: BN="C:\j9dev\win\j9win\include\j9port.h"
+BI: MA=1 74 1  TABS=1 5  WWS=1 IWT=0 ST=0 IN=2 BW=0 US=32000 RO=0 SE=1 SN=0 BIN=0 MN=C	HM=0 MF=608 TL=0 MLL=0 ASE=0 LNL=6 LCF=0 CAPS=0 E=0 ESBU2=-1
+VIEW: LN=.730 CL=14 LE=0 CX=13 CY=24 WI=5 BI=12 HT=0 HN=0 HF=0 HC=4
+BUFFER: BN="C:\j9dev\win\j9win\include\jni.h"
+BI: MA=1 74 1  TABS=1 5  WWS=1 IWT=0 ST=0 IN=2 BW=0 US=32000 RO=0 SE=1 SN=0 BIN=0 MN=C	HM=0 MF=608 TL=0 MLL=0 ASE=0 LNL=6 LCF=0 CAPS=0 E=0 ESBU2=-1
+VIEW: LN=.3266 CL=26 LE=0 CX=25 CY=15 WI=5 BI=14 HT=0 HN=0 HF=0 HC=4
+BUFFER: BN="..\..\gary\j9win\SerialPortTest.java"
+BI: MA=1 74 1  TABS=1 9  WWS=1 IWT=0 ST=0 IN=2 BW=0 US=32000 RO=0 SE=1 SN=0 BIN=0 MN=Java	HM=0 MF=608 TL=0 MLL=0 ASE=0 LNL=6 LCF=0 CAPS=0 E=0 ESBU2=-1
+VIEW: LN=.0 CL=1 LE=0 CX=0 CY=0 WI=5 BI=15 HT=0 HN=0 HF=0 HC=4
+WINDOW: 44 58 1175 563 -1 -1 N  WF=0 WT=3 "Default Fixed Font,10,0,1"
+BUFFER: BN="C:\j9dev\win\j9win\include\jni.h"
+VIEW: LN=.3266 CL=26 LE=0 CX=25 CY=15 WI=89 BI=14 HT=0 HN=0 HF=0 HC=4
+WINDOW: 22 29 1175 563 -1 -1 N  WF=0 WT=2 "Default Fixed Font,10,0,1"
+BUFFER: BN="C:\j9dev\win\j9win\include\j9port.h"
+VIEW: LN=.730 CL=14 LE=0 CX=13 CY=24 WI=87 BI=12 HT=0 HN=0 HF=0 HC=4
+WINDOW: 66 87 1175 563 -1 -1 M  WF=0 WT=1 "Default Fixed Font,10,0,1"
+BUFFER: BN="..\..\gary\j9win\SerialPortTest.java"
+VIEW: LN=.1984 CL=68 LE=0 CX=67 CY=35 WI=91 BI=15 HT=0 HN=0 HF=0 HC=4
+FILEHIST: 9
+C:\Ravi\stocks\earncal.txt
+C:\Ravi\stocks\zacks.txt
+C:\j9dev\vxworks\j9vxworksppcjit-SR1-d\codegen_common\Options.cpp
+..\..\gary\j9win\SimpleSerial.java
+..\..\gary\j9win\TestComm.java
+C:\Documents and Settings\Administrator\My Documents\IBM\wsdd571\workspace\JavaCommAPIBuild\javaxcomm-rhel-20051004-0527.zip
+C:\j9dev\win\j9win\include\j9port.h
+C:\j9dev\win\j9win\include\jni.h
+..\..\gary\j9win\SerialPortTest.java
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vtg b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vtg
new file mode 100644
index 0000000000000000000000000000000000000000..c1b0c0a95a1e3253f4cfc1bf0c68400c94eff6d2
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Javaxcommnatives.vtg differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommDriver.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommDriver.c
new file mode 100644
index 0000000000000000000000000000000000000000..546a410bceefa14435bd27ce50bb5ae8fb4c47d9
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommDriver.c
@@ -0,0 +1,39 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_NSCommDriver.h"
+extern  w32CommDriver_discoverDevicesNC(jenv, jobj);
+#else
+#if _WIN32_WCE>=400
+#include "org_eclipse_soda_dk_comm_NSCommDriver.h"
+extern  w32CommDriver_discoverDevicesNC(jenv, jobj);
+#else
+#include <org_eclipse_soda_dk_comm_NSCommDriver.h>
+#endif
+#endif
+/*
+ * Class:     com.ibm.comm.NSCommDriver
+ * Method:    discoverDevicesNC
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC
+  (JNIEnv *jenv, jobject jobj) {
+#ifdef WIN32
+    w32CommDriver_discoverDevicesNC(jenv, jobj);
+#else
+#if _WIN32_WCE>=400
+    w32CommDriver_discoverDevicesNC(jenv, jobj);
+#else
+    cygCommDriver_discoverDevicesNC(jenv, jobj);
+#endif
+#endif
+    return;
+}	// Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommLOG.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommLOG.c
new file mode 100644
index 0000000000000000000000000000000000000000..aa9cbdde4e821c46f2925314750e572a09169b53
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommLOG.c
@@ -0,0 +1,104 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#include "org_eclipse_soda_dk_comm_NSSerialPort.h"
+#include "NSCommLOG.h"
+/*------------------------------------------------------------------
+ * 
+ *------------------------------------------------------------------*/
+#if 0 
+void ivelog(char *format, ...) {
+	va_list    varArgs;
+	FILE      *file;
+	time_t     timeNow;
+	struct tm *tmNow;
+	char       timeString[32];
+	char      *logFileName;
+	logFileName = "c:\\projects\\javaxcomm_win\\iveser.log";
+//	file = fopen(logFileName,"w");
+	file = fopen(logFileName,"a+w");
+	if (NULL == file) return;
+	timeNow = time(NULL);
+	tmNow   = localtime(&timeNow);
+	strftime(timeString,sizeof(timeString)-1,"%Y/%m/%d %H:%M:%S",tmNow);
+	fprintf(file,"%s : ",timeString);
+	va_start(varArgs,format);
+	vfprintf(file,format,varArgs);
+	va_end(varArgs);
+	fprintf(file,"\n");
+	fclose(file);
+}
+#endif
+/*------------------------------------------------------------------
+ * throw an exception
+ *------------------------------------------------------------------*/
+void iveSerThrow( JNIEnv *env, char *message, int rc ) {
+	jclass clazz;
+	
+	LOG(("iveSerThrow(%s)",message));
+	switch (rc){
+		case J9_ERROR_ACCESS_DENIED:
+			clazz = (*env)->FindClass(env, "javax/comm/PortInUseException");
+			break;
+		case J9_ERROR_FILE_NOT_FOUND:
+			clazz = (*env)->FindClass(env, "javax/comm/NoSuchPortException");		
+			break;
+		default:
+			clazz = (*env)->FindClass(env, "javax/comm/SerialPortException");			
+	}
+	if (!clazz) {
+		LOG(("couldn't find exception class"));
+		return;
+	}
+	(*env)->ThrowNew(env,clazz,message);
+}
+/*------------------------------------------------------------------
+ * 
+ *------------------------------------------------------------------*/
+void iveSerThrowWin(
+	JNIEnv *env, 
+	char   *msg,
+	int     rc
+	) {
+	char message[256];
+	char rcBuffer[128];
+	
+	LOG(("iveSerThrowWin(%s,%d)",msg,rc));
+	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,rc,0,rcBuffer,sizeof(rcBuffer)-1,0);
+	sprintf(message,"%s; rc=%d, %s",msg,rc,rcBuffer);
+	
+	switch (rc){
+		case ERROR_ACCESS_DENIED:
+			iveSerThrow(env,message, J9_ERROR_ACCESS_DENIED);
+			break;
+		case ERROR_FILE_NOT_FOUND:
+			iveSerThrow(env,message, J9_ERROR_FILE_NOT_FOUND);
+			break;
+		default:
+			iveSerThrow(env,message, J9_UNKNOWN_ERROR);
+			break;
+			
+	}
+}
+/*------------------------------------------------------------------
+ * clear comm errors
+ *------------------------------------------------------------------*/
+void iveSerClearCommErrors(
+	HANDLE osHandle
+	) {
+	COMSTAT comStat;
+	DWORD   dwErrors;
+	ClearCommError(osHandle,&dwErrors,&comStat);
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommLOG.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommLOG.h
new file mode 100644
index 0000000000000000000000000000000000000000..e671d0329c4d657043114710669f048968cb55ff
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSCommLOG.h
@@ -0,0 +1,22 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#if defined(NSLOGGING_AVAILABLE)
+#define LOG(x) ivelog x
+#else
+#define LOG(x)
+#endif
+#define  J9_ERROR_ACCESS_DENIED 100
+#define  J9_ERROR_FILE_NOT_FOUND 101
+#define J9_UNKNOWN_ERROR 102
+void ivelog(char *format, ...);
+void iveSerThrow( JNIEnv *, char *, int );
+void iveSerThrowWin( JNIEnv *, char *, int	);
+void iveSerClearCommErrors( HANDLE );
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSDeviceInputStream.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSDeviceInputStream.c
new file mode 100644
index 0000000000000000000000000000000000000000..ef57e33b58629458bb7a924b987aa39bda44f720
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSDeviceInputStream.c
@@ -0,0 +1,76 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_NSDeviceInputStream.h"
+extern int w32DeviceInputStream_readDeviceOneByteNC(JNIEnv *, jobject);
+extern int w32DeviceInputStream_readDeviceNC(JNIEnv *, jobject, jbyteArray, jint, jint);
+extern int w32DeviceInputStream_getReadCountNC(JNIEnv *, jobject);
+#else
+#if _WIN32_WCE>=400
+#include "org_eclipse_soda_dk_comm_NSDeviceInputStream.h"
+extern int w32DeviceInputStream_readDeviceOneByteNC(JNIEnv *, jobject);
+extern int w32DeviceInputStream_readDeviceNC(JNIEnv *, jobject, jbyteArray, jint, jint);
+extern int w32DeviceInputStream_getReadCountNC(JNIEnv *, jobject);
+#else
+#include <org_eclipse_soda_dk_comm_NSDeviceInputStream.h>
+#endif
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceInputStream
+ * Method:    readDeviceOneByteNC
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceOneByteNC
+  (JNIEnv *jenv, jobject jobj) {
+#ifdef WIN32
+	return (int)(unsigned char)w32DeviceInputStream_readDeviceOneByteNC(jenv, jobj);
+#else
+#if _WIN32_WCE>=400
+	return (int)(unsigned char)w32DeviceInputStream_readDeviceOneByteNC(jenv, jobj);
+#else
+    return (int)(unsigned char)cygDeviceInputStream_readDeviceOneByteNC(jenv, jobj);
+#endif
+#endif
+}	/* cygDeviceInputStream_readDeviceOneByteNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceInputStream
+ * Method:    readDeviceNC
+ * Signature: ([BII)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceNC
+  (JNIEnv *jenv, jobject jobj, jbyteArray jba, jint off, jint len) {
+#ifdef WIN32
+	return w32DeviceInputStream_readDeviceNC(jenv, jobj, jba, off, len);
+#else
+#if _WIN32_WCE>=400
+	return w32DeviceInputStream_readDeviceNC(jenv, jobj, jba, off, len);
+#else
+    return cygDeviceInputStream_readDeviceNC(jenv, jobj, jba, off, len);
+#endif
+#endif
+}	/* cygDeviceInputStream_readDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceInputStream
+ * Method:    getReadCountNC
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_getReadCountNC
+  (JNIEnv *jenv, jobject jobj) {
+#ifdef WIN32
+  return w32DeviceInputStream_getReadCountNC(jenv, jobj);
+#else
+#if _WIN32_WCE>=400
+  return w32DeviceInputStream_getReadCountNC(jenv, jobj);
+#else
+  return cygDeviceInputStream_getReadCountNC(jenv, jobj);
+#endif
+#endif
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSDeviceOutputStream.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSDeviceOutputStream.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d11ff2e05abf9e5e81d4af4f6e3c70228369773
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSDeviceOutputStream.c
@@ -0,0 +1,39 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_NSDeviceOutputStream.h"
+extern int w32DeviceOutputStream_writeDeviceNC(JNIEnv *, jobject, jbyteArray, jint, jint);
+#else
+#if _WIN32_WCE>=400
+#include "org_eclipse_soda_dk_comm_NSDeviceOutputStream.h"
+extern int w32DeviceOutputStream_writeDeviceNC(JNIEnv *, jobject, jbyteArray, jint, jint);
+#else
+#include <org_eclipse_soda_dk_comm_NSDeviceOutputStream.h>
+#endif
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceOutputStream
+ * Method:    writeDeviceNC
+ * Signature: ([BII)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jbyteArray jbuf, jint off, jint len) {
+#ifdef WIN32
+    return w32DeviceOutputStream_writeDeviceNC(jenv, jobj, jbuf, off, len);
+#else
+#if _WIN32_WCE>=400
+    return w32DeviceOutputStream_writeDeviceNC(jenv, jobj, jbuf, off, len);
+#else
+    return cygDeviceOutputStream_writeDeviceNC(jenv, jobj, jbuf, off, len);
+#endif
+#endif
+}	/*/ Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSParallelPort.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSParallelPort.c
new file mode 100644
index 0000000000000000000000000000000000000000..98818dff2b9d56842120fd86cd34fcf9aede7162
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSParallelPort.c
@@ -0,0 +1,120 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_NSParallelPort.h"
+#include "w32ParallePort.h"
+#else
+#include <org_eclipse_soda_dk_comm_NSParallelPort.h>
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    closeDeviceNC
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL  Java_org_eclipse_soda_dk_comm_NSParallelPort_closeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint semId)
+{
+#ifdef WIN32
+	return w32ParallelPort_closeDeviceNC(jenv, jobj, fd, semId);
+#else
+//    return cyg32ParallelPort_closeDeviceNC(jenv, jobj, fd, semId);
+    return cygParallelPort_closeDeviceNC(jenv, jobj, fd, semId);
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSParallelPort_closeDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    openDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_openDeviceNC
+  (JNIEnv *jenv, jobject jobj, jstring name, jint semId)
+{
+#ifdef WIN32
+    return w32ParallelPort_openDeviceNC(jenv, jobj, name, semId);
+#else
+    return cygParallelPort_openDeviceNC(jenv, jobj, name, semId);
+#endif
+}   /* Java_org_eclipse_soda_dk_comm_NSParallelPort_openDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPaperOutNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPaperOutNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef WIN32
+	return 1;
+//    return w32ParallelPort_isPaperOutNC(jenv, jobj, jfd);
+#else
+    return cygParallelPort_isPaperOutNC(jenv, jobj, jfd);
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSParallelPort_isPaperOutNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterBusyNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterBusyNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef WIN32
+	return 1;
+//    return w32ParallelPort_isPrinterBusyNC(jenv, jobj, jfd);
+#else
+    return cygParallelPort_isPrinterBusyNC(jenv, jobj, jfd);
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterBusyNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterSelectedNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterSelectedNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef WIN32
+	return 1;
+//    return w32ParallelPort_isPrinterSelectedNC(jenv, jobj, jfd);
+#else
+    return cygParallelPort_isPrinterSelectedNC(jenv, jobj, jfd);
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterSelectedNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterTimedOutNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterTimedOutNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef WIN32
+	return 1;
+//    return w32ParallelPort_isPrinterTimedOutNC(jenv, jobj, jfd);
+#else
+    return cygParallelPort_isPrinterTimedOutNC(jenv, jobj, jfd);
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterTimedOutNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterErrorNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterErrorNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef WIN32
+	return 1;
+//    return w32ParallelPort_isPrinterErrorNC(jenv, jobj, jfd);
+#else
+    return cygParallelPort_isPrinterErrorNC(jenv, jobj, jfd);
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterErrorNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSSerialPort.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSSerialPort.c
new file mode 100644
index 0000000000000000000000000000000000000000..dac25e04cda922aaae3370733c882ce715d8ecce
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/NSSerialPort.c
@@ -0,0 +1,344 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_NSSerialPort.h"
+#include "w32SerialPort.h"
+#else
+#if _WIN32_WCE>=400
+#include "org_eclipse_soda_dk_comm_NSSerialPort.h"
+#include "w32SerialPort.h"
+#else
+#include <org_eclipse_soda_dk_comm_NSSerialPort.h>
+#endif
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    closeDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint semId)
+{
+#ifdef WIN32
+    return w32SerialPort_closeDeviceNC(jenv, jobj, fd, semId);
+#else
+#if _WIN32_WCE>=400
+	return w32SerialPort_closeDeviceNC(jenv, jobj, fd, semId);
+#else
+    return cygSerialPort_closeDeviceNC(jenv, jobj, fd, semId);
+#endif
+#endif
+}	/* Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    openDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC
+  (JNIEnv *jenv, jobject jobj, jstring name, jint semId)
+{
+#ifdef WIN32
+    return w32SerialPort_openDeviceNC((JNIEnv *)jenv, jobj, name, semId);
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_openDeviceNC((JNIEnv *)jenv, jobj, name, semId);
+#else
+    return cygSerialPort_openDeviceNC(jenv, jobj, name, semId);
+#endif
+#endif
+}   /* Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setFlowControlModeNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint fc )
+{
+#ifdef WIN32
+    return w32SerialPort_setFlowControlModeNC(jenv, jobj, fd, fc );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_setFlowControlModeNC(jenv, jobj, fd, fc );
+#else
+    return cygSerialPort_setFlowControlModeNC(jenv, jobj, fd, fc );
+#endif
+#endif
+}   /* Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getFlowControlModeNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC
+  (JNIEnv *jenv, jobject jobj, jint fd )
+{
+#ifdef WIN32
+    return w32SerialPort_getFlowControlModeNC(jenv, jobj, fd );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_getFlowControlModeNC(jenv, jobj, fd );
+#else
+    return cygSerialPort_getFlowControlModeNC(jenv, jobj, fd );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getBaudRateNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC
+  (JNIEnv *jenv, jobject jobj, jint fd)
+{
+#ifdef WIN32
+    return w32SerialPort_getBaudRateNC(jenv, jobj, fd);
+#else
+#if _WI32_WCE>=400
+    return w32SerialPort_getBaudRateNC(jenv, jobj, fd);
+#else
+    return cygSerialPort_getBaudRateNC(jenv, jobj, fd);
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getDataBitsNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC
+  (JNIEnv *jenv, jobject jobj, jint fd)
+{
+#ifdef WIN32
+    return w32SerialPort_getDataBitsNC(jenv, jobj, fd);
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_getDataBitsNC(jenv, jobj, fd);
+#else
+    return cygSerialPort_getDataBitsNC(jenv, jobj, fd);
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getStopBitsNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC
+  (JNIEnv *jenv, jobject jobj, jint fd)
+{
+#ifdef WIN32
+    return w32SerialPort_getStopBitsNC( jenv, jobj, fd );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_getStopBitsNC( jenv, jobj, fd );
+#else
+    return cygSerialPort_getStopBitsNC( jenv, jobj, fd );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getParityNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC
+  (JNIEnv *jenv, jobject jobj, jint fd)
+{
+#ifdef WIN32
+    return w32SerialPort_getParityNC( jenv, jobj, fd );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_getParityNC( jenv, jobj, fd );
+#else
+    return cygSerialPort_getParityNC( jenv, jobj, fd );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setDTRNC
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC
+  (JNIEnv *jenv, jobject jobj, jboolean bool)
+{
+#ifdef WIN32
+    w32SerialPort_setDTRNC( jenv, jobj, bool );
+#else
+#if _WIN32_WCE>=400
+    w32SerialPort_setDTRNC( jenv, jobj, bool );
+#else
+    cygSerialPort_setDTRNC( jenv, jobj, bool );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isDTRNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC
+  (JNIEnv *jenv, jobject jobj)
+{
+#ifdef WIN32
+    return w32SerialPort_isDTRNC( jenv, jobj );
+#else
+#if _WIN32_WCE
+    return w32SerialPort_isDTRNC( jenv, jobj );
+#else
+    return cygSerialPort_isDTRNC( jenv, jobj );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setRTSNC
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC
+  (JNIEnv *jenv, jobject jobj, jboolean bool)
+{
+#ifdef WIN32
+    w32SerialPort_setRTSNC( jenv, jobj, bool );
+#else
+#if _WIN32_WCE>=400
+    w32SerialPort_setRTSNC( jenv, jobj, bool );
+#else
+    cygSerialPort_setRTSNC( jenv, jobj, bool );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isRTSNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC
+  (JNIEnv *jenv, jobject jobj)
+{
+#ifdef WIN32
+    return w32SerialPort_isRTSNC( jenv, jobj );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_isRTSNC( jenv, jobj );
+#else
+    return cygSerialPort_isRTSNC( jenv, jobj );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isCTSNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC
+  (JNIEnv *jenv, jobject jobj)
+{
+#ifdef WIN32
+    return w32SerialPort_isCTSNC( jenv, jobj );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_isCTSNC( jenv, jobj );
+#else
+    return cygSerialPort_isCTSNC( jenv, jobj );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isDSRNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC
+  (JNIEnv *jenv, jobject jobj)
+{
+#ifdef WIN32
+    return w32SerialPort_isDSRNC( jenv, jobj );
+#else
+#ifdef _WIN32_WCE>=400
+    return w32SerialPort_isDSRNC( jenv, jobj );
+#else
+    return cygSerialPort_isDSRNC( jenv, jobj );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isRINC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC
+  (JNIEnv *jenv, jobject jobj)
+{
+#ifdef WIN32
+    return w32SerialPort_isRINC( jenv, jobj );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_isRINC( jenv, jobj );
+#else
+    return cygSerialPort_isRINC( jenv, jobj );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isCDNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC
+  (JNIEnv *jenv, jobject jobj)
+{
+#ifdef WIN32
+    return w32SerialPort_isCDNC( jenv, jobj );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_isCDNC( jenv, jobj );
+#else
+    return cygSerialPort_isCDNC( jenv, jobj );
+#endif
+#endif
+}  /* Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    sendBreakNC
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC
+  (JNIEnv *jenv, jobject jobj, jint jfd, jint jmillis) {
+#ifdef WIN32
+	return 1;
+//    return w32SerialPort_sendBreakNC( jenv, jobj, jfd, jmillis );
+#else
+#if _WIN32_WCE>=400
+	return 1;
+#else
+    return cygSerialPort_sendBreakNC( jenv, jobj, jfd, jmillis );
+#endif
+#endif
+} /* Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setSerialPortParamsNC
+ * Signature: (IIIII)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC
+  (JNIEnv *jenv, jobject jobj, jint jfd, jint jbd, jint jdb, jint jsb, jint jpar) {
+#ifdef WIN32
+    return w32SerialPort_setSerialPortParamsNC( jenv, jobj, jfd, jbd, jdb, jsb, jpar );
+#else
+#if _WIN32_WCE>=400
+    return w32SerialPort_setSerialPortParamsNC( jenv, jobj, jfd, jbd, jdb, jsb, jpar );
+#else
+    return cygSerialPort_setSerialPortParamsNC( jenv, jobj, jfd, jbd, jdb, jsb, jpar );
+#endif
+#endif
+} /* Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/ParallelErrorEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/ParallelErrorEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..8014bdef14822cac52f0445154761c5fdb486fc9
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/ParallelErrorEventThread.c
@@ -0,0 +1,30 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_ParallelErrorEventThread.h"
+#else
+#include <org_eclipse_soda_dk_comm_ParallelErrorEventThread.h>
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_ParallelErrorEventThread
+ * Method:    monitorParallelErrorNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC
+(JNIEnv *jenv, jobject jobj, jint jfd) {
+#ifdef WIN32
+	return;
+//    return w32ParallelErrorEventThread_monitorParallelErrorNC(jenv, jobj, jfd);
+#else
+    return;
+//    return cygParallelErrorEventThread_monitorParallelErrorNC(jenv, jobj, jfd);
+#endif
+} /* Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/Linux/i386_/dkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/Linux/i386_/dkcomm.so
new file mode 100644
index 0000000000000000000000000000000000000000..9d4804732026da556ce983cb557086f843d48afa
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/Linux/i386_/dkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.dll b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a5f33809a6c74f16cb1ff5880bccf9b650be62b8
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.dll differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.exp b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.exp
new file mode 100644
index 0000000000000000000000000000000000000000..8d5a4a8aa89ae40c8598481d7f53ac49a891fb44
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.exp differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.lib b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.lib
new file mode 100644
index 0000000000000000000000000000000000000000..a0e4c546edc84507480a02eb8d7feca6bc870736
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.lib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.pdb b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..139e5ef7d8740d81c95055ba589cb4e862dea9cb
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/Release/win32/x86/dkcomm.pdb differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/SerialDataEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SerialDataEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..8cbadc031e834fe4ca3d0c2dfdbfbcc3618b5c1a
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SerialDataEventThread.c
@@ -0,0 +1,38 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_SerialDataEventThread.h"
+extern void w32SerialDataEventThread_monitorSerialDataNC(JNIEnv *, jobject, jint);
+#else
+#if _WIN32_WCE>=400
+#include "org_eclipse_soda_dk_comm_SerialDataEventThread.h"
+extern void w32SerialDataEventThread_monitorSerialDataNC(JNIEnv *, jobject, jint);
+#else
+#include <org_eclipse_soda_dk_comm_SerialDataEventThread.h>
+#endif
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialDataEventThread
+ * Method:    monitorSerialDataNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC
+  (JNIEnv *jenv, jobject jobj, jint jfd) {
+#ifdef WIN32
+    w32SerialDataEventThread_monitorSerialDataNC( jenv, jobj, jfd );
+#else
+#if _WIN32_WCE>=400
+    w32SerialDataEventThread_monitorSerialDataNC( jenv, jobj, jfd );
+#else
+    cygSerialDataEventThread_monitorSerialDataNC( jenv, jobj, jfd );
+#endif
+#endif
+} /* Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/SerialStatusEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SerialStatusEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..257fb9bbda0fdeb1af17cc7997a3f940cb759617
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SerialStatusEventThread.c
@@ -0,0 +1,38 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifdef WIN32
+#include "org_eclipse_soda_dk_comm_SerialStatusEventThread.h"
+extern void w32SerialStatusEventThread_monitorSerialStatusNC(JNIEnv *, jobject, jint);
+#else
+#if _WIN32_WCE>=400
+#include "org_eclipse_soda_dk_comm_SerialStatusEventThread.h"
+extern void w32SerialStatusEventThread_monitorSerialStatusNC(JNIEnv *, jobject, jint);
+#else
+#include <org_eclipse_soda_dk_comm_SerialStatusEventThread.h>
+#endif
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialStatusEventThread
+ * Method:    monitorSerialStatusNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC
+(JNIEnv *jenv, jobject jobj, jint jfd) {
+#ifdef WIN32
+	w32SerialStatusEventThread_monitorSerialStatusNC(jenv, jobj, jfd);
+#else
+#if _WIN32_WCE>=400
+	w32SerialStatusEventThread_monitorSerialStatusNC(jenv, jobj, jfd);
+#else
+    cygSerialStatusEventThread_monitorSerialStatusNC(jenv, jobj, jfd);
+#endif
+#endif
+} /* Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/SysVStyleSemaphore.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SysVStyleSemaphore.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f4eedcfb0ce04eb461466e828fa4fa935cb8953
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SysVStyleSemaphore.c
@@ -0,0 +1,52 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <fcntl.h>
+#include "SysVStyleSemaphore.h"
+/* created to allow sysV type lookup of semaphore by a unique integer ID
+*/
+static int sem_count = 0;
+static sem_entry sem_tbl[SEM_TBL_SIZE];
+/* Looks up a POSIX semaphore by an integer identifyer.
+	Used to circumvent sysV type semaphores */
+sem_t* sem_lookup(int semID) {
+   return sem_tbl[semID].semaphore;
+}
+/* Creates a POSIX semaphore and adds it to sem_tbl.
+	Returns the semaphore id or -1 for error.*/
+int sem_create(int semID, int initialSize) {
+   
+	int i;
+	for(i = 0; i < SEM_TBL_SIZE; i++){
+		
+      if(i >= sem_count) {
+	  		/* Create semaphore name from semID */
+	  		char semName[15];
+			sprintf(semName, "%d", semID);
+			sem_count++;									  /* increment count */
+			// Previous method using memory mapped semaphores. Not
+			// supported by OSX.
+			//sem_init(sem_lookup(i), 0, initialSize); /* init semaphore */
+			
+			// New method using named semaphores
+			sem_t * sem;
+			sem = sem_open(semName, O_CREAT, 0666, 1);
+			sem_post(sem); // Try to open if semaphore already exists
+			sem_tbl[i].semaphore = sem;
+			sem_tbl[i].id = semID; 					     /* set the id */
+		 return i;
+		} else if(sem_tbl[i].id == semID){
+         return i;
+		}
+   }
+   
+	return -1;
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/SysVStyleSemaphore.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SysVStyleSemaphore.h
new file mode 100644
index 0000000000000000000000000000000000000000..93af351047e27baca07b21983eca7d353e88a94f
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/SysVStyleSemaphore.h
@@ -0,0 +1,31 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#ifndef _SysVStyleSemaphore_h_
+#define _SysVStyleSemaphore_h_
+#include <semaphore.h>
+#ifdef NCI
+#define SEM_TBL_SIZE 5
+#else
+#define SEM_TBL_SIZE 8
+#endif
+typedef struct {
+	sem_t * semaphore;
+	int id;
+	int pid; /* currently not used */
+} sem_entry;
+/* Looks up a POSIX semaphore by an integer identifyer.
+	Used to circumvent sysV type semaphores */
+sem_t* sem_lookup(int semID);															 
+															 
+/* Creates a POSIX semaphore and adds it to sem_tbl.
+	Returns the semaphore id or -1 for error.*/
+int sem_create(int semID, int initialSize);
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/build-win.bat b/target-platform/org.eclipse.soda.dk.comm/src/main/c/build-win.bat
new file mode 100644
index 0000000000000000000000000000000000000000..82fdeaf4f59032020567224b85642729ad2ec73c
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/build-win.bat
@@ -0,0 +1,2 @@
+vcvars32
+nmake -f makefile.win32
\ No newline at end of file
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygCommDriver.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygCommDriver.c
new file mode 100644
index 0000000000000000000000000000000000000000..c130e31d633599b11078d32bd81d6b8010b2d64c
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygCommDriver.c
@@ -0,0 +1,183 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <org_eclipse_soda_dk_comm_NSCommDriver.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#ifdef _POSIX_SEMAPHORES
+#include <semaphore.h>
+#include "SysVStyleSemaphore.h"
+#else 
+#include <sys/ipc.h> 
+#include <sys/sem.h> 
+#endif 
+#include <stdlib.h>
+#define assert(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); return;}
+#define CREAT_PERMS	(0666)
+// for unix only
+// #define KERNEL_2200	"kernel.2200"
+// #define KERNEL_1000	"kernel.1000"
+typedef struct port_s {
+	char		*portName;
+	int		portType;
+	char		*deviceName;
+	int		semKey;
+} port_t;
+void cygCommDriver_discoverDevicesNC(JNIEnv *jenv, jobject jobj) {
+  jclass	jc;
+  jmethodID	jm;
+  const int	PORT_SERIAL = 1;	// should match with CommPortIdentifier
+  const int	PORT_PARALLEL = 2;	// should match with CommPortIdentifier
+  struct stat	sbuf;
+  jstring	pName;
+  jstring	dName;
+  jthrowable	jt;
+  port_t	port_tbl[] =
+		{
+#ifdef NCI
+			{ "LPT1", PORT_PARALLEL, "/dev/lpt0" , 0x11223344 },
+			{ "COM1", PORT_SERIAL  , "/dev/tty00", 0x11223345 },
+			{ "SC"  , PORT_SERIAL  , "/dev/sc"   , 0x11223346 }, // ????
+			{ "COM2", PORT_SERIAL  , "/dev/tty01", 0x11223347 },
+			{ "COM3", PORT_SERIAL  , "/dev/tty02", 0x11223348 },
+			{ "COM4", PORT_SERIAL  , "/dev/tty03", 0x11223349 },
+			{ "COM5", PORT_SERIAL  , "/dev/tty04", 0x11223350 },
+			{ "COM6", PORT_SERIAL  , "/dev/tty05", 0x11223351 },
+#endif	/* NCI */
+#if defined(__linux__) || defined(__osx__)
+			{ "LPT1", PORT_PARALLEL, "/dev/lp0"  , 0x11223344 },
+			{ "/dev/ttyS0", PORT_SERIAL  , "/dev/ttyS0", 0x11223345 },
+			{ "/dev/ttyS1", PORT_SERIAL  , "/dev/ttyS1", 0x11223347 },
+			{ "/dev/ttyS2", PORT_SERIAL  , "/dev/ttyS2", 0x11223348 },
+			{ "/dev/ttyS3", PORT_SERIAL  , "/dev/ttyS3", 0x11223349 },
+			{ "/dev/ttyS4", PORT_SERIAL  , "/dev/ttyS4", 0x11223350 },
+			{ "/dev/ttyS5", PORT_SERIAL  , "/dev/ttyS5", 0x11223351 },
+			{ "/dev/ttyS6", PORT_SERIAL  , "/dev/ttyS6", 0x11223352 },
+			{ "/dev/ttyS7", PORT_SERIAL  , "/dev/ttyS7", 0x11223353 },
+			{ "/dev/ttyS8", PORT_SERIAL  , "/dev/ttyS8", 0x11223354 },
+			{ "/dev/ttyS9", PORT_SERIAL  , "/dev/ttyS9", 0x11223355 },
+			{ "/dev/ttyO4", PORT_SERIAL  , "/dev/ttyO4", 0x11223356 },
+			{ "/dev/ttyO5", PORT_SERIAL  , "/dev/ttyO5", 0x11223357 },
+			{ "/dev/modem", PORT_SERIAL  , "/dev/modem", 0x11223358 },
+			{ "/dev/ttyUSB0", PORT_SERIAL  , "/dev/ttyUSB0", 0x11223359 },
+			{ "/dev/ttyUSB1", PORT_SERIAL  , "/dev/ttyUSB1", 0x11223360 },
+			{ "/dev/ttyUSB2", PORT_SERIAL  , "/dev/ttyUSB2", 0x11223361 },
+			{ "/dev/ttyUSB3", PORT_SERIAL  , "/dev/ttyUSB3", 0x11223362 },
+			{ "/dev/ttyUSB4", PORT_SERIAL  , "/dev/ttyUSB4", 0x11223363 },
+			{ "/dev/ttyUSB5", PORT_SERIAL  , "/dev/ttyUSB5", 0x11223364 },
+			{ "/dev/ttyUSB6", PORT_SERIAL  , "/dev/ttyUSB6", 0x11223365 },
+			{ "/dev/ttyUSB7", PORT_SERIAL  , "/dev/ttyUSB7", 0x11223366 },
+			{ "/dev/ttyUSB8", PORT_SERIAL  , "/dev/ttyUSB8", 0x11223367 },
+			{ "/dev/ttyUSB9", PORT_SERIAL  , "/dev/ttyUSB9", 0x11223368 },
+			{ "/dev/ttyUSB10", PORT_SERIAL  , "/dev/ttyUSB10", 0x11223369 },
+			{ "/dev/ttyUSB11", PORT_SERIAL  , "/dev/ttyUSB11", 0x11223370 },
+			{ "/dev/ttyUSB12", PORT_SERIAL  , "/dev/ttyUSB12", 0x11223371 },
+			{ "/dev/ttyUSB13", PORT_SERIAL  , "/dev/ttyUSB13", 0x11223372 },
+			{ "/dev/ttyUSB14", PORT_SERIAL  , "/dev/ttyUSB14", 0x11223373 },
+			{ "/dev/ttyUSB15", PORT_SERIAL  , "/dev/ttyUSB15", 0x11223374 },
+			{ "/dev/ttyUSB16", PORT_SERIAL  , "/dev/ttyUSB16", 0x11223375 },
+			{ "/dev/ttyUSB17", PORT_SERIAL  , "/dev/ttyUSB17", 0x11223376 },
+			{ "/dev/ttyUSB18", PORT_SERIAL  , "/dev/ttyUSB18", 0x11223377 },
+			{ "/dev/ttyUSB19", PORT_SERIAL  , "/dev/ttyUSB19", 0x11223378 },
+			{ "/dev/ttyACM0", PORT_SERIAL  , "/dev/ttyACM0", 0x11223379 },
+			{ "/dev/ttyACM1", PORT_SERIAL  , "/dev/ttyACM1", 0x11223380 },
+			{ "/dev/ttyACM2", PORT_SERIAL  , "/dev/ttyACM2", 0x11223381 },
+			{ "/dev/ttyACM3", PORT_SERIAL  , "/dev/ttyACM3", 0x11223382 },
+			{ "/dev/ttyACM4", PORT_SERIAL  , "/dev/ttyACM4", 0x11223383 },
+			{ "/dev/ttyACM5", PORT_SERIAL  , "/dev/ttyACM5", 0x11223384 },
+			{ "/dev/ttyACM6", PORT_SERIAL  , "/dev/ttyACM6", 0x11223385 },
+			{ "/dev/ttyACM7", PORT_SERIAL  , "/dev/ttyACM7", 0x11223386 },
+			{ "/dev/ttyACM8", PORT_SERIAL  , "/dev/ttyACM8", 0x11223387 },
+			{ "/dev/ttyACM9", PORT_SERIAL  , "/dev/ttyACM9", 0x11223388 },
+			{ "/dev/ttyO0",   PORT_SERIAL  , "/dev/ttyO0", 0x11223389 },
+			{ "/dev/ttyO1",   PORT_SERIAL  , "/dev/ttyO1", 0x11223390 },
+			{ "/dev/ttyO2",   PORT_SERIAL  , "/dev/ttyO0", 0x11223391 },
+			{ "/dev/ttyO3",   PORT_SERIAL  , "/dev/ttyO0", 0x11223392 },
+			{ "/dev/AMA0",    PORT_SERIAL  , "/dev/AMA0", 0x11223393 },
+			{ "/dev/tty.usbserial", PORT_SERIAL , "/dev/tty.usbserial", 0x11223394 },
+#endif	/* __linux__ */
+#ifdef QNX
+			{ "LPT1", PORT_PARALLEL, "/dev/par1"  , 0x11223344 },
+			{ "COM1", PORT_SERIAL  , "/dev/ser1", 0x11223345 },
+			{ "COM2", PORT_SERIAL  , "/dev/ser2", 0x11223347 },
+			{ "COM3", PORT_SERIAL  , "/dev/ser3", 0x11223348 },
+			{ "COM4", PORT_SERIAL  , "/dev/ser4", 0x11223349 },
+			{ "COM5", PORT_SERIAL  , "/dev/ser5", 0x11223350 },
+			{ "COM6", PORT_SERIAL  , "/dev/ser6", 0x11223351 },
+			{ "COM7", PORT_SERIAL  , "/dev/ser7", 0x11223352 },
+			{ "COM8", PORT_SERIAL  , "/dev/ser8", 0x11223353 },
+			{ "COM9", PORT_SERIAL  , "/dev/ser9", 0x11223354 },
+			{ "COM10", PORT_SERIAL  , "/dev/ser10", 0x11223355 },
+			{ "COM11", PORT_SERIAL  , "/dev/ser11", 0x11223356 },
+			{ "COM12", PORT_SERIAL  , "/dev/ser12", 0x11223357 },
+#endif	/* QNX  */
+		};
+  port_t	*pp;
+  // Get access to the method to add a port.
+  jc = (*jenv)->GetObjectClass(jenv, jobj);
+  assert(jc);
+  jm = (*jenv)->GetMethodID(jenv, jc, "addDeviceToList",
+			    "(Ljava/lang/String;ILjava/lang/String;I)V");
+  assert(jm);
+  // Determine if we're running on a badger.  If so, use the alternate list.
+  // For UNIX only
+  //{
+  // char  *envp =  getenv("BOOT_KERNEL");
+  //
+  // if (envp && *envp) {
+  //    if (!strcmp(envp, KERNEL_2200)) {
+  //       port_tbl = port_tbl_2200;
+  //       port_tbl_noentries = sizeof(port_tbl_2200)/sizeof(port_tbl_2200[0]);
+  //    }
+  //    else if (!strcmp(envp, KERNEL_1000)) {
+  //       port_tbl = port_tbl_1000;
+  //       port_tbl_noentries = sizeof(port_tbl_1000)/sizeof(port_tbl_1000[0]);
+  //    }
+  // }
+  //}
+  // For all the pre-defined ports, check to see which ones exist, and add
+  // them selectively.
+  for (pp = port_tbl;
+       pp < port_tbl+(sizeof(port_tbl)/sizeof(port_tbl[0]));
+       ++pp) {
+       if (stat(pp->deviceName, &sbuf) != -1) {
+		int		semID;
+		
+		pName = (*jenv)->NewStringUTF(jenv, pp->portName);
+		if (!pName)
+			continue;
+		dName = (*jenv)->NewStringUTF(jenv, pp->deviceName);
+		if (!dName)
+			continue;
+		/* Obtain/create a semaphore for the device in consideration.
+		   If it fails, don't lock/unlock it later on. */
+#ifdef _POSIX_SEMAPHORES
+		semID = sem_create(pp->semKey, 1);
+#else
+		semID = semget((key_t)pp->semKey, 1, IPC_CREAT | CREAT_PERMS);
+#endif
+#ifdef DEBUG
+       printf( "%s ( %s ) semID %d\n", pName, dName, semID );
+       fflush( stdout );
+#endif
+	
+		(*jenv)->CallVoidMethod(jenv, jobj, jm,
+					pName, pp->portType, dName, semID);
+		jt = (*jenv)->ExceptionOccurred(jenv);
+		if (jt) {
+			(*jenv)->ExceptionDescribe(jenv);
+			(*jenv)->ExceptionClear(jenv);
+		}
+       }
+  }
+  return;
+}	// Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygCommPortIdentifier.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygCommPortIdentifier.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c014298b445d3b3f4d67a09a0a110f78e573cda
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygCommPortIdentifier.c
@@ -0,0 +1,235 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include "dkcomm.h"
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+#ifdef _POSIX_SEMAPHORES
+#include <semaphore.h>
+#include "SysVStyleSemaphore.h"
+#else 
+#include <sys/ipc.h> 
+#include <sys/sem.h> 
+#endif 
+  
+#include <javax_comm_CommPortIdentifier.h>
+#define assertexc(s)       if (!s) {fprintf(stderr, "\n\n%d asserted!\n\n", __LINE__); \
+				 return(-1);}
+#define NOOF_ELEMS(s)	((sizeof(s))/(sizeof(s[0])))
+typedef struct port_s {
+	char		*portName;
+	int		semKey;
+} port_t;
+#ifndef _POSIX_SEMAPHORES
+static struct sembuf	dev_wait[] = {
+		{ 0, 0, 0 }	/* wait until it is free */
+};
+#endif
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	// getPollingTime()
+static int GetSemID(const char *pnm) {
+  int		semID = -1;
+  port_t	port_tbl[] =  
+	  {
+			{ "LPT1", 0x11223344 },
+			{ "COM1", 0x11223345 },
+#ifdef NCI
+			{ "SC",   0x11223346 }, // ????
+#endif	/* NCI */
+			{ "COM2", 0x11223347 },
+			{ "COM3", 0x11223348 },
+			{ "COM4", 0x11223349 },
+#ifdef NCI
+			{ "COM5", 0x11223350 },
+			{ "COM6", 0x11223351 },
+#endif	/* NCI */
+#ifdef QNX
+			{ "COM5", 0x11223350 },
+			{ "COM6", 0x11223351 },
+			{ "COM7", 0x11223352 },
+			{ "COM8", 0x11223353 },
+			{ "COM9", 0x11223354 },
+			{ "COM10", 0x11223355 },
+			{ "COM11", 0x11223356 },
+			{ "COM12", 0x11223357 },
+#endif /* QNX */
+		};
+  port_t	*pp;
+  int		keyFound = 0;
+  /* Find the semaphore key for the corresponding port name. */
+  for (pp = port_tbl;
+       pp < port_tbl+NOOF_ELEMS(port_tbl);
+       ++pp) {
+      if (!strcmp(pp->portName, pnm)) {
+	  keyFound++;
+	  break;
+      }
+  }
+  if (!keyFound)
+      return semID;
+#ifndef _POSIX_SEMAPHORES
+  /* Get the semaphore ID for the key obtained. */
+  semID = semget((key_t)pp->semKey, 1, 0);
+#else
+	/* don't worry about return value for right now */
+  semID = sem_create(pp->semKey, 1);
+#endif /* _POSIX_SEMAPHORES */
+  return semID;
+}	// GetSemID()
+/*
+ * Class:     javax_comm_CommPortIdentifier
+ * Method:    monitorInterJVMDeviceAccessNC
+ * Signature: (Ljava/lang/Thread;)I
+ *
+ * Currenty not Supported on Posix Devices
+ */
+int cygCommPortIdentifier_monitorInterJVMDeviceAccessNC
+(JNIEnv *jenv, jobject jobj, jobject jtho) {
+	int		pollingTime;	/* seconds */
+	int		oldVal, newVal;
+	jclass		jc;
+	jmethodID	jm;
+	jfieldID	pnameID;
+	jstring		pname;
+	const char	*pnamec;
+	jboolean	isInterruptedReturn;
+	jclass		jcpoc;		/* CommPortOwnershipListener interf */
+	jfieldID	cpoPOID;	/* PORT_OWNED ID */
+	jfieldID	cpoPUID;	/* PORT_UNOWNED ID */
+	jfieldID	cpoPRID;	/* PORT_OWNERSHIP_REQUESTED ID */
+	jint		cpoPO;		/* PORT_OWNED value */
+	jint		cpoPU;		/* PORT_UNOWNED value */
+	jint		cpoPR;		/* PORT_OWNERSHIP_REQUESTED value */
+	jmethodID	jintMethod;
+	jclass		jthreadClass;
+	int		semID;
+	union semuni	scarg;
+	int		mypid = getpid();
+	int		scpid;
+	pollingTime = getPollingTime(jenv);
+	/* Get the class ID of the CommPortIdentifier object.*/
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	/* Get the id of the method to report a change-ownership event. */
+	jm = (*jenv)->GetMethodID(jenv, jc, "fireOwnershipEvent", "(I)V");
+	assertexc(jm);
+	/* Get the const values for the CommPortOwnershipListener events.*/
+	jcpoc = (*jenv)->FindClass(jenv, "javax/comm/CommPortOwnershipListener");
+	assertexc(jcpoc);
+	cpoPOID = (*jenv)->GetStaticFieldID(jenv, jcpoc, "PORT_OWNED", "I");
+	assertexc(cpoPOID);
+	cpoPO = (*jenv)->GetStaticIntField(jenv, jcpoc, cpoPOID);
+	cpoPUID = (*jenv)->GetStaticFieldID(jenv, jcpoc, "PORT_UNOWNED", "I");
+	assertexc(cpoPUID);
+	cpoPU = (*jenv)->GetStaticIntField(jenv, jcpoc, cpoPUID);
+	cpoPRID = (*jenv)->GetStaticFieldID(jenv, jcpoc, "PORT_OWNERSHIP_REQUESTED", "I");
+	assertexc(cpoPRID);
+	cpoPR = (*jenv)->GetStaticIntField(jenv, jcpoc, cpoPRID);
+	/* Get the port name. */
+	pnameID = (*jenv)->GetFieldID(jenv, jc, "name", "Ljava/lang/String;");
+	assertexc(pnameID);
+	pname = (*jenv)->GetObjectField(jenv, jobj, pnameID);
+	assertexc(pname);
+  	pnamec = (*jenv)->GetStringUTFChars(jenv, pname, 0);
+	/* Get the corresponding semaphore ID for the port name. */
+	semID = GetSemID(pnamec);
+  	(*jenv)->ReleaseStringUTFChars(jenv, pname, pnamec);
+	if (semID == -1)
+		return -1;
+	/* Get access to the interrupted method. */
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+	(void)memset(&scarg, 0, sizeof(scarg));
+/* what is this for? */
+	/* Get the current value of the semaphore. */
+#ifdef  _POSIX_SEMAPHORES
+	if ((sem_getvalue(sem_lookup(semID), &oldVal)) < 0) {
+#else
+	if ((oldVal = semctl(semID, 0, GETVAL, scarg)) < 0) {
+#endif		
+		(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semctl error %d!\n", errno);
+		return -1;
+	}
+/* !!!!!!!!!!!!!! */
+	while(1)
+	{
+		/* Check to see if this thread has been interrupted. */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv, jtho, jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		/* If the semaphore was locked the last time, wait until it
+		   gets unlocked.  Else, catch some breath.
+		 */
+#ifdef NCI
+		if (oldVal) {
+#ifdef  _POSIX_SEMAPHORES
+			if(sem_wait(sem_lookup(semID)) <0){
+#else
+			if (semop(semID, dev_wait, NOOF_ELEMS(dev_wait)) < 0) {
+#endif				
+				(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semop error %d!\n", errno);
+				return -1;
+			}
+		}
+		else
+#endif	/* NCI */
+			sleep(pollingTime);
+		/* Get the new value of the semaphore. */
+			/* Get the current value of the semaphore. */
+#ifdef  _POSIX_SEMAPHORES
+		if ((sem_getvalue(sem_lookup(semID), &oldVal)) < 0) {
+#else
+		if ((oldVal = semctl(semID, 0, GETVAL, scarg)) < 0) {
+#endif		
+			(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semctl error %d!\n", errno);
+			return -1;
+		}
+		if (newVal == oldVal)
+			continue;
+		/* Get PID of the last process that changed the semaphore.
+		   If it is the same JVM, ignore this change.
+		 */
+			/* Get the current value of the semaphore. */
+#ifndef  _POSIX_SEMAPHORES
+   /* DLS HACK needs to be changed */
+		if ((scpid = semctl(semID, 0, GETPID, scarg)) < 0) {
+			(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semctl error %d!\n", errno);
+			return -1;
+		}
+		if (scpid != mypid) {
+			/* If locked, send a PORT_OWNED event.
+			   Else, send a PORT_UNOWNED event.
+			 */
+			(*jenv)->CallVoidMethod(jenv, jobj, jm,
+						newVal ? cpoPO : cpoPU);
+		}
+#endif
+		oldVal = newVal;
+	}	/* end of while() */
+} /* Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygDeviceInputStream.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygDeviceInputStream.c
new file mode 100644
index 0000000000000000000000000000000000000000..8c8a2d35a54e321bf4229fe6fe068e38504d1b14
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygDeviceInputStream.c
@@ -0,0 +1,220 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <org_eclipse_soda_dk_comm_NSDeviceInputStream.h>
+#include <sys/time.h>
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define assert(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); return(-1);}
+#define assertexc(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); (*jenv)->ThrowNew(jenv, ec, "");}
+#if defined(__linux__) || defined(__osx__)
+static volatile int	timeoutOccurred = FALSE;
+static struct itimerval	apptimer;
+static struct sigaction	appsa;
+// static void		(*apphandler)();
+int			timerflag;
+static void alarm_handler(int sig)
+{
+	 timeoutOccurred = TRUE; 
+}
+static void start_read_timer(int tmovalue)
+{
+   struct itimerval	tm;
+   struct sigaction	newsa;
+   /* Suspend the app's timer and save it. */
+   (void)memset(&tm, 0, sizeof(tm));
+   (void)setitimer(ITIMER_REAL, &tm, &apptimer);
+   /* Replace the app's signal handler with ours. */
+   (void)memset(&newsa, 0, sizeof(newsa));
+   newsa.sa_handler = alarm_handler;
+   (void)sigaction(SIGALRM, &newsa, &appsa);
+   // apphandler = signal(SIGALRM, alarm_handler);
+   /* Start our timer. */
+   (void)memset(&tm, 0, sizeof(tm));
+   tm.it_value.tv_usec = tmovalue * 1000;  // convert millisec into microsec
+   (void)setitimer(ITIMER_REAL, &tm, NULL);
+   timerflag = TRUE;
+}	/* start_read_timer() */
+static void stop_read_timer()
+{
+   struct itimerval	tm;
+   if (!timerflag)
+      return;
+   /* Stop our ticking timer. */
+   (void)memset(&tm, 0, sizeof(tm));
+   (void)setitimer(ITIMER_REAL, &tm, NULL);
+   /* Restore the app's signal handler. */
+   (void)sigaction(SIGALRM, &appsa, NULL);
+   // (void)signal(SIGALRM, apphandler);
+   /* Restore the app's timer */
+   (void)setitimer(ITIMER_REAL, &apptimer, NULL);
+   timerflag = FALSE;
+}	/* stop_read_timer */
+#endif /* __linux__ */
+int cygDeviceInputStream_readDeviceOneByteNC
+  (JNIEnv *jenv, jobject jobj) {
+  jclass	jc;
+  jclass	ec;
+  jfieldID	jf;
+  jint 		fd = -1;
+  int		rc;
+  int		dc;
+  char		buf[1];
+  jfieldID	tmof;
+  int		tmo;
+  int		serrno;
+	
+  // Get the exception class.
+  ec = (*jenv)->FindClass(jenv, "java/io/IOException");
+  assert(ec);
+  // Get the file descriptor.
+  jc = (*jenv)->GetObjectClass(jenv, jobj);
+  assertexc(jc);
+  jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+  assertexc(jf);
+  fd = (*jenv)->GetIntField(jenv, jobj, jf);
+  if (fd == -1) {
+	(*jenv)->ThrowNew(jenv, ec, "");
+  }
+  tmof = (*jenv)->GetFieldID(jenv, jc, "tmo", "I");
+  assert(tmof);
+  tmo = (*jenv)->GetIntField(jenv, jobj, tmof);
+  
+#ifdef QNX
+	// Read data - QNX with timeout
+	if (tmo <100 & tmo>0) {
+		tmo=100;
+	}
+	dc=readcond(fd, buf, 1, 1, 0, tmo/100); //10th of a second instead of microSecs
+	if (dc<1) {
+		//dc=-1; //return fake error
+	}
+#endif /* QNX */
+#if defined(__linux__) || defined(__osx__)
+  // Start the timer.
+  timeoutOccurred = FALSE;
+  if (tmo > 0)
+	start_read_timer(tmo);
+  // Read data.
+  buf[0] = 0;
+  dc = read(fd, buf, 1);
+  serrno = errno;
+  // Stop the timer.
+  if (tmo > 0)
+	stop_read_timer();
+  if (dc < 0 && !(serrno == EINTR || serrno == EAGAIN)) {
+	(*jenv)->ThrowNew(jenv, ec, "");
+  }
+#endif /* __linux__ */
+  // If timeout had occurred, or if nil data was received, return -1.
+  if (dc <= 0)
+	return -1;
+  return (int)(unsigned char)buf[0];
+}	/* cygDeviceInputStream_readDeviceOneByteNC */
+int cygDeviceInputStream_readDeviceNC
+  (JNIEnv *jenv, jobject jobj, jbyteArray jba, jint off, jint len) {
+  jclass	jc;
+  jfieldID	jf;
+  jint 		fd = -1;
+  int		rc;
+  int		dc = 0;
+  char		*cbuf;
+  jfieldID	tmof;
+  int		tmo;
+  jfieldID	tmoDonef;
+  
+  cbuf = malloc(len);
+  
+  assert(cbuf);
+  // Get the file descriptor.
+  jc = (*jenv)->GetObjectClass(jenv, jobj);
+  assert(jc);
+  jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+  assert(jf);
+  fd = (*jenv)->GetIntField(jenv, jobj, jf);
+  if (fd == -1) {
+	return -1;
+  }
+  tmof = (*jenv)->GetFieldID(jenv, jc, "tmo", "I");
+  assert(tmof);
+  tmoDonef = (*jenv)->GetFieldID(jenv, jc, "tmoDone", "Z");
+  assert(tmoDonef);
+  tmo = (*jenv)->GetIntField(jenv, jobj, tmof);
+#ifdef QNX
+	// Read data - QNX with timeout
+	if (tmo <100 & tmo>0) {
+		tmo=100;
+	}
+	
+	dc=readcond(fd, cbuf, len, len, tmo/100, tmo/100); //10th of a second instead of microSecs
+	if (dc<len) {
+		(*jenv)->SetBooleanField(jenv, jobj, tmoDonef, (jboolean)JNI_TRUE);
+		//dc=-1; //return fake error
+	}
+#endif /* QNX */
+#if defined(__linux__) || defined(__osx__) 
+  // Start the timer.
+  timeoutOccurred = FALSE;
+  if (tmo > 0)
+	start_read_timer(tmo);
+  
+    //Read data
+   dc = read(fd, cbuf, len);
+	
+  // If the timer had already expired, set the field tmoDone.
+  // Else, stop the timer.
+    if (timeoutOccurred) {
+    	dc = 0; // Bug fix for PR#117959
+		(*jenv)->SetBooleanField(jenv, jobj, tmoDonef, (jboolean)JNI_TRUE);
+  	}
+  if (tmo > 0)
+    stop_read_timer();
+#endif /*__linux__*/
+  // Copy back the data into the java buffer.
+  if (dc > 0)
+	(*jenv)->SetByteArrayRegion(jenv, jba, off, dc, (jbyte*)cbuf);
+  free(cbuf);
+  return dc;
+}	/* cygDeviceInputStream_readDeviceNC */
+int cygDeviceInputStream_getReadCountNC
+  (JNIEnv *jenv, jobject jobj) {
+  jclass	jc;
+  jclass	ec;
+  jfieldID	jf;
+  jint 		fd = -1;
+  int		rc;
+  int		dc = 0;
+  // Get the exception class.
+  ec = (*jenv)->FindClass(jenv, "java/io/IOException");
+  assert(ec);
+  // Get the file descriptor.
+  jc = (*jenv)->GetObjectClass(jenv, jobj);
+  assertexc(jc);
+  jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+  assertexc(jf);
+  fd = (*jenv)->GetIntField(jenv, jobj, jf);
+  if (fd == -1) {
+	(*jenv)->ThrowNew(jenv, ec, "");
+  }
+  // Now query the device stream for any data to be read.
+  if ((rc = ioctl(fd, FIONREAD, &dc)) == -1)
+	(*jenv)->ThrowNew(jenv, ec, "");
+  return dc;
+} /* cygDeviceInputStream_getReadCountNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygDeviceOutputStream.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygDeviceOutputStream.c
new file mode 100644
index 0000000000000000000000000000000000000000..4714af2ea86adf68d047bc2c7a5123b2a5e1570d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygDeviceOutputStream.c
@@ -0,0 +1,50 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <org_eclipse_soda_dk_comm_NSDeviceOutputStream.h>
+#define assert(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); return(-1);}
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceOutputStream
+ * Method:    writeDeviceNC
+ * Signature: ([BII)I
+ */
+int cygDeviceOutputStream_writeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jbyteArray jbuf, jint off, jint len) {
+  jclass	jc;
+  jfieldID	jf;
+  jint 		fd = -1;
+  jbyte		*cbuf;
+  jboolean	isCopy;
+  int		wc = 0;
+  jbyte		*cb;
+  int		rc;
+  if (!len)
+	return wc;
+  // Get the file descriptor.
+  jc = (*jenv)->GetObjectClass(jenv, jobj);
+  assert(jc);
+  jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+  assert(jf);
+  fd = (*jenv)->GetIntField(jenv, jobj, jf);
+  if (fd == -1)
+	return -1;
+  // Convert the java byte array buffer into c byte buffer.
+  cbuf =  (*jenv)->GetByteArrayElements(jenv, jbuf, &isCopy);
+  // Write the data out to the device.
+  for ( cb = cbuf+off; len; len -= rc, wc += rc, cb += rc ) {
+	if ((rc = write(fd, cb, len)) < 0)
+		break;
+  }
+  // Should we throw some exception in the event of a write error ????
+  // Free the c byte buffer.
+  (*jenv)->ReleaseByteArrayElements(jenv, jbuf, cbuf, JNI_ABORT);
+  return wc;
+}	/* cygDeviceOutputStream_writeDeviceNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygParallelErrorEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygParallelErrorEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..f8fc071fd20ad8bb986d8dfd9a700f005533a7ca
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygParallelErrorEventThread.c
@@ -0,0 +1,317 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#ifdef NCI
+#include <dev/ic/lptioctl.h>
+#include <dev/ic/lptreg.h>
+#endif	/* NCI */
+#ifdef __linux__
+//#define __KERNEL__  /* For printer error definitions */
+#include <linux/lp.h>
+#endif	/* __linux__ */
+#include <org_eclipse_soda_dk_comm_ParallelErrorEventThread.h>
+#define assertexc(s)       if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return;}
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	/* getPollingTime() */
+static int getStopThreadFlag(JNIEnv *jenv, jobject jobj)
+{
+	jclass cls;
+	jfieldID fid;
+	jint stopThreadFlag;
+	
+	cls = (*jenv)->GetObjectClass(jenv, jobj);
+	if (!cls) (*jenv)->FatalError(jenv, "Missing class");
+	
+	fid = (*jenv)->GetFieldID(jenv, cls, "stopThreadFlag", "I");
+	if (fid == NULL) (*jenv)->FatalError(jenv, "Missing field");
+	
+	stopThreadFlag = (*jenv)->GetIntField(jenv, jobj, fid);
+	
+	return stopThreadFlag;	
+} 
+/*
+ * Class:     org_eclipse_soda_dk_comm_ParallelErrorEventThread
+ * Method:    monitorParallelErrorNC
+ * Signature: (I)V
+ */
+void cygParallelErrorEventThread_monitorParallelErrorNC
+    (JNIEnv *jenv, jobject jobj, jint jfd) {
+	int		pollingTime;	/* seconds */
+	int		oldStatus, newStatus;
+	jfieldID	notifyOnErrorID;
+	jboolean	notifyOnErrorFlag = JNI_TRUE;
+	jclass		jc;
+	jmethodID	jm;
+	jclass		jppc;
+	jfieldID	ppID;
+	jobject		jpp;
+	jboolean	isInterruptedReturn;
+	jclass		jppec;		/* parallel port event class */
+	jfieldID	ppeErrorID;	/* field ID */
+	jint		ppeError;	/* field value */
+	jmethodID	jintMethod;
+	jclass		jthreadClass;
+	
+	jint 		stopThreadFlag;
+	pollingTime = getPollingTime(jenv);
+	/* Get the const value for the parallel port error event type.*/
+	jppec = (*jenv)->FindClass(jenv, "javax/comm/ParallelPortEvent");
+	assertexc(jppec);
+	ppeErrorID = (*jenv)->GetStaticFieldID(jenv, jppec, "PAR_EV_ERROR", "I");
+	assertexc(ppeErrorID);
+	ppeError = (*jenv)->GetStaticIntField(jenv, jppec, ppeErrorID);
+	/* Get the parallel port object.*/
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	ppID = (*jenv)->GetFieldID(jenv, jc, "pp", "Lorg/eclipse/soda/dk/comm/NSParallelPort;");
+	assertexc(ppID);
+	jpp = (*jenv)->GetObjectField(jenv, jobj, ppID);
+	assertexc(jpp);
+	/* Get the class ID of the parallel port object.*/
+	jppc = (*jenv)->GetObjectClass(jenv, jpp);
+	assertexc(jppc);
+	/* Get the notify flag field ID of the parallel port object. */
+	notifyOnErrorID = (*jenv)->GetFieldID(jenv, jppc, "notifyOnErrorFlag", "Z");
+	assertexc(notifyOnErrorID);
+	/* Get access to the method to report a parallel event.*/
+	jm = (*jenv)->GetMethodID(jenv, jppc, "reportParallelEvent", "(IZZ)V");
+	assertexc(jm);
+	/* Get access to the interrupted method.*/
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+#ifdef NCI
+	if (ioctl(jfd, PIOCSTATUS, &oldStatus) < 0) {
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+        oldStatus = 0;
+	if (0) {
+#endif	/* __osx__ */
+#ifdef __linux__
+	if (ioctl(jfd, LPGETSTATUS, &oldStatus) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+        oldStatus = 0;
+	if (0) {
+#endif	/* QNX */
+		(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC: ioctl error %d!\n", errno);
+		return;
+	}
+	while(1)
+	{
+		sleep(pollingTime);
+		stopThreadFlag = getStopThreadFlag(jenv, jobj);
+		if (stopThreadFlag)
+			break;
+			
+		/* check to see if this thread has been interrupted */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv, jobj, jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		/* Get the notify error flag. If not set, skip error checks. */
+		notifyOnErrorFlag = (*jenv)->GetBooleanField(jenv, jpp, notifyOnErrorID);
+		if (notifyOnErrorFlag != JNI_TRUE)
+			continue;
+#ifdef NCI
+		if (ioctl(jfd, PIOCSTATUS, &newStatus) < 0) {
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+                newStatus = 0;
+	        if (0) {
+#endif	/* __osx__ */
+#ifdef __linux__
+		if (ioctl(jfd, LPGETSTATUS, &newStatus) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+                newStatus = 0;
+	        if (0) {
+#endif	/* QNX */
+			(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC: ioctl error %d!\n", errno);
+			return;
+		}
+		if (newStatus == oldStatus)
+			continue;
+#ifdef NCI
+		if((newStatus & LPS_NERR) != (oldStatus & LPS_NERR))
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	        if (0)
+#endif	/* __osx__ */
+#ifdef __linux__
+		if((newStatus & LP_PERRORP) != (oldStatus & LP_PERRORP))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NERR)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NERR)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* __osx__ */
+#ifdef __linux__
+				    (oldStatus & LP_PERRORP)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PERRORP)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_SELECT) != (oldStatus & LPS_SELECT))
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	        if (0)
+#endif	/* __osx__ */
+#ifdef __linux__
+		if((newStatus & LP_PSELECD) != (oldStatus & LP_PSELECD))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_SELECT)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_SELECT)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* __osx__ */
+#ifdef __linux__
+				    (oldStatus & LP_PSELECD)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PSELECD)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_NOPAPER) != (oldStatus & LPS_NOPAPER))
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	        if (0)
+#endif	/* __osx__ */
+#ifdef __linux__
+		if((newStatus & LP_POUTPA) != (oldStatus & LP_POUTPA))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NOPAPER)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NOPAPER)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* __osx__ */
+#ifdef __linux__
+				    (oldStatus & LP_POUTPA)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_POUTPA)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_NACK) != (oldStatus & LPS_NACK))
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	        if (0)
+#endif	/* __osx__ */
+#ifdef __linux__
+		if((newStatus & LP_PACK) != (oldStatus & LP_PACK))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NACK)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NACK)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* __osx__ */
+#ifdef __linux__
+				    (oldStatus & LP_PACK)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PACK)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_NBSY) != (oldStatus & LPS_NBSY))
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	        if (0)
+#endif	/* __osx__ */
+#ifdef __linux__
+		if((newStatus & LP_PBUSY) != (oldStatus & LP_PBUSY))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NBSY)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NBSY)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __osx__      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* __osx__ */
+#ifdef __linux__
+				    (oldStatus & LP_PBUSY)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PBUSY)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+		oldStatus = newStatus;
+	}	/* end of while() */
+} /* cygParallelErrorEventThread_monitorParallelErrorNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygParallelPort.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygParallelPort.c
new file mode 100644
index 0000000000000000000000000000000000000000..7d4a6e73b80d4bae1212ad5871083f29a4ce3af0
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygParallelPort.c
@@ -0,0 +1,321 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include "dkcomm.h"
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/ioctl.h>
+#ifdef NCI
+#include <dev/ic/lptioctl.h>
+#include <dev/ic/lptreg.h>
+#endif	/* NCI */
+#ifdef __linux__
+//#define __KERNEL__ /* To get the definitions for printer errors */
+#include <linux/lp.h>
+#endif	/* __linux__ */
+#ifdef _POSIX_SEMAPHORES
+#include <semaphore.h>
+#include "SysVStyleSemaphore.h"
+#else 
+#include <sys/ipc.h> 
+#include <sys/sem.h> 
+#endif 
+#include <org_eclipse_soda_dk_comm_NSParallelPort.h>
+#define NOOF_ELEMS(s)	((sizeof(s))/(sizeof(s[0])))
+#ifndef _POSIX_SEMAPHORES
+static struct sembuf	dev_test[] = {
+		{ 0, 0, IPC_NOWAIT }	/* test to see if it is free */
+};
+static struct sembuf	dev_lock[] = {
+		{ 0, 0, 0 },	/* wait for the semaphore to be free */
+		{ 0, 1, SEM_UNDO }	/* lock it */
+};
+static struct sembuf	dev_unlock[] = {
+		{ 0, -1, (IPC_NOWAIT | SEM_UNDO) }	/* unlock it */
+};
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    closeDeviceNC
+ * Signature: (II)I
+ */
+int cygParallelPort_closeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint semId)
+{
+  /* If the semaphore was locked, unlock it. */
+  if (semId != -1) {
+  /* fix debug for POSIX semaphores later */
+#if defined(DEBUG) && !(_POSIX_SEMAPHORES)
+    int iRet;
+	 iRet = semop(semId, dev_unlock, NOOF_ELEMS(dev_unlock));
+    printf( "Unlock semID %d return value: %d\n", semId, iRet );
+     {
+        union semuni scarg;
+        int iVal = 0;
+	     (void)memset(&scarg, 0, sizeof(scarg));
+   	  iVal = semctl(semId, 0, GETVAL, scarg);
+        printf( "semID %d value %d\n", semId, iVal );
+        //fflush( stdout );
+     }
+#else
+#ifndef _POSIX_SEMAPHORES
+	(void)semop(semId, dev_unlock, NOOF_ELEMS(dev_unlock));
+#else
+ 	 /* don't worry about return right now */
+	 (void)sem_post(sem_lookup(semId));
+#endif /* _POSIX_SEMAPHORES */
+#endif
+  }
+  /* Drain any remaining data. */
+#ifdef NCI
+  (void)ioctl(fd, TIOCDRAIN, NULL);
+#endif	/* NCI */
+#ifdef __osx__
+  (void)tcdrain(fd);
+#endif	/* __osx__ */
+#ifdef __linux__
+  (void)tcdrain(fd);
+#endif	/* __linux__ */
+# ifdef QNX
+  /*** BugBug: tcdrain hangs with parallel. Need to fix.
+  (void)tcdrain(fd);
+   ***/
+#endif /* QNX */
+  return close(fd);
+}	/* cygParallelPort_closeDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    openDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+int cygParallelPort_openDeviceNC
+  (JNIEnv *jenv, jobject jobj, jstring name, jint semId)
+{
+  const char * dname = NULL;
+  int fd = -1;
+  int sts;
+  dname = (*jenv)->GetStringUTFChars(jenv, name, 0);
+  if( dname == NULL )
+  {
+#ifdef DEBUG
+    printf( "Can not open port because get NULL name\n" );
+#endif
+    return fd;
+  }
+  /* Test the semaphore to see if it is free. If so, lock it.  Else, return
+     a failure. */
+  if (semId != -1) {
+#ifdef _POSIX_SEMAPHORES
+   if(sem_trywait(sem_lookup(semId)) == -1){
+#else 
+	if (semop(semId, dev_test, NOOF_ELEMS(dev_test)) < 0 ||
+	    semop(semId, dev_lock, NOOF_ELEMS(dev_lock)) < 0) {
+#endif
+#if defined(DEBUG) && !(_POSIX_SEMAPHORES)
+     {
+        union semuni scarg;
+        int iVal = 0;
+	     (void)memset(&scarg, 0, sizeof(scarg));
+   	  iVal = semctl(semId, 0, GETVAL, scarg);
+        printf( "semID %d was locked or can not be locked(value %d)\n", semId, iVal );
+        /* fflush( stdout ); */
+     }
+#endif
+		(*jenv)->ReleaseStringUTFChars(jenv, name, dname);
+		return fd;
+	}
+  }
+#ifdef DEBUG
+  (void)fprintf(stderr, "Before opening %s\n", dname);
+#endif /* DEBUG */
+  fd = open( dname, O_RDWR | O_NONBLOCK );
+#ifdef DEBUG
+  (void)fprintf(stderr, "After opening %s; fd = %d\n", dname, fd);
+#endif /* DEBUG */
+  /* Turn on blocking mode for the device. */
+  if (fd != -1) {
+     if ((sts = fcntl(fd, F_GETFL, 0)) != -1) {
+	sts &= ~O_NONBLOCK;
+	(void)fcntl(fd, F_SETFL, sts);
+     }
+  }
+  (*jenv)->ReleaseStringUTFChars(jenv, name, dname);
+  /* If the open has failed and the semaphore was locked, unlock it. */
+  if (fd == -1 && semId != -1) {
+#ifdef _POSIX_SEMAPHORES
+	(void) sem_post(sem_lookup(semId));
+#else 
+	(void)semop(semId, dev_unlock, NOOF_ELEMS(dev_unlock));
+#endif
+  }
+  return fd;
+}   /* win32ParallelPort_openDeviceNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPaperOutNC
+ * Signature: (I)Z
+ */
+jboolean cygParallelPort_isPaperOutNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+  int		status;
+#ifdef NCI
+  if (ioctl(jfd, PIOCSTATUS, &status) < 0) {
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  if (0) {
+#endif	/* __osx__ */
+#ifdef __linux__
+  if (ioctl(jfd, LPGETSTATUS, &status) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  if (0) {
+#endif /* QNX*/	
+     (void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_NSParallelPort_isPaperOutNC: ioctl error %d!\n", errno);
+     return JNI_FALSE;
+  }
+#ifdef NCI
+  return status & LPS_NOPAPER ? JNI_TRUE : JNI_FALSE;
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  return JNI_FALSE;
+#endif	/* __osx__ */
+#ifdef __linux__
+  return status & LP_POUTPA ? JNI_TRUE : JNI_FALSE;
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  return JNI_FALSE;
+#endif /* QNX*/	
+}	/* cygParallelPort_isPaperOutNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterBusyNC
+ * Signature: (I)Z
+ */
+jboolean cygParallelPort_isPrinterBusyNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+  int		status;
+#ifdef NCI
+  if (ioctl(jfd, PIOCSTATUS, &status) < 0) {
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  if (0) {
+#endif	/* __osx__ */
+#ifdef __linux__
+  if (ioctl(jfd, LPGETSTATUS, &status) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  if (0) {
+#endif /* QNX*/	
+     (void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterBusyNC: ioctl error %d!\n", errno);
+     return JNI_FALSE;
+  }
+#ifdef NCI
+  return status & LPS_NBSY ? JNI_FALSE : JNI_TRUE;	/* converse */
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  return JNI_FALSE;
+#endif	/* __osx__ */
+#ifdef __linux__
+  return status & LP_PBUSY ? JNI_FALSE : JNI_TRUE;	/* converse */
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  return JNI_FALSE;
+#endif /* QNX*/	
+}	/* cygParallelPort_isPrinterBusyNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterSelectedNC
+ * Signature: (I)Z
+ */
+jboolean cygParallelPort_isPrinterSelectedNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+  int		status;
+#ifdef NCI
+  if (ioctl(jfd, PIOCSTATUS, &status) < 0) {
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  if (0) {
+#endif	/* __osx__ */
+#ifdef __linux__
+  if (ioctl(jfd, LPGETSTATUS, &status) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  if (0) {
+#endif /* QNX*/	
+     (void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterSelectedNC: ioctl error %d!\n", errno);
+     return JNI_FALSE;
+  }
+#ifdef NCI
+  return status & LPS_SELECT ? JNI_FALSE : JNI_TRUE;	/* converse */
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  return JNI_TRUE;
+#endif	/* __osx__ */
+#ifdef __linux__
+  return status & LP_PSELECD ? JNI_FALSE : JNI_TRUE;	/* converse */
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  return JNI_TRUE;
+#endif /* QNX*/	
+}	/* cygParallelPort_isPrinterSelectedNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterTimedOutNC
+ * Signature: (I)Z
+ */
+jboolean cygParallelPort_isPrinterTimedOutNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+  return JNI_FALSE;
+}	/* cygParallelPort_isPrinterTimedOutNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterErrorNC
+ * Signature: (I)Z
+ */
+jboolean cygParallelPort_isPrinterErrorNC
+  (JNIEnv *jenv, jobject jobj, jint jfd)
+{
+  int		status;
+#ifdef NCI
+  if (ioctl(jfd, PIOCSTATUS, &status) < 0) {
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  if (0) {
+#endif	/* __osx__ */
+#ifdef __linux__
+  if (ioctl(jfd, LPGETSTATUS, &status) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  if (0) {
+#endif /* QNX*/	
+     (void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterErrorNC: ioctl error %d!\n", errno);
+     return JNI_FALSE;
+  }
+#ifdef NCI
+  return status & LPS_NERR ? JNI_FALSE : JNI_TRUE;	/* converse */
+#endif	/* NCI */
+#ifdef __osx__          /* ToDo: implement */
+  return JNI_FALSE;
+#endif	/* __osx__ */
+#ifdef __linux__
+  return status & LP_PERRORP ? JNI_FALSE : JNI_TRUE;	/* converse */
+#endif	/* __linux__ */
+#ifdef QNX          /* ToDo: implement */
+  return JNI_FALSE;
+#endif /* QNX*/	
+}	/* cygParallelPort_isPrinterErrorNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialDataEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialDataEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..e883b4fba93ca2f34d2ea0902679eabbb069714a
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialDataEventThread.c
@@ -0,0 +1,131 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/select.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <unistd.h>
+#include <org_eclipse_soda_dk_comm_SerialDataEventThread.h>
+#define assertexc(s)       if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return;}
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	// getPollingTime()
+static int getStopThreadFlag(JNIEnv *jenv, jobject jobj)
+{
+	jclass cls;
+	jfieldID fid;
+	jint stopThreadFlag;
+	
+	cls = (*jenv)->GetObjectClass(jenv, jobj);
+	if (!cls) (*jenv)->FatalError(jenv, "Missing class");
+	
+	fid = (*jenv)->GetFieldID(jenv, cls, "stopThreadFlag", "I");
+	if (fid == NULL) (*jenv)->FatalError(jenv, "Missing field");
+	
+	stopThreadFlag = (*jenv)->GetIntField(jenv, jobj, fid);
+	
+	return stopThreadFlag;	
+} 
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialDataEventThread
+ * Method:    monitorSerialDataNC
+ * Signature: (I)V
+ */
+void cygSerialDataEventThread_monitorSerialDataNC
+  (JNIEnv *jenv, jobject jobj, jint jfd) {
+    jclass   jspec; /* serial port event class */
+    fd_set  r_mask;
+    jfieldID   data_available_id;      /* field ID */
+        jint   data_available_event;  /* field value */
+        jclass        jc;
+        jmethodID     jm;
+        jfieldID         spID;
+        jobject  jsp;
+        jclass   jspc;
+        jfieldID notifyOnDataAvailableID;
+        jboolean notifyOnDataAvailableFlag = JNI_FALSE;
+        int result;
+	int		pollingTime;	/* seconds */
+	struct timeval	tv;
+	jboolean	 isInterruptedReturn;
+	jclass	 jthreadClass;
+	jmethodID	 jintMethod;
+	jint 		stopThreadFlag;
+	pollingTime = getPollingTime(jenv);
+        jspec = (*jenv)->FindClass(jenv, "javax/comm/SerialPortEvent");
+        assertexc(jspec);
+        data_available_id = (*jenv)->GetStaticFieldID(jenv, jspec, "DATA_AVAILABLE", "I");
+        assertexc(data_available_id);
+        data_available_event = (*jenv)->GetStaticIntField(jenv, jspec, data_available_id);
+        /* Get the serial port object.*/
+        jc = (*jenv)->GetObjectClass(jenv, jobj);
+        assertexc(jc);
+        spID = (*jenv)->GetFieldID(jenv, jc, "serialPort", "Lorg/eclipse/soda/dk/comm/NSSerialPort;");
+        assertexc(spID);
+        jsp = (*jenv)->GetObjectField(jenv, jobj, spID);
+        assertexc(jsp);
+        /* Get the class ID of the serial port object.*/
+        jspc = (*jenv)->GetObjectClass(jenv, jsp);
+        assertexc(jspc);
+        /* Get access to the method to add a port.*/
+        jm = (*jenv)->GetMethodID(jenv, jspc, "reportSerialEvent", "(IZZ)V");
+        assertexc(jm);
+        notifyOnDataAvailableID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnDataFlag", "Z");
+        assertexc(notifyOnDataAvailableID);
+	/* Get access to the interrupted method.*/
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+   while(1)
+	 {
+	 	
+		stopThreadFlag = getStopThreadFlag(jenv, jobj);
+		if (stopThreadFlag)
+			break;
+	 	
+	/* check to see if this thread has been interrupted */
+	isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv,jobj,jintMethod);
+	if(isInterruptedReturn == JNI_TRUE)
+		break;
+	(void)memset(&tv, 0, sizeof(tv));
+	tv.tv_sec = pollingTime;
+        FD_ZERO(&r_mask);
+        FD_SET(jfd, &r_mask);
+        result = select(jfd + 1, &r_mask, NULL, NULL, &tv);
+        if (result == -1 && errno != EINTR)
+		break;
+	if (!result)	// time out
+		continue;
+       if (FD_ISSET(jfd, &r_mask))
+	{
+        notifyOnDataAvailableFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnDataAvailableID);
+         if(notifyOnDataAvailableFlag)
+           (*jenv)->CallVoidMethod(jenv, jsp, jm, data_available_event, JNI_TRUE, JNI_TRUE);
+        }
+    }
+} /* cygSerialDataEventThread_monitorSerialDataNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialPort.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialPort.c
new file mode 100644
index 0000000000000000000000000000000000000000..ab1389f3047ff47c093b9cc4f46b7cf37c6b76c8
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialPort.c
@@ -0,0 +1,707 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include "dkcomm.h"
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef QNX
+ #include <sys/ioctl.h>
+ #include <termios.h>
+#endif
+#ifdef NCI
+ #include <termios.h>
+#endif	/* NCI */
+#ifdef __osx__
+ #include <sys/ioctl.h>
+ #include <termios.h>
+#endif	/* __osx__ */
+#ifdef __linux__
+ //#include <asm/ioctls.h>
+ #include <sys/ioctl.h>
+ //#include <asm/termios.h>
+ #include <termios.h>
+ #endif	/* __linux__ */
+#include <sys/types.h>
+#ifdef _POSIX_SEMAPHORES
+#include <semaphore.h>
+#include "SysVStyleSemaphore.h"
+#else 
+#include <sys/ipc.h> 
+#include <sys/sem.h> 
+#endif 
+#include <org_eclipse_soda_dk_comm_NSSerialPort.h>
+#define assertexc(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); return(-1);}
+#define NOOF_ELEMS(s)	((sizeof(s))/(sizeof(s[0])))
+#define DEBUG
+#ifndef _POSIX_SEMAPHORES
+static struct sembuf	dev_test[] = {
+		{ 0, 0, IPC_NOWAIT }	/* test to see if it is free */
+};
+static struct sembuf	dev_lock[] = {
+		{ 0, 0, 0 },	/* wait for the semaphore to be free */
+		{ 0, 1, SEM_UNDO }	/* lock it */
+};
+static struct sembuf	dev_unlock[] = {
+		// { 0, -1, (IPC_NOWAIT | SEM_UNDO) }	/* unlock it */
+		{ 0, -1,  0  }   	/* wait til unlock it */
+};
+#endif
+static jint getfd(JNIEnv *jenv, jobject jobj)
+  {
+    jclass        jc;
+    jfieldID      jf;
+    jint          fd = -1;
+    // Get the file descriptor.
+    jc = (*jenv)->GetObjectClass(jenv, jobj);
+    assertexc(jc);
+    jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+    assertexc(jf);
+    fd = (*jenv)->GetIntField(jenv, jobj, jf);
+    return fd;
+  }
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    openDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+int cygSerialPort_closeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint semId)
+{
+  /* If the semaphore was locked, unlock it. */
+  if (semId != -1) {
+  /* fix debug for POSIX semaphores later */
+#if defined(DEBUG) && !(_POSIX_SEMAPHORES)
+    int iRet;
+	 iRet = semop(semId, dev_unlock, NOOF_ELEMS(dev_unlock));
+    printf( "Unlock semID %d return value: %d\n", semId, iRet );
+     {
+        union semuni scarg;
+        int iVal = 0;
+	     (void)memset(&scarg, 0, sizeof(scarg));
+   	  iVal = semctl(semId, 0, GETVAL, scarg);
+        printf( "semID %d value %d\n", semId, iVal );
+        //fflush( stdout );
+     }
+#else
+#ifndef _POSIX_SEMAPHORES
+	 (void)semop(semId, dev_unlock, NOOF_ELEMS(dev_unlock));
+#else
+ 	 /* don't worry about return right now */
+	 (void)sem_post(sem_lookup(semId));
+#endif /* _POSIX_SEMAPHORES */
+#endif
+  }
+  /* Drain any remaining data. */
+#ifdef NCI
+  (void)ioctl(fd, TIOCDRAIN, NULL);
+#endif	/* NCI */
+#if defined(__linux__) || defined(__osx__)
+  (void)tcdrain(fd);
+#endif	/* __linux__ */
+# ifdef QNX
+  (void)tcdrain(fd);
+#endif /* QNX */
+  return close(fd);
+}	/* cygSerialPort_closeDeviceNC */
+int cygSerialPort_openDeviceNC
+  (JNIEnv *jenv, jobject jobj, jstring name, jint semId)
+{
+  sem_t * local_sem;
+  const char * dname = NULL;
+  int fd = -1;
+  int sts;
+  dname = (*jenv)->GetStringUTFChars(jenv, name, 0);
+  if( dname == NULL )
+  {
+
+    printf( "Can not open port because get NULL name\n" );
+
+    return fd;
+  }
+  /* Test the semaphore to see if it is free. If so, lock it.  Else, return
+     a failure. */
+  if (semId != -1) {
+#ifdef _POSIX_SEMAPHORES
+   if(sem_trywait(sem_lookup(semId)) == -1){
+#else 
+	if (semop(semId, dev_test, NOOF_ELEMS(dev_test)) < 0 ||
+	    semop(semId, dev_lock, NOOF_ELEMS(dev_lock)) < 0) {
+#endif
+#if defined(DEBUG) && !(_POSIX_SEMAPHORES)
+     {
+        union semuni scarg;
+        int iVal = 0;
+	     (void)memset(&scarg, 0, sizeof(scarg));
+   	  iVal = semctl(semId, 0, GETVAL, scarg);
+        printf( "semID %d was locked or can not be locked(value %d)\n", semId, iVal );
+        /* fflush( stdout ); */
+     }
+#endif
+		(*jenv)->ReleaseStringUTFChars(jenv, name, dname);
+		return fd;
+	}
+  }
+
+  printf("Before opening %s\n", dname);
+
+  fd = open( dname, O_RDWR | O_NONBLOCK );
+
+  printf("After opening %s; fd = %d\n", dname, fd);
+
+  /* Turn on blocking mode for the device. */
+  if (fd != -1) {
+     if ((sts = fcntl(fd, F_GETFL, 0)) != -1) {
+		sts &= ~O_NONBLOCK;
+		(void)fcntl(fd, F_SETFL, sts);
+     }
+  }
+#define SMARTCARD
+#ifdef SMARTCARD
+  /* For SmartCard, set it to clocal, enable reader and turn off
+     flow control. */
+  if (fd != -1) {
+	struct termios		io;
+	if (tcgetattr(fd, &io) == -1)
+			printf("tcgetattr() failed on %s(%d)!\n", dname, errno);
+	else {
+   		io.c_iflag &= ~(IXOFF | IXON | INLCR | ICRNL | IGNCR);
+   		io.c_oflag &= ~(OPOST | OCRNL | ONLCR | ONOCR | ONLRET);
+#ifdef NCI
+   		io.c_cflag &= ~(CRTS_IFLOW | CCTS_OFLOW);
+#endif	/* NCI */
+#ifdef __linux__
+   		io.c_cflag &= ~(CRTSCTS);
+#endif	/* __linux__ */
+#ifdef __osx__
+		io.c_cflag &= ~(CRTSCTS);
+#endif
+#ifdef QNX
+		io.c_cflag &=~(IHFLOW | OHFLOW);
+#endif /* QNX */		
+		io.c_cflag |= (CLOCAL | CREAD);
+		io.c_lflag &= ~ICANON;	/* turn off cannonical processing */
+		/* turn off echoing */
+		io.c_lflag &= ~(ECHO | ECHOKE | ECHOE | ECHOCTL);
+		io.c_lflag &= ~ISIG;
+		io.c_cc[VMIN] = 1;
+		io.c_cc[VTIME] = 0;
+		if (tcsetattr(fd, TCSANOW, &io) == -1)
+			printf("tcsetattr() failed on %s!\n", dname);
+#if 0
+		else
+			printf("tcsetattr() set clocal, cread and no flow control on %s!\n", dname);
+			/*fprintf(stderr, "tcsetattr() set clocal, cread and no flow control on %s!\n", dname); */
+			
+#endif	/* 0 */
+	}
+  }
+#endif
+  (*jenv)->ReleaseStringUTFChars(jenv, name, dname);
+  /* If the open has failed and the semaphore was locked, unlock it. */
+  if (fd == -1 && semId != -1) {
+#ifdef _POSIX_SEMAPHORES
+	(void)sem_post(sem_lookup(semId));
+#else 
+	(void)semop(semId, dev_unlock, NOOF_ELEMS(dev_unlock));
+#endif  
+  }
+  return fd;
+}    /* cygSerialPort_openDeviceNC */
+int cygSerialPort_setFlowControlModeNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint fc )
+{
+  int			fm = -1;
+  int			rc;
+  struct termios	ios;
+  if ((rc = tcgetattr(fd, &ios)) == -1)
+     return fm;
+  /* Now set the desired flow control.  Turn off the other exclusive flow
+     control mode.
+   */
+  /* In fact, set the flow control completely based on the flags just passed
+     in.   That means, turn off all flow control modes that were set earlier.
+   */
+  ios.c_iflag &= ~(IXOFF | IXON);
+#ifdef NCI
+  ios.c_cflag &= ~(CRTS_IFLOW | CCTS_OFLOW);
+#endif	/* NCI */
+#if defined(__linux__) || defined(__osx__)
+  ios.c_cflag &= ~(CRTSCTS);
+#endif	/* __linux__ */
+#ifdef QNX
+  ios.c_cflag &=~(IHFLOW | OHFLOW);
+#endif /* QNX */  
+  if (fc == 0) {			// NONE
+     /* Do nothing, as all the flow control modes are already turned off now. */
+  }
+  else {
+     if (fc & 1) {		// RTSCTS_IN
+	// ios.c_iflag &= ~IXOFF;
+#ifdef NCI
+	ios.c_cflag |= CRTS_IFLOW;
+#endif	/* NCI */
+#if defined(__linux__) || defined(__osx__)
+	ios.c_cflag |= CRTSCTS;
+#endif	/* __linux__ */
+#ifdef QNX
+	ios.c_cflag |=IHFLOW;
+#endif /* QNX */	
+     }
+     if (fc & 2) {		// RTSCTS_OUT
+	// ios.c_iflag &= ~IXON;
+#ifdef NCI
+	ios.c_cflag |= CCTS_OFLOW;
+#endif	/* NCI */
+#if defined(__linux__) || defined(__osx__)
+	ios.c_cflag |= CRTSCTS;
+#endif	/* __linux__ */
+#ifdef QNX
+	ios.c_cflag |= OHFLOW;
+#endif /* QNX*/	
+     }
+     if (fc & 4) {		// XONXOFF_IN
+	// ios.c_cflag &= ~CRTS_IFLOW;
+	ios.c_iflag |= IXOFF;
+     }
+     if (fc & 8) {		// XONXOFF_OUT
+	// ios.c_cflag &= ~CCTS_OFLOW;
+	ios.c_iflag |= IXON;
+     }
+  }
+  if ((rc = tcsetattr(fd, TCSANOW, &ios)) != -1)
+     fm = fc;
+  return fm;
+}   /* cygSerialPort_setFlowControlModeNC */
+int cygSerialPort_getFlowControlModeNC
+  (JNIEnv *jenv, jobject jobj, jint fd )
+{
+  struct termios 	ios;
+  int			rc;
+  int			fm = -1;
+  if ((rc = tcgetattr(fd, &ios)) == -1)
+     return fm;
+  // Determine the flow control.
+#ifdef NCI 
+  if ((!(ios.c_cflag & CRTS_IFLOW) && !(ios.c_cflag & CCTS_OFLOW)) &&
+#endif	/* NCI */
+#ifdef __osx__
+  if ((!(ios.c_cflag & CRTSCTS)) &&
+#endif	/* __osx__ */
+#ifdef __linux__ 
+  if ((!(ios.c_cflag & CRTSCTS)) &&
+#endif	/* __linux__ */
+#ifdef QNX
+  if ((!(ios.c_cflag & IHFLOW) && !(ios.c_cflag & OHFLOW)) &&
+#endif /* QNX */
+      (!(ios.c_iflag & IXON) && !(ios.c_iflag & IXOFF)))
+     fm = 0;				// NONE
+  else {
+     fm = 0;
+#ifdef NCI
+     if (ios.c_cflag & CRTS_IFLOW)	// RTSCTS_IN
+#endif	/* NCI */
+#ifdef __osx__
+     if (ios.c_cflag & CRTSCTS)		// RTSCTS_IN
+#endif	/* __osx__ */
+#ifdef __linux__ 
+     if (ios.c_cflag & CRTSCTS)		// RTSCTS_IN
+#endif	/* __linux__ */
+#ifdef QNX
+     if (ios.c_cflag & IHFLOW)
+#endif /* QNX */     
+        fm |= 1;
+#ifdef NCI
+     if (ios.c_cflag & CCTS_OFLOW)	// RTSCTS_OUT
+#endif	/* NCI */
+#ifdef __osx__ 
+     if (ios.c_cflag & CRTSCTS)		// RTSCTS_IN
+#endif	/* __osx__ */
+#ifdef __linux__ 
+     if (ios.c_cflag & CRTSCTS)		// RTSCTS_IN
+#endif	/* __linux__ */
+#ifdef QNX
+     if (ios.c_cflag & OHFLOW)
+#endif /* QNX */     
+        fm |= 2;
+     if (ios.c_iflag & IXOFF)		// XONXOFF_IN
+        fm |= 4;
+     if (ios.c_iflag & IXON)		// XONXOFF_OUT
+        fm |= 8;
+  }
+  
+  return fm;
+}   /* cygSerialPort_getFlowControlModeNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getBaudRateNC
+ * Signature: (I)I
+ */
+int cygSerialPort_getBaudRateNC
+  (JNIEnv *jenv, jobject jobj, jint fd)
+{
+  struct termios ios;
+  int rc = -1;
+  speed_t sp;
+#ifdef DEBUG
+  printf( "getBaudRateNC\n" );
+  /* fflush( stdout ); */
+#endif
+ (void)memset(&ios, 0, sizeof(ios));
+#ifdef DEBUG
+  printf( "tcgetattr()\n" );
+  /* fflush( stdout ); */
+#endif
+ rc = tcgetattr(fd, &ios);
+ if ( rc ==  -1 ) return rc;
+#ifdef DEBUG
+  printf( "cfgetospeed()\n" );
+  /* fflush( stdout ); */
+#endif
+ sp = cfgetospeed( &ios );
+#if defined(__linux__) || defined(__osx__)
+ /* Map the internal value to external speed. */
+#ifdef DEBUG
+  printf( "sp %d\n",sp);
+  /*fflush( stdout ); */
+#endif
+ switch((int)sp) {
+    case B50:		sp = 50; break;
+    case B75:		sp = 75; break;
+    case B110:		sp = 110; break;
+    case B134:		sp = 134; break;
+    case B150:		sp = 150; break;
+    case B200:		sp = 200; break;
+    case B300:		sp = 300; break;
+    case B600:		sp = 600; break;
+    case B1200:		sp = 1200; break;
+    case B1800:		sp = 1800; break;
+    case B2400:		sp = 2400; break;
+    case B4800:		sp = 4800; break;
+    case B9600:		sp = 9600; break;
+    case B19200:	sp = 19200; break;
+    case B38400:	sp = 38400; break;
+    case B57600:	sp = 57600; break;
+    case B115200:	sp = 115200; break;
+    case B230400:	sp = 230400; break;
+ }
+#ifdef DEBUG
+  printf( " new sp %d\n", sp);
+  /* fflush( stdout ); */
+#endif
+#endif	/* __linux__ */
+ return (jint) sp;
+}   /* cygSerialPort_getFlowControlModeNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getDataBitsNC
+ * Signature: (I)I
+ */
+int cygSerialPort_getDataBitsNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+  struct termios ios;
+  int rc = -1;
+  rc = tcgetattr(fd, &ios);
+  if ( rc ==  -1 ) return (jint) rc;
+  rc = ios.c_cflag & CSIZE;
+  switch ( rc )
+  {
+    case CS5:
+      return (jint) 5;
+    break;
+    case CS6:
+      return (jint) 6;
+    break;
+    case CS7:
+      return (jint) 7;
+    break;
+    case CS8:
+      return (jint) 8;
+    break;
+    default:
+      return (jint) -1;
+  }
+  return (jint) rc;
+} /* cygSerialPort_getDataBitsNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getStopBitsNC
+ * Signature: (I)I
+ */
+int cygSerialPort_getStopBitsNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+  struct termios ios;
+  int rc = -1;
+  rc = tcgetattr(fd, &ios);
+  if ( rc ==  -1 ) return (jint) rc;
+  if ( ios.c_cflag & CSTOPB )
+    rc = 2;
+  else
+    rc = 1;
+  return (jint) rc;
+}  /* cygSerialPort_getStopBitsNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getParityNC
+ * Signature: (I)I
+ */
+int cygSerialPort_getParityNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+  struct termios ios;
+  int rc = -1;
+  int NONE = 0, ODD = 1, EVEN = 2;
+  rc = tcgetattr(fd, &ios);
+  if ( rc ==  -1 ) return (jint) rc;
+  if ( ios.c_cflag & PARENB )
+  {
+    if ( ios.c_cflag & PARODD )
+      rc = ODD;
+    else
+      rc = EVEN;
+  } else
+    rc = NONE; // PARITY_NONE
+#ifdef DEBUG
+  /*fprintf(stderr, "getParityNC:  parity = %d\n", rc); */
+#endif /* DEBUG */
+  return (jint) rc;
+}  /* cygSerialPort_getParityNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setDTRNC
+ * Signature: (Z)V
+ */
+void cygSerialPort_setDTRNC(JNIEnv *jenv, jobject jobj, jint fd, jboolean bool)
+{
+    int jdtr;
+    int rc = -1;
+    fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jdtr );
+    if ( rc ==  -1 ) return;
+    if ( bool == JNI_TRUE )
+      jdtr |= TIOCM_DTR;
+    else
+      jdtr &= ~TIOCM_DTR;
+    rc = ioctl( fd, TIOCMSET, &jdtr );
+}  /* cygSerialPort_setDTRNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isDTRNC
+ * Signature: ()Z
+ */
+jboolean cygSerialPort_isDTRNC(JNIEnv *jenv, jobject jobj)
+{
+    int jdtr;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jdtr );
+    if ( rc ==  -1 ) return (jboolean)JNI_FALSE;
+    if ( jdtr & TIOCM_DTR )
+      return (jboolean)JNI_TRUE;
+    else
+      return (jboolean)JNI_FALSE;
+}  /* cygSerialPort_isDTRNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setRTSNC
+ * Signature: (Z)V
+ */
+void cygSerialPort_setRTSNC(JNIEnv *jenv, jobject jobj, jboolean bool)
+{
+    int jrts;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jrts );
+    if ( rc ==  -1 ) return;
+    if ( bool == JNI_TRUE )
+      jrts |= TIOCM_RTS;
+    else
+      jrts &= ~TIOCM_RTS;
+    rc = ioctl( fd, TIOCMSET, &jrts );
+}  /* cygSerialPort_setRTSNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isRTSNC
+ * Signature: ()Z
+ */
+jboolean cygSerialPort_isRTSNC(JNIEnv *jenv, jobject jobj)
+{
+    int jrts;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jrts );
+    if ( rc ==  -1 ) return (jboolean) JNI_FALSE;
+    if ( jrts & TIOCM_RTS )
+      return (jboolean) JNI_TRUE;
+    else
+      return (jboolean) JNI_FALSE;
+}  /* cygSerialPort_isRTSNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isCTSNC
+ * Signature: ()Z
+ */
+jboolean cygSerialPort_isCTSNC(JNIEnv *jenv, jobject jobj)
+{
+    int jcts;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jcts );
+    if ( rc ==  -1 ) return (jboolean) JNI_FALSE;
+    if ( jcts & TIOCM_CTS )
+      return (jboolean) JNI_TRUE;
+    else
+      return (jboolean) JNI_FALSE;
+}  /* cygSerialPort_isCTSNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isDSRNC
+ * Signature: ()Z
+ */
+jboolean cygSerialPort_isDSRNC(JNIEnv *jenv, jobject jobj)
+{
+    int jdsr;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jdsr );
+    if ( rc ==  -1 ) return (jboolean) JNI_FALSE;
+    if ( jdsr & TIOCM_CTS )
+      return (jboolean) JNI_TRUE;
+    else
+      return (jboolean) JNI_FALSE;
+}  /* cygSerialPort_isDSRNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isRINC
+ * Signature: ()Z
+ */
+jboolean cygSerialPort_isRINC(JNIEnv *jenv, jobject jobj)
+{
+    int jrng;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jrng );
+    if ( rc ==  -1 ) return (jboolean) JNI_FALSE;
+    if ( jrng & TIOCM_RNG )
+      return (jboolean) JNI_TRUE;
+    else
+      return (jboolean) JNI_FALSE;
+}  /* cygSerialPort_isRINC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isCDNC
+ * Signature: ()Z
+ */
+jboolean cygSerialPort_isCDNC(JNIEnv *jenv, jobject jobj)
+{
+    int jcd;
+    int rc = -1;
+    jint fd = -1;
+    fd = getfd( jenv, jobj );
+    rc = ioctl( fd, TIOCMGET, &jcd );
+    if ( rc ==  -1 ) return (jboolean) JNI_FALSE;
+    if ( jcd & TIOCM_CD )
+      return (jboolean) JNI_TRUE;
+    else
+      return (jboolean) JNI_FALSE;
+}  /* cygSerialPort_isCDNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    sendBreakNC
+ * Signature: (II)I
+ */
+int cygSerialPort_sendBreakNC(JNIEnv *jenv, jobject jobj, jint jfd, jint jmillis) {
+   (void)tcsendbreak(jfd, jmillis);
+} /* Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setSerialPortParamsNC
+ * Signature: (IIIII)I
+ */
+int cygSerialPort_setSerialPortParamsNC
+  (JNIEnv *jenv, jobject jobj, jint jfd, jint jbd, jint jdb, jint jsb, jint jpar) {
+  int			rc;
+  struct termios 	ios;
+  speed_t		spd;
+  if ((rc = tcgetattr(jfd, &ios)) == -1)
+     return rc;
+  // Set the baud rate.
+  spd = jbd;
+#ifdef QNX  /* put in by daniel */
+   if ((rc = cfsetospeed(&ios, spd)) == -1)
+     return rc;
+	if ((rc = cfsetispeed(&ios, spd)) == -1)
+     return rc;
+#else
+  if ((rc = cfsetspeed(&ios, spd)) == -1)
+     return rc;
+#endif 
+  // Set the data bits.
+  switch(jdb) {
+     case 5:		// DATABITS_5
+	ios.c_cflag &= ~CSIZE;
+	ios.c_cflag |= CS5;
+	break;
+     case 6:		// DATABITS_6
+	ios.c_cflag &= ~CSIZE;
+	ios.c_cflag |= CS6;
+	break;
+     case 7:		// DATABITS_7
+	ios.c_cflag &= ~CSIZE;
+	ios.c_cflag |= CS7;
+	break;
+     case 8:		// DATABITS_8
+	ios.c_cflag &= ~CSIZE;
+	ios.c_cflag |= CS8;
+	break;
+  }
+  // Set the stop bits. 1.5 is not supported.
+  switch (jsb) {
+     case 1:		// STOPBITS_1
+	ios.c_cflag &= ~CSTOPB;
+	break;
+     case 2:		// STOPBITS_2
+	ios.c_cflag |= CSTOPB;
+	break;
+  }
+  // Set the parity.  MARK and SPACE are not supported.
+  switch (jpar) {
+     case 0:		// PARITY_NONE
+#ifdef DEBUG
+	/* fprintf(stderr, "setSerialPortParamsNC: parity set to %s\n", "NONE"); */
+#endif /* DEBUG */
+	ios.c_cflag &= ~PARENB;
+	break;
+     case 1:		// PARITY_ODD
+#ifdef DEBUG
+	/* fprintf(stderr, "setSerialPortParamsNC: parity set to %s\n", "ODD"); */
+#endif /* DEBUG */
+	ios.c_cflag |= PARENB;
+	ios.c_cflag |= PARODD;
+	break;
+     case 2:		// PARITY_EVEN
+#ifdef DEBUG
+	/* fprintf(stderr, "setSerialPortParamsNC: parity set to %s\n", "EVEN"); */
+#endif /* DEBUG */
+	ios.c_cflag |= PARENB;
+	ios.c_cflag &= ~PARODD;
+  }
+  // Now set the desired communication characteristics.
+  rc = tcsetattr(jfd, TCSANOW, &ios);
+  return rc;
+} /* cygSerialPort_setSerialPortParamsNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialStatusEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialStatusEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..e4c4e263356f7a45024cd03f23481fd416f65ce4
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/cygSerialStatusEventThread.c
@@ -0,0 +1,168 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <org_eclipse_soda_dk_comm_SerialStatusEventThread.h>
+#define assertexc(s)       if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return;}
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	// getPollingTime()
+static int getStopThreadFlag(JNIEnv *jenv, jobject jobj)
+{
+	jclass cls;
+	jfieldID fid;
+	jint stopThreadFlag;
+	
+	cls = (*jenv)->GetObjectClass(jenv, jobj);
+	if (!cls) (*jenv)->FatalError(jenv, "Missing class");
+	
+	fid = (*jenv)->GetFieldID(jenv, cls, "stopThreadFlag", "I");
+	if (fid == NULL) (*jenv)->FatalError(jenv, "Missing field");
+	
+	stopThreadFlag = (*jenv)->GetIntField(jenv, jobj, fid);
+	
+	return stopThreadFlag;	
+} 
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialStatusEventThread
+ * Method:    monitorSerialStatusNC
+ * Signature: (I)V
+ */
+void cygSerialStatusEventThread_monitorSerialStatusNC(JNIEnv *jenv, jobject jobj, jint jfd) {
+	int		pollingTime;	/* seconds */
+	int oldStatus, newStatus;
+	jfieldID notifyOnCDID, notifyOnCTSID;
+	jfieldID notifyOnDSRID, notifyOnRIID;
+	jboolean notifyOnCDFlag = JNI_FALSE;
+	jboolean notifyOnCTSFlag = JNI_FALSE;
+	jboolean notifyOnDSRFlag = JNI_FALSE;
+	jboolean notifyOnRIFlag = JNI_FALSE;
+	jclass        jc;
+	jmethodID     jm;
+	jclass	 jspc;
+	jfieldID 	 spID;
+	jobject	 jsp;
+	jboolean	 isInterruptedReturn;
+	jclass	 jspec;	/* serial port event class */
+	jfieldID	 speCDID,speCTSID, speDSRID, speRIID ;	/* field ID */
+	jint		 speCD, speCTS, speDSR, speRI;	/* field value */
+	jmethodID	 jintMethod;
+	jclass	 jthreadClass;
+	jint 		stopThreadFlag;
+	
+	pollingTime = getPollingTime(jenv);
+	/* Get the const values for all the serial port event types.*/
+	jspec = (*jenv)->FindClass(jenv, "javax/comm/SerialPortEvent");
+	assertexc(jspec);
+	speCDID = (*jenv)->GetStaticFieldID(jenv, jspec, "CD", "I");
+	assertexc(speCDID);
+	speCD = (*jenv)->GetStaticIntField(jenv, jspec, speCDID);
+	speCTSID = (*jenv)->GetStaticFieldID(jenv, jspec, "CTS", "I");
+	assertexc(speCTSID);
+	speCTS = (*jenv)->GetStaticIntField(jenv, jspec, speCTSID);
+	speDSRID = (*jenv)->GetStaticFieldID(jenv, jspec, "DSR", "I");
+	assertexc(speDSRID);
+	speDSR = (*jenv)->GetStaticIntField(jenv, jspec, speDSRID);
+	speRIID = (*jenv)->GetStaticFieldID(jenv, jspec, "RI", "I");
+	assertexc(speRIID);
+	speRI = (*jenv)->GetStaticIntField(jenv, jspec, speRIID);
+	/* Get the serial port object.*/
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	spID = (*jenv)->GetFieldID(jenv, jc, "serialPort", "Lorg/eclipse/soda/dk/comm/NSSerialPort;");
+	assertexc(spID);
+	jsp = (*jenv)->GetObjectField(jenv, jobj, spID);
+	assertexc(jsp);
+	/* Get the class ID of the serial port object.*/
+	jspc = (*jenv)->GetObjectClass(jenv, jsp);
+	assertexc(jspc);
+	notifyOnCDID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnCDFlag", "Z");
+	assertexc(notifyOnCDID);
+	notifyOnCTSID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnCTSFlag", "Z");
+	assertexc(notifyOnCTSID);
+	notifyOnDSRID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnDSRFlag", "Z");
+	assertexc(notifyOnDSRID);
+	notifyOnRIID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnRIFlag", "Z");
+	assertexc(notifyOnRIID);
+	/* Get access to the method to add a port.*/
+	jm = (*jenv)->GetMethodID(jenv, jspc, "reportSerialEvent", "(IZZ)V");
+	assertexc(jm);
+	/* Get access to the interrupted method.*/
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+	if (ioctl(jfd, TIOCMGET, &oldStatus) < 0) {
+		(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC: ioctl error %d!\n", errno);
+		return;
+	}
+	while(1)
+	{
+		sleep(pollingTime);
+		stopThreadFlag = getStopThreadFlag(jenv, jobj);
+		if (stopThreadFlag)
+			break;
+		/* check to see if this thread has been interrupted */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv,jobj,jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		notifyOnCDFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnCDID);
+		notifyOnCTSFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnCTSID);
+		notifyOnDSRFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnDSRID);
+		notifyOnRIFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnRIID);
+		if (ioctl(jfd, TIOCMGET, &newStatus) < 0) {
+			(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC: ioctl error %d!\n", errno);
+			return;
+		}
+		if (newStatus == oldStatus)
+			continue;
+		if((newStatus & TIOCM_CD) != (oldStatus & TIOCM_CD))
+		{
+			if(notifyOnCDFlag)        /* need to use jsp to access this field */
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speCD,
+				    (oldStatus & TIOCM_CD)? JNI_TRUE:JNI_FALSE,(newStatus & TIOCM_CD)? JNI_TRUE:JNI_FALSE);
+		}
+		if((newStatus & TIOCM_CTS) != (oldStatus & TIOCM_CTS))
+		{
+			if(notifyOnCTSFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speCTS,
+				    (oldStatus & TIOCM_CTS)? JNI_TRUE:JNI_FALSE,(newStatus & TIOCM_CTS)? JNI_TRUE:JNI_FALSE);
+		}
+		if((newStatus & TIOCM_DSR) != (oldStatus & TIOCM_DSR))
+		{
+			if(notifyOnDSRFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speDSR,
+				    (oldStatus & TIOCM_DSR)? JNI_TRUE:JNI_FALSE,(newStatus & TIOCM_DSR)? JNI_TRUE:JNI_FALSE);
+		}
+		if((newStatus & TIOCM_RI) != (oldStatus & TIOCM_RI))
+		{
+			if(notifyOnRIFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speRI,
+				    (oldStatus & TIOCM_RI)? JNI_TRUE:JNI_FALSE,(newStatus & TIOCM_RI)? JNI_TRUE:JNI_FALSE);
+		}
+		oldStatus = newStatus;
+	}	/* end of while() */
+} /* cygSerialStatusEventThread_monitorSerialStatusNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.h
new file mode 100644
index 0000000000000000000000000000000000000000..5a8955d9b889a2a217c94960b3faec054314ce0b
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.h
@@ -0,0 +1,16 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+union semuni {
+  int val;                   /* value for SETVAL             */
+  struct semid_ds *buf;      /* buffer for IPC_STAT, IPC_SET */
+  unsigned short int *array; /* array for GETALL, SETALL     */
+  struct seminfo *__buf;     /* buffer for IPC_INFO          */
+};
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.lib b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.lib
new file mode 100644
index 0000000000000000000000000000000000000000..531ff1444ab77f556a5f6ab3b184b79e17760cd5
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.lib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.map b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.map
new file mode 100644
index 0000000000000000000000000000000000000000..fcbfbe83b454e65be98e76ad9540cf995b59bdc0
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm.map
@@ -0,0 +1,229 @@
+ dkcomm
+
+ Timestamp is 45ad528b (Tue Jan 16 17:32:43 2007)
+
+ Preferred load address is 11300000
+
+ Start         Length     Name                   Class
+ 0001:00000000 000025c8H .text                   CODE
+ 0002:00000000 000000a4H .idata$5                DATA
+ 0002:000000b0 00000588H .rdata                  DATA
+ 0002:00000638 00000048H .rdata$debug            DATA
+ 0002:00000680 00000004H .rdata$sxdata           DATA
+ 0002:00000684 00000004H .rtc$IAA                DATA
+ 0002:00000688 00000004H .rtc$IZZ                DATA
+ 0002:0000068c 00000004H .rtc$TAA                DATA
+ 0002:00000690 00000004H .rtc$TZZ                DATA
+ 0002:00000694 0000003cH .idata$2                DATA
+ 0002:000006d0 00000014H .idata$3                DATA
+ 0002:000006e4 000000a4H .idata$4                DATA
+ 0002:00000788 00000232H .idata$6                DATA
+ 0002:000009c0 00000792H .edata                  DATA
+ 0003:00000000 00000004H .CRT$XCA                DATA
+ 0003:00000004 00000004H .CRT$XCZ                DATA
+ 0003:00000008 00000004H .CRT$XIA                DATA
+ 0003:0000000c 00000004H .CRT$XIZ                DATA
+ 0003:00000010 00000004H .data                   DATA
+ 0003:00000014 00000014H .bss                    DATA
+
+  Address         Publics by Value              Rva+Base     Lib:Object
+
+ 0000:00000001       ___safe_se_handler_count   00000001     <absolute>
+ 0001:00000000       _Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC@12 11301000 f   CommPortIdentifier.obj
+ 0001:00000020       _Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC@8 11301020 f   NSCommDriver.obj
+ 0001:00000040       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceOneByteNC@8 11301040 f   NSDeviceInputStream.obj
+ 0001:00000060       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceNC@20 11301060 f   NSDeviceInputStream.obj
+ 0001:00000090       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_getReadCountNC@8 11301090 f   NSDeviceInputStream.obj
+ 0001:000000b0       _Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC@20 113010b0 f   NSDeviceOutputStream.obj
+ 0001:000000e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC@16 113010e0 f   NSSerialPort.obj
+ 0001:00000100       _Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC@16 11301100 f   NSSerialPort.obj
+ 0001:00000120       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC@16 11301120 f   NSSerialPort.obj
+ 0001:00000140       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC@12 11301140 f   NSSerialPort.obj
+ 0001:00000160       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC@12 11301160 f   NSSerialPort.obj
+ 0001:00000180       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC@12 11301180 f   NSSerialPort.obj
+ 0001:000001a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC@12 113011a0 f   NSSerialPort.obj
+ 0001:000001c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC@12 113011c0 f   NSSerialPort.obj
+ 0001:000001e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC@12 113011e0 f   NSSerialPort.obj
+ 0001:00000200       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC@8 11301200 f   NSSerialPort.obj
+ 0001:00000220       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC@12 11301220 f   NSSerialPort.obj
+ 0001:00000240       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC@8 11301240 f   NSSerialPort.obj
+ 0001:00000260       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC@8 11301260 f   NSSerialPort.obj
+ 0001:00000280       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC@8 11301280 f   NSSerialPort.obj
+ 0001:000002a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC@8 113012a0 f   NSSerialPort.obj
+ 0001:000002c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC@8 113012c0 f   NSSerialPort.obj
+ 0001:000002e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC@16 113012e0 f   NSSerialPort.obj
+ 0001:000002f0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC@28 113012f0 f   NSSerialPort.obj
+ 0001:00000320       _Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC@12 11301320 f   SerialDataEventThread.obj
+ 0001:00000340       _Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC@12 11301340 f   SerialStatusEventThread.obj
+ 0001:00000360       _w32CommDriver_discoverDevicesNC 11301360 f   w32CommDriver.obj
+ 0001:00000510       _w32CommPortIdentifier_monitorInterJVMDeviceAccessNC 11301510 f   w32CommPortIdentifier.obj
+ 0001:00000770       _w32DeviceInputStream_readDeviceOneByteNC 11301770 f   w32DeviceInputStream.obj
+ 0001:00000940       _w32DeviceInputStream_readDeviceNC 11301940 f   w32DeviceInputStream.obj
+ 0001:00000c10       _w32DeviceInputStream_getReadCountNC 11301c10 f   w32DeviceInputStream.obj
+ 0001:00000d30       _w32DeviceOutputStream_writeDeviceNC 11301d30 f   w32DeviceOutputStream.obj
+ 0001:00000f70       _w32SerialDataEventThread_monitorSerialDataNC 11301f70 f   w32SerialDataEventThread.obj
+ 0001:00001250       _w32getfd                  11302250 f   w32SerialPort.obj
+ 0001:000012b0       _w32SerialPort_closeDeviceNC 113022b0 f   w32SerialPort.obj
+ 0001:000012c0       _w32SerialPort_openDeviceNC 113022c0 f   w32SerialPort.obj
+ 0001:00001350       _w32SerialPort_setFlowControlModeNC 11302350 f   w32SerialPort.obj
+ 0001:00001440       _w32SerialPort_getFlowControlModeNC 11302440 f   w32SerialPort.obj
+ 0001:00001500       _w32SerialPort_getBaudRateNC 11302500 f   w32SerialPort.obj
+ 0001:00001560       _w32SerialPort_getDataBitsNC 11302560 f   w32SerialPort.obj
+ 0001:000015c0       _w32SerialPort_getStopBitsNC 113025c0 f   w32SerialPort.obj
+ 0001:00001640       _w32SerialPort_getParityNC 11302640 f   w32SerialPort.obj
+ 0001:00001700       _w32SerialPort_setDTRNC    11302700 f   w32SerialPort.obj
+ 0001:000017b0       _w32SerialPort_isDTRNC     113027b0 f   w32SerialPort.obj
+ 0001:00001840       _w32SerialPort_setRTSNC    11302840 f   w32SerialPort.obj
+ 0001:00001900       _w32SerialPort_isRTSNC     11302900 f   w32SerialPort.obj
+ 0001:00001990       _w32SerialPort_isCTSNC     11302990 f   w32SerialPort.obj
+ 0001:000019d0       _w32SerialPort_isDSRNC     113029d0 f   w32SerialPort.obj
+ 0001:00001a10       _w32SerialPort_isRINC      11302a10 f   w32SerialPort.obj
+ 0001:00001a50       _w32SerialPort_isCDNC      11302a50 f   w32SerialPort.obj
+ 0001:00001a90       _w32SerialPort_setSerialPortParamsNC 11302a90 f   w32SerialPort.obj
+ 0001:00001c50       _w32SerialStatusEventThread_monitorSerialStatusNC 11302c50 f   w32SerialStatusEventThread.obj
+ 0001:000021b0       _iveSerThrow               113031b0 f   NSCommLOG.obj
+ 0001:00002200       _iveSerThrowWin            11303200 f   NSCommLOG.obj
+ 0001:000022c0       _iveSerClearCommErrors     113032c0 f   NSCommLOG.obj
+ 0001:000022dc       ___WSAFDIsSet@8            113032dc f   ws2_32:WS2_32.dll
+ 0001:000022e2       __CRT_INIT@12              113032e2 f   MSVCRT:crtdll.obj
+ 0001:000023a0       __DllMainCRTStartup@12     113033a0 f   MSVCRT:crtdll.obj
+ 0001:00002484       __initterm                 11303484 f   MSVCRT:MSVCR71.dll
+ 0001:0000248a       __onexit                   1130348a f   MSVCRT:atonexit.obj
+ 0001:000024b0       _atexit                    113034b0 f   MSVCRT:atonexit.obj
+ 0001:000024c2       __RTC_Initialize           113034c2 f   MSVCRT:initsect.obj
+ 0001:00002506       __RTC_Terminate            11303506 f   MSVCRT:initsect.obj
+ 0001:0000254a       ___CppXcptFilter           1130354a f   MSVCRT:MSVCR71.dll
+ 0001:00002550       _DllMain@12                11303550 f   MSVCRT:dllmain.obj
+ 0001:00002570       __SEH_prolog               11303570 f   MSVCRT:sehprolg.obj
+ 0001:000025ab       __SEH_epilog               113035ab f   MSVCRT:sehprolg.obj
+ 0001:000025bc       __except_handler3          113035bc f   MSVCRT:MSVCR71.dll
+ 0001:000025c2       ___dllonexit               113035c2 f   MSVCRT:MSVCR71.dll
+ 0002:00000000       __imp__GetCommState@8      11304000     kernel32:KERNEL32.dll
+ 0002:00000004       __imp__ClearCommError@12   11304004     kernel32:KERNEL32.dll
+ 0002:00000008       __imp__Sleep@4             11304008     kernel32:KERNEL32.dll
+ 0002:0000000c       __imp__GetOverlappedResult@16 1130400c     kernel32:KERNEL32.dll
+ 0002:00000010       __imp__CloseHandle@4       11304010     kernel32:KERNEL32.dll
+ 0002:00000014       __imp__ReadFile@20         11304014     kernel32:KERNEL32.dll
+ 0002:00000018       __imp__GetLastError@0      11304018     kernel32:KERNEL32.dll
+ 0002:0000001c       __imp__CreateEventA@16     1130401c     kernel32:KERNEL32.dll
+ 0002:00000020       __imp__GlobalUnlock@4      11304020     kernel32:KERNEL32.dll
+ 0002:00000024       __imp__GlobalHandle@4      11304024     kernel32:KERNEL32.dll
+ 0002:00000028       __imp__GlobalFree@4        11304028     kernel32:KERNEL32.dll
+ 0002:0000002c       __imp__GlobalLock@4        1130402c     kernel32:KERNEL32.dll
+ 0002:00000030       __imp__GlobalAlloc@8       11304030     kernel32:KERNEL32.dll
+ 0002:00000034       __imp__WaitCommEvent@12    11304034     kernel32:KERNEL32.dll
+ 0002:00000038       __imp__SetCommMask@8       11304038     kernel32:KERNEL32.dll
+ 0002:0000003c       __imp__GetCommMask@8       1130403c     kernel32:KERNEL32.dll
+ 0002:00000040       __imp__WriteFile@20        11304040     kernel32:KERNEL32.dll
+ 0002:00000044       __imp__CreateFileA@28      11304044     kernel32:KERNEL32.dll
+ 0002:00000048       __imp__SetCommState@8      11304048     kernel32:KERNEL32.dll
+ 0002:0000004c       __imp__DisableThreadLibraryCalls@4 1130404c     kernel32:KERNEL32.dll
+ 0002:00000050       __imp__GetCommModemStatus@8 11304050     kernel32:KERNEL32.dll
+ 0002:00000054       __imp__SetCommTimeouts@8   11304054     kernel32:KERNEL32.dll
+ 0002:00000058       __imp__FormatMessageA@28   11304058     kernel32:KERNEL32.dll
+ 0002:0000005c       \177KERNEL32_NULL_THUNK_DATA 1130405c     kernel32:KERNEL32.dll
+ 0002:00000060       __imp___initterm           11304060     MSVCRT:MSVCR71.dll
+ 0002:00000064       __imp___onexit             11304064     MSVCRT:MSVCR71.dll
+ 0002:00000068       __imp__printf              11304068     MSVCRT:MSVCR71.dll
+ 0002:0000006c       __imp__fprintf             1130406c     MSVCRT:MSVCR71.dll
+ 0002:00000070       __imp___iob                11304070     MSVCRT:MSVCR71.dll
+ 0002:00000074       __imp___errno              11304074     MSVCRT:MSVCR71.dll
+ 0002:00000078       __imp__sprintf             11304078     MSVCRT:MSVCR71.dll
+ 0002:0000007c       __imp__free                1130407c     MSVCRT:MSVCR71.dll
+ 0002:00000080       __imp__malloc              11304080     MSVCRT:MSVCR71.dll
+ 0002:00000084       __imp___adjust_fdiv        11304084     MSVCRT:MSVCR71.dll
+ 0002:00000088       __imp____CppXcptFilter     11304088     MSVCRT:MSVCR71.dll
+ 0002:0000008c       __imp___except_handler3    1130408c     MSVCRT:MSVCR71.dll
+ 0002:00000090       __imp____dllonexit         11304090     MSVCRT:MSVCR71.dll
+ 0002:00000094       \177MSVCR71_NULL_THUNK_DATA 11304094     MSVCRT:MSVCR71.dll
+ 0002:00000098       __imp__select@20           11304098     ws2_32:WS2_32.dll
+ 0002:0000009c       __imp____WSAFDIsSet@8      1130409c     ws2_32:WS2_32.dll
+ 0002:000000a0       \177WS2_32_NULL_THUNK_DATA 113040a0     ws2_32:WS2_32.dll
+ 0002:000000cc       ??_C@_0BA@DKOKNLIO@addDeviceToList?$AA@ 113040cc     w32CommDriver.obj
+ 0002:000000dc       ??_C@_0CK@PFBBOMIO@?$CILjava?1lang?1String?$DLILjava?1lang?1S@ 113040dc     w32CommDriver.obj
+ 0002:00000108       ??_C@_0BB@JPFAMGLG@?6?6?$CFd?5asserted?$CB?6?6?$AA@ 11304108     w32CommDriver.obj
+ 0002:0000011c       ??_C@_04CGJBIPHE@COM4?$AA@ 1130411c     w32CommDriver.obj
+ 0002:00000124       ??_C@_04GJNABJLD@COM3?$AA@ 11304124     w32CommDriver.obj
+ 0002:0000012c       ??_C@_04MCDLDDNG@LPT1?$AA@ 1130412c     w32CommDriver.obj
+ 0002:00000134       ??_C@_04HAMLCIPC@COM2?$AA@ 11304134     w32CommDriver.obj
+ 0002:0000013c       ??_C@_04FLOGHLDB@COM1?$AA@ 1130413c     w32CommDriver.obj
+ 0002:00000144       ??_C@_0M@MACEOJAN@pollingTime?$AA@ 11304144     w32CommPortIdentifier.obj
+ 0002:00000150       ??_C@_01JPJNBJEM@I?$AA@    11304150     w32CommPortIdentifier.obj
+ 0002:00000154       ??_C@_0BO@CPNLBCEJ@javax?1comm?1CommPortIdentifier?$AA@ 11304154     w32CommPortIdentifier.obj
+ 0002:00000174       ??_C@_0O@NBKAIMLM@isInterrupted?$AA@ 11304174     w32CommPortIdentifier.obj
+ 0002:00000184       ??_C@_03MMPFGPID@?$CI?$CJZ?$AA@ 11304184     w32CommPortIdentifier.obj
+ 0002:00000188       ??_C@_0BB@NOKBFPFO@java?1lang?1Thread?$AA@ 11304188     w32CommPortIdentifier.obj
+ 0002:0000019c       ??_C@_04MEMAJGDJ@name?$AA@ 1130419c     w32CommPortIdentifier.obj
+ 0002:000001a4       ??_C@_0BD@JFADHEFE@Ljava?1lang?1String?$DL?$AA@ 113041a4     w32CommPortIdentifier.obj
+ 0002:000001b8       ??_C@_0BJ@EKOOIJDM@PORT_OWNERSHIP_REQUESTED?$AA@ 113041b8     w32CommPortIdentifier.obj
+ 0002:000001d4       ??_C@_0N@GCHANIDN@PORT_UNOWNED?$AA@ 113041d4     w32CommPortIdentifier.obj
+ 0002:000001e4       ??_C@_0L@DGJAIDMO@PORT_OWNED?$AA@ 113041e4     w32CommPortIdentifier.obj
+ 0002:000001f0       ??_C@_0CF@LEBHMMNO@javax?1comm?1CommPortOwnershipList@ 113041f0     w32CommPortIdentifier.obj
+ 0002:00000218       ??_C@_0BD@DJGIFLED@fireOwnershipEvent?$AA@ 11304218     w32CommPortIdentifier.obj
+ 0002:0000022c       ??_C@_04PFANPMCN@?$CII?$CJV?$AA@ 1130422c     w32CommPortIdentifier.obj
+ 0002:00000234       ??_C@_0BD@GBHBBJKK@Error?5reading?5data?$AA@ 11304234     w32DeviceInputStream.obj
+ 0002:00000248       ??_C@_0BP@JHKNIHPB@Error?5creating?5event?5semaphore?$AA@ 11304248     w32DeviceInputStream.obj
+ 0002:00000268       ??_C@_02ENHFDPNM@fd?$AA@   11304268     w32DeviceInputStream.obj
+ 0002:0000026b       ??_C@_00CNPNBAHC@?$AA@     1130426b     w32DeviceInputStream.obj
+ 0002:0000026c       ??_C@_0BE@EBAPEBGJ@java?1io?1IOException?$AA@ 1130426c     w32DeviceInputStream.obj
+ 0002:00000280       ??_C@_07DFPBEPEC@tmoDone?$AA@ 11304280     w32DeviceInputStream.obj
+ 0002:00000288       ??_C@_01POHCFINO@Z?$AA@    11304288     w32DeviceInputStream.obj
+ 0002:0000028c       ??_C@_03JIIMDIDD@tmo?$AA@  1130428c     w32DeviceInputStream.obj
+ 0002:00000290       ??_C@_0BD@JJLDMOGH@Error?5writing?5data?$AA@ 11304290     w32DeviceOutputStream.obj
+ 0002:000002a4       ??_C@_0BL@GHKGOAFM@Error?5writing?5pending?5data?$AA@ 113042a4     w32DeviceOutputStream.obj
+ 0002:000002c0       ??_C@_0BB@BOAIAAB@notifyOnDataFlag?$AA@ 113042c0     w32SerialDataEventThread.obj
+ 0002:000002d4       ??_C@_0BC@HPCHKFFH@reportSerialEvent?$AA@ 113042d4     w32SerialDataEventThread.obj
+ 0002:000002e8       ??_C@_06LLPILDMP@?$CIIZZ?$CJV?$AA@ 113042e8     w32SerialDataEventThread.obj
+ 0002:000002f0       ??_C@_0L@MAAAEFDE@serialPort?$AA@ 113042f0     w32SerialDataEventThread.obj
+ 0002:000002fc       ??_C@_0CI@KKHBCPKN@Lorg?1eclipse?1soda?1dk?1comm?1NSSeri@ 113042fc     w32SerialDataEventThread.obj
+ 0002:00000324       ??_C@_0P@KBKADJBM@DATA_AVAILABLE?$AA@ 11304324     w32SerialDataEventThread.obj
+ 0002:00000334       ??_C@_0BL@ILADHPFC@javax?1comm?1SerialPortEvent?$AA@ 11304334     w32SerialDataEventThread.obj
+ 0002:00000350       ??_C@_0BD@OHJNHKHO@Error?5opening?5port?$AA@ 11304350     w32SerialPort.obj
+ 0002:00000364       ??_C@_0BC@DLMHNEGO@portName?5is?5NULL?6?$AA@ 11304364     w32SerialPort.obj
+ 0002:00000378       ??_C@_0DE@GKAMPLLG@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 11304378     w32SerialPort.obj
+ 0002:000003ac       ??_C@_0BG@HPDKJDLF@SetCommState?$CI?$CJ?5failed?$AA@ 113043ac     w32SerialPort.obj
+ 0002:000003c4       ??_C@_0BG@IKGMEKPE@GetCommState?$CI?$CJ?5failed?$AA@ 113043c4     w32SerialPort.obj
+ 0002:000003dc       ??_C@_0DE@OFFEFAE@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 113043dc     w32SerialPort.obj
+ 0002:00000410       ??_C@_0DD@GCHOIIHP@w32SerialPort_isRTSNC?$CI?$CJ?5failed?5t@ 11304410     w32SerialPort.obj
+ 0002:00000444       ??_C@_0BJ@BEHBIPCI@SetCommTimeouts?$CI?$CJ?5failed?$AA@ 11304444     w32SerialPort.obj
+ 0002:00000460       ??_C@_0ED@DPOFFCNL@w32SerialStatusEventThread_monit@ 11304460     w32SerialStatusEventThread.obj
+ 0002:000004a8       ??_C@_0FC@KANLAHLN@w32SerialStatusEventThread_monit@ 113044a8     w32SerialStatusEventThread.obj
+ 0002:000004fc       ??_C@_0P@LNBOEMLD@notifyOnRIFlag?$AA@ 113044fc     w32SerialStatusEventThread.obj
+ 0002:0000050c       ??_C@_0BA@OEMCCJHB@notifyOnDSRFlag?$AA@ 1130450c     w32SerialStatusEventThread.obj
+ 0002:0000051c       ??_C@_0BA@OAPMMNED@notifyOnCTSFlag?$AA@ 1130451c     w32SerialStatusEventThread.obj
+ 0002:0000052c       ??_C@_0P@MACJMIBH@notifyOnCDFlag?$AA@ 1130452c     w32SerialStatusEventThread.obj
+ 0002:0000053c       ??_C@_02EODNCIHP@RI?$AA@   1130453c     w32SerialStatusEventThread.obj
+ 0002:00000540       ??_C@_03CMLKEALG@DSR?$AA@  11304540     w32SerialStatusEventThread.obj
+ 0002:00000544       ??_C@_03KNDJFPML@CTS?$AA@  11304544     w32SerialStatusEventThread.obj
+ 0002:00000548       ??_C@_02OGHHJPHF@CD?$AA@   11304548     w32SerialStatusEventThread.obj
+ 0002:0000054c       ??_C@_0BO@JOOJOFDP@javax?1comm?1PortInUseException?$AA@ 1130454c     NSCommLOG.obj
+ 0002:0000056c       ??_C@_0BP@BMFPBIGF@javax?1comm?1NoSuchPortException?$AA@ 1130456c     NSCommLOG.obj
+ 0002:0000058c       ??_C@_0BP@KFMBBGE@javax?1comm?1SerialPortException?$AA@ 1130458c     NSCommLOG.obj
+ 0002:000005ac       ??_C@_0O@JKHHKLAA@?$CFs?$DL?5rc?$DN?$CFd?0?5?$CFs?$AA@ 113045ac     NSCommLOG.obj
+ 0002:000005f0       __load_config_used         113045f0     MSVCRT:loadcfg.obj
+ 0002:00000680       ___safe_se_handler_table   11304680     <linker-defined>
+ 0002:00000684       ___rtc_iaa                 11304684     MSVCRT:initsect.obj
+ 0002:00000688       ___rtc_izz                 11304688     MSVCRT:initsect.obj
+ 0002:0000068c       ___rtc_taa                 1130468c     MSVCRT:initsect.obj
+ 0002:00000690       ___rtc_tzz                 11304690     MSVCRT:initsect.obj
+ 0002:00000694       __IMPORT_DESCRIPTOR_WS2_32 11304694     ws2_32:WS2_32.dll
+ 0002:000006a8       __IMPORT_DESCRIPTOR_KERNEL32 113046a8     kernel32:KERNEL32.dll
+ 0002:000006bc       __IMPORT_DESCRIPTOR_MSVCR71 113046bc     MSVCRT:MSVCR71.dll
+ 0002:000006d0       __NULL_IMPORT_DESCRIPTOR   113046d0     ws2_32:WS2_32.dll
+ 0003:00000000       ___xc_a                    11306000     MSVCRT:cinitexe.obj
+ 0003:00000004       ___xc_z                    11306004     MSVCRT:cinitexe.obj
+ 0003:00000008       ___xi_a                    11306008     MSVCRT:cinitexe.obj
+ 0003:0000000c       ___xi_z                    1130600c     MSVCRT:cinitexe.obj
+ 0003:00000010       ___security_cookie         11306010     MSVCRT:seccook.obj
+ 0003:00000018       __adjust_fdiv              11306018     <common>
+ 0003:0000001c       ___onexitend               1130601c     <common>
+ 0003:00000020       ___onexitbegin             11306020     <common>
+ 0003:00000024       __pRawDllMain              11306024     <common>
+
+ entry point at        0001:000023a0
+
+ Static symbols
+
+ 0001:000004c0       _getPollingTime            113014c0 f   w32CommPortIdentifier.obj
+ 0001:00000f20       _getPollingTime            11301f20 f   w32SerialDataEventThread.obj
+ 0001:00001c00       _getPollingTime            11302c00 f   w32SerialStatusEventThread.obj
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.h
new file mode 100644
index 0000000000000000000000000000000000000000..5a8955d9b889a2a217c94960b3faec054314ce0b
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.h
@@ -0,0 +1,16 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+union semuni {
+  int val;                   /* value for SETVAL             */
+  struct semid_ds *buf;      /* buffer for IPC_STAT, IPC_SET */
+  unsigned short int *array; /* array for GETALL, SETALL     */
+  struct seminfo *__buf;     /* buffer for IPC_INFO          */
+};
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.lib b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.lib
new file mode 100644
index 0000000000000000000000000000000000000000..5cff58e2223db1f29da1ac137e767902374bb63b
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.lib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.map b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.map
new file mode 100644
index 0000000000000000000000000000000000000000..7f0989df2cc884ba463a71645b9575eee0e432ef
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/dkcomm22.map
@@ -0,0 +1,229 @@
+ dkcomm22
+
+ Timestamp is 45a7c2fc (Fri Jan 12 12:18:52 2007)
+
+ Preferred load address is 11300000
+
+ Start         Length     Name                   Class
+ 0001:00000000 000025c8H .text                   CODE
+ 0002:00000000 000000a4H .idata$5                DATA
+ 0002:000000b0 00000588H .rdata                  DATA
+ 0002:00000638 0000004aH .rdata$debug            DATA
+ 0002:00000690 00000004H .rdata$sxdata           DATA
+ 0002:00000694 00000004H .rtc$IAA                DATA
+ 0002:00000698 00000004H .rtc$IZZ                DATA
+ 0002:0000069c 00000004H .rtc$TAA                DATA
+ 0002:000006a0 00000004H .rtc$TZZ                DATA
+ 0002:000006a4 0000003cH .idata$2                DATA
+ 0002:000006e0 00000014H .idata$3                DATA
+ 0002:000006f4 000000a4H .idata$4                DATA
+ 0002:00000798 00000232H .idata$6                DATA
+ 0002:000009d0 00000794H .edata                  DATA
+ 0003:00000000 00000004H .CRT$XCA                DATA
+ 0003:00000004 00000004H .CRT$XCZ                DATA
+ 0003:00000008 00000004H .CRT$XIA                DATA
+ 0003:0000000c 00000004H .CRT$XIZ                DATA
+ 0003:00000010 00000004H .data                   DATA
+ 0003:00000014 00000014H .bss                    DATA
+
+  Address         Publics by Value              Rva+Base     Lib:Object
+
+ 0000:00000001       ___safe_se_handler_count   00000001     <absolute>
+ 0001:00000000       _Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC@12 11301000 f   CommPortIdentifier.obj
+ 0001:00000020       _Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC@8 11301020 f   NSCommDriver.obj
+ 0001:00000040       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceOneByteNC@8 11301040 f   NSDeviceInputStream.obj
+ 0001:00000060       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceNC@20 11301060 f   NSDeviceInputStream.obj
+ 0001:00000090       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_getReadCountNC@8 11301090 f   NSDeviceInputStream.obj
+ 0001:000000b0       _Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC@20 113010b0 f   NSDeviceOutputStream.obj
+ 0001:000000e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC@16 113010e0 f   NSSerialPort.obj
+ 0001:00000100       _Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC@16 11301100 f   NSSerialPort.obj
+ 0001:00000120       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC@16 11301120 f   NSSerialPort.obj
+ 0001:00000140       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC@12 11301140 f   NSSerialPort.obj
+ 0001:00000160       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC@12 11301160 f   NSSerialPort.obj
+ 0001:00000180       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC@12 11301180 f   NSSerialPort.obj
+ 0001:000001a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC@12 113011a0 f   NSSerialPort.obj
+ 0001:000001c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC@12 113011c0 f   NSSerialPort.obj
+ 0001:000001e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC@12 113011e0 f   NSSerialPort.obj
+ 0001:00000200       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC@8 11301200 f   NSSerialPort.obj
+ 0001:00000220       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC@12 11301220 f   NSSerialPort.obj
+ 0001:00000240       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC@8 11301240 f   NSSerialPort.obj
+ 0001:00000260       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC@8 11301260 f   NSSerialPort.obj
+ 0001:00000280       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC@8 11301280 f   NSSerialPort.obj
+ 0001:000002a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC@8 113012a0 f   NSSerialPort.obj
+ 0001:000002c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC@8 113012c0 f   NSSerialPort.obj
+ 0001:000002e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC@16 113012e0 f   NSSerialPort.obj
+ 0001:000002f0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC@28 113012f0 f   NSSerialPort.obj
+ 0001:00000320       _Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC@12 11301320 f   SerialDataEventThread.obj
+ 0001:00000340       _Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC@12 11301340 f   SerialStatusEventThread.obj
+ 0001:00000360       _w32CommDriver_discoverDevicesNC 11301360 f   w32CommDriver.obj
+ 0001:00000510       _w32CommPortIdentifier_monitorInterJVMDeviceAccessNC 11301510 f   w32CommPortIdentifier.obj
+ 0001:00000770       _w32DeviceInputStream_readDeviceOneByteNC 11301770 f   w32DeviceInputStream.obj
+ 0001:00000940       _w32DeviceInputStream_readDeviceNC 11301940 f   w32DeviceInputStream.obj
+ 0001:00000c10       _w32DeviceInputStream_getReadCountNC 11301c10 f   w32DeviceInputStream.obj
+ 0001:00000d30       _w32DeviceOutputStream_writeDeviceNC 11301d30 f   w32DeviceOutputStream.obj
+ 0001:00000f70       _w32SerialDataEventThread_monitorSerialDataNC 11301f70 f   w32SerialDataEventThread.obj
+ 0001:00001250       _w32getfd                  11302250 f   w32SerialPort.obj
+ 0001:000012b0       _w32SerialPort_closeDeviceNC 113022b0 f   w32SerialPort.obj
+ 0001:000012c0       _w32SerialPort_openDeviceNC 113022c0 f   w32SerialPort.obj
+ 0001:00001350       _w32SerialPort_setFlowControlModeNC 11302350 f   w32SerialPort.obj
+ 0001:00001440       _w32SerialPort_getFlowControlModeNC 11302440 f   w32SerialPort.obj
+ 0001:00001500       _w32SerialPort_getBaudRateNC 11302500 f   w32SerialPort.obj
+ 0001:00001560       _w32SerialPort_getDataBitsNC 11302560 f   w32SerialPort.obj
+ 0001:000015c0       _w32SerialPort_getStopBitsNC 113025c0 f   w32SerialPort.obj
+ 0001:00001640       _w32SerialPort_getParityNC 11302640 f   w32SerialPort.obj
+ 0001:00001700       _w32SerialPort_setDTRNC    11302700 f   w32SerialPort.obj
+ 0001:000017b0       _w32SerialPort_isDTRNC     113027b0 f   w32SerialPort.obj
+ 0001:00001840       _w32SerialPort_setRTSNC    11302840 f   w32SerialPort.obj
+ 0001:00001900       _w32SerialPort_isRTSNC     11302900 f   w32SerialPort.obj
+ 0001:00001990       _w32SerialPort_isCTSNC     11302990 f   w32SerialPort.obj
+ 0001:000019d0       _w32SerialPort_isDSRNC     113029d0 f   w32SerialPort.obj
+ 0001:00001a10       _w32SerialPort_isRINC      11302a10 f   w32SerialPort.obj
+ 0001:00001a50       _w32SerialPort_isCDNC      11302a50 f   w32SerialPort.obj
+ 0001:00001a90       _w32SerialPort_setSerialPortParamsNC 11302a90 f   w32SerialPort.obj
+ 0001:00001c50       _w32SerialStatusEventThread_monitorSerialStatusNC 11302c50 f   w32SerialStatusEventThread.obj
+ 0001:000021b0       _iveSerThrow               113031b0 f   NSCommLOG.obj
+ 0001:00002200       _iveSerThrowWin            11303200 f   NSCommLOG.obj
+ 0001:000022c0       _iveSerClearCommErrors     113032c0 f   NSCommLOG.obj
+ 0001:000022dc       ___WSAFDIsSet@8            113032dc f   ws2_32:WS2_32.dll
+ 0001:000022e2       __CRT_INIT@12              113032e2 f   MSVCRT:crtdll.obj
+ 0001:000023a0       __DllMainCRTStartup@12     113033a0 f   MSVCRT:crtdll.obj
+ 0001:00002484       __initterm                 11303484 f   MSVCRT:MSVCR71.dll
+ 0001:0000248a       __onexit                   1130348a f   MSVCRT:atonexit.obj
+ 0001:000024b0       _atexit                    113034b0 f   MSVCRT:atonexit.obj
+ 0001:000024c2       __RTC_Initialize           113034c2 f   MSVCRT:initsect.obj
+ 0001:00002506       __RTC_Terminate            11303506 f   MSVCRT:initsect.obj
+ 0001:0000254a       ___CppXcptFilter           1130354a f   MSVCRT:MSVCR71.dll
+ 0001:00002550       _DllMain@12                11303550 f   MSVCRT:dllmain.obj
+ 0001:00002570       __SEH_prolog               11303570 f   MSVCRT:sehprolg.obj
+ 0001:000025ab       __SEH_epilog               113035ab f   MSVCRT:sehprolg.obj
+ 0001:000025bc       __except_handler3          113035bc f   MSVCRT:MSVCR71.dll
+ 0001:000025c2       ___dllonexit               113035c2 f   MSVCRT:MSVCR71.dll
+ 0002:00000000       __imp__GetCommState@8      11304000     kernel32:KERNEL32.dll
+ 0002:00000004       __imp__ClearCommError@12   11304004     kernel32:KERNEL32.dll
+ 0002:00000008       __imp__Sleep@4             11304008     kernel32:KERNEL32.dll
+ 0002:0000000c       __imp__GetOverlappedResult@16 1130400c     kernel32:KERNEL32.dll
+ 0002:00000010       __imp__CloseHandle@4       11304010     kernel32:KERNEL32.dll
+ 0002:00000014       __imp__ReadFile@20         11304014     kernel32:KERNEL32.dll
+ 0002:00000018       __imp__GetLastError@0      11304018     kernel32:KERNEL32.dll
+ 0002:0000001c       __imp__CreateEventA@16     1130401c     kernel32:KERNEL32.dll
+ 0002:00000020       __imp__GlobalUnlock@4      11304020     kernel32:KERNEL32.dll
+ 0002:00000024       __imp__GlobalHandle@4      11304024     kernel32:KERNEL32.dll
+ 0002:00000028       __imp__GlobalFree@4        11304028     kernel32:KERNEL32.dll
+ 0002:0000002c       __imp__GlobalLock@4        1130402c     kernel32:KERNEL32.dll
+ 0002:00000030       __imp__GlobalAlloc@8       11304030     kernel32:KERNEL32.dll
+ 0002:00000034       __imp__WaitCommEvent@12    11304034     kernel32:KERNEL32.dll
+ 0002:00000038       __imp__SetCommMask@8       11304038     kernel32:KERNEL32.dll
+ 0002:0000003c       __imp__GetCommMask@8       1130403c     kernel32:KERNEL32.dll
+ 0002:00000040       __imp__WriteFile@20        11304040     kernel32:KERNEL32.dll
+ 0002:00000044       __imp__CreateFileA@28      11304044     kernel32:KERNEL32.dll
+ 0002:00000048       __imp__SetCommState@8      11304048     kernel32:KERNEL32.dll
+ 0002:0000004c       __imp__DisableThreadLibraryCalls@4 1130404c     kernel32:KERNEL32.dll
+ 0002:00000050       __imp__GetCommModemStatus@8 11304050     kernel32:KERNEL32.dll
+ 0002:00000054       __imp__SetCommTimeouts@8   11304054     kernel32:KERNEL32.dll
+ 0002:00000058       __imp__FormatMessageA@28   11304058     kernel32:KERNEL32.dll
+ 0002:0000005c       \177KERNEL32_NULL_THUNK_DATA 1130405c     kernel32:KERNEL32.dll
+ 0002:00000060       __imp___initterm           11304060     MSVCRT:MSVCR71.dll
+ 0002:00000064       __imp___onexit             11304064     MSVCRT:MSVCR71.dll
+ 0002:00000068       __imp__printf              11304068     MSVCRT:MSVCR71.dll
+ 0002:0000006c       __imp__fprintf             1130406c     MSVCRT:MSVCR71.dll
+ 0002:00000070       __imp___iob                11304070     MSVCRT:MSVCR71.dll
+ 0002:00000074       __imp___errno              11304074     MSVCRT:MSVCR71.dll
+ 0002:00000078       __imp__sprintf             11304078     MSVCRT:MSVCR71.dll
+ 0002:0000007c       __imp__free                1130407c     MSVCRT:MSVCR71.dll
+ 0002:00000080       __imp__malloc              11304080     MSVCRT:MSVCR71.dll
+ 0002:00000084       __imp___adjust_fdiv        11304084     MSVCRT:MSVCR71.dll
+ 0002:00000088       __imp____CppXcptFilter     11304088     MSVCRT:MSVCR71.dll
+ 0002:0000008c       __imp___except_handler3    1130408c     MSVCRT:MSVCR71.dll
+ 0002:00000090       __imp____dllonexit         11304090     MSVCRT:MSVCR71.dll
+ 0002:00000094       \177MSVCR71_NULL_THUNK_DATA 11304094     MSVCRT:MSVCR71.dll
+ 0002:00000098       __imp__select@20           11304098     ws2_32:WS2_32.dll
+ 0002:0000009c       __imp____WSAFDIsSet@8      1130409c     ws2_32:WS2_32.dll
+ 0002:000000a0       \177WS2_32_NULL_THUNK_DATA 113040a0     ws2_32:WS2_32.dll
+ 0002:000000cc       ??_C@_0BA@DKOKNLIO@addDeviceToList?$AA@ 113040cc     w32CommDriver.obj
+ 0002:000000dc       ??_C@_0CK@PFBBOMIO@?$CILjava?1lang?1String?$DLILjava?1lang?1S@ 113040dc     w32CommDriver.obj
+ 0002:00000108       ??_C@_0BB@JPFAMGLG@?6?6?$CFd?5asserted?$CB?6?6?$AA@ 11304108     w32CommDriver.obj
+ 0002:0000011c       ??_C@_04CGJBIPHE@COM4?$AA@ 1130411c     w32CommDriver.obj
+ 0002:00000124       ??_C@_04GJNABJLD@COM3?$AA@ 11304124     w32CommDriver.obj
+ 0002:0000012c       ??_C@_04MCDLDDNG@LPT1?$AA@ 1130412c     w32CommDriver.obj
+ 0002:00000134       ??_C@_04HAMLCIPC@COM2?$AA@ 11304134     w32CommDriver.obj
+ 0002:0000013c       ??_C@_04FLOGHLDB@COM1?$AA@ 1130413c     w32CommDriver.obj
+ 0002:00000144       ??_C@_0M@MACEOJAN@pollingTime?$AA@ 11304144     w32CommPortIdentifier.obj
+ 0002:00000150       ??_C@_01JPJNBJEM@I?$AA@    11304150     w32CommPortIdentifier.obj
+ 0002:00000154       ??_C@_0BO@CPNLBCEJ@javax?1comm?1CommPortIdentifier?$AA@ 11304154     w32CommPortIdentifier.obj
+ 0002:00000174       ??_C@_0O@NBKAIMLM@isInterrupted?$AA@ 11304174     w32CommPortIdentifier.obj
+ 0002:00000184       ??_C@_03MMPFGPID@?$CI?$CJZ?$AA@ 11304184     w32CommPortIdentifier.obj
+ 0002:00000188       ??_C@_0BB@NOKBFPFO@java?1lang?1Thread?$AA@ 11304188     w32CommPortIdentifier.obj
+ 0002:0000019c       ??_C@_04MEMAJGDJ@name?$AA@ 1130419c     w32CommPortIdentifier.obj
+ 0002:000001a4       ??_C@_0BD@JFADHEFE@Ljava?1lang?1String?$DL?$AA@ 113041a4     w32CommPortIdentifier.obj
+ 0002:000001b8       ??_C@_0BJ@EKOOIJDM@PORT_OWNERSHIP_REQUESTED?$AA@ 113041b8     w32CommPortIdentifier.obj
+ 0002:000001d4       ??_C@_0N@GCHANIDN@PORT_UNOWNED?$AA@ 113041d4     w32CommPortIdentifier.obj
+ 0002:000001e4       ??_C@_0L@DGJAIDMO@PORT_OWNED?$AA@ 113041e4     w32CommPortIdentifier.obj
+ 0002:000001f0       ??_C@_0CF@LEBHMMNO@javax?1comm?1CommPortOwnershipList@ 113041f0     w32CommPortIdentifier.obj
+ 0002:00000218       ??_C@_0BD@DJGIFLED@fireOwnershipEvent?$AA@ 11304218     w32CommPortIdentifier.obj
+ 0002:0000022c       ??_C@_04PFANPMCN@?$CII?$CJV?$AA@ 1130422c     w32CommPortIdentifier.obj
+ 0002:00000234       ??_C@_0BD@GBHBBJKK@Error?5reading?5data?$AA@ 11304234     w32DeviceInputStream.obj
+ 0002:00000248       ??_C@_0BP@JHKNIHPB@Error?5creating?5event?5semaphore?$AA@ 11304248     w32DeviceInputStream.obj
+ 0002:00000268       ??_C@_02ENHFDPNM@fd?$AA@   11304268     w32DeviceInputStream.obj
+ 0002:0000026b       ??_C@_00CNPNBAHC@?$AA@     1130426b     w32DeviceInputStream.obj
+ 0002:0000026c       ??_C@_0BE@EBAPEBGJ@java?1io?1IOException?$AA@ 1130426c     w32DeviceInputStream.obj
+ 0002:00000280       ??_C@_07DFPBEPEC@tmoDone?$AA@ 11304280     w32DeviceInputStream.obj
+ 0002:00000288       ??_C@_01POHCFINO@Z?$AA@    11304288     w32DeviceInputStream.obj
+ 0002:0000028c       ??_C@_03JIIMDIDD@tmo?$AA@  1130428c     w32DeviceInputStream.obj
+ 0002:00000290       ??_C@_0BD@JJLDMOGH@Error?5writing?5data?$AA@ 11304290     w32DeviceOutputStream.obj
+ 0002:000002a4       ??_C@_0BL@GHKGOAFM@Error?5writing?5pending?5data?$AA@ 113042a4     w32DeviceOutputStream.obj
+ 0002:000002c0       ??_C@_0BB@BOAIAAB@notifyOnDataFlag?$AA@ 113042c0     w32SerialDataEventThread.obj
+ 0002:000002d4       ??_C@_0BC@HPCHKFFH@reportSerialEvent?$AA@ 113042d4     w32SerialDataEventThread.obj
+ 0002:000002e8       ??_C@_06LLPILDMP@?$CIIZZ?$CJV?$AA@ 113042e8     w32SerialDataEventThread.obj
+ 0002:000002f0       ??_C@_0L@MAAAEFDE@serialPort?$AA@ 113042f0     w32SerialDataEventThread.obj
+ 0002:000002fc       ??_C@_0CI@KKHBCPKN@Lorg?1eclipse?1soda?1dk?1comm?1NSSeri@ 113042fc     w32SerialDataEventThread.obj
+ 0002:00000324       ??_C@_0P@KBKADJBM@DATA_AVAILABLE?$AA@ 11304324     w32SerialDataEventThread.obj
+ 0002:00000334       ??_C@_0BL@ILADHPFC@javax?1comm?1SerialPortEvent?$AA@ 11304334     w32SerialDataEventThread.obj
+ 0002:00000350       ??_C@_0BD@OHJNHKHO@Error?5opening?5port?$AA@ 11304350     w32SerialPort.obj
+ 0002:00000364       ??_C@_0BC@DLMHNEGO@portName?5is?5NULL?6?$AA@ 11304364     w32SerialPort.obj
+ 0002:00000378       ??_C@_0DE@GKAMPLLG@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 11304378     w32SerialPort.obj
+ 0002:000003ac       ??_C@_0BG@HPDKJDLF@SetCommState?$CI?$CJ?5failed?$AA@ 113043ac     w32SerialPort.obj
+ 0002:000003c4       ??_C@_0BG@IKGMEKPE@GetCommState?$CI?$CJ?5failed?$AA@ 113043c4     w32SerialPort.obj
+ 0002:000003dc       ??_C@_0DE@OFFEFAE@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 113043dc     w32SerialPort.obj
+ 0002:00000410       ??_C@_0DD@GCHOIIHP@w32SerialPort_isRTSNC?$CI?$CJ?5failed?5t@ 11304410     w32SerialPort.obj
+ 0002:00000444       ??_C@_0BJ@BEHBIPCI@SetCommTimeouts?$CI?$CJ?5failed?$AA@ 11304444     w32SerialPort.obj
+ 0002:00000460       ??_C@_0ED@DPOFFCNL@w32SerialStatusEventThread_monit@ 11304460     w32SerialStatusEventThread.obj
+ 0002:000004a8       ??_C@_0FC@KANLAHLN@w32SerialStatusEventThread_monit@ 113044a8     w32SerialStatusEventThread.obj
+ 0002:000004fc       ??_C@_0P@LNBOEMLD@notifyOnRIFlag?$AA@ 113044fc     w32SerialStatusEventThread.obj
+ 0002:0000050c       ??_C@_0BA@OEMCCJHB@notifyOnDSRFlag?$AA@ 1130450c     w32SerialStatusEventThread.obj
+ 0002:0000051c       ??_C@_0BA@OAPMMNED@notifyOnCTSFlag?$AA@ 1130451c     w32SerialStatusEventThread.obj
+ 0002:0000052c       ??_C@_0P@MACJMIBH@notifyOnCDFlag?$AA@ 1130452c     w32SerialStatusEventThread.obj
+ 0002:0000053c       ??_C@_02EODNCIHP@RI?$AA@   1130453c     w32SerialStatusEventThread.obj
+ 0002:00000540       ??_C@_03CMLKEALG@DSR?$AA@  11304540     w32SerialStatusEventThread.obj
+ 0002:00000544       ??_C@_03KNDJFPML@CTS?$AA@  11304544     w32SerialStatusEventThread.obj
+ 0002:00000548       ??_C@_02OGHHJPHF@CD?$AA@   11304548     w32SerialStatusEventThread.obj
+ 0002:0000054c       ??_C@_0BO@JOOJOFDP@javax?1comm?1PortInUseException?$AA@ 1130454c     NSCommLOG.obj
+ 0002:0000056c       ??_C@_0BP@BMFPBIGF@javax?1comm?1NoSuchPortException?$AA@ 1130456c     NSCommLOG.obj
+ 0002:0000058c       ??_C@_0BP@KFMBBGE@javax?1comm?1SerialPortException?$AA@ 1130458c     NSCommLOG.obj
+ 0002:000005ac       ??_C@_0O@JKHHKLAA@?$CFs?$DL?5rc?$DN?$CFd?0?5?$CFs?$AA@ 113045ac     NSCommLOG.obj
+ 0002:000005f0       __load_config_used         113045f0     MSVCRT:loadcfg.obj
+ 0002:00000690       ___safe_se_handler_table   11304690     <linker-defined>
+ 0002:00000694       ___rtc_iaa                 11304694     MSVCRT:initsect.obj
+ 0002:00000698       ___rtc_izz                 11304698     MSVCRT:initsect.obj
+ 0002:0000069c       ___rtc_taa                 1130469c     MSVCRT:initsect.obj
+ 0002:000006a0       ___rtc_tzz                 113046a0     MSVCRT:initsect.obj
+ 0002:000006a4       __IMPORT_DESCRIPTOR_WS2_32 113046a4     ws2_32:WS2_32.dll
+ 0002:000006b8       __IMPORT_DESCRIPTOR_KERNEL32 113046b8     kernel32:KERNEL32.dll
+ 0002:000006cc       __IMPORT_DESCRIPTOR_MSVCR71 113046cc     MSVCRT:MSVCR71.dll
+ 0002:000006e0       __NULL_IMPORT_DESCRIPTOR   113046e0     ws2_32:WS2_32.dll
+ 0003:00000000       ___xc_a                    11306000     MSVCRT:cinitexe.obj
+ 0003:00000004       ___xc_z                    11306004     MSVCRT:cinitexe.obj
+ 0003:00000008       ___xi_a                    11306008     MSVCRT:cinitexe.obj
+ 0003:0000000c       ___xi_z                    1130600c     MSVCRT:cinitexe.obj
+ 0003:00000010       ___security_cookie         11306010     MSVCRT:seccook.obj
+ 0003:00000018       __adjust_fdiv              11306018     <common>
+ 0003:0000001c       ___onexitend               1130601c     <common>
+ 0003:00000020       ___onexitbegin             11306020     <common>
+ 0003:00000024       __pRawDllMain              11306024     <common>
+
+ entry point at        0001:000023a0
+
+ Static symbols
+
+ 0001:000004c0       _getPollingTime            113014c0 f   w32CommPortIdentifier.obj
+ 0001:00000f20       _getPollingTime            11301f20 f   w32SerialDataEventThread.obj
+ 0001:00001c00       _getPollingTime            11302c00 f   w32SerialStatusEventThread.obj
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/ibmcomm.lib b/target-platform/org.eclipse.soda.dk.comm/src/main/c/ibmcomm.lib
new file mode 100644
index 0000000000000000000000000000000000000000..c949ff29a0a1d1067b61c8da5b3dda4b6cadb9e5
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/ibmcomm.lib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/ibmcomm.map b/target-platform/org.eclipse.soda.dk.comm/src/main/c/ibmcomm.map
new file mode 100644
index 0000000000000000000000000000000000000000..e0525ae35337796a96dae1c0d2e904db99b63b21
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/ibmcomm.map
@@ -0,0 +1,229 @@
+ org_eclipse_soda_dk_comm
+
+ Timestamp is 45a6583d (Thu Jan 11 10:31:09 2007)
+
+ Preferred load address is 11300000
+
+ Start         Length     Name                   Class
+ 0001:00000000 00002538H .text                   CODE
+ 0002:00000000 000000a8H .idata$5                DATA
+ 0002:000000b0 000004e0H .rdata                  DATA
+ 0002:00000590 00000049H .rdata$debug            DATA
+ 0002:000005e0 00000004H .rdata$sxdata           DATA
+ 0002:000005e4 00000004H .rtc$IAA                DATA
+ 0002:000005e8 00000004H .rtc$IZZ                DATA
+ 0002:000005ec 00000004H .rtc$TAA                DATA
+ 0002:000005f0 00000004H .rtc$TZZ                DATA
+ 0002:000005f4 0000003cH .idata$2                DATA
+ 0002:00000630 00000014H .idata$3                DATA
+ 0002:00000644 000000a8H .idata$4                DATA
+ 0002:000006ec 0000023eH .idata$6                DATA
+ 0002:00000930 00000667H .edata                  DATA
+ 0003:00000000 00000004H .CRT$XCA                DATA
+ 0003:00000004 00000004H .CRT$XCZ                DATA
+ 0003:00000008 00000004H .CRT$XIA                DATA
+ 0003:0000000c 00000004H .CRT$XIZ                DATA
+ 0003:00000010 00000004H .data                   DATA
+ 0003:00000014 00000014H .bss                    DATA
+
+  Address         Publics by Value              Rva+Base     Lib:Object
+
+ 0000:00000001       ___safe_se_handler_count   00000001     <absolute>
+ 0001:00000000       _Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC@12 11301000 f   CommPortIdentifier.obj
+ 0001:00000020       _Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC@8 11301020 f   NSCommDriver.obj
+ 0001:00000040       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceOneByteNC@8 11301040 f   NSDeviceInputStream.obj
+ 0001:00000060       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceNC@20 11301060 f   NSDeviceInputStream.obj
+ 0001:00000090       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_getReadCountNC@8 11301090 f   NSDeviceInputStream.obj
+ 0001:000000b0       _Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC@20 113010b0 f   NSDeviceOutputStream.obj
+ 0001:000000e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC@16 113010e0 f   NSSerialPort.obj
+ 0001:00000100       _Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC@16 11301100 f   NSSerialPort.obj
+ 0001:00000120       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC@16 11301120 f   NSSerialPort.obj
+ 0001:00000140       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC@12 11301140 f   NSSerialPort.obj
+ 0001:00000160       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC@12 11301160 f   NSSerialPort.obj
+ 0001:00000180       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC@12 11301180 f   NSSerialPort.obj
+ 0001:000001a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC@12 113011a0 f   NSSerialPort.obj
+ 0001:000001c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC@12 113011c0 f   NSSerialPort.obj
+ 0001:000001e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC@12 113011e0 f   NSSerialPort.obj
+ 0001:00000200       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC@8 11301200 f   NSSerialPort.obj
+ 0001:00000220       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC@12 11301220 f   NSSerialPort.obj
+ 0001:00000240       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC@8 11301240 f   NSSerialPort.obj
+ 0001:00000260       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC@8 11301260 f   NSSerialPort.obj
+ 0001:00000280       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC@8 11301280 f   NSSerialPort.obj
+ 0001:000002a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC@8 113012a0 f   NSSerialPort.obj
+ 0001:000002c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC@8 113012c0 f   NSSerialPort.obj
+ 0001:000002e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC@16 113012e0 f   NSSerialPort.obj
+ 0001:000002f0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC@28 113012f0 f   NSSerialPort.obj
+ 0001:00000320       _Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC@12 11301320 f   SerialDataEventThread.obj
+ 0001:00000340       _Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC@12 11301340 f   SerialStatusEventThread.obj
+ 0001:00000360       _w32CommDriver_discoverDevicesNC 11301360 f   w32CommDriver.obj
+ 0001:00000510       _w32CommPortIdentifier_monitorInterJVMDeviceAccessNC 11301510 f   w32CommPortIdentifier.obj
+ 0001:00000770       _w32DeviceInputStream_readDeviceOneByteNC 11301770 f   w32DeviceInputStream.obj
+ 0001:00000940       _w32DeviceInputStream_readDeviceNC 11301940 f   w32DeviceInputStream.obj
+ 0001:00000c10       _w32DeviceInputStream_getReadCountNC 11301c10 f   w32DeviceInputStream.obj
+ 0001:00000d30       _w32DeviceOutputStream_writeDeviceNC 11301d30 f   w32DeviceOutputStream.obj
+ 0001:00000f70       _w32SerialDataEventThread_monitorSerialDataNC 11301f70 f   w32SerialDataEventThread.obj
+ 0001:00001250       _w32getfd                  11302250 f   w32SerialPort.obj
+ 0001:000012b0       _w32SerialPort_closeDeviceNC 113022b0 f   w32SerialPort.obj
+ 0001:000012c0       _w32SerialPort_openDeviceNC 113022c0 f   w32SerialPort.obj
+ 0001:00001350       _w32SerialPort_setFlowControlModeNC 11302350 f   w32SerialPort.obj
+ 0001:00001440       _w32SerialPort_getFlowControlModeNC 11302440 f   w32SerialPort.obj
+ 0001:00001500       _w32SerialPort_getBaudRateNC 11302500 f   w32SerialPort.obj
+ 0001:00001560       _w32SerialPort_getDataBitsNC 11302560 f   w32SerialPort.obj
+ 0001:000015c0       _w32SerialPort_getStopBitsNC 113025c0 f   w32SerialPort.obj
+ 0001:00001640       _w32SerialPort_getParityNC 11302640 f   w32SerialPort.obj
+ 0001:00001700       _w32SerialPort_setDTRNC    11302700 f   w32SerialPort.obj
+ 0001:000017b0       _w32SerialPort_isDTRNC     113027b0 f   w32SerialPort.obj
+ 0001:00001840       _w32SerialPort_setRTSNC    11302840 f   w32SerialPort.obj
+ 0001:00001900       _w32SerialPort_isRTSNC     11302900 f   w32SerialPort.obj
+ 0001:00001990       _w32SerialPort_isCTSNC     11302990 f   w32SerialPort.obj
+ 0001:000019d0       _w32SerialPort_isDSRNC     113029d0 f   w32SerialPort.obj
+ 0001:00001a10       _w32SerialPort_isRINC      11302a10 f   w32SerialPort.obj
+ 0001:00001a50       _w32SerialPort_isCDNC      11302a50 f   w32SerialPort.obj
+ 0001:00001a90       _w32SerialPort_setSerialPortParamsNC 11302a90 f   w32SerialPort.obj
+ 0001:00001c50       _w32SerialStatusEventThread_monitorSerialStatusNC 11302c50 f   w32SerialStatusEventThread.obj
+ 0001:00002120       _iveSerThrow               11303120 f   NSCommLOG.obj
+ 0001:00002170       _iveSerThrowWin            11303170 f   NSCommLOG.obj
+ 0001:00002230       _iveSerClearCommErrors     11303230 f   NSCommLOG.obj
+ 0001:0000224c       ___WSAFDIsSet@8            1130324c f   ws2_32:WS2_32.dll
+ 0001:00002252       __CRT_INIT@12              11303252 f   MSVCRT:crtdll.obj
+ 0001:00002310       __DllMainCRTStartup@12     11303310 f   MSVCRT:crtdll.obj
+ 0001:000023f4       __initterm                 113033f4 f   MSVCRT:MSVCR71.dll
+ 0001:000023fa       __onexit                   113033fa f   MSVCRT:atonexit.obj
+ 0001:00002420       _atexit                    11303420 f   MSVCRT:atonexit.obj
+ 0001:00002432       __RTC_Initialize           11303432 f   MSVCRT:initsect.obj
+ 0001:00002476       __RTC_Terminate            11303476 f   MSVCRT:initsect.obj
+ 0001:000024ba       ___CppXcptFilter           113034ba f   MSVCRT:MSVCR71.dll
+ 0001:000024c0       _DllMain@12                113034c0 f   MSVCRT:dllmain.obj
+ 0001:000024e0       __SEH_prolog               113034e0 f   MSVCRT:sehprolg.obj
+ 0001:0000251b       __SEH_epilog               1130351b f   MSVCRT:sehprolg.obj
+ 0001:0000252c       __except_handler3          1130352c f   MSVCRT:MSVCR71.dll
+ 0001:00002532       ___dllonexit               11303532 f   MSVCRT:MSVCR71.dll
+ 0002:00000000       __imp__GetCommState@8      11304000     kernel32:KERNEL32.dll
+ 0002:00000004       __imp__ClearCommError@12   11304004     kernel32:KERNEL32.dll
+ 0002:00000008       __imp__Sleep@4             11304008     kernel32:KERNEL32.dll
+ 0002:0000000c       __imp__GetOverlappedResult@16 1130400c     kernel32:KERNEL32.dll
+ 0002:00000010       __imp__CloseHandle@4       11304010     kernel32:KERNEL32.dll
+ 0002:00000014       __imp__ReadFile@20         11304014     kernel32:KERNEL32.dll
+ 0002:00000018       __imp__GetLastError@0      11304018     kernel32:KERNEL32.dll
+ 0002:0000001c       __imp__CreateEventA@16     1130401c     kernel32:KERNEL32.dll
+ 0002:00000020       __imp__GlobalUnlock@4      11304020     kernel32:KERNEL32.dll
+ 0002:00000024       __imp__GlobalHandle@4      11304024     kernel32:KERNEL32.dll
+ 0002:00000028       __imp__GlobalFree@4        11304028     kernel32:KERNEL32.dll
+ 0002:0000002c       __imp__GlobalLock@4        1130402c     kernel32:KERNEL32.dll
+ 0002:00000030       __imp__GlobalAlloc@8       11304030     kernel32:KERNEL32.dll
+ 0002:00000034       __imp__WaitCommEvent@12    11304034     kernel32:KERNEL32.dll
+ 0002:00000038       __imp__SetCommMask@8       11304038     kernel32:KERNEL32.dll
+ 0002:0000003c       __imp__GetCommMask@8       1130403c     kernel32:KERNEL32.dll
+ 0002:00000040       __imp__WriteFile@20        11304040     kernel32:KERNEL32.dll
+ 0002:00000044       __imp__CreateFileA@28      11304044     kernel32:KERNEL32.dll
+ 0002:00000048       __imp__lstrcatA@8          11304048     kernel32:KERNEL32.dll
+ 0002:0000004c       __imp__SetCommState@8      1130404c     kernel32:KERNEL32.dll
+ 0002:00000050       __imp__DisableThreadLibraryCalls@4 11304050     kernel32:KERNEL32.dll
+ 0002:00000054       __imp__GetCommModemStatus@8 11304054     kernel32:KERNEL32.dll
+ 0002:00000058       __imp__SetCommTimeouts@8   11304058     kernel32:KERNEL32.dll
+ 0002:0000005c       __imp__FormatMessageA@28   1130405c     kernel32:KERNEL32.dll
+ 0002:00000060       \177KERNEL32_NULL_THUNK_DATA 11304060     kernel32:KERNEL32.dll
+ 0002:00000064       __imp___initterm           11304064     MSVCRT:MSVCR71.dll
+ 0002:00000068       __imp___onexit             11304068     MSVCRT:MSVCR71.dll
+ 0002:0000006c       __imp__printf              1130406c     MSVCRT:MSVCR71.dll
+ 0002:00000070       __imp__fprintf             11304070     MSVCRT:MSVCR71.dll
+ 0002:00000074       __imp___iob                11304074     MSVCRT:MSVCR71.dll
+ 0002:00000078       __imp___errno              11304078     MSVCRT:MSVCR71.dll
+ 0002:0000007c       __imp__sprintf             1130407c     MSVCRT:MSVCR71.dll
+ 0002:00000080       __imp__free                11304080     MSVCRT:MSVCR71.dll
+ 0002:00000084       __imp__malloc              11304084     MSVCRT:MSVCR71.dll
+ 0002:00000088       __imp___adjust_fdiv        11304088     MSVCRT:MSVCR71.dll
+ 0002:0000008c       __imp____CppXcptFilter     1130408c     MSVCRT:MSVCR71.dll
+ 0002:00000090       __imp___except_handler3    11304090     MSVCRT:MSVCR71.dll
+ 0002:00000094       __imp____dllonexit         11304094     MSVCRT:MSVCR71.dll
+ 0002:00000098       \177MSVCR71_NULL_THUNK_DATA 11304098     MSVCRT:MSVCR71.dll
+ 0002:0000009c       __imp__select@20           1130409c     ws2_32:WS2_32.dll
+ 0002:000000a0       __imp____WSAFDIsSet@8      113040a0     ws2_32:WS2_32.dll
+ 0002:000000a4       \177WS2_32_NULL_THUNK_DATA 113040a4     ws2_32:WS2_32.dll
+ 0002:000000cc       ??_C@_0BA@DKOKNLIO@addDeviceToList?$AA@ 113040cc     w32CommDriver.obj
+ 0002:000000dc       ??_C@_0CK@PFBBOMIO@?$CILjava?1lang?1String?$DLILjava?1lang?1S@ 113040dc     w32CommDriver.obj
+ 0002:00000108       ??_C@_0BB@JPFAMGLG@?6?6?$CFd?5asserted?$CB?6?6?$AA@ 11304108     w32CommDriver.obj
+ 0002:0000011c       ??_C@_04CGJBIPHE@COM4?$AA@ 1130411c     w32CommDriver.obj
+ 0002:00000124       ??_C@_04GJNABJLD@COM3?$AA@ 11304124     w32CommDriver.obj
+ 0002:0000012c       ??_C@_04MCDLDDNG@LPT1?$AA@ 1130412c     w32CommDriver.obj
+ 0002:00000134       ??_C@_04HAMLCIPC@COM2?$AA@ 11304134     w32CommDriver.obj
+ 0002:0000013c       ??_C@_04FLOGHLDB@COM1?$AA@ 1130413c     w32CommDriver.obj
+ 0002:00000144       ??_C@_0M@MACEOJAN@pollingTime?$AA@ 11304144     w32CommPortIdentifier.obj
+ 0002:00000150       ??_C@_01JPJNBJEM@I?$AA@    11304150     w32CommPortIdentifier.obj
+ 0002:00000154       ??_C@_0BO@CPNLBCEJ@javax?1comm?1CommPortIdentifier?$AA@ 11304154     w32CommPortIdentifier.obj
+ 0002:00000174       ??_C@_0O@NBKAIMLM@isInterrupted?$AA@ 11304174     w32CommPortIdentifier.obj
+ 0002:00000184       ??_C@_03MMPFGPID@?$CI?$CJZ?$AA@ 11304184     w32CommPortIdentifier.obj
+ 0002:00000188       ??_C@_0BB@NOKBFPFO@java?1lang?1Thread?$AA@ 11304188     w32CommPortIdentifier.obj
+ 0002:0000019c       ??_C@_04MEMAJGDJ@name?$AA@ 1130419c     w32CommPortIdentifier.obj
+ 0002:000001a4       ??_C@_0BD@JFADHEFE@Ljava?1lang?1String?$DL?$AA@ 113041a4     w32CommPortIdentifier.obj
+ 0002:000001b8       ??_C@_0BJ@EKOOIJDM@PORT_OWNERSHIP_REQUESTED?$AA@ 113041b8     w32CommPortIdentifier.obj
+ 0002:000001d4       ??_C@_0N@GCHANIDN@PORT_UNOWNED?$AA@ 113041d4     w32CommPortIdentifier.obj
+ 0002:000001e4       ??_C@_0L@DGJAIDMO@PORT_OWNED?$AA@ 113041e4     w32CommPortIdentifier.obj
+ 0002:000001f0       ??_C@_0CF@LEBHMMNO@javax?1comm?1CommPortOwnershipList@ 113041f0     w32CommPortIdentifier.obj
+ 0002:00000218       ??_C@_0BD@DJGIFLED@fireOwnershipEvent?$AA@ 11304218     w32CommPortIdentifier.obj
+ 0002:0000022c       ??_C@_04PFANPMCN@?$CII?$CJV?$AA@ 1130422c     w32CommPortIdentifier.obj
+ 0002:00000234       ??_C@_0BD@GBHBBJKK@Error?5reading?5data?$AA@ 11304234     w32DeviceInputStream.obj
+ 0002:00000248       ??_C@_0BP@JHKNIHPB@Error?5creating?5event?5semaphore?$AA@ 11304248     w32DeviceInputStream.obj
+ 0002:00000268       ??_C@_02ENHFDPNM@fd?$AA@   11304268     w32DeviceInputStream.obj
+ 0002:0000026b       ??_C@_00CNPNBAHC@?$AA@     1130426b     w32DeviceInputStream.obj
+ 0002:0000026c       ??_C@_0BE@EBAPEBGJ@java?1io?1IOException?$AA@ 1130426c     w32DeviceInputStream.obj
+ 0002:00000280       ??_C@_07DFPBEPEC@tmoDone?$AA@ 11304280     w32DeviceInputStream.obj
+ 0002:00000288       ??_C@_01POHCFINO@Z?$AA@    11304288     w32DeviceInputStream.obj
+ 0002:0000028c       ??_C@_03JIIMDIDD@tmo?$AA@  1130428c     w32DeviceInputStream.obj
+ 0002:00000290       ??_C@_0BD@JJLDMOGH@Error?5writing?5data?$AA@ 11304290     w32DeviceOutputStream.obj
+ 0002:000002a4       ??_C@_0BL@GHKGOAFM@Error?5writing?5pending?5data?$AA@ 113042a4     w32DeviceOutputStream.obj
+ 0002:000002c0       ??_C@_0BB@BOAIAAB@notifyOnDataFlag?$AA@ 113042c0     w32SerialDataEventThread.obj
+ 0002:000002d4       ??_C@_0BC@HPCHKFFH@reportSerialEvent?$AA@ 113042d4     w32SerialDataEventThread.obj
+ 0002:000002e8       ??_C@_06LLPILDMP@?$CIIZZ?$CJV?$AA@ 113042e8     w32SerialDataEventThread.obj
+ 0002:000002f0       ??_C@_0L@MAAAEFDE@serialPort?$AA@ 113042f0     w32SerialDataEventThread.obj
+ 0002:000002fc       ??_C@_0BM@KAHNFPOG@Lcom?1ibm?1comm?1NSSerialPort?$DL?$AA@ 113042fc     w32SerialDataEventThread.obj
+ 0002:00000318       ??_C@_0P@KBKADJBM@DATA_AVAILABLE?$AA@ 11304318     w32SerialDataEventThread.obj
+ 0002:00000328       ??_C@_0BL@ILADHPFC@javax?1comm?1SerialPortEvent?$AA@ 11304328     w32SerialDataEventThread.obj
+ 0002:00000344       ??_C@_0BD@OHJNHKHO@Error?5opening?5port?$AA@ 11304344     w32SerialPort.obj
+ 0002:00000358       ??_C@_01JLIPDDHJ@?3?$AA@   11304358     w32SerialPort.obj
+ 0002:0000035c       ??_C@_0BC@DLMHNEGO@portName?5is?5NULL?6?$AA@ 1130435c     w32SerialPort.obj
+ 0002:00000370       ??_C@_0DE@GKAMPLLG@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 11304370     w32SerialPort.obj
+ 0002:000003a4       ??_C@_0BG@HPDKJDLF@SetCommState?$CI?$CJ?5failed?$AA@ 113043a4     w32SerialPort.obj
+ 0002:000003bc       ??_C@_0BG@IKGMEKPE@GetCommState?$CI?$CJ?5failed?$AA@ 113043bc     w32SerialPort.obj
+ 0002:000003d4       ??_C@_0DE@OFFEFAE@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 113043d4     w32SerialPort.obj
+ 0002:00000408       ??_C@_0DD@GCHOIIHP@w32SerialPort_isRTSNC?$CI?$CJ?5failed?5t@ 11304408     w32SerialPort.obj
+ 0002:0000043c       ??_C@_0BJ@BEHBIPCI@SetCommTimeouts?$CI?$CJ?5failed?$AA@ 1130443c     w32SerialPort.obj
+ 0002:00000458       ??_C@_0P@LNBOEMLD@notifyOnRIFlag?$AA@ 11304458     w32SerialStatusEventThread.obj
+ 0002:00000468       ??_C@_0BA@OEMCCJHB@notifyOnDSRFlag?$AA@ 11304468     w32SerialStatusEventThread.obj
+ 0002:00000478       ??_C@_0BA@OAPMMNED@notifyOnCTSFlag?$AA@ 11304478     w32SerialStatusEventThread.obj
+ 0002:00000488       ??_C@_0P@MACJMIBH@notifyOnCDFlag?$AA@ 11304488     w32SerialStatusEventThread.obj
+ 0002:00000498       ??_C@_02EODNCIHP@RI?$AA@   11304498     w32SerialStatusEventThread.obj
+ 0002:0000049c       ??_C@_03CMLKEALG@DSR?$AA@  1130449c     w32SerialStatusEventThread.obj
+ 0002:000004a0       ??_C@_03KNDJFPML@CTS?$AA@  113044a0     w32SerialStatusEventThread.obj
+ 0002:000004a4       ??_C@_02OGHHJPHF@CD?$AA@   113044a4     w32SerialStatusEventThread.obj
+ 0002:000004a8       ??_C@_0BO@JOOJOFDP@javax?1comm?1PortInUseException?$AA@ 113044a8     NSCommLOG.obj
+ 0002:000004c8       ??_C@_0BP@BMFPBIGF@javax?1comm?1NoSuchPortException?$AA@ 113044c8     NSCommLOG.obj
+ 0002:000004e8       ??_C@_0BP@KFMBBGE@javax?1comm?1SerialPortException?$AA@ 113044e8     NSCommLOG.obj
+ 0002:00000508       ??_C@_0O@JKHHKLAA@?$CFs?$DL?5rc?$DN?$CFd?0?5?$CFs?$AA@ 11304508     NSCommLOG.obj
+ 0002:00000548       __load_config_used         11304548     MSVCRT:loadcfg.obj
+ 0002:000005e0       ___safe_se_handler_table   113045e0     <linker-defined>
+ 0002:000005e4       ___rtc_iaa                 113045e4     MSVCRT:initsect.obj
+ 0002:000005e8       ___rtc_izz                 113045e8     MSVCRT:initsect.obj
+ 0002:000005ec       ___rtc_taa                 113045ec     MSVCRT:initsect.obj
+ 0002:000005f0       ___rtc_tzz                 113045f0     MSVCRT:initsect.obj
+ 0002:000005f4       __IMPORT_DESCRIPTOR_WS2_32 113045f4     ws2_32:WS2_32.dll
+ 0002:00000608       __IMPORT_DESCRIPTOR_KERNEL32 11304608     kernel32:KERNEL32.dll
+ 0002:0000061c       __IMPORT_DESCRIPTOR_MSVCR71 1130461c     MSVCRT:MSVCR71.dll
+ 0002:00000630       __NULL_IMPORT_DESCRIPTOR   11304630     ws2_32:WS2_32.dll
+ 0003:00000000       ___xc_a                    11305000     MSVCRT:cinitexe.obj
+ 0003:00000004       ___xc_z                    11305004     MSVCRT:cinitexe.obj
+ 0003:00000008       ___xi_a                    11305008     MSVCRT:cinitexe.obj
+ 0003:0000000c       ___xi_z                    1130500c     MSVCRT:cinitexe.obj
+ 0003:00000010       ___security_cookie         11305010     MSVCRT:seccook.obj
+ 0003:00000018       __adjust_fdiv              11305018     <common>
+ 0003:0000001c       ___onexitend               1130501c     <common>
+ 0003:00000020       ___onexitbegin             11305020     <common>
+ 0003:00000024       __pRawDllMain              11305024     <common>
+
+ entry point at        0001:00002310
+
+ Static symbols
+
+ 0001:000004c0       _getPollingTime            113014c0 f   w32CommPortIdentifier.obj
+ 0001:00000f20       _getPollingTime            11301f20 f   w32SerialDataEventThread.obj
+ 0001:00001c00       _getPollingTime            11302c00 f   w32SerialStatusEventThread.obj
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/javax_comm_CommPortIdentifier.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/javax_comm_CommPortIdentifier.h
new file mode 100644
index 0000000000000000000000000000000000000000..70aedd6566f7df083afa72ffb7ae1beef643490a
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/javax_comm_CommPortIdentifier.h
@@ -0,0 +1,34 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class javax_comm_CommPortIdentifier */
+#ifndef _Included_javax_comm_CommPortIdentifier
+#define _Included_javax_comm_CommPortIdentifier
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef javax_comm_CommPortIdentifier_pollingTime
+#define javax_comm_CommPortIdentifier_pollingTime 1L
+#undef javax_comm_CommPortIdentifier_PORT_SERIAL
+#define javax_comm_CommPortIdentifier_PORT_SERIAL 1L
+#undef javax_comm_CommPortIdentifier_PORT_PARALLEL
+#define javax_comm_CommPortIdentifier_PORT_PARALLEL 2L
+/*
+ * Class:     javax_comm_CommPortIdentifier
+ * Method:    monitorInterVMDeviceAccessNC
+ * Signature: (Ljava/lang/Runnable;)I
+ */
+JNIEXPORT jint JNICALL Java_javax_comm_CommPortIdentifier_monitorInterVMDeviceAccessNC
+  (JNIEnv *, jobject, jobject);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..52a0d12de4b849239ded6d878be8a7ecbbf0bd51
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile
@@ -0,0 +1,26 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+DLLNAME=Release/win32/x86/dkcomm22.dll
+all: 
+	@echo "Usage: make platform"    ;
+	@echo "	Where platform = linux | qnx" ;
+linux:
+	$(MAKE) -f makefile.linux
+qnx:
+	$(MAKE) -f makefile.qnx
+	
+clean:
+	rm -f *.o
+	rm -f *.obj
+	rm -f $(DLLNAME)
+		
+	
+	
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux
new file mode 100644
index 0000000000000000000000000000000000000000..73c8da24079f410c4bf46e33ed17e8d42305f3c7
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux
@@ -0,0 +1,183 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+MAKEFILE = makefile.linux
+############################################################################################################
+#       Configure your OS, CPUTYPE and COMPILER 
+############################################################################################################
+OS  = Linux
+##OS=Qnx
+CPUTYPE = i386
+##CPUTYPE = powerpc
+##CPUTYPE = ppc82xx
+##CPUTYPE = ppc440gp
+##CPUTYPE = xscale
+##CPUTYPE = mips
+##CPUTYPE = sh4
+##CPUTYPE = ibm44gp
+LIBTYPE = so                   
+##LIBTYPE = a
+DATATYPE = le
+##DATATYPE = be
+##COMPILER = kenati
+##COMPILER = ydog
+##COMPILER = mvlpee31
+##COMPILER = mvlcee31
+##COMPILER = mvlarm
+##COMPILER = coyote
+##BOARDTYPE = Mainstone
+##BOARDTYPE = Walnut
+##BOARDTYPE = Malta
+##BOARDTYPE = Sandpoint
+##BOARDTYPE = Solution
+############################################################################################################
+#
+#       Release the libdkcomm.so file place
+#
+############################################################################################################
+DLLNAME=Release/$(OS)/$(CPUTYPE)_$(COMPILER)/libdkcomm.$(LIBTYPE)
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = cygCommDriver.o cygDeviceInputStream.o cygDeviceOutputStream.o cygSerialPort.o
+BUILDFILES3 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES4 = NSParallelPort.o ParallelErrorEventThread.o cygSerialDataEventThread.o cygSerialStatusEventThread.o
+BUILDFILES5 = cygParallelPort.o cygParallelErrorEventThread.o cygCommPortIdentifier.o
+C_OBJECTS   = $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) $(BUILDFILES5)
+# For Linux ARM BE - Coyote 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_coyote"
+TOOL_DIR  = /opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/bin
+CROSSCOMP = xscale_be-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I/opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/include -I. -I/phx4f/team/ravi/JavaCommAPI-J9/j9lnxarmbesf-beta22/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Linux i386 
+ifeq "$(CPUTYPE)_$(COMPILER)""i386_"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I. -I/usr/comm/osgimin11/bin/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# Yellow Dog Linux for Power PC
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_ydog"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I.
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+endif
+# Kenati Linux gcc for Power PC 
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_kenati"
+CROSSCOMP = powerpc-uclibc-
+TOOL_DIR  = /opt/kenati/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS        = $(TOOL_DIR)/$(CROSSCOMP)as
+ASFLAGS   = -c $(VMASMDEBUG)
+ifeq "$(LIBTYPE)""a"
+CFLAGS   = -D__linux__ -DLINUXPPC -DJ9VM_STATIC_LINKAGE -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include -fno-exceptions
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS = rcv 
+else
+#CFLAGS   = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include  -I. -I/phx4f/team/ravi/j9lnxppc/include
+CFLAGS   = -shared -fPIC -D__linux__ -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include 
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+endif
+# Montavista PEE 3.1 for the ppc82xx Sandpoint Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc82xx_mvlpee31"
+TOOL_DIR  = /opt/montavista_x86_ppc82xx/montavista/pro/devkit/ppc/82xx/bin
+CROSSCOMP = ppc_82xx-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-sandpoint/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the MIPS LE/BE Malta Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""mips_mvlpee31"
+CROSSCOMP = mips_fp_$(DATATYPE)-
+TOOL_DIR  = /opt/montavista/pro/devkit/mips/fp_$(DATATYPE)/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mipsle/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the Hitachi SH-4 Solution Board
+ifeq "$(CPUTYPE)_$(COMPILER)""sh4_mvlpee31"
+TOOL_DIR  = /opt/montavista/pro/devkit/sh/sh4_$(DATATYPE)/bin
+CROSSCOMP = sh_sh4_$(DATATYPE)-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mvl-sh4/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the IBM 440GP Walnut Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc440gp_mvlpee31"
+CROSSCOMP = ppc_440-
+TOOL_DIR  = /opt/montavista_ppc_440gp/montavista/pro/devkit/ppc/440/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__  -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-walnut/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista CEE 3.1 for the xscale Mainstone Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlcee31"
+CROSSCOMP = iwmmxt_le-
+TOOL_DIR  = /opt/montavista/cee/devkit/arm/iwmmxt_le/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx4f/team/ravi/gary/j9lnxarmhhmjit-mpn/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS  = rcv
+endif
+# Montavista Linux gcc for the xscale 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlarm"
+CROSSCOMP = arm_sa_le-
+TOOL_DIR  = /opt/montavista/pro/devkit/arm/sa_le/bin 
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/xscale/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+all:      $(DLLNAME) messages
+BUILDLIB: $(DLLNAME)
+$(DLLNAME): \
+	$(C_OBJECTS)
+	$(LINKER) $(LNKFLAGS) $(DLLNAME) \
+        $(C_OBJECTS)
+messages:         
+	@echo "================================================";
+	@echo " === It is for $(CPUTYPE)($(DATATYPE)) $(COMPILER) $(BOARDTYPE) ===";
+	@echo "================================================";
+        
+clean:
+	rm $(DLLNAME)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.arm_hf b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.arm_hf
new file mode 100644
index 0000000000000000000000000000000000000000..c605653564a4d388753ee7f90e3dcae5c8ed2ccf
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.arm_hf
@@ -0,0 +1,198 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+MAKEFILE = makefile.linux
+############################################################################################################
+#       Configure your OS, CPUTYPE and COMPILER 
+############################################################################################################
+OS  = Linux
+##OS=Qnx
+CPUTYPE = arm
+##CPUTYPE = powerpc
+##CPUTYPE = ppc82xx
+##CPUTYPE = ppc440gp
+##CPUTYPE = xscale
+##CPUTYPE = mips
+##CPUTYPE = sh4
+##CPUTYPE = ibm44gp
+LIBTYPE = so                   
+##LIBTYPE = a
+DATATYPE = le
+##DATATYPE = be
+##COMPILER = kenati
+##COMPILER = ydog
+##COMPILER = mvlpee31
+##COMPILER = mvlcee31
+##COMPILER = mvlarm
+##COMPILER = coyote
+##BOARDTYPE = Mainstone
+##BOARDTYPE = Walnut
+##BOARDTYPE = Malta
+##BOARDTYPE = Sandpoint
+##BOARDTYPE = Solution
+############################################################################################################
+#
+#       Release the libdkcomm.so file place
+#
+############################################################################################################
+DLLNAME=Release/$(OS)/$(CPUTYPE)_$(COMPILER)/libdkcomm.$(LIBTYPE)
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = cygCommDriver.o cygDeviceInputStream.o cygDeviceOutputStream.o cygSerialPort.o
+BUILDFILES3 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES4 = NSParallelPort.o ParallelErrorEventThread.o cygSerialDataEventThread.o cygSerialStatusEventThread.o
+BUILDFILES5 = cygParallelPort.o cygParallelErrorEventThread.o cygCommPortIdentifier.o
+C_OBJECTS   = $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) $(BUILDFILES5)
+# For Linux ARM BE - Coyote 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_coyote"
+TOOL_DIR  = /opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/bin
+CROSSCOMP = xscale_be-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I/opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/include -I. -I/phx4f/team/ravi/JavaCommAPI-J9/j9lnxarmbesf-beta22/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Linux ARM  
+ifeq "$(CPUTYPE)_$(COMPILER)""arm_"
+#TOOL_DIR  = /usr/bin
+#CROSSCOMP =
+JAVA_HOME  = /usr/lib/jvm/jdk-7-oracle-armhf
+#CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CC         = arm-linux-gnueabihf-gcc
+CFLAGS    += -O -shared -D__linux__ -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I../include -I.
+#AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS	   = $(CC)
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(CC)
+LNKFLAGS = -shared -o
+endif
+# For Linux i386 
+ifeq "$(CPUTYPE)_$(COMPILER)""i386_"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I. -I/usr/comm/osgimin11/bin/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# Yellow Dog Linux for Power PC
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_ydog"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I.
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+endif
+# Kenati Linux gcc for Power PC 
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_kenati"
+CROSSCOMP = powerpc-uclibc-
+TOOL_DIR  = /opt/kenati/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS        = $(TOOL_DIR)/$(CROSSCOMP)as
+ASFLAGS   = -c $(VMASMDEBUG)
+ifeq "$(LIBTYPE)""a"
+CFLAGS   = -D__linux__ -DLINUXPPC -DJ9VM_STATIC_LINKAGE -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include -fno-exceptions
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS = rcv 
+else
+#CFLAGS   = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include  -I. -I/phx4f/team/ravi/j9lnxppc/include
+CFLAGS   = -shared -fPIC -D__linux__ -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include 
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+endif
+# Montavista PEE 3.1 for the ppc82xx Sandpoint Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc82xx_mvlpee31"
+TOOL_DIR  = /opt/montavista_x86_ppc82xx/montavista/pro/devkit/ppc/82xx/bin
+CROSSCOMP = ppc_82xx-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-sandpoint/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the MIPS LE/BE Malta Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""mips_mvlpee31"
+CROSSCOMP = mips_fp_$(DATATYPE)-
+TOOL_DIR  = /opt/montavista/pro/devkit/mips/fp_$(DATATYPE)/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mipsle/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the Hitachi SH-4 Solution Board
+ifeq "$(CPUTYPE)_$(COMPILER)""sh4_mvlpee31"
+TOOL_DIR  = /opt/montavista/pro/devkit/sh/sh4_$(DATATYPE)/bin
+CROSSCOMP = sh_sh4_$(DATATYPE)-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mvl-sh4/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the IBM 440GP Walnut Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc440gp_mvlpee31"
+CROSSCOMP = ppc_440-
+TOOL_DIR  = /opt/montavista_ppc_440gp/montavista/pro/devkit/ppc/440/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__  -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-walnut/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista CEE 3.1 for the xscale Mainstone Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlcee31"
+CROSSCOMP = iwmmxt_le-
+TOOL_DIR  = /opt/montavista/cee/devkit/arm/iwmmxt_le/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx4f/team/ravi/gary/j9lnxarmhhmjit-mpn/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS  = rcv
+endif
+# Montavista Linux gcc for the xscale 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlarm"
+CROSSCOMP = arm_sa_le-
+TOOL_DIR  = /opt/montavista/pro/devkit/arm/sa_le/bin 
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/xscale/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+all:      $(DLLNAME) messages
+BUILDLIB: $(DLLNAME)
+$(DLLNAME): \
+	$(C_OBJECTS)
+	mkdir -p `dirname $(DLLNAME)`
+	$(LINKER) $(LNKFLAGS) $(DLLNAME) \
+        $(C_OBJECTS)
+messages:         
+	@echo "================================================";
+	@echo " === It is for $(CPUTYPE)($(DATATYPE)) $(COMPILER) $(BOARDTYPE) ===";
+	@echo "================================================";
+        
+clean:
+	rm $(DLLNAME)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.arm_sf b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.arm_sf
new file mode 100644
index 0000000000000000000000000000000000000000..3c527fd7b3203a9c308b1b881d65af45b500aa02
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.arm_sf
@@ -0,0 +1,195 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+MAKEFILE = makefile.linux
+############################################################################################################
+#       Configure your OS, CPUTYPE and COMPILER 
+############################################################################################################
+OS  = Linux
+##OS=Qnx
+CPUTYPE = arm
+##CPUTYPE = powerpc
+##CPUTYPE = ppc82xx
+##CPUTYPE = ppc440gp
+##CPUTYPE = xscale
+##CPUTYPE = mips
+##CPUTYPE = sh4
+##CPUTYPE = ibm44gp
+LIBTYPE = so                   
+##LIBTYPE = a
+DATATYPE = le
+##DATATYPE = be
+##COMPILER = kenati
+##COMPILER = ydog
+##COMPILER = mvlpee31
+##COMPILER = mvlcee31
+##COMPILER = mvlarm
+##COMPILER = coyote
+##BOARDTYPE = Mainstone
+##BOARDTYPE = Walnut
+##BOARDTYPE = Malta
+##BOARDTYPE = Sandpoint
+##BOARDTYPE = Solution
+############################################################################################################
+#
+#       Release the libdkcomm.so file place
+#
+############################################################################################################
+DLLNAME=Release/$(OS)/$(CPUTYPE)_$(COMPILER)/libdkcomm.$(LIBTYPE)
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = cygCommDriver.o cygDeviceInputStream.o cygDeviceOutputStream.o cygSerialPort.o
+BUILDFILES3 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES4 = NSParallelPort.o ParallelErrorEventThread.o cygSerialDataEventThread.o cygSerialStatusEventThread.o
+BUILDFILES5 = cygParallelPort.o cygParallelErrorEventThread.o cygCommPortIdentifier.o
+C_OBJECTS   = $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) $(BUILDFILES5)
+# For Linux ARM BE - Coyote 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_coyote"
+TOOL_DIR  = /opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/bin
+CROSSCOMP = xscale_be-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I/opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/include -I. -I/phx4f/team/ravi/JavaCommAPI-J9/j9lnxarmbesf-beta22/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Linux ARM (using poky toolchain) 
+ifeq "$(CPUTYPE)_$(COMPILER)""arm_"
+#TOOL_DIR  = /usr/bin
+#CROSSCOMP =
+#CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    += -msoft-float -shared -D__linux__ -I$(JAVA_HOME)/include -I../include -I.
+#AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(CXX)
+LNKFLAGS = -shared -o
+endif
+# For Linux i386 
+ifeq "$(CPUTYPE)_$(COMPILER)""i386_"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I. -I/usr/comm/osgimin11/bin/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# Yellow Dog Linux for Power PC
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_ydog"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I.
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+endif
+# Kenati Linux gcc for Power PC 
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_kenati"
+CROSSCOMP = powerpc-uclibc-
+TOOL_DIR  = /opt/kenati/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS        = $(TOOL_DIR)/$(CROSSCOMP)as
+ASFLAGS   = -c $(VMASMDEBUG)
+ifeq "$(LIBTYPE)""a"
+CFLAGS   = -D__linux__ -DLINUXPPC -DJ9VM_STATIC_LINKAGE -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include -fno-exceptions
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS = rcv 
+else
+#CFLAGS   = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include  -I. -I/phx4f/team/ravi/j9lnxppc/include
+CFLAGS   = -shared -fPIC -D__linux__ -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include 
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+endif
+# Montavista PEE 3.1 for the ppc82xx Sandpoint Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc82xx_mvlpee31"
+TOOL_DIR  = /opt/montavista_x86_ppc82xx/montavista/pro/devkit/ppc/82xx/bin
+CROSSCOMP = ppc_82xx-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-sandpoint/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the MIPS LE/BE Malta Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""mips_mvlpee31"
+CROSSCOMP = mips_fp_$(DATATYPE)-
+TOOL_DIR  = /opt/montavista/pro/devkit/mips/fp_$(DATATYPE)/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mipsle/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the Hitachi SH-4 Solution Board
+ifeq "$(CPUTYPE)_$(COMPILER)""sh4_mvlpee31"
+TOOL_DIR  = /opt/montavista/pro/devkit/sh/sh4_$(DATATYPE)/bin
+CROSSCOMP = sh_sh4_$(DATATYPE)-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mvl-sh4/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the IBM 440GP Walnut Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc440gp_mvlpee31"
+CROSSCOMP = ppc_440-
+TOOL_DIR  = /opt/montavista_ppc_440gp/montavista/pro/devkit/ppc/440/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__  -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-walnut/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista CEE 3.1 for the xscale Mainstone Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlcee31"
+CROSSCOMP = iwmmxt_le-
+TOOL_DIR  = /opt/montavista/cee/devkit/arm/iwmmxt_le/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx4f/team/ravi/gary/j9lnxarmhhmjit-mpn/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS  = rcv
+endif
+# Montavista Linux gcc for the xscale 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlarm"
+CROSSCOMP = arm_sa_le-
+TOOL_DIR  = /opt/montavista/pro/devkit/arm/sa_le/bin 
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/xscale/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+all:      $(DLLNAME) messages
+BUILDLIB: $(DLLNAME)
+$(DLLNAME): \
+	$(C_OBJECTS)
+	mkdir -p `dirname $(DLLNAME)`
+	$(LINKER) $(LNKFLAGS) $(DLLNAME) \
+        $(C_OBJECTS)
+messages:         
+	@echo "================================================";
+	@echo " === It is for $(CPUTYPE)($(DATATYPE)) $(COMPILER) $(BOARDTYPE) ===";
+	@echo "================================================";
+        
+clean:
+	rm $(DLLNAME)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.i586 b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.i586
new file mode 100644
index 0000000000000000000000000000000000000000..00a3026538cd5a73328ecd17e5b98399fea76463
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.i586
@@ -0,0 +1,184 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+MAKEFILE = makefile.linux
+############################################################################################################
+#       Configure your OS, CPUTYPE and COMPILER 
+############################################################################################################
+OS  = Linux
+##OS=Qnx
+CPUTYPE = i386
+##CPUTYPE = powerpc
+##CPUTYPE = ppc82xx
+##CPUTYPE = ppc440gp
+##CPUTYPE = xscale
+##CPUTYPE = mips
+##CPUTYPE = sh4
+##CPUTYPE = ibm44gp
+LIBTYPE = so                   
+##LIBTYPE = a
+DATATYPE = le
+##DATATYPE = be
+##COMPILER = kenati
+##COMPILER = ydog
+##COMPILER = mvlpee31
+##COMPILER = mvlcee31
+##COMPILER = mvlarm
+##COMPILER = coyote
+##BOARDTYPE = Mainstone
+##BOARDTYPE = Walnut
+##BOARDTYPE = Malta
+##BOARDTYPE = Sandpoint
+##BOARDTYPE = Solution
+############################################################################################################
+#
+#       Release the libdkcomm.so file place
+#
+############################################################################################################
+DLLNAME=Release/$(OS)/$(CPUTYPE)_$(COMPILER)/libdkcomm.$(LIBTYPE)
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = cygCommDriver.o cygDeviceInputStream.o cygDeviceOutputStream.o cygSerialPort.o
+BUILDFILES3 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES4 = NSParallelPort.o ParallelErrorEventThread.o cygSerialDataEventThread.o cygSerialStatusEventThread.o
+BUILDFILES5 = cygParallelPort.o cygParallelErrorEventThread.o cygCommPortIdentifier.o
+C_OBJECTS   = $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) $(BUILDFILES5)
+# For Linux ARM BE - Coyote 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_coyote"
+TOOL_DIR  = /opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/bin
+CROSSCOMP = xscale_be-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I/opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/include -I. -I/phx4f/team/ravi/JavaCommAPI-J9/j9lnxarmbesf-beta22/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Linux i386 (yocto toolchain)
+ifeq "$(CPUTYPE)_$(COMPILER)""i386_"
+#TOOL_DIR  = /usr/bin
+#CROSSCOMP =
+#CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    += -shared -D__linux__ -I$(JAVA_HOME)/include -I../include -I. 
+#AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(CXX)
+LNKFLAGS = -shared -o
+endif
+# Yellow Dog Linux for Power PC
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_ydog"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I.
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+endif
+# Kenati Linux gcc for Power PC 
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_kenati"
+CROSSCOMP = powerpc-uclibc-
+TOOL_DIR  = /opt/kenati/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS        = $(TOOL_DIR)/$(CROSSCOMP)as
+ASFLAGS   = -c $(VMASMDEBUG)
+ifeq "$(LIBTYPE)""a"
+CFLAGS   = -D__linux__ -DLINUXPPC -DJ9VM_STATIC_LINKAGE -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include -fno-exceptions
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS = rcv 
+else
+#CFLAGS   = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include  -I. -I/phx4f/team/ravi/j9lnxppc/include
+CFLAGS   = -shared -fPIC -D__linux__ -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include 
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+endif
+# Montavista PEE 3.1 for the ppc82xx Sandpoint Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc82xx_mvlpee31"
+TOOL_DIR  = /opt/montavista_x86_ppc82xx/montavista/pro/devkit/ppc/82xx/bin
+CROSSCOMP = ppc_82xx-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-sandpoint/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the MIPS LE/BE Malta Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""mips_mvlpee31"
+CROSSCOMP = mips_fp_$(DATATYPE)-
+TOOL_DIR  = /opt/montavista/pro/devkit/mips/fp_$(DATATYPE)/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mipsle/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the Hitachi SH-4 Solution Board
+ifeq "$(CPUTYPE)_$(COMPILER)""sh4_mvlpee31"
+TOOL_DIR  = /opt/montavista/pro/devkit/sh/sh4_$(DATATYPE)/bin
+CROSSCOMP = sh_sh4_$(DATATYPE)-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mvl-sh4/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the IBM 440GP Walnut Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc440gp_mvlpee31"
+CROSSCOMP = ppc_440-
+TOOL_DIR  = /opt/montavista_ppc_440gp/montavista/pro/devkit/ppc/440/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__  -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-walnut/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista CEE 3.1 for the xscale Mainstone Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlcee31"
+CROSSCOMP = iwmmxt_le-
+TOOL_DIR  = /opt/montavista/cee/devkit/arm/iwmmxt_le/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx4f/team/ravi/gary/j9lnxarmhhmjit-mpn/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS  = rcv
+endif
+# Montavista Linux gcc for the xscale 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlarm"
+CROSSCOMP = arm_sa_le-
+TOOL_DIR  = /opt/montavista/pro/devkit/arm/sa_le/bin 
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/xscale/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+all:      $(DLLNAME) messages
+BUILDLIB: $(DLLNAME)
+$(DLLNAME): \
+	$(C_OBJECTS)
+	mkdir -p `dirname $(DLLNAME)`
+	$(LINKER) $(LNKFLAGS) $(DLLNAME) \
+        $(C_OBJECTS)
+messages:         
+	@echo "================================================";
+	@echo " === It is for $(CPUTYPE)($(DATATYPE)) $(COMPILER) $(BOARDTYPE) ===";
+	@echo "================================================";
+        
+clean:
+	rm $(DLLNAME)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.x86_64 b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.x86_64
new file mode 100644
index 0000000000000000000000000000000000000000..2d0276b722829bee25d76ba0a0e81bb819c4070d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.linux.poky.x86_64
@@ -0,0 +1,195 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+MAKEFILE = makefile.linux
+############################################################################################################
+#       Configure your OS, CPUTYPE and COMPILER 
+############################################################################################################
+OS  = Linux
+##OS=Qnx
+CPUTYPE = x86-64
+##CPUTYPE = powerpc
+##CPUTYPE = ppc82xx
+##CPUTYPE = ppc440gp
+##CPUTYPE = xscale
+##CPUTYPE = mips
+##CPUTYPE = sh4
+##CPUTYPE = ibm44gp
+LIBTYPE = so                   
+##LIBTYPE = a
+DATATYPE = le
+##DATATYPE = be
+##COMPILER = kenati
+##COMPILER = ydog
+##COMPILER = mvlpee31
+##COMPILER = mvlcee31
+##COMPILER = mvlarm
+##COMPILER = coyote
+##BOARDTYPE = Mainstone
+##BOARDTYPE = Walnut
+##BOARDTYPE = Malta
+##BOARDTYPE = Sandpoint
+##BOARDTYPE = Solution
+############################################################################################################
+#
+#       Release the dkcomm.so file place
+#
+############################################################################################################
+DLLNAME=Release/$(OS)/$(CPUTYPE)_$(COMPILER)/dkcomm.$(LIBTYPE)
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = cygCommDriver.o cygDeviceInputStream.o cygDeviceOutputStream.o cygSerialPort.o
+BUILDFILES3 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES4 = NSParallelPort.o ParallelErrorEventThread.o cygSerialDataEventThread.o cygSerialStatusEventThread.o
+BUILDFILES5 = cygParallelPort.o cygParallelErrorEventThread.o cygCommPortIdentifier.o
+C_OBJECTS   = $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) $(BUILDFILES5)
+# For Linux ARM BE - Coyote 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_coyote"
+TOOL_DIR  = /opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/bin
+CROSSCOMP = xscale_be-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I/opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/include -I. -I/phx4f/team/ravi/JavaCommAPI-J9/j9lnxarmbesf-beta22/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Linux i386 (yocto toolchain)
+ifeq "$(CPUTYPE)_$(COMPILER)""i386_"
+#TOOL_DIR  = /usr/bin
+#CROSSCOMP =
+#CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    += -shared -D__linux__ -I$(JAVA_HOME)/include -I../include -I. 
+#AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(CXX)
+LNKFLAGS = -shared -o
+endif
+# For Linux x86_64 (yocto toolchain)
+ifeq "$(CPUTYPE)_$(COMPILER)""x86-64_"
+#TOOL_DIR  = /usr/bin
+#CROSSCOMP =
+#CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    += -shared -D__linux__ -I$(JAVA_HOME)/include -I../include -I. -fPIC 
+#AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(CXX)
+LNKFLAGS = -shared -o
+endif
+# Yellow Dog Linux for Power PC
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_ydog"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I.
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+endif
+# Kenati Linux gcc for Power PC 
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_kenati"
+CROSSCOMP = powerpc-uclibc-
+TOOL_DIR  = /opt/kenati/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS        = $(TOOL_DIR)/$(CROSSCOMP)as
+ASFLAGS   = -c $(VMASMDEBUG)
+ifeq "$(LIBTYPE)""a"
+CFLAGS   = -D__linux__ -DLINUXPPC -DJ9VM_STATIC_LINKAGE -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include -fno-exceptions
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS = rcv 
+else
+#CFLAGS   = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include  -I. -I/phx4f/team/ravi/j9lnxppc/include
+CFLAGS   = -shared -fPIC -D__linux__ -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include 
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+endif
+# Montavista PEE 3.1 for the ppc82xx Sandpoint Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc82xx_mvlpee31"
+TOOL_DIR  = /opt/montavista_x86_ppc82xx/montavista/pro/devkit/ppc/82xx/bin
+CROSSCOMP = ppc_82xx-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-sandpoint/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the MIPS LE/BE Malta Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""mips_mvlpee31"
+CROSSCOMP = mips_fp_$(DATATYPE)-
+TOOL_DIR  = /opt/montavista/pro/devkit/mips/fp_$(DATATYPE)/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mipsle/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the Hitachi SH-4 Solution Board
+ifeq "$(CPUTYPE)_$(COMPILER)""sh4_mvlpee31"
+TOOL_DIR  = /opt/montavista/pro/devkit/sh/sh4_$(DATATYPE)/bin
+CROSSCOMP = sh_sh4_$(DATATYPE)-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mvl-sh4/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the IBM 440GP Walnut Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc440gp_mvlpee31"
+CROSSCOMP = ppc_440-
+TOOL_DIR  = /opt/montavista_ppc_440gp/montavista/pro/devkit/ppc/440/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__  -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-walnut/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista CEE 3.1 for the xscale Mainstone Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlcee31"
+CROSSCOMP = iwmmxt_le-
+TOOL_DIR  = /opt/montavista/cee/devkit/arm/iwmmxt_le/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx4f/team/ravi/gary/j9lnxarmhhmjit-mpn/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS  = rcv
+endif
+# Montavista Linux gcc for the xscale 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlarm"
+CROSSCOMP = arm_sa_le-
+TOOL_DIR  = /opt/montavista/pro/devkit/arm/sa_le/bin 
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/xscale/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+all:      $(DLLNAME) messages
+BUILDLIB: $(DLLNAME)
+$(DLLNAME): \
+	$(C_OBJECTS)
+	mkdir -p `dirname $(DLLNAME)` 
+	$(LINKER) $(LNKFLAGS) $(DLLNAME) \
+        $(C_OBJECTS)
+messages:         
+	@echo "================================================";
+	@echo " === It is for $(CPUTYPE)($(DATATYPE)) $(COMPILER) $(BOARDTYPE) ===";
+	@echo "================================================";
+        
+clean:
+	rm $(DLLNAME)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.osx b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.osx
new file mode 100644
index 0000000000000000000000000000000000000000..548350e6bc22051ab572212ab1fa5c4a504b26f8
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.osx
@@ -0,0 +1,198 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+MAKEFILE = makefile.linux
+############################################################################################################
+#       Configure your OS, CPUTYPE and COMPILER 
+############################################################################################################
+##OS  = Linux
+OS  = OSX
+##OS=Qnx
+CPUTYPE = x86
+##CPUTYPE = i386
+##CPUTYPE = powerpc
+##CPUTYPE = ppc82xx
+##CPUTYPE = ppc440gp
+##CPUTYPE = xscale
+##CPUTYPE = mips
+##CPUTYPE = sh4
+##CPUTYPE = ibm44gp
+##LIBTYPE = so                   
+LIBTYPE = jnilib                   
+##LIBTYPE = a
+DATATYPE = le
+##DATATYPE = be
+##COMPILER = kenati
+##COMPILER = ydog
+##COMPILER = mvlpee31
+##COMPILER = mvlcee31
+##COMPILER = mvlarm
+##COMPILER = coyote
+COMPILER = macosx
+##BOARDTYPE = Mainstone
+##BOARDTYPE = Walnut
+##BOARDTYPE = Malta
+##BOARDTYPE = Sandpoint
+##BOARDTYPE = Solution
+############################################################################################################
+#
+#       Release the libdkcomm.so file place
+#
+############################################################################################################
+DLLNAME=Release/$(OS)/$(CPUTYPE)_$(COMPILER)/libdkcomm.$(LIBTYPE)
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = cygCommDriver.o cygDeviceInputStream.o cygDeviceOutputStream.o cygSerialPort.o
+BUILDFILES3 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES4 = NSParallelPort.o ParallelErrorEventThread.o cygSerialDataEventThread.o cygSerialStatusEventThread.o
+BUILDFILES5 = cygParallelPort.o cygParallelErrorEventThread.o cygCommPortIdentifier.o
+C_OBJECTS   = $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) $(BUILDFILES5)
+# For Linux ARM BE - Coyote 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_coyote"
+TOOL_DIR  = /opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/bin
+CROSSCOMP = xscale_be-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I/opt/montavista_xscale_be/montavista/pro/devkit/arm/xscale_be/include -I. -I/phx4f/team/ravi/JavaCommAPI-J9/j9lnxarmbesf-beta22/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Linux i386 
+ifeq "$(CPUTYPE)_$(COMPILER)""i386_"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I. -I/usr/comm/osgimin11/bin/include
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# For Mac x86 
+ifeq "$(CPUTYPE)_$(COMPILER)""x86_macosx"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__osx__ -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/darwin -I../include -I/usr/include -I. -I/usr/comm/osgimin11/bin/include -lpthread
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+# Yellow Dog Linux for Power PC
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_ydog"
+TOOL_DIR  = /usr/bin
+CROSSCOMP =
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/usr/include -I.
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+endif
+# Kenati Linux gcc for Power PC 
+ifeq "$(CPUTYPE)_$(COMPILER)""powerpc_kenati"
+CROSSCOMP = powerpc-uclibc-
+TOOL_DIR  = /opt/kenati/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+AS        = $(TOOL_DIR)/$(CROSSCOMP)as
+ASFLAGS   = -c $(VMASMDEBUG)
+ifeq "$(LIBTYPE)""a"
+CFLAGS   = -D__linux__ -DLINUXPPC -DJ9VM_STATIC_LINKAGE -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include -fno-exceptions
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS = rcv 
+else
+#CFLAGS   = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include  -I. -I/phx4f/team/ravi/j9lnxppc/include
+CFLAGS   = -shared -fPIC -D__linux__ -mcpu=$(CPUTYPE) -I../include -I. -I/phx4f/team/ravi/j9lnxppc/include 
+LINKER   = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS = -shared -o
+endif
+endif
+# Montavista PEE 3.1 for the ppc82xx Sandpoint Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc82xx_mvlpee31"
+TOOL_DIR  = /opt/montavista_x86_ppc82xx/montavista/pro/devkit/ppc/82xx/bin
+CROSSCOMP = ppc_82xx-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-sandpoint/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the MIPS LE/BE Malta Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""mips_mvlpee31"
+CROSSCOMP = mips_fp_$(DATATYPE)-
+TOOL_DIR  = /opt/montavista/pro/devkit/mips/fp_$(DATATYPE)/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mipsle/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the Hitachi SH-4 Solution Board
+ifeq "$(CPUTYPE)_$(COMPILER)""sh4_mvlpee31"
+TOOL_DIR  = /opt/montavista/pro/devkit/sh/sh4_$(DATATYPE)/bin
+CROSSCOMP = sh_sh4_$(DATATYPE)-
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/mvl-sh4/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista PEE 3.1 for the IBM 440GP Walnut Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""ppc440gp_mvlpee31"
+CROSSCOMP = ppc_440-
+TOOL_DIR  = /opt/montavista_ppc_440gp/montavista/pro/devkit/ppc/440/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__  -I../include -I/phx4f/team/tjfang/runtimes/2005-2.2.1SR1/j9lnxppc-walnut/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+# Montavista CEE 3.1 for the xscale Mainstone Board 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlcee31"
+CROSSCOMP = iwmmxt_le-
+TOOL_DIR  = /opt/montavista/cee/devkit/arm/iwmmxt_le/bin
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx4f/team/ravi/gary/j9lnxarmhhmjit-mpn/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)ar
+LNKFLAGS  = rcv
+endif
+# Montavista Linux gcc for the xscale 
+ifeq "$(CPUTYPE)_$(COMPILER)""xscale_mvlarm"
+CROSSCOMP = arm_sa_le-
+TOOL_DIR  = /opt/montavista/pro/devkit/arm/sa_le/bin 
+CC        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+CFLAGS    = -shared -D__linux__ -mcpu=$(CPUTYPE) -I../include -I/phx5f/projects/TCK/cert22/runtimes/0706/mvl/31/xscale/bin/include -I. -fPIC
+AS        = $(TOOL_DIR)/$(CROSSCOMP)gcc
+ASFLAGS   = -c $(VMASMDEBUG) -shared
+LINKER    = $(TOOL_DIR)/$(CROSSCOMP)gcc
+LNKFLAGS  = -shared -o
+endif
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+all:      $(DLLNAME) messages
+BUILDLIB: $(DLLNAME)
+$(DLLNAME): \
+	$(C_OBJECTS)
+	$(LINKER) $(LNKFLAGS) $(DLLNAME) \
+        $(C_OBJECTS)
+messages:         
+	@echo "================================================";
+	@echo " === It is for $(CPUTYPE)($(DATATYPE)) $(COMPILER) $(BOARDTYPE) ===";
+	@echo "================================================";
+        
+clean:
+	rm $(DLLNAME)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.qnx b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.qnx
new file mode 100644
index 0000000000000000000000000000000000000000..68636035923780feed72aaa08370443d53f5052d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.qnx
@@ -0,0 +1,29 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+DLLNAME=../libibmcomm.so# declaration
+BUILDFILES1 = CommPortIdentifier.o NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o NSParallelPort.o ParallelErrorEventThread.o
+CC=qcc
+CFLAGS=-O -Vgcc_ntox86 -DQNX -DNEUTRINO -shared -DX86 -I../include -I/usr/include -I.
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+AS=qcc
+ASFLAGS=-Vgcc_ntox86 -c $(VMASMDEBUG) 
+all:  BUILDLIB
+BUILDLIB: $(DLLNAME)
+ 
+$(DLLNAME):\
+	$(BUILDFILES1) $(BUILDFILES2) 
+	 qcc -L. -W l,-s -W l,-x -Vgcc_ntox86 -shared  -o $(DLLNAME) \
+	$(BUILDFILES1) $(BUILDFILES2) -W l,--start-group \
+	-W l,--end-group 
+		 
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.win32 b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.win32
new file mode 100644
index 0000000000000000000000000000000000000000..2235e0a6f3ccfb52b00c730bdbe481f70d60a54a
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.win32
@@ -0,0 +1,54 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+APPVER=4.0
+TARGETOS=WIN95
+SEHMAP = TRUE
+!include <win32.mak>
+DLLFILENAME=dkcomm.dll# declaration
+DLLPATH = Release\win32\x86\
+DLLNAME= $(DLLPATH)\dkcomm.dll# declaration
+LIBNAME=dkcomm# declaration
+LIBPATH=.\# declaration
+.c.obj:
+	$(cc) -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 $(cflags) -D_MT -D_DLL -MD -D_WINSOCKAPI_ -DWIN32 -Ogityb1 -Gs -GF -Zm400 -Zi  /IC:\IBM\osgimin11\bin\include $*.c
+#/IC:\IBM\osgimin11\bin\include
+.cpp.obj:
+	$(cc) -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 $(cflags) -D_MT -D_DLL -MD -D_WINSOCKAPI_ -DWIN32 -Ogityb1 -Gs -GF -Zm400 -Zi  $*.cpp
+.rc.res:
+	rc $<
+BUILDFILES1 = CommPortIdentifier.obj NSCommDriver.obj NSDeviceInputStream.obj NSDeviceOutputStream.obj NSSerialPort.obj
+BUILDFILES2 = SerialDataEventThread.obj SerialStatusEventThread.obj w32CommDriver.obj w32CommPortIdentifier.obj
+BUILDFILES3 = w32DeviceInputStream.obj w32DeviceOutputStream.obj w32SerialDataEventThread.obj
+BUILDFILES4 = w32SerialPort.obj w32SerialStatusEventThread.obj NSCommLOG.obj
+#NSParallelPort.obj ParallelErrorEventThread.obj NSCommLOG.obj
+SYSLIBFILES1 = ws2_32.lib
+MDLLIBFILES1 =
+all: \
+	 $(LIBPATH)$(LIBNAME).lib $(DLLNAME)
+BUILDLIB: $(LIBPATH)$(LIBNAME).lib
+$(LIBPATH)$(LIBNAME).lib:\
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) \
+	$(MDLLIBFILES1)
+	$(implib) -subsystem:windows -out:$(LIBPATH)$(LIBNAME).lib -machine:$(CPU) \
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) \
+	$(MDLLIBFILES1)
+$(DLLNAME): $(LIBPATH)$(LIBNAME).lib \
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) \
+	$(MDLLIBFILES1)
+	link $(VMLINK) /debug /opt:icf /opt:ref /INCREMENTAL:NO /NOLOGO -entry:_DllMainCRTStartup@12 -dll /BASE:0x11300000 -machine:$(CPU) \
+	-subsystem:windows -out:$(DLLNAME) -map:$(LIBNAME).map \
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4) \
+	$(MDLLIBFILES1) $(SYSLIBFILES1)  \
+	kernel32.lib  ws2_32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib
+static:
+	$(MAKE) -f makefile.static
+quick:
+	$(MAKE)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.win32_down b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.win32_down
new file mode 100644
index 0000000000000000000000000000000000000000..d3ec8f8c99e8a6db1630d3bbae8b22ce1bd57722
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.win32_down
@@ -0,0 +1,29 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+!include <win32.mak>
+DLLNAME=../libibmcomm.dll# declaration
+BUILDFILES1 = CommPortIdentifier.obj NSCommDriver.o NSDeviceInputStream.o NSDeviceOutputStream.o NSSerialPort.o
+BUILDFILES2 = SerialDataEventThread.o SerialStatusEventThread.o SysVStyleSemaphore.o
+BUILDFILES3 = NSParallelPort.o ParallelErrorEventThread.o NSCommLOG.o
+BUILDFILES4 = w32SerialPort.o
+CC=gcc
+CFLAGS=-shared -DWIN32 -DDLL -DDEBUG -I../include -I/usr/include -I.
+.SUFFIXES:.cpp
+.cpp.o:
+	$(CC) $(CFLAGS) -I. -fno-exceptions -fno-rtti -c $<
+AS=gcc
+ASFLAGS=-c $(VMASMDEBUG) -shared
+all: \
+	 $(DLLNAME)
+BUILDLIB: $(DLLNAME)
+$(DLLNAME):\
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)
+	 gcc -shared -o $(DLLNAME) $(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.wince b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.wince
new file mode 100644
index 0000000000000000000000000000000000000000..bd47c723c6b01fe9f09802b28212b430dcdd98e2
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/makefile.wince
@@ -0,0 +1,54 @@
+#########################################################################
+# Copyright (c) 2001, 2009 IBM.                                         #
+# All rights reserved. This program and the accompanying materials      #
+# are made available under the terms of the Eclipse Public License v1.0 #
+# which accompanies this distribution, and is available at              #
+# http://www.eclipse.org/legal/epl-v10.html                             #
+#                                                                       #
+# Contributors:                                                         #
+#     IBM - initial API and implementation                              #
+#########################################################################
+.SUFFIXES: .s
+CPU=ARM
+CC=clarm
+DLLNAME=Release/Windows/WinCE/libibmcomm.dll# declaration
+LIBNAME=Release/Windows/WinCE/libibmcomm# declaration
+LIBPATH="C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Lib\armv4"
+BUILDFILES1 = CommPortIdentifier.obj NSCommDriver.obj          NSDeviceInputStream.obj   NSDeviceOutputStream.obj
+BUILDFILES2 = NSSerialPort.obj       NSCommLOG.obj             SerialDataEventThread.obj SerialStatusEventThread.obj 
+BUILDFILES3 = w32SerialPort.obj      w32DeviceInputStream.obj  w32DeviceOutputStream.obj w32SerialDataEventThread.obj
+BUILDFILES4 = w32CommDriver.obj      w32CommPortIdentifier.obj w32SerialStatusEventThread.obj 
+CFLAGS =-DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /nologo /c -DJ9WINCE -DJ9POCKETPC /W3 -DIPV4_WINCE -D_WIN32_WCE=300 
+CFLAGS+=-D"MS Pocket PC" /DUNDER_CE=300 /D"UNICODE" /D "_MBCS" /Zm400 -DFIXUP_UNALIGNED -D$(CPU) -D_$(CPU)_ -Ogitb1 
+CFLAGS+=-GF -DTR_HOST_32BIT -DTR_TARGET_$(CPU) -DNewFrameShape -DTR_HOST_$(CPU) -DSMALL -DTR_TARGET_32BIT 
+CFLAGS+=-I ../include -I. 
+CFLAGS+=-I "C:\Program Files\IBM\DeviceDeveloper\wsdd5.0\ive-2.2\bin\include"
+CFLAGS+=-I "C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Include\armv4"
+##CFLAGS=-shared -DWIN32 -DDLL -DDEBUG -I../include -I/usr/include -I.
+%.obj : %.c
+	$(CC) $(CFLAGS) $< -o $@
+%.obj : %.cpp
+	$(CC) -c $(CFLAGS) $< -o $@
+AS=armasm
+ASFLAGS=$(VMASMDEBUG) -shared
+%.obj : %.s
+	$(AS) -c $(ASFLAGS) $< -o $@
+all: \
+	 $(DLLNAME)
+BUILDLIB: $(DLLNAME)
+$(LIBNAME).lib:\
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)
+	lib -subsystem:windowsce,3.0 -out:$(LIBNAME).lib -machine:$(CPU) \
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)
+$(DLLNAME):$(LIBNAME).lib\
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)
+	link $(VMLINK)  /INCREMENTAL:NO /NOLOGO -machine:$(CPU) \
+	-subsystem:windowsce,3.0 -out:$(DLLNAME) -map:$(LIBNAME).map \
+	$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)  \
+        $(LIBPATH)/corelibc.lib $(LIBPATH)/coredll.lib
+	##-subsystem:windowsce,3.0 -out:$(DLLNAME) -map:$(LIBNAME).map /dll \ ##/entry:"_DllMainCRTStartup"  \
+        ##$(LIBPATH)/corelibc.lib 
+	##$(BUILDFILES1) $(BUILDFILES2) $(BUILDFILES3) $(BUILDFILES4)
+	##/dll /entry:"_DllMainCRTStartup" corelibc.lib coredll.lib commctrl.lib aygshell.lib $(LIBPATH)$(LIBNAME).exp
+         
+         
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm.lib b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm.lib
new file mode 100644
index 0000000000000000000000000000000000000000..9ca51577207d820b70b65472a5f96f8292299106
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm.lib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm.map b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm.map
new file mode 100644
index 0000000000000000000000000000000000000000..4a0c39fd6407f90a5f658f12b7a0bf8def8ccd45
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm.map
@@ -0,0 +1,229 @@
+ org_eclipse_soda_dk_comm
+
+ Timestamp is 45a69b5b (Thu Jan 11 15:17:31 2007)
+
+ Preferred load address is 11300000
+
+ Start         Length     Name                   Class
+ 0001:00000000 000025c8H .text                   CODE
+ 0002:00000000 000000a4H .idata$5                DATA
+ 0002:000000b0 00000580H .rdata                  DATA
+ 0002:00000630 0000005aH .rdata$debug            DATA
+ 0002:00000690 00000004H .rdata$sxdata           DATA
+ 0002:00000694 00000004H .rtc$IAA                DATA
+ 0002:00000698 00000004H .rtc$IZZ                DATA
+ 0002:0000069c 00000004H .rtc$TAA                DATA
+ 0002:000006a0 00000004H .rtc$TZZ                DATA
+ 0002:000006a4 0000003cH .idata$2                DATA
+ 0002:000006e0 00000014H .idata$3                DATA
+ 0002:000006f4 000000a4H .idata$4                DATA
+ 0002:00000798 00000232H .idata$6                DATA
+ 0002:000009d0 000007a4H .edata                  DATA
+ 0003:00000000 00000004H .CRT$XCA                DATA
+ 0003:00000004 00000004H .CRT$XCZ                DATA
+ 0003:00000008 00000004H .CRT$XIA                DATA
+ 0003:0000000c 00000004H .CRT$XIZ                DATA
+ 0003:00000010 00000004H .data                   DATA
+ 0003:00000014 00000014H .bss                    DATA
+
+  Address         Publics by Value              Rva+Base     Lib:Object
+
+ 0000:00000001       ___safe_se_handler_count   00000001     <absolute>
+ 0001:00000000       _Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC@12 11301000 f   CommPortIdentifier.obj
+ 0001:00000020       _Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC@8 11301020 f   NSCommDriver.obj
+ 0001:00000040       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceOneByteNC@8 11301040 f   NSDeviceInputStream.obj
+ 0001:00000060       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceNC@20 11301060 f   NSDeviceInputStream.obj
+ 0001:00000090       _Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_getReadCountNC@8 11301090 f   NSDeviceInputStream.obj
+ 0001:000000b0       _Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC@20 113010b0 f   NSDeviceOutputStream.obj
+ 0001:000000e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC@16 113010e0 f   NSSerialPort.obj
+ 0001:00000100       _Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC@16 11301100 f   NSSerialPort.obj
+ 0001:00000120       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC@16 11301120 f   NSSerialPort.obj
+ 0001:00000140       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC@12 11301140 f   NSSerialPort.obj
+ 0001:00000160       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC@12 11301160 f   NSSerialPort.obj
+ 0001:00000180       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC@12 11301180 f   NSSerialPort.obj
+ 0001:000001a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC@12 113011a0 f   NSSerialPort.obj
+ 0001:000001c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC@12 113011c0 f   NSSerialPort.obj
+ 0001:000001e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC@12 113011e0 f   NSSerialPort.obj
+ 0001:00000200       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC@8 11301200 f   NSSerialPort.obj
+ 0001:00000220       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC@12 11301220 f   NSSerialPort.obj
+ 0001:00000240       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC@8 11301240 f   NSSerialPort.obj
+ 0001:00000260       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC@8 11301260 f   NSSerialPort.obj
+ 0001:00000280       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC@8 11301280 f   NSSerialPort.obj
+ 0001:000002a0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC@8 113012a0 f   NSSerialPort.obj
+ 0001:000002c0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC@8 113012c0 f   NSSerialPort.obj
+ 0001:000002e0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC@16 113012e0 f   NSSerialPort.obj
+ 0001:000002f0       _Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC@28 113012f0 f   NSSerialPort.obj
+ 0001:00000320       _Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC@12 11301320 f   SerialDataEventThread.obj
+ 0001:00000340       _Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC@12 11301340 f   SerialStatusEventThread.obj
+ 0001:00000360       _w32CommDriver_discoverDevicesNC 11301360 f   w32CommDriver.obj
+ 0001:00000510       _w32CommPortIdentifier_monitorInterJVMDeviceAccessNC 11301510 f   w32CommPortIdentifier.obj
+ 0001:00000770       _w32DeviceInputStream_readDeviceOneByteNC 11301770 f   w32DeviceInputStream.obj
+ 0001:00000940       _w32DeviceInputStream_readDeviceNC 11301940 f   w32DeviceInputStream.obj
+ 0001:00000c10       _w32DeviceInputStream_getReadCountNC 11301c10 f   w32DeviceInputStream.obj
+ 0001:00000d30       _w32DeviceOutputStream_writeDeviceNC 11301d30 f   w32DeviceOutputStream.obj
+ 0001:00000f70       _w32SerialDataEventThread_monitorSerialDataNC 11301f70 f   w32SerialDataEventThread.obj
+ 0001:00001250       _w32getfd                  11302250 f   w32SerialPort.obj
+ 0001:000012b0       _w32SerialPort_closeDeviceNC 113022b0 f   w32SerialPort.obj
+ 0001:000012c0       _w32SerialPort_openDeviceNC 113022c0 f   w32SerialPort.obj
+ 0001:00001350       _w32SerialPort_setFlowControlModeNC 11302350 f   w32SerialPort.obj
+ 0001:00001440       _w32SerialPort_getFlowControlModeNC 11302440 f   w32SerialPort.obj
+ 0001:00001500       _w32SerialPort_getBaudRateNC 11302500 f   w32SerialPort.obj
+ 0001:00001560       _w32SerialPort_getDataBitsNC 11302560 f   w32SerialPort.obj
+ 0001:000015c0       _w32SerialPort_getStopBitsNC 113025c0 f   w32SerialPort.obj
+ 0001:00001640       _w32SerialPort_getParityNC 11302640 f   w32SerialPort.obj
+ 0001:00001700       _w32SerialPort_setDTRNC    11302700 f   w32SerialPort.obj
+ 0001:000017b0       _w32SerialPort_isDTRNC     113027b0 f   w32SerialPort.obj
+ 0001:00001840       _w32SerialPort_setRTSNC    11302840 f   w32SerialPort.obj
+ 0001:00001900       _w32SerialPort_isRTSNC     11302900 f   w32SerialPort.obj
+ 0001:00001990       _w32SerialPort_isCTSNC     11302990 f   w32SerialPort.obj
+ 0001:000019d0       _w32SerialPort_isDSRNC     113029d0 f   w32SerialPort.obj
+ 0001:00001a10       _w32SerialPort_isRINC      11302a10 f   w32SerialPort.obj
+ 0001:00001a50       _w32SerialPort_isCDNC      11302a50 f   w32SerialPort.obj
+ 0001:00001a90       _w32SerialPort_setSerialPortParamsNC 11302a90 f   w32SerialPort.obj
+ 0001:00001c50       _w32SerialStatusEventThread_monitorSerialStatusNC 11302c50 f   w32SerialStatusEventThread.obj
+ 0001:000021b0       _iveSerThrow               113031b0 f   NSCommLOG.obj
+ 0001:00002200       _iveSerThrowWin            11303200 f   NSCommLOG.obj
+ 0001:000022c0       _iveSerClearCommErrors     113032c0 f   NSCommLOG.obj
+ 0001:000022dc       ___WSAFDIsSet@8            113032dc f   ws2_32:WS2_32.dll
+ 0001:000022e2       __CRT_INIT@12              113032e2 f   MSVCRT:crtdll.obj
+ 0001:000023a0       __DllMainCRTStartup@12     113033a0 f   MSVCRT:crtdll.obj
+ 0001:00002484       __initterm                 11303484 f   MSVCRT:MSVCR71.dll
+ 0001:0000248a       __onexit                   1130348a f   MSVCRT:atonexit.obj
+ 0001:000024b0       _atexit                    113034b0 f   MSVCRT:atonexit.obj
+ 0001:000024c2       __RTC_Initialize           113034c2 f   MSVCRT:initsect.obj
+ 0001:00002506       __RTC_Terminate            11303506 f   MSVCRT:initsect.obj
+ 0001:0000254a       ___CppXcptFilter           1130354a f   MSVCRT:MSVCR71.dll
+ 0001:00002550       _DllMain@12                11303550 f   MSVCRT:dllmain.obj
+ 0001:00002570       __SEH_prolog               11303570 f   MSVCRT:sehprolg.obj
+ 0001:000025ab       __SEH_epilog               113035ab f   MSVCRT:sehprolg.obj
+ 0001:000025bc       __except_handler3          113035bc f   MSVCRT:MSVCR71.dll
+ 0001:000025c2       ___dllonexit               113035c2 f   MSVCRT:MSVCR71.dll
+ 0002:00000000       __imp__GetCommState@8      11304000     kernel32:KERNEL32.dll
+ 0002:00000004       __imp__ClearCommError@12   11304004     kernel32:KERNEL32.dll
+ 0002:00000008       __imp__Sleep@4             11304008     kernel32:KERNEL32.dll
+ 0002:0000000c       __imp__GetOverlappedResult@16 1130400c     kernel32:KERNEL32.dll
+ 0002:00000010       __imp__CloseHandle@4       11304010     kernel32:KERNEL32.dll
+ 0002:00000014       __imp__ReadFile@20         11304014     kernel32:KERNEL32.dll
+ 0002:00000018       __imp__GetLastError@0      11304018     kernel32:KERNEL32.dll
+ 0002:0000001c       __imp__CreateEventA@16     1130401c     kernel32:KERNEL32.dll
+ 0002:00000020       __imp__GlobalUnlock@4      11304020     kernel32:KERNEL32.dll
+ 0002:00000024       __imp__GlobalHandle@4      11304024     kernel32:KERNEL32.dll
+ 0002:00000028       __imp__GlobalFree@4        11304028     kernel32:KERNEL32.dll
+ 0002:0000002c       __imp__GlobalLock@4        1130402c     kernel32:KERNEL32.dll
+ 0002:00000030       __imp__GlobalAlloc@8       11304030     kernel32:KERNEL32.dll
+ 0002:00000034       __imp__WaitCommEvent@12    11304034     kernel32:KERNEL32.dll
+ 0002:00000038       __imp__SetCommMask@8       11304038     kernel32:KERNEL32.dll
+ 0002:0000003c       __imp__GetCommMask@8       1130403c     kernel32:KERNEL32.dll
+ 0002:00000040       __imp__WriteFile@20        11304040     kernel32:KERNEL32.dll
+ 0002:00000044       __imp__CreateFileA@28      11304044     kernel32:KERNEL32.dll
+ 0002:00000048       __imp__SetCommState@8      11304048     kernel32:KERNEL32.dll
+ 0002:0000004c       __imp__DisableThreadLibraryCalls@4 1130404c     kernel32:KERNEL32.dll
+ 0002:00000050       __imp__GetCommModemStatus@8 11304050     kernel32:KERNEL32.dll
+ 0002:00000054       __imp__SetCommTimeouts@8   11304054     kernel32:KERNEL32.dll
+ 0002:00000058       __imp__FormatMessageA@28   11304058     kernel32:KERNEL32.dll
+ 0002:0000005c       \177KERNEL32_NULL_THUNK_DATA 1130405c     kernel32:KERNEL32.dll
+ 0002:00000060       __imp___initterm           11304060     MSVCRT:MSVCR71.dll
+ 0002:00000064       __imp___onexit             11304064     MSVCRT:MSVCR71.dll
+ 0002:00000068       __imp__printf              11304068     MSVCRT:MSVCR71.dll
+ 0002:0000006c       __imp__fprintf             1130406c     MSVCRT:MSVCR71.dll
+ 0002:00000070       __imp___iob                11304070     MSVCRT:MSVCR71.dll
+ 0002:00000074       __imp___errno              11304074     MSVCRT:MSVCR71.dll
+ 0002:00000078       __imp__sprintf             11304078     MSVCRT:MSVCR71.dll
+ 0002:0000007c       __imp__free                1130407c     MSVCRT:MSVCR71.dll
+ 0002:00000080       __imp__malloc              11304080     MSVCRT:MSVCR71.dll
+ 0002:00000084       __imp___adjust_fdiv        11304084     MSVCRT:MSVCR71.dll
+ 0002:00000088       __imp____CppXcptFilter     11304088     MSVCRT:MSVCR71.dll
+ 0002:0000008c       __imp___except_handler3    1130408c     MSVCRT:MSVCR71.dll
+ 0002:00000090       __imp____dllonexit         11304090     MSVCRT:MSVCR71.dll
+ 0002:00000094       \177MSVCR71_NULL_THUNK_DATA 11304094     MSVCRT:MSVCR71.dll
+ 0002:00000098       __imp__select@20           11304098     ws2_32:WS2_32.dll
+ 0002:0000009c       __imp____WSAFDIsSet@8      1130409c     ws2_32:WS2_32.dll
+ 0002:000000a0       \177WS2_32_NULL_THUNK_DATA 113040a0     ws2_32:WS2_32.dll
+ 0002:000000cc       ??_C@_0BA@DKOKNLIO@addDeviceToList?$AA@ 113040cc     w32CommDriver.obj
+ 0002:000000dc       ??_C@_0CK@PFBBOMIO@?$CILjava?1lang?1String?$DLILjava?1lang?1S@ 113040dc     w32CommDriver.obj
+ 0002:00000108       ??_C@_0BB@JPFAMGLG@?6?6?$CFd?5asserted?$CB?6?6?$AA@ 11304108     w32CommDriver.obj
+ 0002:0000011c       ??_C@_04CGJBIPHE@COM4?$AA@ 1130411c     w32CommDriver.obj
+ 0002:00000124       ??_C@_04GJNABJLD@COM3?$AA@ 11304124     w32CommDriver.obj
+ 0002:0000012c       ??_C@_04MCDLDDNG@LPT1?$AA@ 1130412c     w32CommDriver.obj
+ 0002:00000134       ??_C@_04HAMLCIPC@COM2?$AA@ 11304134     w32CommDriver.obj
+ 0002:0000013c       ??_C@_04FLOGHLDB@COM1?$AA@ 1130413c     w32CommDriver.obj
+ 0002:00000144       ??_C@_0M@MACEOJAN@pollingTime?$AA@ 11304144     w32CommPortIdentifier.obj
+ 0002:00000150       ??_C@_01JPJNBJEM@I?$AA@    11304150     w32CommPortIdentifier.obj
+ 0002:00000154       ??_C@_0BO@CPNLBCEJ@javax?1comm?1CommPortIdentifier?$AA@ 11304154     w32CommPortIdentifier.obj
+ 0002:00000174       ??_C@_0O@NBKAIMLM@isInterrupted?$AA@ 11304174     w32CommPortIdentifier.obj
+ 0002:00000184       ??_C@_03MMPFGPID@?$CI?$CJZ?$AA@ 11304184     w32CommPortIdentifier.obj
+ 0002:00000188       ??_C@_0BB@NOKBFPFO@java?1lang?1Thread?$AA@ 11304188     w32CommPortIdentifier.obj
+ 0002:0000019c       ??_C@_04MEMAJGDJ@name?$AA@ 1130419c     w32CommPortIdentifier.obj
+ 0002:000001a4       ??_C@_0BD@JFADHEFE@Ljava?1lang?1String?$DL?$AA@ 113041a4     w32CommPortIdentifier.obj
+ 0002:000001b8       ??_C@_0BJ@EKOOIJDM@PORT_OWNERSHIP_REQUESTED?$AA@ 113041b8     w32CommPortIdentifier.obj
+ 0002:000001d4       ??_C@_0N@GCHANIDN@PORT_UNOWNED?$AA@ 113041d4     w32CommPortIdentifier.obj
+ 0002:000001e4       ??_C@_0L@DGJAIDMO@PORT_OWNED?$AA@ 113041e4     w32CommPortIdentifier.obj
+ 0002:000001f0       ??_C@_0CF@LEBHMMNO@javax?1comm?1CommPortOwnershipList@ 113041f0     w32CommPortIdentifier.obj
+ 0002:00000218       ??_C@_0BD@DJGIFLED@fireOwnershipEvent?$AA@ 11304218     w32CommPortIdentifier.obj
+ 0002:0000022c       ??_C@_04PFANPMCN@?$CII?$CJV?$AA@ 1130422c     w32CommPortIdentifier.obj
+ 0002:00000234       ??_C@_0BD@GBHBBJKK@Error?5reading?5data?$AA@ 11304234     w32DeviceInputStream.obj
+ 0002:00000248       ??_C@_0BP@JHKNIHPB@Error?5creating?5event?5semaphore?$AA@ 11304248     w32DeviceInputStream.obj
+ 0002:00000268       ??_C@_02ENHFDPNM@fd?$AA@   11304268     w32DeviceInputStream.obj
+ 0002:0000026b       ??_C@_00CNPNBAHC@?$AA@     1130426b     w32DeviceInputStream.obj
+ 0002:0000026c       ??_C@_0BE@EBAPEBGJ@java?1io?1IOException?$AA@ 1130426c     w32DeviceInputStream.obj
+ 0002:00000280       ??_C@_07DFPBEPEC@tmoDone?$AA@ 11304280     w32DeviceInputStream.obj
+ 0002:00000288       ??_C@_01POHCFINO@Z?$AA@    11304288     w32DeviceInputStream.obj
+ 0002:0000028c       ??_C@_03JIIMDIDD@tmo?$AA@  1130428c     w32DeviceInputStream.obj
+ 0002:00000290       ??_C@_0BD@JJLDMOGH@Error?5writing?5data?$AA@ 11304290     w32DeviceOutputStream.obj
+ 0002:000002a4       ??_C@_0BL@GHKGOAFM@Error?5writing?5pending?5data?$AA@ 113042a4     w32DeviceOutputStream.obj
+ 0002:000002c0       ??_C@_0BB@BOAIAAB@notifyOnDataFlag?$AA@ 113042c0     w32SerialDataEventThread.obj
+ 0002:000002d4       ??_C@_0BC@HPCHKFFH@reportSerialEvent?$AA@ 113042d4     w32SerialDataEventThread.obj
+ 0002:000002e8       ??_C@_06LLPILDMP@?$CIIZZ?$CJV?$AA@ 113042e8     w32SerialDataEventThread.obj
+ 0002:000002f0       ??_C@_0L@MAAAEFDE@serialPort?$AA@ 113042f0     w32SerialDataEventThread.obj
+ 0002:000002fc       ??_C@_0BM@KAHNFPOG@Lcom?1ibm?1comm?1NSSerialPort?$DL?$AA@ 113042fc     w32SerialDataEventThread.obj
+ 0002:00000318       ??_C@_0P@KBKADJBM@DATA_AVAILABLE?$AA@ 11304318     w32SerialDataEventThread.obj
+ 0002:00000328       ??_C@_0BL@ILADHPFC@javax?1comm?1SerialPortEvent?$AA@ 11304328     w32SerialDataEventThread.obj
+ 0002:00000344       ??_C@_0BD@OHJNHKHO@Error?5opening?5port?$AA@ 11304344     w32SerialPort.obj
+ 0002:00000358       ??_C@_0BC@DLMHNEGO@portName?5is?5NULL?6?$AA@ 11304358     w32SerialPort.obj
+ 0002:0000036c       ??_C@_0DE@GKAMPLLG@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 1130436c     w32SerialPort.obj
+ 0002:000003a0       ??_C@_0BG@HPDKJDLF@SetCommState?$CI?$CJ?5failed?$AA@ 113043a0     w32SerialPort.obj
+ 0002:000003b8       ??_C@_0BG@IKGMEKPE@GetCommState?$CI?$CJ?5failed?$AA@ 113043b8     w32SerialPort.obj
+ 0002:000003d0       ??_C@_0DE@OFFEFAE@w32SerialPort_setDTRNC?$CI?$CJ?5failed?5@ 113043d0     w32SerialPort.obj
+ 0002:00000404       ??_C@_0DD@GCHOIIHP@w32SerialPort_isRTSNC?$CI?$CJ?5failed?5t@ 11304404     w32SerialPort.obj
+ 0002:00000438       ??_C@_0BJ@BEHBIPCI@SetCommTimeouts?$CI?$CJ?5failed?$AA@ 11304438     w32SerialPort.obj
+ 0002:00000458       ??_C@_0ED@DPOFFCNL@w32SerialStatusEventThread_monit@ 11304458     w32SerialStatusEventThread.obj
+ 0002:000004a0       ??_C@_0FC@KANLAHLN@w32SerialStatusEventThread_monit@ 113044a0     w32SerialStatusEventThread.obj
+ 0002:000004f4       ??_C@_0P@LNBOEMLD@notifyOnRIFlag?$AA@ 113044f4     w32SerialStatusEventThread.obj
+ 0002:00000504       ??_C@_0BA@OEMCCJHB@notifyOnDSRFlag?$AA@ 11304504     w32SerialStatusEventThread.obj
+ 0002:00000514       ??_C@_0BA@OAPMMNED@notifyOnCTSFlag?$AA@ 11304514     w32SerialStatusEventThread.obj
+ 0002:00000524       ??_C@_0P@MACJMIBH@notifyOnCDFlag?$AA@ 11304524     w32SerialStatusEventThread.obj
+ 0002:00000534       ??_C@_02EODNCIHP@RI?$AA@   11304534     w32SerialStatusEventThread.obj
+ 0002:00000538       ??_C@_03CMLKEALG@DSR?$AA@  11304538     w32SerialStatusEventThread.obj
+ 0002:0000053c       ??_C@_03KNDJFPML@CTS?$AA@  1130453c     w32SerialStatusEventThread.obj
+ 0002:00000540       ??_C@_02OGHHJPHF@CD?$AA@   11304540     w32SerialStatusEventThread.obj
+ 0002:00000544       ??_C@_0BO@JOOJOFDP@javax?1comm?1PortInUseException?$AA@ 11304544     NSCommLOG.obj
+ 0002:00000564       ??_C@_0BP@BMFPBIGF@javax?1comm?1NoSuchPortException?$AA@ 11304564     NSCommLOG.obj
+ 0002:00000584       ??_C@_0BP@KFMBBGE@javax?1comm?1SerialPortException?$AA@ 11304584     NSCommLOG.obj
+ 0002:000005a4       ??_C@_0O@JKHHKLAA@?$CFs?$DL?5rc?$DN?$CFd?0?5?$CFs?$AA@ 113045a4     NSCommLOG.obj
+ 0002:000005e8       __load_config_used         113045e8     MSVCRT:loadcfg.obj
+ 0002:00000690       ___safe_se_handler_table   11304690     <linker-defined>
+ 0002:00000694       ___rtc_iaa                 11304694     MSVCRT:initsect.obj
+ 0002:00000698       ___rtc_izz                 11304698     MSVCRT:initsect.obj
+ 0002:0000069c       ___rtc_taa                 1130469c     MSVCRT:initsect.obj
+ 0002:000006a0       ___rtc_tzz                 113046a0     MSVCRT:initsect.obj
+ 0002:000006a4       __IMPORT_DESCRIPTOR_WS2_32 113046a4     ws2_32:WS2_32.dll
+ 0002:000006b8       __IMPORT_DESCRIPTOR_KERNEL32 113046b8     kernel32:KERNEL32.dll
+ 0002:000006cc       __IMPORT_DESCRIPTOR_MSVCR71 113046cc     MSVCRT:MSVCR71.dll
+ 0002:000006e0       __NULL_IMPORT_DESCRIPTOR   113046e0     ws2_32:WS2_32.dll
+ 0003:00000000       ___xc_a                    11306000     MSVCRT:cinitexe.obj
+ 0003:00000004       ___xc_z                    11306004     MSVCRT:cinitexe.obj
+ 0003:00000008       ___xi_a                    11306008     MSVCRT:cinitexe.obj
+ 0003:0000000c       ___xi_z                    1130600c     MSVCRT:cinitexe.obj
+ 0003:00000010       ___security_cookie         11306010     MSVCRT:seccook.obj
+ 0003:00000018       __adjust_fdiv              11306018     <common>
+ 0003:0000001c       ___onexitend               1130601c     <common>
+ 0003:00000020       ___onexitbegin             11306020     <common>
+ 0003:00000024       __pRawDllMain              11306024     <common>
+
+ entry point at        0001:000023a0
+
+ Static symbols
+
+ 0001:000004c0       _getPollingTime            113014c0 f   w32CommPortIdentifier.obj
+ 0001:00000f20       _getPollingTime            11301f20 f   w32SerialDataEventThread.obj
+ 0001:00001c00       _getPollingTime            11302c00 f   w32SerialStatusEventThread.obj
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSCommDriver.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSCommDriver.h
new file mode 100644
index 0000000000000000000000000000000000000000..5bfe97e95bfd77469e2cf7fce05c07d009cf128d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSCommDriver.h
@@ -0,0 +1,28 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_NSCommDriver */
+#ifndef _Included_org_eclipse_soda_dk_comm_NSCommDriver
+#define _Included_org_eclipse_soda_dk_comm_NSCommDriver
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSCommDriver
+ * Method:    discoverDevicesNC
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC
+  (JNIEnv *, jobject);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSDeviceInputStream.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSDeviceInputStream.h
new file mode 100644
index 0000000000000000000000000000000000000000..9f466f29442f1c977ba5caa732519c9c0986dcee
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSDeviceInputStream.h
@@ -0,0 +1,42 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_NSDeviceInputStream */
+#ifndef _Included_org_eclipse_soda_dk_comm_NSDeviceInputStream
+#define _Included_org_eclipse_soda_dk_comm_NSDeviceInputStream
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceInputStream
+ * Method:    readDeviceOneByteNC
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceOneByteNC
+  (JNIEnv *, jobject);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceInputStream
+ * Method:    readDeviceNC
+ * Signature: ([BII)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_readDeviceNC
+  (JNIEnv *, jobject, jbyteArray, jint, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceInputStream
+ * Method:    getReadCountNC
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceInputStream_getReadCountNC
+  (JNIEnv *, jobject);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSDeviceOutputStream.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSDeviceOutputStream.h
new file mode 100644
index 0000000000000000000000000000000000000000..c79e2798f2d52b0a47cdfebfd1175a2bf3fa64ee
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSDeviceOutputStream.h
@@ -0,0 +1,28 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_NSDeviceOutputStream */
+#ifndef _Included_org_eclipse_soda_dk_comm_NSDeviceOutputStream
+#define _Included_org_eclipse_soda_dk_comm_NSDeviceOutputStream
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceOutputStream
+ * Method:    writeDeviceNC
+ * Signature: ([BII)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSDeviceOutputStream_writeDeviceNC
+  (JNIEnv *, jobject, jbyteArray, jint, jint);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSParallelPort.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSParallelPort.h
new file mode 100644
index 0000000000000000000000000000000000000000..93b0db739427eb150d057775eb1b7b82cc5b3e3d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSParallelPort.h
@@ -0,0 +1,94 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_NSParallelPort */
+#ifndef _Included_org_eclipse_soda_dk_comm_NSParallelPort
+#define _Included_org_eclipse_soda_dk_comm_NSParallelPort
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ANY
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ANY 0L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_SPP
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_SPP 1L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_PS2
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_PS2 2L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_EPP
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_EPP 3L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ECP
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ECP 4L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_NIBBLE
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_NIBBLE 5L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ANY
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ANY 0L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_SPP
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_SPP 1L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_PS2
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_PS2 2L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_EPP
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_EPP 3L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ECP
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_ECP 4L
+#undef org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_NIBBLE
+#define org_eclipse_soda_dk_comm_NSParallelPort_LPT_MODE_NIBBLE 5L
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    openDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_openDeviceNC
+  (JNIEnv *, jobject, jstring, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    closeDeviceNC
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_closeDeviceNC
+  (JNIEnv *, jobject, jint, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPaperOutNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPaperOutNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterBusyNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterBusyNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterSelectedNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterSelectedNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterTimedOutNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterTimedOutNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterErrorNC
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSParallelPort_isPrinterErrorNC
+  (JNIEnv *, jobject, jint);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSSerialPort.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSSerialPort.h
new file mode 100644
index 0000000000000000000000000000000000000000..3d76d5509940b637daccc81eab5f35869f596a64
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_NSSerialPort.h
@@ -0,0 +1,215 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_NSSerialPort */
+#ifndef _Included_org_eclipse_soda_dk_comm_NSSerialPort
+#define _Included_org_eclipse_soda_dk_comm_NSSerialPort
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_5
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_5 5L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_6
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_6 6L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_7
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_7 7L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_8
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_8 8L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1
+#define org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1 1L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_2
+#define org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_2 2L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1_5
+#define org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1_5 3L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_NONE
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_NONE 0L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_ODD
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_ODD 1L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_EVEN
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_EVEN 2L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_MARK
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_MARK 3L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_SPACE
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_SPACE 4L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_NONE
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_NONE 0L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_IN
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_IN 1L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_OUT
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_OUT 2L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_IN
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_IN 4L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_OUT
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_OUT 8L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_5
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_5 5L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_6
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_6 6L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_7
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_7 7L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_8
+#define org_eclipse_soda_dk_comm_NSSerialPort_DATABITS_8 8L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1
+#define org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1 1L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_2
+#define org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_2 2L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1_5
+#define org_eclipse_soda_dk_comm_NSSerialPort_STOPBITS_1_5 3L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_NONE
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_NONE 0L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_ODD
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_ODD 1L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_EVEN
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_EVEN 2L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_MARK
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_MARK 3L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_PARITY_SPACE
+#define org_eclipse_soda_dk_comm_NSSerialPort_PARITY_SPACE 4L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_NONE
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_NONE 0L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_IN
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_IN 1L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_OUT
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_RTSCTS_OUT 2L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_IN
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_IN 4L
+#undef org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_OUT
+#define org_eclipse_soda_dk_comm_NSSerialPort_FLOWCONTROL_XONXOFF_OUT 8L
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    openDeviceNC
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_openDeviceNC
+  (JNIEnv *, jobject, jstring, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    closeDeviceNC
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_closeDeviceNC
+  (JNIEnv *, jobject, jint, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setFlowControlModeNC
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setFlowControlModeNC
+  (JNIEnv *, jobject, jint, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getFlowControlModeNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getFlowControlModeNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    sendBreakNC
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_sendBreakNC
+  (JNIEnv *, jobject, jint, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getBaudRateNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getBaudRateNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getDataBitsNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getDataBitsNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getStopBitsNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getStopBitsNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    getParityNC
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_getParityNC
+  (JNIEnv *, jobject, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setDTRNC
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setDTRNC
+  (JNIEnv *, jobject, jboolean);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setRTSNC
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setRTSNC
+  (JNIEnv *, jobject, jboolean);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    setSerialPortParamsNC
+ * Signature: (IIIII)I
+ */
+JNIEXPORT jint JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_setSerialPortParamsNC
+  (JNIEnv *, jobject, jint, jint, jint, jint, jint);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isDTRNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isDTRNC
+  (JNIEnv *, jobject);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isRTSNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isRTSNC
+  (JNIEnv *, jobject);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isCTSNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isCTSNC
+  (JNIEnv *, jobject);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isDSRNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isDSRNC
+  (JNIEnv *, jobject);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isRINC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isRINC
+  (JNIEnv *, jobject);
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    isCDNC
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_eclipse_soda_dk_comm_NSSerialPort_isCDNC
+  (JNIEnv *, jobject);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_ParallelErrorEventThread.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_ParallelErrorEventThread.h
new file mode 100644
index 0000000000000000000000000000000000000000..f726a9eea0173ff44f766ada3e0517ad51e38381
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_ParallelErrorEventThread.h
@@ -0,0 +1,40 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_ParallelErrorEventThread */
+#ifndef _Included_org_eclipse_soda_dk_comm_ParallelErrorEventThread
+#define _Included_org_eclipse_soda_dk_comm_ParallelErrorEventThread
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef org_eclipse_soda_dk_comm_ParallelErrorEventThread_MAX_PRIORITY
+#define org_eclipse_soda_dk_comm_ParallelErrorEventThread_MAX_PRIORITY 10L
+#undef org_eclipse_soda_dk_comm_ParallelErrorEventThread_MIN_PRIORITY
+#define org_eclipse_soda_dk_comm_ParallelErrorEventThread_MIN_PRIORITY 1L
+#undef org_eclipse_soda_dk_comm_ParallelErrorEventThread_NORM_PRIORITY
+#define org_eclipse_soda_dk_comm_ParallelErrorEventThread_NORM_PRIORITY 5L
+#undef org_eclipse_soda_dk_comm_ParallelErrorEventThread_NANOS_MAX
+#define org_eclipse_soda_dk_comm_ParallelErrorEventThread_NANOS_MAX 999999L
+#undef org_eclipse_soda_dk_comm_ParallelErrorEventThread_INITIAL_LOCAL_STORAGE_CAPACITY
+#define org_eclipse_soda_dk_comm_ParallelErrorEventThread_INITIAL_LOCAL_STORAGE_CAPACITY 5L
+#undef org_eclipse_soda_dk_comm_ParallelErrorEventThread_NO_REF
+#define org_eclipse_soda_dk_comm_ParallelErrorEventThread_NO_REF 0L
+/*
+ * Class:     org_eclipse_soda_dk_comm_ParallelErrorEventThread
+ * Method:    monitorParallelErrorNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC
+  (JNIEnv *, jobject, jint);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_SerialDataEventThread.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_SerialDataEventThread.h
new file mode 100644
index 0000000000000000000000000000000000000000..0267bc3b4ec5bf8acf9d5a9da9c6e1030ee253e5
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_SerialDataEventThread.h
@@ -0,0 +1,40 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_SerialDataEventThread */
+#ifndef _Included_org_eclipse_soda_dk_comm_SerialDataEventThread
+#define _Included_org_eclipse_soda_dk_comm_SerialDataEventThread
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef org_eclipse_soda_dk_comm_SerialDataEventThread_MAX_PRIORITY
+#define org_eclipse_soda_dk_comm_SerialDataEventThread_MAX_PRIORITY 10L
+#undef org_eclipse_soda_dk_comm_SerialDataEventThread_MIN_PRIORITY
+#define org_eclipse_soda_dk_comm_SerialDataEventThread_MIN_PRIORITY 1L
+#undef org_eclipse_soda_dk_comm_SerialDataEventThread_NORM_PRIORITY
+#define org_eclipse_soda_dk_comm_SerialDataEventThread_NORM_PRIORITY 5L
+#undef org_eclipse_soda_dk_comm_SerialDataEventThread_NANOS_MAX
+#define org_eclipse_soda_dk_comm_SerialDataEventThread_NANOS_MAX 999999L
+#undef org_eclipse_soda_dk_comm_SerialDataEventThread_INITIAL_LOCAL_STORAGE_CAPACITY
+#define org_eclipse_soda_dk_comm_SerialDataEventThread_INITIAL_LOCAL_STORAGE_CAPACITY 5L
+#undef org_eclipse_soda_dk_comm_SerialDataEventThread_NO_REF
+#define org_eclipse_soda_dk_comm_SerialDataEventThread_NO_REF 0L
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialDataEventThread
+ * Method:    monitorSerialDataNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_SerialDataEventThread_monitorSerialDataNC
+  (JNIEnv *, jobject, jint);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_SerialStatusEventThread.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_SerialStatusEventThread.h
new file mode 100644
index 0000000000000000000000000000000000000000..2531ac182df9570012e610c8dd9a3593bf825567
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/org_eclipse_soda_dk_comm_SerialStatusEventThread.h
@@ -0,0 +1,40 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <jni.h>
+/* Header for class org_eclipse_soda_dk_comm_SerialStatusEventThread */
+#ifndef _Included_org_eclipse_soda_dk_comm_SerialStatusEventThread
+#define _Included_org_eclipse_soda_dk_comm_SerialStatusEventThread
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef org_eclipse_soda_dk_comm_SerialStatusEventThread_MAX_PRIORITY
+#define org_eclipse_soda_dk_comm_SerialStatusEventThread_MAX_PRIORITY 10L
+#undef org_eclipse_soda_dk_comm_SerialStatusEventThread_MIN_PRIORITY
+#define org_eclipse_soda_dk_comm_SerialStatusEventThread_MIN_PRIORITY 1L
+#undef org_eclipse_soda_dk_comm_SerialStatusEventThread_NORM_PRIORITY
+#define org_eclipse_soda_dk_comm_SerialStatusEventThread_NORM_PRIORITY 5L
+#undef org_eclipse_soda_dk_comm_SerialStatusEventThread_NANOS_MAX
+#define org_eclipse_soda_dk_comm_SerialStatusEventThread_NANOS_MAX 999999L
+#undef org_eclipse_soda_dk_comm_SerialStatusEventThread_INITIAL_LOCAL_STORAGE_CAPACITY
+#define org_eclipse_soda_dk_comm_SerialStatusEventThread_INITIAL_LOCAL_STORAGE_CAPACITY 5L
+#undef org_eclipse_soda_dk_comm_SerialStatusEventThread_NO_REF
+#define org_eclipse_soda_dk_comm_SerialStatusEventThread_NO_REF 0L
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialStatusEventThread
+ * Method:    monitorSerialStatusNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC
+  (JNIEnv *, jobject, jint);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/vc60.pdb b/target-platform/org.eclipse.soda.dk.comm/src/main/c/vc60.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..74e5bdcd30a29fd568d82c3c64a3890cbaabe37d
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/vc60.pdb differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/vc70.pdb b/target-platform/org.eclipse.soda.dk.comm/src/main/c/vc70.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..46ed4ed30805a478b3aee6df0aa5a5333f5fd25b
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/c/vc70.pdb differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32CommDriver.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32CommDriver.c
new file mode 100644
index 0000000000000000000000000000000000000000..0e4bf8a2bd25c0e60d060f83346bd2444daae95b
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32CommDriver.c
@@ -0,0 +1,110 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef _WIN32_WCE
+#include <sys/stat.h>
+#include <sys/types.h>
+#endif
+#include "org_eclipse_soda_dk_comm_NSCommDriver.h"
+#include "NSCommLOG.h"
+#if 0 //t.j
+#include <unistd.h>
+#ifdef _POSIX_SEMAPHORES
+#include <semaphore.h>
+#include "SysVStyleSemaphore.h"
+#else 
+#include <sys/ipc.h> 
+#include <sys/sem.h> 
+#endif 
+#endif //t.j
+#define assert(s)       if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return;}
+#define CREAT_PERMS	(0666)
+typedef struct port_s {
+	char	*portName;
+	int		portType;
+	char	*deviceName;
+	int		semKey;
+} port_t;
+void w32CommDriver_discoverDevicesNC(JNIEnv *jenv, jobject jobj) {
+	jclass	jc;
+	jmethodID	jm;
+	const int	PORT_SERIAL   = 1;	// should match with CommPortIdentifier
+	const int	PORT_PARALLEL = 2;	// should match with CommPortIdentifier
+//	struct stat	sbuf;
+	jstring		pName, dName=NULL;
+	jthrowable	jt;
+	int			semID=0x11223344;
+  port_t	port_tbl[] =
+		{
+			{ "LPT1", PORT_PARALLEL, "LPT1", 0x11223344 },
+			{ "COM1", PORT_SERIAL  , "COM1", 0x11223345 },
+			{ "COM2", PORT_SERIAL  , "COM2", 0x11223347 },
+			{ "COM3", PORT_SERIAL  , "COM3", 0x11223348 },
+			{ "COM4", PORT_SERIAL  , "COM4", 0x11223349 },
+			{ "COM5", PORT_SERIAL  , "COM5", 0x11223350 },
+			{ "COM6", PORT_SERIAL  , "COM6", 0x11223351 },
+			{ "COM7", PORT_SERIAL  , "COM7", 0x11223352 },
+			{ "COM8", PORT_SERIAL  , "COM8", 0x11223353 },
+			{ "COM9", PORT_SERIAL  , "COM9", 0x11223354 },
+			{ "COM10", PORT_SERIAL  , "\\\\.\\COM10", 0x11223355 },
+			{ "COM11", PORT_SERIAL  , "\\\\.\\COM11", 0x11223356 },
+			{ "COM12", PORT_SERIAL  , "\\\\.\\COM12", 0x11223357 },
+			{ "COM13", PORT_SERIAL  , "\\\\.\\COM13", 0x11223358 },
+			{ "COM14", PORT_SERIAL  , "\\\\.\\COM14", 0x11223359 },
+			{ "COM15", PORT_SERIAL  , "\\\\.\\COM15", 0x11223360 },
+			{ "COM16", PORT_SERIAL  , "\\\\.\\COM16", 0x11223361 },
+			{ "COM17", PORT_SERIAL  , "\\\\.\\COM17", 0x11223362 },
+			{ "COM18", PORT_SERIAL  , "\\\\.\\COM18", 0x11223363 },
+			{ "COM19", PORT_SERIAL  , "\\\\.\\COM19", 0x11223364 },
+			{ "COM20", PORT_SERIAL  , "\\\\.\\COM20", 0x11223365 },
+		};
+  port_t	*pp;
+  // Get access to the method to add a port.
+  jc = (*jenv)->GetObjectClass(jenv, jobj);
+  assert(jc);
+  jm = (*jenv)->GetMethodID(jenv, jc, "addDeviceToList",
+			    "(Ljava/lang/String;ILjava/lang/String;I)V");
+  assert(jm);
+  // For all the pre-defined ports, check to see which ones exist, and add
+  // them selectively.
+  for (pp = port_tbl; pp < port_tbl+(sizeof(port_tbl)/sizeof(port_tbl[0])); ++pp) {
+	pName = (*jenv)->NewStringUTF(jenv, pp->portName);
+	if (!pName) continue;
+    
+	dName = (*jenv)->NewStringUTF(jenv, pp->deviceName);
+	if (!dName) continue;
+#if 0 //t.j
+		/* Obtain/create a semaphore for the device in consideration.
+		   If it fails, don't lock/unlock it later on. */
+#ifdef _POSIX_SEMAPHORES
+		semID = sem_create(pp->semKey, 1);
+#else
+		semID = semget((key_t)pp->semKey, 1, IPC_CREAT | CREAT_PERMS);
+#endif
+#endif
+#ifdef DEBUG
+//       LOG( ("pName: %s, %s, dName: %s, semID %d\n", pName,pp->portName, dName, semID) );
+       printf( "pName: %s %s, dNama: %s semID %d\n", pName, pp->portName, dName, semID );
+       fflush( stdout );
+#endif
+		
+	 (*jenv)->CallVoidMethod(jenv, jobj, jm,
+					pName, pp->portType, dName, semID);
+	 jt = (*jenv)->ExceptionOccurred(jenv);
+	 if (jt) {
+	   	(*jenv)->ExceptionDescribe(jenv);
+	   	(*jenv)->ExceptionClear(jenv);
+	 }
+  }
+  return;
+}	/* Java_org_eclipse_soda_dk_comm_NSCommDriver_discoverDevicesNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32CommPortIdentifier.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32CommPortIdentifier.c
new file mode 100644
index 0000000000000000000000000000000000000000..d5d0a15056493160c18b72cab053f8582f9b62c9
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32CommPortIdentifier.c
@@ -0,0 +1,223 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#include <winbase.h>
+#ifndef _WIN32_WCE
+#include <sys/types.h>
+#endif
+#include "javax_comm_CommPortIdentifier.h"
+#define assertexc(s)  if (!s) {fprintf(stderr, "\n\n%d asserted!\n\n", __LINE__); \
+				 return(-1);}
+#define NOOF_ELEMS(s)	((sizeof(s))/(sizeof(s[0])))
+typedef struct port_s {
+	char	*portName;
+	int		semKey;
+} port_t;
+//#ifndef _POSIX_SEMAPHORES
+//static struct sembuf	dev_wait[] = {
+//		{ 0, 0, 0 }	/* wait until it is free */
+//};
+//#endif
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	/* getPollingTime() */
+#if 0 //t.j
+static int GetSemID(const char *pnm) {
+  int		semID = -1;
+  port_t	port_tbl[] =  
+	  {
+			{ "LPT1", 0x11223344 },
+			{ "COM1", 0x11223345 },
+			{ "COM2", 0x11223347 },
+			{ "COM3", 0x11223348 },
+			{ "COM4", 0x11223349 },
+			{ "COM5", 0x11223350 },
+			{ "COM6", 0x11223351 },
+			{ "COM7", 0x11223352 },
+			{ "COM8", 0x11223353 },
+			{ "COM9", 0x11223354 },
+			{ "COM10", 0x11223355 },
+			{ "COM11", 0x11223356 },
+			{ "COM12", 0x11223357 },
+			{ "COM13", 0x11223358 },
+			{ "COM14", 0x11223359 },
+			{ "COM15", 0x11223360 },
+			{ "COM16", 0x11223361 },
+			{ "COM17", 0x11223362 },
+			{ "COM18", 0x11223363 },
+			{ "COM19", 0x11223364 },
+			{ "COM20", 0x11223365 },
+		};
+  port_t	*pp;
+  int		keyFound = 0;
+  /* Find the semaphore key for the corresponding port name. */
+  for (pp = port_tbl;
+       pp < port_tbl+NOOF_ELEMS(port_tbl);
+       ++pp) {
+      if (!strcmp(pp->portName, pnm)) {
+	  keyFound++;
+	  break;
+      }
+  }
+  if (!keyFound)
+      return semID;
+#ifndef _POSIX_SEMAPHORES
+  /* Get the semaphore ID for the key obtained. */
+  semID = semget((key_t)pp->semKey, 1, 0);
+#else
+	/* don't worry about return value for right now */
+  semID = sem_create(pp->semKey, 1);
+#endif /* _POSIX_SEMAPHORES */
+  return semID;
+}	/* GetSemID() */
+#endif //t.j
+/*
+ * Class:     javax_comm_CommPortIdentifier
+ * Method:    monitorInterJVMDeviceAccessNC
+ * Signature: (Ljava/lang/Thread;)I
+ *
+ * Currenty not Supported on Posix Devices
+ */
+int w32CommPortIdentifier_monitorInterJVMDeviceAccessNC
+		(JNIEnv *jenv, jobject jobj, jobject jtho) {
+	int		pollingTime;	/* seconds */
+	int		oldVal, newVal;
+	jclass		jc;
+	jmethodID	jm;
+	jfieldID	pnameID;
+	jstring		pname;
+	const char	*pnamec;
+	jboolean	isInterruptedReturn;
+	jclass		jcpoc;		/* CommPortOwnershipListener interf */
+	jfieldID	cpoPOID;	/* PORT_OWNED ID */
+	jfieldID	cpoPUID;	/* PORT_UNOWNED ID */
+	jfieldID	cpoPRID;	/* PORT_OWNERSHIP_REQUESTED ID */
+	jint		cpoPO;		/* PORT_OWNED value */
+	jint		cpoPU;		/* PORT_UNOWNED value */
+	jint		cpoPR;		/* PORT_OWNERSHIP_REQUESTED value */
+	jmethodID	jintMethod;
+	jclass		jthreadClass;
+//t.j	int		semID;
+//t.j	union semuni	scarg;
+//	int		mypid = getpid();
+//	int		scpid;
+	pollingTime = getPollingTime(jenv);
+	/* Get the class ID of the CommPortIdentifier object.*/
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	/* Get the id of the method to report a change-ownership event. */
+	jm = (*jenv)->GetMethodID(jenv, jc, "fireOwnershipEvent", "(I)V");
+	assertexc(jm);
+	/* Get the const values for the CommPortOwnershipListener events.*/
+	jcpoc = (*jenv)->FindClass(jenv, "javax/comm/CommPortOwnershipListener");
+	assertexc(jcpoc);
+	cpoPOID = (*jenv)->GetStaticFieldID(jenv, jcpoc, "PORT_OWNED", "I");
+	assertexc(cpoPOID);
+	cpoPO = (*jenv)->GetStaticIntField(jenv, jcpoc, cpoPOID);
+	cpoPUID = (*jenv)->GetStaticFieldID(jenv, jcpoc, "PORT_UNOWNED", "I");
+	assertexc(cpoPUID);
+	cpoPU = (*jenv)->GetStaticIntField(jenv, jcpoc, cpoPUID);
+	cpoPRID = (*jenv)->GetStaticFieldID(jenv, jcpoc, "PORT_OWNERSHIP_REQUESTED", "I");
+	assertexc(cpoPRID);
+	cpoPR = (*jenv)->GetStaticIntField(jenv, jcpoc, cpoPRID);
+	/* Get the port name. */
+	pnameID = (*jenv)->GetFieldID(jenv, jc, "name", "Ljava/lang/String;");
+	assertexc(pnameID);
+	pname = (*jenv)->GetObjectField(jenv, jobj, pnameID);
+	assertexc(pname);
+  	pnamec = (*jenv)->GetStringUTFChars(jenv, pname, 0);
+	/* Get the corresponding semaphore ID for the port name. */
+//t.j	semID = GetSemID(pnamec);
+//	if (semID == -1)
+//t.j		return -1;
+	(*jenv)->ReleaseStringUTFChars(jenv, pname, pnamec);
+	/* Get access to the interrupted method. */
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+#if 0 //t.j
+	(void)memset(&scarg, 0, sizeof(scarg));
+/* what is this for? */
+	/* Get the current value of the semaphore. */
+#ifdef  _POSIX_SEMAPHORES
+	if ((sem_getvalue(sem_lookup(semID), &oldVal)) < 0) {
+#else
+	if ((oldVal = semctl(semID, 0, GETVAL, scarg)) < 0) {
+#endif	
+		(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semctl error %d!\n", errno);
+		return -1;
+	}
+#endif //t.j		
+/* !!!!!!!!!!!!!! */
+	while(1)
+	{
+		/* Check to see if this thread has been interrupted. */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv, jtho, jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		/* If the semaphore was locked the last time, wait until it
+		   gets unlocked.  Else, catch some breath.
+		 */
+		Sleep(pollingTime);
+		/* Get the new value of the semaphore. */
+			/* Get the current value of the semaphore. */
+#if 0 //t.j
+#ifdef  _POSIX_SEMAPHORES
+		if ((sem_getvalue(sem_lookup(semID), &oldVal)) < 0) {
+#else
+		if ((oldVal = semctl(semID, 0, GETVAL, scarg)) < 0) {
+#endif		
+			(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semctl error %d!\n", errno);
+			return -1;
+		}
+		if (newVal == oldVal)
+			continue;
+		/* Get PID of the last process that changed the semaphore.
+		   If it is the same JVM, ignore this change.
+		 */
+			/* Get the current value of the semaphore. */
+#ifndef  _POSIX_SEMAPHORES
+   /* DLS HACK needs to be changed */
+		if ((scpid = semctl(semID, 0, GETPID, scarg)) < 0) {
+			(void)fprintf(stderr, "Java_javax_comm_CommPortIdentifier_monitorInterJVMDeviceAccessNC: semctl error %d!\n", errno);
+			return -1;
+		}
+		if (scpid != mypid) {
+			/* If locked, send a PORT_OWNED event.
+			   Else, send a PORT_UNOWNED event.
+			 */
+			(*jenv)->CallVoidMethod(jenv, jobj, jm,
+						newVal ? cpoPO : cpoPU);
+		}
+#endif
+#endif //t.j		
+		oldVal = newVal;
+	}	/* end of while() */
+	return 0;
+} /* w32CommPortIdentifier_monitorInterJVMDeviceAccessNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32DeviceInputStream.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32DeviceInputStream.c
new file mode 100644
index 0000000000000000000000000000000000000000..67f1e7cb4f636c0a737369dbffa39c12fa701de9
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32DeviceInputStream.c
@@ -0,0 +1,254 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#ifndef _WIN32_WCE
+#include <sys/types.h>
+#endif
+#include "org_eclipse_soda_dk_comm_NSDeviceInputStream.h"
+#include "NSCommLOG.h"
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define READ_TIMEOUT 500		/* milliseconds */
+#define assert(s)  if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return(-1);}
+#define assertexc(s)    if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 (*jenv)->ThrowNew(jenv, ec, "");}
+/*
+ * Function:   w32DeviceInputStream_readDeviceOneByteNC
+ * Purpose:    Read one byte from serial port device 
+ * Signature: ()I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32DeviceInputStream_readDeviceOneByteNC(JNIEnv *jenv, jobject jobj) {
+    HANDLE      osHandle;
+    BOOL        success;
+    OVERLAPPED  overlap; 
+    DWORD       lastRc;
+    DWORD       actualBytes = 0;
+	jclass		jc;
+	jclass		ec;
+	jfieldID	jf;
+	jint 		fd = -1;
+	char		buf[1];
+	
+#ifdef DEBUG
+    printf("w32DeviceOutputStream_writeDeviceNC() entered\n");
+#endif /* DEBUG */
+	/* Get the exception class. */
+	ec = (*jenv)->FindClass(jenv, "java/io/IOException");
+	assert(ec);
+	/* Get the file descriptor. */
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+	assertexc(jf);
+	fd = (*jenv)->GetIntField(jenv, jobj, jf);
+	if (fd == -1) return -1;                    
+    osHandle = (HANDLE) fd;
+    iveSerClearCommErrors(osHandle);
+    memset(&overlap,0,sizeof(overlap));
+    overlap.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
+    if (NULL == overlap.hEvent) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"Error creating event semaphore",lastRc);
+        return 0;
+    }
+	success = ReadFile(osHandle, buf, 1, &actualBytes, &overlap);
+	if(success) {
+		CloseHandle(overlap.hEvent);
+		return (int)(unsigned char)buf[0];
+	} else {
+		lastRc = GetLastError();
+		if (ERROR_IO_PENDING != lastRc) {
+			CloseHandle(overlap.hEvent);
+			iveSerThrowWin(jenv,"Error reading data",lastRc);
+			return 0;
+		}
+	}
+	buf[0] = 0;
+	actualBytes = 0;
+#ifndef _WIN32_WCE
+	success = GetOverlappedResult(osHandle,&overlap,&actualBytes,TRUE);
+#endif
+	if ( success && actualBytes ) {
+		lastRc = (int)(unsigned char)(buf[0]);
+	} else {
+		lastRc = GetLastError();
+	}
+	CloseHandle(overlap.hEvent);
+	return lastRc;
+}	/* w32DeviceInputStream_readDeviceOneByteNC */
+/*
+ * Function:   w32DeviceInputStream_readDeviceNC
+ * Purpose:    Read Serial Port Device
+ * Signature: ([BII)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32DeviceInputStream_readDeviceNC
+  (JNIEnv *jenv, jobject jobj, jbyteArray jba, jint off, jint len) {
+    HANDLE      osHandle;
+    BOOL        success;
+    OVERLAPPED  overlap; 
+    DWORD       lastRc;
+    DWORD       actualBytes = 0;
+	jclass		jc;
+	jfieldID	jf;
+	jint 		fd = -1;
+	jbyte		*cbuf;
+    jboolean	isCopy;
+    jfieldID	tmof;
+    int		    tmo;
+    jfieldID	tmoDonef;
+	DWORD eventMask;
+    HGLOBAL     hglob;
+    hglob = GlobalAlloc(GMEM_MOVEABLE, len);
+    if (!hglob)
+    {
+        return (void *) 0;
+    }
+    cbuf = GlobalLock(hglob);
+    if (!cbuf) {
+        GlobalFree(hglob);
+    }
+#ifdef DEBUG
+    printf("w32DeviceInputStream_readDeviceNC() entered\n");
+#endif /* DEBUG */
+	/* Get the file descriptor. */
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assert(jc);
+	jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+	assert(jf);
+	fd = (*jenv)->GetIntField(jenv, jobj, jf);
+	if (fd == -1) return -1;
+	osHandle = (HANDLE) fd;
+    tmof = (*jenv)->GetFieldID(jenv, jc, "tmo", "I");
+    assert(tmof);
+    tmoDonef = (*jenv)->GetFieldID(jenv, jc, "tmoDone", "Z");
+    assert(tmoDonef);
+    tmo = (*jenv)->GetIntField(jenv, jobj, tmof);
+    iveSerClearCommErrors(osHandle);
+    memset(&overlap,0,sizeof(overlap));
+    overlap.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
+    if (NULL == overlap.hEvent) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"Error creating event semaphore",lastRc);
+        
+        // Free the bufffer memory
+        hglob = GlobalHandle( cbuf );
+        if (hglob) {
+            GlobalUnlock( hglob );
+            GlobalFree( hglob );
+        }   	
+        return lastRc;
+    }
+    success = ReadFile(osHandle, cbuf, len, &actualBytes, &overlap);
+	if(success) {
+	  // Copy back the data into the java buffer.
+	  if (actualBytes > 0)
+		(*jenv)->SetByteArrayRegion(jenv, jba, off, actualBytes, (jbyte*)cbuf);
+        // Free the bufffer memory
+        hglob = GlobalHandle( cbuf );
+        if (hglob) {
+            GlobalUnlock( hglob );
+            GlobalFree( hglob );
+        }   	
+		CloseHandle(overlap.hEvent);
+		return actualBytes;
+	} else {
+		lastRc = GetLastError();
+		if (ERROR_IO_PENDING != lastRc) {
+			CloseHandle(overlap.hEvent);
+			iveSerThrowWin(jenv,"Error reading data",lastRc);
+			(*jenv)->SetBooleanField(jenv, jobj, tmoDonef, (jboolean)JNI_TRUE);
+	
+        // Free the bufffer memory
+	        hglob = GlobalHandle( cbuf );
+	        if (hglob) {
+	            GlobalUnlock( hglob );
+	            GlobalFree( hglob );
+	        } 
+				
+			return lastRc;
+		}
+	}
+	
+	actualBytes = 0;
+#ifndef _WIN32_WCE
+	success = GetOverlappedResult(osHandle,&overlap,&actualBytes,TRUE);
+#endif
+	if (success) {
+	  // Copy back the data into the java buffer.
+	  if (actualBytes > 0)
+		(*jenv)->SetByteArrayRegion(jenv, jba, off, actualBytes, (jbyte*)cbuf);
+		
+		lastRc = actualBytes;
+	} else {
+		lastRc = GetLastError();
+	}
+	//Free the bufffer memory
+    hglob = GlobalHandle( cbuf );
+    if (hglob) {
+        GlobalUnlock( hglob );
+        GlobalFree( hglob );
+    }   
+    CloseHandle(overlap.hEvent);
+	return lastRc;
+}  /* w32DeviceInputStream_readDeviceNC() */
+/*
+ * Function:   w32DeviceInputStream_getReadCountNC
+ * Purpose:    Check serial port device event 
+ * Signature: ()I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32DeviceInputStream_getReadCountNC(JNIEnv *jenv, jobject jobj)
+{
+    DWORD	dwCommEvent = 0;
+	HANDLE  osHandle;
+	
+	jclass		jc;
+	jclass		ec;
+	jfieldID	jf;
+	jint 		fd = -1;
+	int			dc = 0;
+	// Get the exception class.
+	ec = (*jenv)->FindClass(jenv, "java/io/IOException");
+	assert(ec);
+	// Get the file descriptor.
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+	assertexc(jf);
+	fd = (*jenv)->GetIntField(jenv, jobj, jf);
+	if (fd == -1) {
+		(*jenv)->ThrowNew(jenv, ec, "");
+	}
+	osHandle = (HANDLE)fd;
+	if(!GetCommMask( osHandle, &dwCommEvent ))
+		return GetLastError();
+	
+	dwCommEvent |= EV_RXCHAR;
+	if( !SetCommMask( osHandle, dwCommEvent ))
+		return GetLastError();
+	if( !WaitCommEvent( osHandle, &dwCommEvent, NULL ))
+		return GetLastError();
+	return (dwCommEvent&EV_RXCHAR);
+}  /* w32DeviceInputStream_getReadCountNC() */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32DeviceOutputStream.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32DeviceOutputStream.c
new file mode 100644
index 0000000000000000000000000000000000000000..7e4e916737c41c27ac0f4318a2781de962225234
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32DeviceOutputStream.c
@@ -0,0 +1,142 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#ifndef _WIN32_WCE
+#include <sys/types.h>
+#endif
+#include "org_eclipse_soda_dk_comm_NSDeviceOutputStream.h"
+#include "NSCommLOG.h"
+#define assert(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				     return(-1);}
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSDeviceOutputStream
+ * Method:    writeDeviceNC
+ * Signature: ([BII)I
+ */
+int w32DeviceOutputStream_writeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jbyteArray jbuf, jint offset, jint length) {
+    HANDLE      osHandle;
+    BOOL        success;
+#ifndef _WIN32_WCE
+    OVERLAPPED  overlap; 
+#endif
+#if _WIN32_WCE>=400
+	HANDLE		event;
+#endif
+    DWORD       lastRc;
+    DWORD       actualBytes = 0;
+    jclass	    jc;
+    jfieldID	jf;
+    jint 		fd = -1;
+    jbyte		*cbuf;
+    jboolean	isCopy;
+    int		    writecnt = 0;
+    jbyte		*cb;
+#ifdef DEBUG
+    printf("w32DeviceOutputStream_writeDeviceNC() entered\n");
+#endif /* DEBUG */
+    if (!length) return writecnt;
+    /* Get the file descriptor. */
+    jc = (*jenv)->GetObjectClass(jenv, jobj);
+    assert(jc);
+    jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+    assert(jf);
+    fd = (*jenv)->GetIntField(jenv, jobj, jf);
+    if (fd == -1) return -1;                    
+    osHandle = (HANDLE) fd;
+    iveSerClearCommErrors(osHandle);
+#if _WIN32_WCE>=400
+    memset(&event,0,sizeof(event));
+    event = CreateEvent(NULL,TRUE,FALSE,NULL);
+    if (event == NULL) {
+        lastRc = GetLastError();
+        LOG(("iveSerWrite: error creating event semaphore: %d",lastRc));
+        iveSerThrowWin(jenv,"Error creating event semaphore",lastRc);
+        return 0;
+    }
+#else
+    memset(&overlap,0,sizeof(overlap));
+    overlap.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
+    if (NULL == overlap.hEvent) {
+        lastRc = GetLastError();
+        LOG(("iveSerWrite: error creating event semaphore: %d",lastRc));
+        iveSerThrowWin(jenv,"Error creating event semaphore",lastRc);
+        return 0;
+    }
+#endif //_WIN32_WCE>=400
+    /* Convert the java byte array buffer into c byte buffer. */
+    cbuf =  (*jenv)->GetByteArrayElements(jenv, jbuf, &isCopy);
+    /* Write the data out to the device. */
+    for ( cb = cbuf+offset; length; length -= actualBytes, writecnt += actualBytes, cb += actualBytes ) {
+#if _WIN32_WCE>=400
+        success = WriteFile(osHandle, cb, length, &actualBytes, 0);
+#else
+        success = WriteFile(osHandle, cb, length, &actualBytes, &overlap);
+#endif //_WIN32_WCE
+        if (success) {
+#ifdef DEBUG
+            printf("w32DeviceOutputStream_writeDeviceNC(): write completed successfully without blocking\n");
+#endif /* DEBUG */
+#if _WIN32_WCE>=400
+            CloseHandle(event);
+#else
+            CloseHandle(overlap.hEvent);
+#endif //_WIN32_WCE
+            return actualBytes;
+        }
+        lastRc = GetLastError();
+        if (ERROR_IO_PENDING != lastRc) {
+#ifdef DEBUG
+            printf("w32DeviceOutputStream_writeDeviceNC(): write failed: %d\n", lastRc);
+#endif /* DEBUG */
+#if _WIN32_WCE>=400
+            CloseHandle(event);
+#else
+            CloseHandle(overlap.hEvent);
+#endif //_WIN32_WCE
+            iveSerThrowWin(jenv,"Error writing data",lastRc);
+            return 0;
+        }
+        actualBytes = 0;
+#ifndef _WIN32_WCE
+        success = GetOverlappedResult(osHandle,&overlap,&actualBytes,TRUE);
+#endif //_WIN32_WCE
+        if (success) {
+#ifdef DEBUG
+            printf("w32DeviceOutputStream_writeDeviceNC(): getOverlappedResult completed successfully\n");
+#endif /* DEBUG */
+#if _WIN32_WCE>=400
+            CloseHandle(event);
+#else
+            CloseHandle(overlap.hEvent);
+#endif //_WIN32_WCE
+            return actualBytes;
+        }
+        lastRc = GetLastError();
+#ifdef DEBUG
+        printf("w32DeviceOutputStream_writeDeviceNC(): getOverlappedResult failed: %d\n",lastRc);
+#endif /* DEBUG */
+#if _WIN32_WCE>=400
+            CloseHandle(event);
+#else
+            CloseHandle(overlap.hEvent);
+#endif //_WIN32_WCE
+        iveSerThrowWin(jenv,"Error writing pending data",lastRc);
+    }
+    /* Should we throw some exception in the event of a write error ???? */
+    /* Free the c byte buffer. */
+    (*jenv)->ReleaseByteArrayElements(jenv, jbuf, cbuf, JNI_ABORT);
+    return writecnt;
+}	/* w32DeviceOutputStream_writeDeviceNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallePort.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallePort.h
new file mode 100644
index 0000000000000000000000000000000000000000..6cf8320aff68f61be13725917000bf66a5535b9e
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallePort.h
@@ -0,0 +1,12 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+int w32ParallelPort_closeDeviceNC( JNIEnv *, jobject, jint, jint );
+int w32ParallelPort_openDeviceNC( JNIEnv *, jobject, jstring, jint );
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallelErrorEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallelErrorEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..5a761ec72861fea7b815a373a621ba2c6ef3a5cd
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallelErrorEventThread.c
@@ -0,0 +1,257 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#ifdef NCI
+#include <dev/ic/lptioctl.h>
+#include <dev/ic/lptreg.h>
+#endif	/* NCI */
+#ifdef __linux__
+#define __KERNEL__  /* For printer error definitions */
+#include <linux/lp.h>
+#endif	/* __linux__ */
+#include <org_eclipse_soda_dk_comm_ParallelErrorEventThread.h>
+#define assertexc(s)       if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return;}
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	// getPollingTime()
+/*
+ * Class:     org_eclipse_soda_dk_comm_ParallelErrorEventThread
+ * Method:    monitorParallelErrorNC
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC
+(JNIEnv *jenv, jobject jobj, jint jfd) {
+	int		pollingTime;	/* seconds */
+	int		oldStatus, newStatus;
+	jfieldID	notifyOnErrorID;
+	jboolean	notifyOnErrorFlag = JNI_TRUE;
+	jclass		jc;
+	jmethodID	jm;
+	jclass		jppc;
+	jfieldID	ppID;
+	jobject		jpp;
+	jboolean	isInterruptedReturn;
+	jclass		jppec;		/* parallel port event class */
+	jfieldID	ppeErrorID;	/* field ID */
+	jint		ppeError;	/* field value */
+	jmethodID	jintMethod;
+	jclass		jthreadClass;
+	pollingTime = getPollingTime(jenv);
+	/* Get the const value for the parallel port error event type.*/
+	jppec = (*jenv)->FindClass(jenv, "javax/comm/ParallelPortEvent");
+	assertexc(jppec);
+	ppeErrorID = (*jenv)->GetStaticFieldID(jenv, jppec, "PAR_EV_ERROR", "I");
+	assertexc(ppeErrorID);
+	ppeError = (*jenv)->GetStaticIntField(jenv, jppec, ppeErrorID);
+	/* Get the parallel port object.*/
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	ppID = (*jenv)->GetFieldID(jenv, jc, "pp", "Lorg/eclipse/soda/dk/comm/NSParallelPort;");
+	assertexc(ppID);
+	jpp = (*jenv)->GetObjectField(jenv, jobj, ppID);
+	assertexc(jpp);
+	/* Get the class ID of the parallel port object.*/
+	jppc = (*jenv)->GetObjectClass(jenv, jpp);
+	assertexc(jppc);
+	/* Get the notify flag field ID of the parallel port object. */
+	notifyOnErrorID = (*jenv)->GetFieldID(jenv, jppc, "notifyOnErrorFlag", "Z");
+	assertexc(notifyOnErrorID);
+	/* Get access to the method to report a parallel event.*/
+	jm = (*jenv)->GetMethodID(jenv, jppc, "reportParallelEvent", "(IZZ)V");
+	assertexc(jm);
+	/* Get access to the interrupted method.*/
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+#ifdef NCI
+	if (ioctl(jfd, PIOCSTATUS, &oldStatus) < 0) {
+#endif	/* NCI */
+#ifdef __linux__
+	if (ioctl(jfd, LPGETSTATUS, &oldStatus) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+        oldStatus = 0;
+	if (0) {
+#endif	/* QNX */
+		(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC: ioctl error %d!\n", errno);
+		return;
+	}
+	while(1)
+	{
+		sleep(pollingTime);
+		/* check to see if this thread has been interrupted */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv, jobj, jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		/* Get the notify error flag. If not set, skip error checks. */
+		notifyOnErrorFlag = (*jenv)->GetBooleanField(jenv, jpp, notifyOnErrorID);
+		if (notifyOnErrorFlag != JNI_TRUE)
+			continue;
+#ifdef NCI
+		if (ioctl(jfd, PIOCSTATUS, &newStatus) < 0) {
+#endif	/* NCI */
+#ifdef __linux__
+		if (ioctl(jfd, LPGETSTATUS, &newStatus) < 0) {
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+                newStatus = 0;
+	        if (0) {
+#endif	/* QNX */
+			(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC: ioctl error %d!\n", errno);
+			return;
+		}
+		if (newStatus == oldStatus)
+			continue;
+#ifdef NCI
+		if((newStatus & LPS_NERR) != (oldStatus & LPS_NERR))
+#endif	/* NCI */
+#ifdef __linux__
+		if((newStatus & LP_PERRORP) != (oldStatus & LP_PERRORP))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NERR)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NERR)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __linux__
+				    (oldStatus & LP_PERRORP)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PERRORP)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_SELECT) != (oldStatus & LPS_SELECT))
+#endif	/* NCI */
+#ifdef __linux__
+		if((newStatus & LP_PSELECD) != (oldStatus & LP_PSELECD))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_SELECT)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_SELECT)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __linux__
+				    (oldStatus & LP_PSELECD)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PSELECD)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_NOPAPER) != (oldStatus & LPS_NOPAPER))
+#endif	/* NCI */
+#ifdef __linux__
+		if((newStatus & LP_POUTPA) != (oldStatus & LP_POUTPA))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NOPAPER)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NOPAPER)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __linux__
+				    (oldStatus & LP_POUTPA)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_POUTPA)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_NACK) != (oldStatus & LPS_NACK))
+#endif	/* NCI */
+#ifdef __linux__
+		if((newStatus & LP_PACK) != (oldStatus & LP_PACK))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NACK)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NACK)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __linux__
+				    (oldStatus & LP_PACK)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PACK)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+#ifdef NCI
+		if((newStatus & LPS_NBSY) != (oldStatus & LPS_NBSY))
+#endif	/* NCI */
+#ifdef __linux__
+		if((newStatus & LP_PBUSY) != (oldStatus & LP_PBUSY))
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	        if (0)
+#endif	/* QNX */
+		{
+			(*jenv)->CallVoidMethod(jenv, jpp, jm, ppeError,
+#ifdef NCI
+				    (oldStatus & LPS_NBSY)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LPS_NBSY)? JNI_TRUE:JNI_FALSE);
+#endif	/* NCI */
+#ifdef __linux__
+				    (oldStatus & LP_PBUSY)? JNI_TRUE:JNI_FALSE,
+				    (newStatus & LP_PBUSY)? JNI_TRUE:JNI_FALSE);
+#endif	/* __linux__ */
+#ifdef QNX      /* ToDo: implement */
+	                            JNI_FALSE, JNI_FALSE);
+#endif	/* QNX */
+			oldStatus = newStatus;
+			continue;
+		}
+		oldStatus = newStatus;
+	}	/* end of while() */
+} /* Java_org_eclipse_soda_dk_comm_ParallelErrorEventThread_monitorParallelErrorNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallelPort.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallelPort.c
new file mode 100644
index 0000000000000000000000000000000000000000..ff63e65a79be9bd830205d2e8145bac55e4bfd02
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32ParallelPort.c
@@ -0,0 +1,331 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#include <winbase.h>
+#include <winspool.h>
+#include <sys/types.h>
+#include "org_eclipse_soda_dk_comm_NSParallelPort.h"
+#include "NSCommLOG.h"
+#define NOOF_ELEMS(s)	((sizeof(s))/(sizeof(s[0])))
+#define _PRINTER_
+BOOL w32ParallelPort_GetJobs( HANDLE, JOB_INFO_2 **, int *, DWORD * );
+/*
+ * Function:   w32ParallelPort_closeDeviceNC
+ * Purpose:    Close a parallel I/O Device
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds
+ */
+int w32ParallelPort_closeDeviceNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint semId)
+{
+	HANDLE osHandle = (HANDLE) fd;
+	jenv;
+#ifdef _PRINTER_
+	return ClosePrinter(osHandle);
+#else
+	return CloseHandle(osHandle);
+#endif
+}	/* w32ParallelPort_closeDeviceNC */
+/*
+ * Function:   w32ParallelPort_openDeviceNC
+ * Purpose:    Open a parallel I/O Device
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - device handle
+ */
+int w32ParallelPort_openDeviceNC(JNIEnv *jenv, jobject jobj, jstring name, jint semId)
+{
+	char	* portName = NULL;
+	int		  fd = -1;
+	HANDLE	  osHandle = (HANDLE)fd;
+	portName = (CHAR *)(*jenv)->GetStringUTFChars(jenv, name, 0);
+	if( portName == NULL )  {
+#ifdef DEBUG
+		printf( "Can not open port because get NULL name\n" );
+#endif
+		return (int)osHandle;
+	}
+#ifdef _PRINTER_
+	fd = OpenPrinter( portName,				/* printer or server name	*/
+					  &osHandle,			/* printer or server handle	*/
+					  NULL );				/* printer defaults			*/
+	if(fd == -1) {
+		fd = GetLastError();
+        iveSerThrowWin(jenv,"parallel port exception: the port isn't valid.\n",fd);
+		return 0;
+	}
+#else
+	osHandle =	CreateFile( portName,
+							GENERIC_WRITE,
+							0,
+							0,
+							OPEN_EXISTING,
+							FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
+							0);
+	if (INVALID_HANDLE_VALUE == osHandle) {
+		fd = GetLastError();
+		iveSerThrowWin(jenv,"Error opening file",fd);
+		return 0;
+	}
+#endif
+	
+	(*jenv)->ReleaseStringUTFChars(jenv, name, portName);
+	
+	return (int)osHandle;
+}  /* w32ParallelPort_openDeviceNC */
+/*
+ * Function:   w32ParallelPort_isPaperOutNC
+ * Purpose:    Check the print paper out status
+ * Signature:  (I)Z
+ * Return:     TRUE, FALSE
+ */
+BOOL w32ParallelPort_isPaperOutNC(JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef _PRINTER_
+	HANDLE		 osHandle = (HANDLE)jfd;
+	JOB_INFO_2  *pJobs;
+	int			 cJobs;
+	DWORD		 dwPrinterStatus;
+    /*
+     *  Get the state information for the Printer Queue and
+     *  the jobs in the Printer Queue.
+     */ 
+    if (!w32ParallelPort_GetJobs(osHandle, &pJobs, &cJobs, &dwPrinterStatus))
+		return FALSE;
+    if (dwPrinterStatus & (PRINTER_STATUS_ERROR     |
+						   PRINTER_STATUS_PAPER_JAM | 
+						   PRINTER_STATUS_PAPER_OUT |
+						   PRINTER_STATUS_PAPER_PROBLEM )) {
+		free( pJobs );
+		return TRUE;
+	} else
+	return FALSE;
+#else
+	return FALSE;
+#endif
+}	/* w32ParallelPort_isPaperOutNC */
+/*
+ * Function:   w32ParallelPort_isPrinterBusyNC
+ * Purpose:    Check the print busy status
+ * Signature:  (I)Z
+ * Return:     TRUE, FALSE
+ */
+BOOL w32ParallelPort_isPrinterBusyNC(JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef _PRINTER_
+	HANDLE		 osHandle = (HANDLE)jfd;
+	JOB_INFO_2  *pJobs;
+	int			 cJobs;
+	DWORD		 dwPrinterStatus;
+    /*
+     *  Get the state information for the Printer Queue and
+     *  the jobs in the Printer Queue.
+     */ 
+    if (!w32ParallelPort_GetJobs(osHandle, &pJobs, &cJobs, &dwPrinterStatus))
+		return FALSE;
+    if (dwPrinterStatus & (PRINTER_STATUS_ERROR | 
+		PRINTER_STATUS_BUSY )) {
+		free( pJobs );
+		return TRUE;
+	} else
+		return FALSE;
+#else
+	return TFALSE;
+#endif
+}	/* w32ParallelPort_isPrinterBusyNC */
+/*
+ * Function:   w32ParallelPort_isPrinterBusyNC
+ * Purpose:    Check the print select status
+ * Signature:  (I)Z
+ * Return:     TRUE, FALSE
+ */
+BOOL w32ParallelPort_isPrinterSelectedNC(JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef _PRINTER_
+	HANDLE		 osHandle = (HANDLE)jfd;
+	JOB_INFO_2  *pJobs;
+	int			 cJobs;
+	DWORD		 dwPrinterStatus;
+    /*
+     *  Get the state information for the Printer Queue and
+     *  the jobs in the Printer Queue.
+     */ 
+    if (!w32ParallelPort_GetJobs(osHandle, &pJobs, &cJobs, &dwPrinterStatus))
+		return FALSE;
+    if (dwPrinterStatus & PRINTER_STATUS_PROCESSING ) {
+		free( pJobs );
+		return TRUE;
+	} else
+		return FALSE;
+#else
+	return TFALSE;
+#endif
+}	/* w32ParallelPort_isPrinterSelectedNC */
+	
+/*
+ * Function:   w32ParallelPort_isPrinterBusyNC
+ * Purpose:    Check the printer out status
+ * Signature:  (I)Z
+ * Return:     TRUE, FALSE
+ */
+BOOL w32ParallelPort_isPrinterTimedOutNC(JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef _PRINTER_
+	HANDLE		 osHandle = (HANDLE)jfd;
+	JOB_INFO_2  *pJobs;
+	int			 cJobs;
+	DWORD		 dwPrinterStatus;
+    /*
+     *  Get the state information for the Printer Queue and
+     *  the jobs in the Printer Queue.
+     */ 
+    if (!w32ParallelPort_GetJobs(osHandle, &pJobs, &cJobs, &dwPrinterStatus))
+		return FALSE;
+    if (dwPrinterStatus & PRINTER_STATUS_PENDING_DELETION ) {
+		free( pJobs );
+		return TRUE;
+	} else
+		return FALSE;
+#else
+	return TFALSE;
+#endif
+}	/* w32ParallelPort_isPrinterTimedOutNC */
+/*
+ * Class:     org_eclipse_soda_dk_comm_NSParallelPort
+ * Method:    isPrinterErrorNC
+ * Signature: (I)Z
+ * Return:     TRUE, FALSE
+ */
+BOOL w32ParallelPort_isPrinterErrorNC(JNIEnv *jenv, jobject jobj, jint jfd)
+{
+#ifdef _PRINTER_
+	HANDLE		osHandle = (HANDLE)jfd;
+    DWORD       dwPrinterStatus;
+    JOB_INFO_2  *pJobs;
+    int         cJobs, i;
+    /*
+     *  Get the state information for the Printer Queue and
+     *  the jobs in the Printer Queue.
+     */ 
+    if (!w32ParallelPort_GetJobs(osHandle, &pJobs, &cJobs, &dwPrinterStatus))
+		return FALSE;
+    if (dwPrinterStatus & (PRINTER_STATUS_ERROR |
+						   PRINTER_STATUS_PAPER_JAM |
+						   PRINTER_STATUS_PAPER_OUT |
+						   PRINTER_STATUS_PAPER_PROBLEM |
+						   PRINTER_STATUS_OUTPUT_BIN_FULL |
+						   PRINTER_STATUS_NOT_AVAILABLE |
+						   PRINTER_STATUS_NO_TONER |
+						   PRINTER_STATUS_OUT_OF_MEMORY |
+						   PRINTER_STATUS_OFFLINE |
+						   PRINTER_STATUS_DOOR_OPEN)) {
+          free( pJobs );
+          return TRUE;
+     }
+     for (i=0; i < cJobs; i++)
+     {
+        if (pJobs[i].Status & JOB_STATUS_PRINTING)
+        {
+            if (pJobs[i].Status & (JOB_STATUS_ERROR |
+								   JOB_STATUS_OFFLINE |
+								   JOB_STATUS_PAPEROUT |
+								   JOB_STATUS_BLOCKED_DEVQ)) {
+                free( pJobs );
+                return TRUE;
+            }
+        }
+     }
+    free( pJobs );
+    return FALSE;
+#endif
+}	/* w32ParallelPort_isPrinterErrorNC */
+/*
+ * Class:      w32ParallelPort_GetJobs
+ * Method:     reading the printer / printer job status
+ * Signature:  (I)Z
+ * Return:     TRUE, FALSE
+ */
+BOOL w32ParallelPort_GetJobs( HANDLE osHandle, JOB_INFO_2 **ppJobInfo,
+							  int *pcJobs, DWORD *pStatus)
+{
+    DWORD           cByteNeeded,
+                    nReturned,
+                    cByteUsed;
+    JOB_INFO_2      *pJobStorage  = NULL;
+    PRINTER_INFO_2  *pPrinterInfo = NULL;
+   /* Get the buffer size needed. */ 
+    if (!GetPrinter(osHandle, 2, NULL, 0, &cByteNeeded))
+    {
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+           return FALSE;
+    }
+    pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
+    if (!(pPrinterInfo)) return FALSE;
+    if (!GetPrinter(osHandle,
+				    2,
+	 			    (LPSTR)pPrinterInfo,
+					cByteNeeded,
+					&cByteUsed))
+    {
+        free(pPrinterInfo);
+        pPrinterInfo = NULL;
+        return FALSE;
+    }
+    if (!EnumJobs(osHandle,
+				  0,
+				  pPrinterInfo->cJobs,
+				  2,
+				  NULL,
+				  0,
+				  (LPDWORD)&cByteNeeded,
+				  (LPDWORD)&nReturned))
+    {
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+        {
+            free(pPrinterInfo);
+            pPrinterInfo = NULL;
+            return FALSE;
+        }
+    }
+    pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
+    if (!pJobStorage)
+    {
+        free(pPrinterInfo);
+        pPrinterInfo = NULL;
+        return FALSE;
+    }
+    ZeroMemory(pJobStorage, cByteNeeded);
+    if (!EnumJobs(osHandle,
+				  0,
+				  pPrinterInfo->cJobs,
+				  2,
+				  (LPBYTE)pJobStorage,
+				  cByteNeeded,
+				  (LPDWORD)&cByteUsed,
+				  (LPDWORD)&nReturned))
+    {
+         free(pPrinterInfo);
+         free(pJobStorage);
+         pJobStorage = NULL;
+         pPrinterInfo = NULL;
+         return FALSE;
+    }
+    *pcJobs = nReturned;
+    *pStatus = pPrinterInfo->Status;
+    *ppJobInfo = pJobStorage;
+    free(pPrinterInfo);
+    return TRUE;
+} /* w32ParallelPort_GetJobs() */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialDataEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialDataEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..0c3038aa3b99f8a79b9c5bb2abc0dfc7b8506472
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialDataEventThread.c
@@ -0,0 +1,135 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <windows.h>
+#include <winsock2.h>
+#ifndef _WIN32_WCE
+#include <errno.h>
+#else
+#include <winsock2.h>
+#endif
+#include "org_eclipse_soda_dk_comm_SerialDataEventThread.h"
+#define assertexc(s)       if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return;}
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	/* getPollingTime() */
+#if _WIN32_WCE>=400
+static int getStopThreadFlag(JNIEnv *jenv, jobject jobj)
+{
+	jclass cls;
+	jfieldID fid;
+	jint stopThreadFlag;
+	
+	cls = (*jenv)->GetObjectClass(jenv, jobj);
+	if (!cls) (*jenv)->FatalError(jenv, "Missing class");
+	
+	fid = (*jenv)->GetFieldID(jenv, cls, "stopThreadFlag", "I");
+	if (fid == NULL) (*jenv)->FatalError(jenv, "Missing field");
+	
+	stopThreadFlag = (*jenv)->GetIntField(jenv, jobj, fid);
+	
+	return stopThreadFlag;	
+}
+#endif //_WIN32_WCE>=400
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialDataEventThread
+ * Method:    monitorSerialDataNC
+ * Signature: (I)V
+ */
+void w32SerialDataEventThread_monitorSerialDataNC
+  (JNIEnv *jenv, jobject jobj, jint jfd) {
+    jclass		jspec;					/* serial port event class */
+    fd_set		r_mask;
+    jfieldID	data_available_id;      /* field ID */
+    jint		data_available_event;	/* field value */
+    jclass      jc;
+    jmethodID   jm;
+    jfieldID    spID;
+    jobject		jsp;
+    jclass		jspc;
+    jfieldID	notifyOnDataAvailableID;
+    jboolean	notifyOnDataAvailableFlag = JNI_FALSE;
+    int			result;
+	int			pollingTime;			/* seconds */
+	struct		timeval	tv;
+	jboolean	isInterruptedReturn;
+	jclass		jthreadClass;
+	jmethodID	jintMethod;
+#if _WIN32_WCE>=400
+	jint 		stopThreadFlag;
+#endif
+	pollingTime = getPollingTime(jenv);
+    jspec = (*jenv)->FindClass(jenv, "javax/comm/SerialPortEvent");
+    assertexc(jspec);
+    data_available_id = (*jenv)->GetStaticFieldID(jenv, jspec, "DATA_AVAILABLE", "I");
+    assertexc(data_available_id);
+    data_available_event = (*jenv)->GetStaticIntField(jenv, jspec, data_available_id);
+    /* Get the serial port object.*/
+    jc = (*jenv)->GetObjectClass(jenv, jobj);
+    assertexc(jc);
+    spID = (*jenv)->GetFieldID(jenv, jc, "serialPort", "Lorg/eclipse/soda/dk/comm/NSSerialPort;");
+    assertexc(spID);
+    jsp = (*jenv)->GetObjectField(jenv, jobj, spID);
+    assertexc(jsp);
+    /* Get the class ID of the serial port object.*/
+    jspc = (*jenv)->GetObjectClass(jenv, jsp);
+    assertexc(jspc);
+    /* Get access to the method to add a port.*/
+    jm = (*jenv)->GetMethodID(jenv, jspc, "reportSerialEvent", "(IZZ)V");
+    assertexc(jm);
+    notifyOnDataAvailableID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnDataFlag", "Z");
+    assertexc(notifyOnDataAvailableID);
+	/* Get access to the interrupted method.*/
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+	while(1)
+	{
+#if _WIN32_WCE>=400
+		stopThreadFlag = getStopThreadFlag(jenv, jobj);
+		if (stopThreadFlag)
+			break;	 	
+#endif
+		/* check to see if this thread has been interrupted */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv,jobj,jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		memset(&tv, 0, sizeof(tv));
+		tv.tv_sec = pollingTime;
+		FD_ZERO(&r_mask);
+		FD_SET(jfd, &r_mask);
+		result = select(jfd + 1, &r_mask, NULL, NULL, &tv);
+#ifndef _WIN32_WCE
+		if (result == -1 && errno != EINTR) break;
+#endif
+		if (!result)  continue;
+		if (FD_ISSET(jfd, &r_mask))
+		{
+			notifyOnDataAvailableFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnDataAvailableID);
+			if(notifyOnDataAvailableFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, data_available_event, JNI_TRUE, JNI_TRUE);
+        }
+    }
+} /* w32SerialDataEventThread_monitorSerialDataNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialPort.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialPort.c
new file mode 100644
index 0000000000000000000000000000000000000000..d91519e485231db5fb1d734521e2e387eaff3e1f
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialPort.c
@@ -0,0 +1,642 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#include <winbase.h>
+#ifndef _WIN32_WCE
+#include <sys/types.h>
+#endif //_WIN32_WCE
+#include "org_eclipse_soda_dk_comm_NSSerialPort.h"
+#include "NSCommLOG.h"
+#if 0 //t.j
+#ifdef _POSIX_SEMAPHORES
+#include <semaphore.h>
+#include "SysVStyleSemaphore.h"
+#else 
+#include <sys/ipc.h> 
+#include <sys/sem.h> 
+#endif
+#define NOOF_ELEMS(s)	((sizeof(s))/(sizeof(s[0])))
+#ifndef _POSIX_SEMAPHORES
+static struct sembuf	dev_test[] = {
+		{ 0, 0, IPC_NOWAIT }	/* test to see if it is free */
+};
+static struct sembuf	dev_lock[] = {
+		{ 0, 0, 0 },	/* wait for the semaphore to be free */
+		{ 0, 1, SEM_UNDO }	/* lock it */
+};
+static struct sembuf	dev_unlock[] = {
+		// { 0, -1, (IPC_NOWAIT | SEM_UNDO) }	/* unlock it */
+		{ 0, -1,  0  }   	/* wait til unlock it */
+};
+#endif
+#endif //t.j
+#define assert(s)  if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+				 return(-1);}
+/*------------------------------------------------------------------
+ * constants
+ *------------------------------------------------------------------*/
+#define W32COMM_PARITY_NONE       0
+#define W32COMM_PARITY_ODD        1
+#define W32COMM_PARITY_EVEN       2
+#define W32COMM_PARITY_MARK       3
+#define W32COMM_PARITY_SPACE      4
+#define W32COMM_STOPBITS_1_5      0
+#define W32COMM_STOPBITS_1        1
+#define W32COMM_STOPBITS_2        2
+#define W32COMM_DATABITS_5        5
+#define W32COMM_DATABITS_6        6
+#define W32COMM_DATABITS_7        7
+#define W32COMM_DATABITS_8        8
+#define assertexc(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); \
+                            return(-1);}
+jint w32getfd(JNIEnv *jenv, jobject jobj)
+{
+    jclass        jc;
+    jfieldID      jf;
+    jint          fd = -1;
+    // Get the file descriptor.
+    jc = (*jenv)->GetObjectClass(jenv, jobj);
+    assertexc(jc);
+    jf = (*jenv)->GetFieldID(jenv, jc, "fd", "I");
+    assertexc(jf);
+    return (*jenv)->GetIntField(jenv, jobj, jf);
+}  /* w32getfd() */
+/*
+ * Function:   w32SerialPort_closeDeviceNC
+ * Purpose:    Close a I/O Device
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds
+ */
+int w32SerialPort_closeDeviceNC
+  (JNIEnv *env, jobject jobj, jint fd, jint semId)
+{
+	HANDLE osHandle = (HANDLE) fd;
+	env;
+	return CloseHandle(osHandle);
+}	/* w32SerialPort_closeDeviceNC */
+/*
+ * Function:   w32SerialPort_openDeviceNC
+ * Purpose:    open a I/O Device
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_openDeviceNC
+  (JNIEnv *jenv, jobject jobj, jstring name, jint semId)
+{
+#if _WIN32_WCE>=400
+	//TCHAR		appends[2] = L":";
+	//const unsigned short *portName = NULL;
+	//const unsigned short *portName_wince = NULL;
+	LPTSTR	portName = NULL;
+	LPTSTR	portName_wince = NULL;
+	LPTSTR	appends = TEXT(":");
+#else
+	const char *portName = NULL;
+#endif
+	int			fd = -1;
+	HANDLE      osHandle;
+#ifdef WINCE
+	portName = (*jenv)->GetStringChars(jenv, name, 0);
+#else
+	portName = (*jenv)->GetStringUTFChars(jenv, name, 0);
+#endif //_WIN32_WCE
+	if( portName == NULL )
+	{
+#ifdef DEBUG
+//		LOG(("Can not open port because get NULL name\n"));
+		printf( "Can not open port because get NULL name\n" );
+	    fflush( stdout );
+#endif
+		printf("portName is NULL\n");
+		return fd;
+	}
+#if _WIN32_WCE>=400
+	lstrcat(portName, appends);
+	// TEXT("COM1:")
+	
+	osHandle =	CreateFile(
+				portName,
+				GENERIC_READ | GENERIC_WRITE,
+				0,
+				NULL,
+				OPEN_EXISTING,
+				0,
+				NULL);
+#else
+	osHandle =	CreateFile(
+				portName,
+				GENERIC_READ | GENERIC_WRITE,
+				0,
+				0,
+				OPEN_EXISTING,
+				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
+				0);
+#endif //_WIN32_WCE
+	
+	if (INVALID_HANDLE_VALUE == osHandle) {
+		fd = GetLastError();
+		iveSerThrowWin(jenv,"Error opening port", fd);
+		return 0;
+	}
+#if _WIN32_WCE>=400
+	(*jenv)->ReleaseStringChars(jenv, name, portName);
+#else
+	(*jenv)->ReleaseStringUTFChars(jenv, name, portName);
+#endif //_WIN32_WCE
+#ifdef DEBUG
+//		LOG(("w32SerialPort_openDeviceNC(%s)",portName));
+		printf( "w32SerialPort_openDeviceNC(%s) osHandle: %d\n", portName, osHandle );
+	    fflush( stdout );
+#endif
+	return (jint) osHandle;
+}  /* w32SerialPort_openDeviceNC */
+/*
+ * Function:   w32SerialPort_setFlowControlModeNC
+ * Purpose:    setup the comm port flow control
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_setFlowControlModeNC(JNIEnv *jenv, jobject jobj, jint fd, jint fc )
+{
+    HANDLE  osHandle = (HANDLE) fd;
+    DWORD   lastRc;
+    DCB     dcb;
+    BOOL    success;
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return success;
+    }
+	if (fc == 0) {			// None for both hardware and software
+		 /* Do nothing, as all the flow control modes are already turned off now. */
+		dcb.fOutxCtsFlow      = FALSE; //(config->hardwareFlowControl != 0);
+	    dcb.fOutxDsrFlow      = FALSE; 
+		dcb.fTXContinueOnXoff = FALSE;
+	    dcb.fOutX             = FALSE; //(config->softwareFlowControl != 0);
+		dcb.fInX              = FALSE; //(config->softwareFlowControl != 0);
+	} else {
+		if (fc & 1) {		/* hardware flow control RTSCTS_IN */
+			dcb.fOutxCtsFlow  = TRUE; 
+			dcb.fRtsControl   = RTS_CONTROL_ENABLE;
+		 }
+		 if (fc & 2) {		/* hardware flow control RTSCTS_OUT */
+			dcb.fOutxCtsFlow  = TRUE; 
+			dcb.fRtsControl   = RTS_CONTROL_ENABLE;
+		 }
+		 if (fc & 4) {		/* software flow control XONXOFF_IN */
+			dcb.fInX = TRUE;
+		 }
+		 if (fc & 8) {		/* software flow control XONXOFF_OUT */
+			dcb.fOutX  = TRUE;
+		 } 
+	}
+	success = SetCommState(osHandle,&dcb);
+	if (!success) {
+		lastRc = GetLastError();
+		iveSerThrowWin(jenv,"SetCommState() failed",lastRc);
+		printf("w32SerialPort_setDTRNC() failed to set the DCB: %d\n", success);
+	}
+	return success;
+}  /* w32SerialPort_setFlowControlModeNC */
+/*
+ * Function:   w32SerialPort_getFlowControlModeNC
+ * Purpose:    get the current comm port flow control settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_getFlowControlModeNC(JNIEnv *jenv, jobject jobj, jint fd )
+{
+    HANDLE  osHandle = (HANDLE) fd;
+    DWORD   lastRc;
+    DCB     dcb;
+    int     ret = -1;
+	(void)memset(&dcb, 0, sizeof(DCB));
+    ret = GetCommState(osHandle,&dcb);
+    if (!ret) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return ret;
+    }
+  // Determine the flow control.
+  if ( !dcb.fOutxCtsFlow && !dcb.fOutxDsrFlow && !dcb.fTXContinueOnXoff && !dcb.fOutX && !dcb.fInX )
+     ret = 0;				/* None for both hardware and software flow control */
+  else {
+     ret = 0;
+     if ( dcb.fOutxCtsFlow && (dcb.fRtsControl==RTS_CONTROL_ENABLE) )	/* hardware flow control RTSCTS_IN */
+        ret |= 1;
+     if ( dcb.fOutxCtsFlow && (dcb.fRtsControl==RTS_CONTROL_ENABLE) )	/* hardware flow control RTSCTS_IN */
+        ret |= 2;
+     if (dcb.fInX  & TRUE)		/* software flow control XONXOFF_IN */
+        ret |= 4;
+     if (dcb.fOutX & TRUE)		/* software flow control XONXOFF_OUT */
+        ret |= 8;
+  }
+  
+  return ret;
+} /* w32SerialPort_getFlowControlModeNC */
+/*
+ * Function:   w32SerialPort_getBaudRateNC
+ * Purpose:    get the current comm port baud rate settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_getBaudRateNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+    HANDLE  osHandle = (HANDLE) fd;
+    DWORD   lastRc;
+    DCB     dcb;
+    BOOL    success;
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return success;
+    }
+#ifdef DEBUG
+	printf( "win32SerialPort_getBaudRateNC(), baud rate: %d\n", dcb.BaudRate );
+	fflush( stdout ); 
+#endif
+	return dcb.BaudRate;
+}  /* w32SerialPort_getBaudRateNC() */
+/*
+ * Function:   w32SerialPort_getDataBitsNC
+ * Purpose:    get the current comm port data bits settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_getDataBitsNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+    HANDLE  osHandle = (HANDLE) fd;
+    DWORD   lastRc;
+    DCB     dcb;
+    BOOL    success;
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return success;
+    }
+#ifdef DEBUG
+	printf( "w32SerialPort_getDataBitsNC(), baud rate: %d\n", dcb.ByteSize );
+	fflush( stdout ); 
+#endif
+	return dcb.ByteSize;
+}  /* w32SerialPort_getDataBitsNC() */
+   
+/*
+ * Function:   w32SerialPort_getStopBitsNC
+ * Purpose:    get the current comm port stop bits settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_getStopBitsNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+    HANDLE  osHandle = (HANDLE) fd;
+    DCB     dcb;
+    DWORD   lastRc;
+    BOOL    success;
+    BYTE    stopBits;
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return success;
+    }
+	
+    switch (dcb.StopBits) {
+		case ONE5STOPBITS:	stopBits = W32COMM_STOPBITS_1_5; break;
+        case TWOSTOPBITS:	stopBits = W32COMM_STOPBITS_2;   break;
+        case ONESTOPBIT:   
+        default:            stopBits = W32COMM_STOPBITS_1;   break;
+    }
+	return (jint) stopBits;
+}  /* w32SerialPort_getStopBitsNC() */
+/*
+ * Function:   w32SerialPort_getParityNC
+ * Purpose:    get the current comm port parity bits settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_getParityNC(JNIEnv *jenv, jobject jobj, jint fd)
+{
+    HANDLE  osHandle = (HANDLE) fd;
+    DCB     dcb;
+    DWORD   lastRc;
+    BOOL    success;
+    BYTE    parity;
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return success;
+    }
+	
+	if ( dcb.fParity == TRUE )
+	{
+	    switch (dcb.Parity) {
+			case EVENPARITY:   parity = W32COMM_PARITY_EVEN;  break;
+			case ODDPARITY:    parity = W32COMM_PARITY_ODD;   break;
+			case MARKPARITY:   parity = W32COMM_PARITY_MARK;  break;
+			case SPACEPARITY:  parity = W32COMM_PARITY_SPACE; break;
+			case NOPARITY:	   
+			default:           parity = W32COMM_PARITY_NONE;  break;
+    
+		}
+	}
+#ifdef DEBUG
+	printf( "win32SerialPort_getParityNC():  parity = %d\n", parity); 
+#endif /* DEBUG */
+  
+	return (jint) parity;
+} /* w32SerialPort_getParityNC() */
+/*
+ * Function:   w32SerialPort_setDTRNC
+ * Purpose:    setup the comm port DTR bit settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     none	
+ */
+void w32SerialPort_setDTRNC(JNIEnv *jenv, jobject jobj, jboolean bool)
+{
+    DCB     dcb;
+    DWORD   lastRc;
+    BOOL    success;
+    HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+		printf("w32SerialPort_setDTRNC() failed to get the DCB: %d\n", success);
+    }
+	dcb.fDtrControl = DTR_CONTROL_ENABLE;
+    success = SetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"SetCommState() failed",lastRc);
+		printf("w32SerialPort_setDTRNC() failed to set the DCB: %d\n", success);
+    }
+}  /* w32SerialPort_setDTRNC() */
+/*
+ * Function:   w32SerialPort_isDTRNC
+ * Purpose:    checking the current comm port DTR bit settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+BOOL w32SerialPort_isDTRNC(JNIEnv *jenv, jobject jobj)
+{
+    DCB     dcb;
+    DWORD   lastRc;
+    BOOL    success;
+    HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	if (osHandle == (HANDLE)-1) return -1;                    
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+		printf("w32SerialPort_setDTRNC() failed to get the DCB: %d\n", success);
+    }
+	return (dcb.fDtrControl & DTR_CONTROL_ENABLE);
+}  /* w32SerialPort_isDTRNC() */
+/*
+ * Function:   w32SerialPort_setRTSNC
+ * Purpose:    setup the comm port RTS bit
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     none	
+ */
+void w32SerialPort_setRTSNC(JNIEnv *jenv, jobject jobj, jboolean bool)
+{
+    DCB     dcb;
+    DWORD   lastRc;
+    BOOL    success;
+    HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+		printf("w32SerialPort_setDTRNC() failed to get the DCB: %d\n", success);
+    }
+	dcb.fRtsControl = RTS_CONTROL_ENABLE;
+    success = SetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"SetCommState() failed",lastRc);
+		printf("w32SerialPort_setDTRNC() failed to set the DCB: %d\n", success);
+    }
+}  /* w32SerialPort_setRTSNC() */
+/*
+ * Function:   w32SerialPort_isRTSNC
+ * Purpose:    checking the current comm port RTS bit settings
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+BOOL w32SerialPort_isRTSNC( JNIEnv *jenv, jobject jobj )
+{
+    DCB     dcb;
+    DWORD   lastRc;
+    BOOL    success;
+    HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	if (osHandle == (HANDLE)-1) return -1;                    
+	(void)memset(&dcb, 0, sizeof(DCB));
+    success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+		printf("w32SerialPort_isRTSNC() failed to get the DCB: %d\n", success);
+    }
+	return (dcb.fRtsControl&RTS_CONTROL_ENABLE);
+}  /* w32SerialPort_isRTSNC() */
+/*
+ * Function:   w32SerialPort_isCTSNC
+ * Purpose:    checking the current comm port CTS bit
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+BOOL w32SerialPort_isCTSNC( JNIEnv *jenv, jobject jobj )
+{
+    DWORD	dwCommFlags = 0;
+	HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	if (osHandle == (HANDLE)-1) return -1;                    
+	
+	GetCommModemStatus( osHandle, &dwCommFlags );
+	return  (dwCommFlags&MS_CTS_ON);
+}  /* w32SerialPort_isCTSNC */
+/*
+ * Function:   w32SerialPort_isDSRNC
+ * Purpose:    checking the current comm port DSR bit
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+BOOL w32SerialPort_isDSRNC( JNIEnv *jenv, jobject jobj )
+{
+    DWORD	dwCommFlags = 0;
+	HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	if (osHandle == (HANDLE)-1) return -1;                    
+	
+	GetCommModemStatus( osHandle, &dwCommFlags );
+	return  (dwCommFlags&MS_DSR_ON);
+} /* w32SerialPort_isDSRNC() */
+/*
+ * Function:   w32SerialPort_isRINC
+ * Purpose:    checking the current comm port RIN bit
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+BOOL w32SerialPort_isRINC( JNIEnv *jenv, jobject jobj )
+{
+    DWORD	dwCommFlags = 0;
+	HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	if (osHandle == (HANDLE)-1) return -1;                    
+	
+	GetCommModemStatus( osHandle, &dwCommFlags );
+	return  (dwCommFlags&MS_RING_ON);
+}  /* w32SerialPort_isRINC() */
+/*
+ * Function:   w32SerialPort_isCDNC
+ * Purpose:    checking the current comm port CD bit
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+BOOL w32SerialPort_isCDNC(JNIEnv *jenv, jobject jobj)
+{
+    DWORD	dwCommFlags = 0;
+	HANDLE  osHandle = (HANDLE) w32getfd(jenv, jobj);
+	if (osHandle == (HANDLE)-1) return -1;                    
+	
+	GetCommModemStatus( osHandle, &dwCommFlags );
+	return  (dwCommFlags&MS_RLSD_ON);
+}  /* w32SerialPort_isCDNC() */
+#if 0 //t.j
+/*
+ * Function:     org_eclipse_soda_dk_comm_NSSerialPort
+ * Method:    sendBreakNC
+ * Signature: (II)I
+ */
+int w32SerialPort_sendBreakNC(JNIEnv *jenv, jobject jobj, jint jfd, jint jmillis) {
+   (void)tcsendbreak(jfd, jmillis);
+} /* w32SerialPort_sendBreakNC() */
+#endif //t.j
+/*
+ * Function:   w32SerialPort_setSerialPortParamsNC
+ * Purpose:    config the comm port
+ * Signature: (Ljava/lang/String;I)I
+ * Return:     0 - Fail
+ *			   none zero - succeeds	
+ */
+int w32SerialPort_setSerialPortParamsNC
+  (JNIEnv *jenv, jobject jobj, jint fd, jint jbaudrate, jint jdatabits, jint jstopbits, jint jparity ) {
+    HANDLE       osHandle = (HANDLE) fd;
+    DCB          dcb;
+    COMMTIMEOUTS commTimeouts;
+    BOOL         success;
+    DWORD        lastRc;
+    BYTE         parity;
+    BYTE         stopBits;
+//t.j    int          rts;
+    switch (jparity) {
+        case W32COMM_PARITY_EVEN:  parity = EVENPARITY;  break;
+        case W32COMM_PARITY_ODD:   parity = ODDPARITY;   break;
+        case W32COMM_PARITY_MARK:  parity = MARKPARITY;  break;
+        case W32COMM_PARITY_SPACE: parity = SPACEPARITY; break;
+        case W32COMM_PARITY_NONE:  
+        default:                   parity = NOPARITY;    break;
+    }
+    switch (jstopbits) {
+        case W32COMM_STOPBITS_1_5: stopBits = ONE5STOPBITS; break;
+        case W32COMM_STOPBITS_2:   stopBits = TWOSTOPBITS;  break;
+        case W32COMM_STOPBITS_1:   
+        default:                   stopBits = ONESTOPBIT;   break;
+    }
+//t.j    if (config->hardwareFlowControl) {
+//        rts = RTS_CONTROL_HANDSHAKE;
+//    }
+//    else {
+//        rts = RTS_CONTROL_ENABLE;
+//t.j    }
+    memset(&dcb, 0, sizeof(DCB));
+	success = GetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"GetCommState() failed",lastRc);
+        return success;
+    }
+#ifdef DEBUG
+//       LOG( ("pName: %s, %s, dName: %s, semID %d\n", pName,pp->portName, dName, semID) );
+       printf( "before==> baudrate: %d, databits %d, stopbits: %d parity %d\n", dcb.BaudRate, dcb.ByteSize, dcb.StopBits, dcb.Parity );
+       fflush( stdout );
+#endif
+	dcb.BaudRate          = jbaudrate;
+    dcb.fBinary           = TRUE;
+    dcb.fParity           = TRUE;
+    dcb.fTXContinueOnXoff = FALSE;
+    dcb.fErrorChar        = FALSE;
+    dcb.fNull             = FALSE;
+    dcb.fAbortOnError     = FALSE;
+    dcb.ByteSize          = jdatabits;
+    dcb.Parity            = parity;
+    dcb.StopBits          = stopBits;
+	dcb.fOutxCtsFlow      = FALSE; //(config->hardwareFlowControl != 0);
+    dcb.fOutxDsrFlow      = FALSE; 
+	dcb.fTXContinueOnXoff = FALSE;
+    dcb.fOutX             = FALSE; //(config->softwareFlowControl != 0);
+	dcb.fInX              = FALSE; //(config->softwareFlowControl != 0);
+	dcb.XonChar           = 0;
+	dcb.XoffChar		  = 0;
+    success = SetCommState(osHandle,&dcb);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"SetCommState() failed",lastRc);
+        return success;
+    }
+    memset(&commTimeouts,0,sizeof(commTimeouts));
+    commTimeouts.ReadIntervalTimeout		 = MAXDWORD;
+    commTimeouts.ReadTotalTimeoutConstant	 = 0;
+    commTimeouts.ReadTotalTimeoutMultiplier	 = 0;
+    commTimeouts.WriteTotalTimeoutConstant	 = 0;
+    commTimeouts.WriteTotalTimeoutMultiplier = 0;
+    success = SetCommTimeouts(osHandle,&commTimeouts);
+    if (!success) {
+        lastRc = GetLastError();
+        iveSerThrowWin(jenv,"SetCommTimeouts() failed",lastRc);
+        return success;
+    }
+#ifdef DEBUG
+//       LOG( ("pName: %s, %s, dName: %s, semID %d\n", pName,pp->portName, dName, semID) );
+       printf( "after==> baudrate: %d, databits %d, stopbits: %d parity %d\n", dcb.BaudRate, dcb.ByteSize, dcb.StopBits, dcb.Parity );
+       fflush( stdout );
+#endif
+    return success;
+} /* w32SerialPort_setSerialPortParamsNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialPort.h b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialPort.h
new file mode 100644
index 0000000000000000000000000000000000000000..25759f8b975b56d6e6104776105612ed9a26e14d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialPort.h
@@ -0,0 +1,28 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <windows.h>
+int  w32SerialPort_closeDeviceNC( JNIEnv *, jobject, jint, jint );
+int  w32SerialPort_openDeviceNC( JNIEnv *, jobject, jstring, jint );
+int  w32SerialPort_getBaudRateNC( JNIEnv *, jobject, jint );
+int  w32SerialPort_getDataBitsNC( JNIEnv *, jobject, jint );
+int  w32SerialPort_getStopBitsNC( JNIEnv *, jobject, jint );
+int  w32SerialPort_getParityNC( JNIEnv *, jobject, jint );
+void w32SerialPort_setDTRNC( JNIEnv *, jobject, jboolean );
+void w32SerialPort_setRTSNC( JNIEnv *, jobject, jboolean );
+BOOL w32SerialPort_isDTRNC( JNIEnv *, jobject );
+BOOL w32SerialPort_isRTSNC( JNIEnv *, jobject );
+BOOL w32SerialPort_isCTSNC( JNIEnv *, jobject );
+BOOL w32SerialPort_isDSRNC( JNIEnv *, jobject );
+BOOL w32SerialPort_isRINC(  JNIEnv *, jobject );
+BOOL w32SerialPort_isCDNC(  JNIEnv *, jobject );
+int  w32SerialPort_setFlowControlModeNC( JNIEnv *, jobject, jint, jint );
+int  w32SerialPort_getFlowControlModeNC(JNIEnv *, jobject, jint );
+int  w32SerialPort_setSerialPortParamsNC( JNIEnv *, jobject, jint, jint, jint, jint, jint );
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialStatusEventThread.c b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialStatusEventThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..92dba326ed484337961c1af367b29bb8c35869fd
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/c/w32SerialStatusEventThread.c
@@ -0,0 +1,164 @@
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+#include <winbase.h>
+#ifndef _WIN32_WCE
+#include <sys/types.h>
+#endif
+#include "org_eclipse_soda_dk_comm_SerialStatusEventThread.h"
+#define assertexc(s) if (!s) {printf("\n\n%d asserted!\n\n", __LINE__); return;}
+static int	getPollingTime(JNIEnv *jenv) {
+  int		ptime = 5;
+  jclass	cic;
+  jfieldID	ptID;
+  jint		pt;
+  do {
+	cic = (*jenv)->FindClass(jenv, "javax/comm/CommPortIdentifier");
+	if (!cic) break;
+	ptID = (*jenv)->GetStaticFieldID(jenv, cic, "pollingTime", "I");
+	if (!ptID) break;
+	pt = (*jenv)->GetStaticIntField(jenv, cic, ptID);
+	if (pt > 0)
+		ptime = pt;
+  } while (0);
+  return ptime;
+}	/* getPollingTime() */
+/*
+ * Class:     org_eclipse_soda_dk_comm_SerialStatusEventThread
+ * Method:    monitorSerialStatusNC
+ * Signature: (I)V
+ */
+void w32SerialStatusEventThread_monitorSerialStatusNC
+		(JNIEnv *jenv, jobject jobj, jint jfd) {
+	int		 pollingTime;								/* seconds */
+	HANDLE   osHandle = (HANDLE)jfd;
+	DWORD	 oldStatus, newStatus;
+	jfieldID notifyOnCDID, notifyOnCTSID;
+	jfieldID notifyOnDSRID, notifyOnRIID;
+	jboolean notifyOnCDFlag = JNI_FALSE;
+	jboolean notifyOnCTSFlag = JNI_FALSE;
+	jboolean notifyOnDSRFlag = JNI_FALSE;
+	jboolean notifyOnRIFlag = JNI_FALSE;
+	jclass      jc;
+	jmethodID   jm;
+	jclass		jspc;
+	jfieldID 	spID;
+	jobject		jsp;
+	jboolean	isInterruptedReturn;
+	jclass		jspec;									/* serial port event class */
+	jfieldID	speCDID,speCTSID, speDSRID, speRIID ;	/* field ID		*/
+	jint		speCD, speCTS, speDSR, speRI;			/* field value	*/
+	jmethodID	jintMethod;
+	jclass		jthreadClass;
+	pollingTime = getPollingTime(jenv);
+	/* Get the const values for all the serial port event types.*/
+	jspec = (*jenv)->FindClass(jenv, "javax/comm/SerialPortEvent");
+	assertexc(jspec);
+	speCDID = (*jenv)->GetStaticFieldID(jenv, jspec, "CD", "I");
+	assertexc(speCDID);
+	speCD = (*jenv)->GetStaticIntField(jenv, jspec, speCDID);
+	speCTSID = (*jenv)->GetStaticFieldID(jenv, jspec, "CTS", "I");
+	assertexc(speCTSID);
+	speCTS = (*jenv)->GetStaticIntField(jenv, jspec, speCTSID);
+	speDSRID = (*jenv)->GetStaticFieldID(jenv, jspec, "DSR", "I");
+	assertexc(speDSRID);
+	speDSR = (*jenv)->GetStaticIntField(jenv, jspec, speDSRID);
+	speRIID = (*jenv)->GetStaticFieldID(jenv, jspec, "RI", "I");
+	assertexc(speRIID);
+	speRI = (*jenv)->GetStaticIntField(jenv, jspec, speRIID);
+	/* Get the serial port object.*/
+	jc = (*jenv)->GetObjectClass(jenv, jobj);
+	assertexc(jc);
+	spID = (*jenv)->GetFieldID(jenv, jc, "serialPort", "Lorg/eclipse/soda/dk/comm/NSSerialPort;");
+	assertexc(spID);
+	jsp = (*jenv)->GetObjectField(jenv, jobj, spID);
+	assertexc(jsp);
+	/* Get the class ID of the serial port object.*/
+	jspc = (*jenv)->GetObjectClass(jenv, jsp);
+	assertexc(jspc);
+	notifyOnCDID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnCDFlag", "Z");
+	assertexc(notifyOnCDID);
+	notifyOnCTSID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnCTSFlag", "Z");
+	assertexc(notifyOnCTSID);
+	notifyOnDSRID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnDSRFlag", "Z");
+	assertexc(notifyOnDSRID);
+	notifyOnRIID = (*jenv)->GetFieldID(jenv, jspc, "notifyOnRIFlag", "Z");
+	assertexc(notifyOnRIID);
+	/* Get access to the method to add a port.*/
+	jm = (*jenv)->GetMethodID(jenv, jspc, "reportSerialEvent", "(IZZ)V");
+	assertexc(jm);
+	/* Get access to the interrupted method.*/
+	jthreadClass = (*jenv)->FindClass(jenv, "java/lang/Thread");
+	assertexc(jthreadClass);
+	jintMethod = (*jenv)->GetMethodID(jenv, jthreadClass, "isInterrupted", "()Z");
+	assertexc(jintMethod);
+//	if (ioctl(jfd, TIOCMGET, &oldStatus) < 0) {
+//		(void)fprintf(stderr, "Java_org_eclipse_soda_dk_comm_SerialStatusEventThread_monitorSerialStatusNC: ioctl error %d!\n", errno);
+//		return;
+//t.j	}
+#ifndef _WIN32_WCE
+	if (GetCommModemStatus(osHandle, &oldStatus) < 0) {
+		errno = GetLastError();
+		(void)fprintf(stderr, "w32SerialStatusEventThread_monitorSerialStatusNC: GetCommModemStatus() error %d!\n", errno);
+		return;
+	}
+#endif //_WIN32_WCE
+	while(1)
+	{
+		Sleep(pollingTime);
+		/* check to see if this thread has been interrupted */
+		isInterruptedReturn = (*jenv)->CallBooleanMethod(jenv,jobj,jintMethod);
+		if(isInterruptedReturn == JNI_TRUE)
+			break;
+		notifyOnCDFlag  = (*jenv)->GetBooleanField(jenv, jsp, notifyOnCDID);
+		notifyOnCTSFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnCTSID);
+		notifyOnDSRFlag = (*jenv)->GetBooleanField(jenv, jsp, notifyOnDSRID);
+		notifyOnRIFlag  = (*jenv)->GetBooleanField(jenv, jsp, notifyOnRIID);
+#ifndef _WIN32_WCE
+		if (GetCommModemStatus(osHandle, &newStatus) < 0) {
+			errno = GetLastError();
+			(void)fprintf(stderr, "w32SerialStatusEventThread_monitorSerialStatusNC: ioctl error %d!\n", errno);
+			return;
+		}
+#endif //_WIN32_WCE
+		if (newStatus == oldStatus)
+			continue;
+		if((newStatus & MS_RLSD_ON) != (oldStatus & MS_RLSD_ON))
+		{
+			if(notifyOnCDFlag)        /* need to use jsp to access this field */
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speCD,
+				    (oldStatus & MS_RLSD_ON)? JNI_TRUE:JNI_FALSE,(newStatus & MS_RLSD_ON)? JNI_TRUE:JNI_FALSE);
+		}
+		if((newStatus & MS_CTS_ON) != (oldStatus & MS_CTS_ON))
+		{
+			if(notifyOnCTSFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speCTS,
+				    (oldStatus & MS_CTS_ON)? JNI_TRUE:JNI_FALSE,(newStatus & MS_CTS_ON)? JNI_TRUE:JNI_FALSE);
+		}
+		if((newStatus & MS_DSR_ON) != (oldStatus & MS_DSR_ON))
+		{
+			if(notifyOnDSRFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speDSR,
+				    (oldStatus & MS_DSR_ON)? JNI_TRUE:JNI_FALSE,(newStatus & MS_DSR_ON)? JNI_TRUE:JNI_FALSE);
+		}
+		if((newStatus & MS_RING_ON) != (oldStatus & MS_RING_ON))
+		{
+			if(notifyOnRIFlag)
+				(*jenv)->CallVoidMethod(jenv, jsp, jm, speRI,
+				    (oldStatus & MS_RING_ON)? JNI_TRUE:JNI_FALSE,(newStatus & MS_RING_ON)? JNI_TRUE:JNI_FALSE);
+		}
+		oldStatus = newStatus;
+	}	/* end of while() */
+} /* w32SerialStatusEventThread_monitorSerialStatusNC */
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommDriver.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..3545a2987dc4f213c98b55d5a7018b8e363e52a9
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommDriver.java
@@ -0,0 +1,31 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public interface CommDriver {
+	/**
+	 * Get comm port with the specified port name and port type parameters and return the CommPort result.
+	 * @param portName	The port name (<code>String</code>) parameter.
+	 * @param portType	The port type (<code>int</code>) parameter.
+	 * @return	Results of the get comm port (<code>CommPort</code>) value.
+	 */
+	public abstract CommPort getCommPort(final String portName, final int portType);
+
+	/**
+	 * Initialize.
+	 */
+	public abstract void initialize();
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPort.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPort.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e6305444c38c3840a480f27db0f7cfca5c8a1bc
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPort.java
@@ -0,0 +1,199 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.io.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public abstract class CommPort extends Object {
+	/**
+	 * Define the name (String) field.
+	 */
+	protected String name = null;
+
+	/**
+	 * Close.
+	 */
+	public void close() {
+		CommPortIdentifier cport;
+		try {
+			cport = CommPortIdentifier.getPortIdentifier(this);
+		} catch (final NoSuchPortException nspe) {
+			cport = null;
+		}
+		if (cport != null) {
+			cport.internalClosePort();
+		}
+	}
+
+	/**
+	 * Disable receive framing.
+	 * @see #enableReceiveFraming(int)
+	 */
+	public abstract void disableReceiveFraming();
+
+	/**
+	 * Disable receive threshold.
+	 * @see #enableReceiveThreshold(int)
+	 * @see #getReceiveThreshold()
+	 */
+	public abstract void disableReceiveThreshold();
+
+	/**
+	 * Disable receive timeout.
+	 * @see #enableReceiveTimeout(int)
+	 * @see #getReceiveTimeout()
+	 */
+	public abstract void disableReceiveTimeout();
+
+	/**
+	 * Enable receive framing with the specified framing byte parameter.
+	 * @param framingByte	The framing byte (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveFraming()
+	 */
+	public abstract void enableReceiveFraming(final int framingByte) throws UnsupportedCommOperationException;
+
+	/**
+	 * Enable receive threshold with the specified thresh parameter.
+	 * @param thresh	The thresh (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveThreshold()
+	 * @see #getReceiveThreshold()
+	 */
+	public abstract void enableReceiveThreshold(final int thresh) throws UnsupportedCommOperationException;
+
+	/**
+	 * Enable receive timeout with the specified rcv timeout parameter.
+	 * @param rcvTimeout	The rcv timeout (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveTimeout()
+	 * @see #getReceiveTimeout()
+	 */
+	public abstract void enableReceiveTimeout(final int rcvTimeout) throws UnsupportedCommOperationException;
+
+	/**
+	 * Gets the input buffer size (int) value.
+	 * @return	The input buffer size (<code>int</code>) value.
+	 * @see #setInputBufferSize(int)
+	 */
+	public abstract int getInputBufferSize();
+
+	/**
+	 * Gets the input stream value.
+	 * @return	The input stream (<code>InputStream</code>) value.
+	 * @throws IOException IOException.
+	 */
+	public abstract InputStream getInputStream() throws IOException;
+
+	/**
+	 * Gets the name (String) value.
+	 * @return	The name (<code>String</code>) value.
+	 */
+	public String getName() {
+		return this.name;
+	}
+
+	/**
+	 * Gets the output buffer size (int) value.
+	 * @return	The output buffer size (<code>int</code>) value.
+	 * @see #setOutputBufferSize(int)
+	 */
+	public abstract int getOutputBufferSize();
+
+	/**
+	 * Gets the output stream value.
+	 * @return	The output stream (<code>OutputStream</code>) value.
+	 * @throws IOException IOException.
+	 */
+	public abstract OutputStream getOutputStream() throws IOException;
+
+	/**
+	 * Gets the receive framing byte (int) value.
+	 * @return	The receive framing byte (<code>int</code>) value.
+	 */
+	public abstract int getReceiveFramingByte();
+
+	/**
+	 * Gets the receive threshold (int) value.
+	 * @return	The receive threshold (<code>int</code>) value.
+	 * @see #disableReceiveThreshold()
+	 * @see #enableReceiveThreshold(int)
+	 */
+	public abstract int getReceiveThreshold();
+
+	/**
+	 * Gets the receive timeout (int) value.
+	 * @return	The receive timeout (<code>int</code>) value.
+	 * @see #disableReceiveTimeout()
+	 * @see #enableReceiveTimeout(int)
+	 */
+	public abstract int getReceiveTimeout();
+
+	/**
+	 * Gets the receive framing enabled (boolean) value.
+	 * @return	The receive framing enabled (<code>boolean</code>) value.
+	 */
+	public abstract boolean isReceiveFramingEnabled();
+
+	/**
+	 * Gets the receive threshold enabled (boolean) value.
+	 * @return	The receive threshold enabled (<code>boolean</code>) value.
+	 */
+	public abstract boolean isReceiveThresholdEnabled();
+
+	/**
+	 * Gets the receive timeout enabled (boolean) value.
+	 * @return	The receive timeout enabled (<code>boolean</code>) value.
+	 */
+	public abstract boolean isReceiveTimeoutEnabled();
+
+	/**
+	 * Sets the input buffer size value.
+	 * @param size	The size (<code>int</code>) parameter.
+	 * @see #getInputBufferSize()
+	 */
+	public abstract void setInputBufferSize(final int size);
+
+	/**
+	 * Sets the output buffer size value.
+	 * @param size	The size (<code>int</code>) parameter.
+	 * @see #getOutputBufferSize()
+	 */
+	public abstract void setOutputBufferSize(final int size);
+
+	/**
+	 * Returns the string value.
+	 * @return	The string (<code>String</code>) value.
+	 */
+	public String toString() {
+		String str;
+		String pt;
+		CommPortIdentifier cport;
+		/* This should be port name + port type. */
+		try {
+			cport = CommPortIdentifier.getPortIdentifier(this);
+		} catch (final NoSuchPortException nspe) {
+			cport = null;
+		}
+		if (cport != null) {
+			pt = cport.getPortType() == CommPortIdentifier.PORT_SERIAL ? "SERIAL" : "PARALLEL"; //$NON-NLS-1$//$NON-NLS-2$
+		} else {
+			pt = " "; //$NON-NLS-1$
+		}
+		str = new String(this.name + ':' + pt);
+		return str;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPortIdentifier.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPortIdentifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8d7e01dc800d2018eed4710aaa9dacfa8103332
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPortIdentifier.java
@@ -0,0 +1,265 @@
+package javax.comm;
+
+/**************************************************************************************************************************************************************************************************************************************************************
+ * Copyright (c) 1999, 2009 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html Contributors: IBM Corporation - initial API and implementation
+ *************************************************************************************************************************************************************************************************************************************************************/
+import java.io.FileDescriptor;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.soda.dk.comm.internal.Library;
+
+/**
+ * @author IBM
+ */
+public class CommPortIdentifier {
+	/**
+	 * Define polling time value.
+	 */
+	public static final int pollingTime = 1;
+
+	/**
+	 * Define port serial value.
+	 */
+	public static final int PORT_SERIAL = 1;
+
+	/**
+	 * Define port parallel value.
+	 */
+	public static final int PORT_PARALLEL = 2;
+
+	static CommDriver commDriver = null;
+
+	static boolean initialized = false;
+
+	static Hashtable identifiers = new Hashtable(4); // initial number of
+	// ports
+	// static block to ensure proper initialization
+	static {
+		// TODO: Create a factory that would return the proper Comdriver based
+		// on the property file
+		// where the comdrivers are registered. (javax.comm.properties)
+		// lazy initialization to avoid overhead.
+		try {
+			// System.loadLibrary("dkcomm"); // replace the old ibmcomm //$NON-NLS-1$
+			Library.load_dkcomm();
+		} catch (final UnsatisfiedLinkError e) {
+			e.printStackTrace();
+			System.exit(1);
+		}
+		if (!initialized) {
+			commDriver = new org.eclipse.soda.dk.comm.NSCommDriver();
+			commDriver.initialize();
+			initialized = true;
+		}
+	}
+
+	/**
+	 * Adds <CODE>portName</CODE> to the list of ports.
+	 * 
+	 * @param portName
+	 *            The name of the port being added
+	 * @param portType
+	 *            The type of the port being added
+	 * @param commDriver
+	 *            The driver representing the port being added
+	 * @see javax.comm.CommDriver
+	 * @since CommAPI 1.1
+	 */
+	// TODO: This method is not done yet. CommDriver needs to be registered.
+	// Also the signature is non-standard. Type needs to be added.
+	public static void addPortName(final String portName, final int portType, final CommDriver commDriver) {
+		// what do I do with CommDriver??
+		identifiers.put(portName, new CommPortIdentifier(portName, portType));
+		// name=portName;
+	}
+
+	/**
+	 * Obtains the <CODE>CommPortIdentifier</CODE> object corresponding to a port that has already been opened by the application.
+	 * 
+	 * @param port
+	 *            a CommPort object obtained from a previous open
+	 * @return a CommPortIdentifier object
+	 * @exception NoSuchPortException
+	 *                if the port object is invalid
+	 */
+	public static CommPortIdentifier getPortIdentifier(final CommPort port) throws NoSuchPortException {
+		return CommPortIdentifier.getPortIdentifier(port.getName());
+	}
+
+	/**
+	 * Obtains a <CODE>CommPortIdentifier</CODE> object by using a port name. The port name may have been stored in persistent storage by the application.
+	 * 
+	 * @param portName
+	 *            name of the port to open
+	 * @return a <CODE>CommPortIdentifier</CODE> object
+	 * @exception NoSuchPortException
+	 *                if the port does not exist
+	 */
+	public static CommPortIdentifier getPortIdentifier(final String portName) throws NoSuchPortException {
+		final Object comPortId = identifiers.get(portName);
+		if (comPortId == null) {
+			throw new NoSuchPortException();
+		}
+		return (CommPortIdentifier) comPortId;
+	}
+
+	/**
+	 * Obtains an enumeration object that contains a <CODE>CommPortIdentifier</CODE> object for each port in the system.
+	 * 
+	 * @return an <CODE> Enumeration </CODE> object that can be used to enumerate all the ports known to the system
+	 * @see java.util.Enumeration
+	 */
+	public static Enumeration getPortIdentifiers() {
+		return identifiers.elements();
+	}
+
+	String name = null;
+
+	String currentOwner = null;
+
+	boolean currentlyOwned = false;
+
+	private List listeners;
+
+	CommPort commPort = null;
+
+	int type = 0;
+
+	private CommPortIdentifier(final String id, final int type) {
+		this.name = id;
+		this.type = type;
+		this.listeners = new Vector();
+	}
+
+	/**
+	 * Registers an interested application so that it can receive notification of changes in port ownership. This includes notification of the following events:
+	 * <UL>
+	 * <LI> <CODE>PORT_OWNED</CODE>: Port became owned
+	 * <LI> <CODE>PORT_UNOWNED</CODE>: Port became unowned
+	 * <LI> <CODE>PORT_OWNERSHIP_REQUESTED</CODE>: If the application owns this port and is willing to give up ownership, then it should call <CODE>close</CODE> now.
+	 * </UL>
+	 * The <CODE>ownershipChange</CODE> method of the listener registered using <CODE>addPortOwnershipListener</CODE> will be called with one of the above events.
+	 * 
+	 * @param listener
+	 *            a <CODE>CommPortOwnershipListener</CODE> callback object
+	 */
+	public void addPortOwnershipListener(final CommPortOwnershipListener listener) {
+		if ((listener != null) && !this.listeners.contains(listener)) {
+			this.listeners.add(listener);
+		}
+	}
+
+	/**
+	 * Non-Api method. Called when close() method is called on CommPort object. Required to set port owner to null and propagate CommPortOwnership event.
+	 */
+	public synchronized void closePort() {
+		this.currentlyOwned = false;
+		this.currentOwner = null;
+		this.commPort = null;
+		fireOwnershipEvent(CommPortOwnershipListener.PORT_UNOWNED);
+	}
+
+	/**
+	 * This method needs to be called when ownership of the port changes.
+	 */
+	void fireOwnershipEvent(final int eventType) {
+		for (final Iterator eventListeners = this.listeners.iterator(); eventListeners.hasNext();) {
+			final CommPortOwnershipListener listener = (CommPortOwnershipListener) eventListeners.next();
+			listener.ownershipChange(eventType);
+		}
+	}
+
+	/**
+	 * Returns the owner of the port.
+	 * 
+	 * @return current owner of the port.
+	 */
+	public String getCurrentOwner() {
+		return this.currentOwner;
+		// TODO: Native code needs to check the owner of the port
+	}
+
+	/**
+	 * Returns the name of the port.
+	 * 
+	 * @return the name of the port
+	 */
+	public String getName() {
+		return this.name;
+	}
+
+	/**
+	 * Returns the port type.
+	 * 
+	 * @return portType - PORT_SERIAL or PORT_PARALLEL
+	 */
+	public int getPortType() {
+		return this.type; // CommPortIdentifier.PORT_SERIAL, PORT_PARALLEL is
+		// not implemented;
+	}
+
+	/**
+	 * Non-Api method. Called when close() method is called on CommPort object. Required to set port owner to null and propagate CommPortOwnership event.
+	 */
+	synchronized void internalClosePort() {
+		closePort();
+	}
+
+	/**
+	 * Checks whether the port is owned.
+	 * 
+	 * @return boolean <CODE>true</CODE> if the port is owned by some application, <CODE>false</CODE> if the port is not owned.
+	 */
+	public boolean isCurrentlyOwned() {
+		return this.currentlyOwned;
+		// TODO: Native code needs to check the owner of port
+	}
+
+	/**
+	 * Opens the communications port using a <CODE>FileDescriptor</CODE> object on platforms that support this technique.
+	 * 
+	 * @param fileDescriptor
+	 *            The <CODE>FileDescriptor</CODE> object used to build a <CODE>CommPort</CODE>.
+	 * @return a <CODE>CommPort</CODE> object.
+	 * @exception UnsupportedCommOperationException
+	 *                is thrown on platforms which do not support this functionality.
+	 */
+	public CommPort open(final FileDescriptor fileDescriptor) throws UnsupportedCommOperationException {
+		throw new UnsupportedCommOperationException("Opening port with FileDescriptor is not supported!");
+	}
+
+	/**
+	 * @param appName
+	 * @param timeout
+	 * @return comport
+	 * @throws PortInUseException
+	 */
+	public synchronized CommPort open(final String appName, final int timeout) throws PortInUseException {
+		if (isCurrentlyOwned()) {
+			final PortInUseException piux = new PortInUseException(appName);
+			piux.currentOwner = getCurrentOwner();
+			throw piux;
+		}
+		this.currentOwner = appName;
+		this.currentlyOwned = true;
+		fireOwnershipEvent(CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED);
+		return commDriver.getCommPort(getName(), getPortType());
+	}
+
+	/**
+	 * Deregisters a <CODE>CommPortOwnershipListener</CODE> registered using <CODE>addPortOwnershipListener</CODE>
+	 * 
+	 * @param listener
+	 *            The CommPortOwnershipListener object that was previously registered using addPortOwnershipListener
+	 */
+	public void removePortOwnershipListener(final CommPortOwnershipListener listener) {
+		if (listener != null) {
+			this.listeners.remove(listener);
+		}
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPortOwnershipListener.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPortOwnershipListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a9534fc1cbd83cd7d4822516545dd994d6bd6a1
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/CommPortOwnershipListener.java
@@ -0,0 +1,41 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public interface CommPortOwnershipListener extends EventListener {
+	/**
+	 * Define the port owned (int) constant.
+	 */
+	public static final int PORT_OWNED = 1;
+
+	/**
+	 * Define the port unowned (int) constant.
+	 */
+	public static final int PORT_UNOWNED = 2;
+
+	/**
+	 * Define the port ownership requested (int) constant.
+	 */
+	public static final int PORT_OWNERSHIP_REQUESTED = 3;
+
+	/**
+	 * Ownership change with the specified type parameter.
+	 * @param type	The type (<code>int</code>) parameter.
+	 */
+	public abstract void ownershipChange(final int type);
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/NoSuchPortException.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/NoSuchPortException.java
new file mode 100644
index 0000000000000000000000000000000000000000..4dd2bfab59c08907bffb13df267dd8091e3aaa36
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/NoSuchPortException.java
@@ -0,0 +1,40 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class NoSuchPortException extends Exception {
+	/**
+	 * Define the serial version uid (long) constant.
+	 */
+	private static final long serialVersionUID = 4635426743616819612L;
+
+	/**
+	 * Constructs an instance of this class.
+	 * @see #NoSuchPortException(String)
+	 */
+	public NoSuchPortException() {
+		super();
+	}
+
+	/**
+	 * Constructs an instance of this class from the specified msg parameter.
+	 * @param msg	The msg (<code>String</code>) parameter.
+	 * @see #NoSuchPortException()
+	 */
+	public NoSuchPortException(final String msg) {
+		super(msg);
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPort.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPort.java
new file mode 100644
index 0000000000000000000000000000000000000000..6907526a1d407494c90f44acaf29bb1db90a81e3
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPort.java
@@ -0,0 +1,145 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public abstract class ParallelPort extends CommPort {
+	/**
+	 * Define the lpt mode any (int) constant.
+	 */
+	public static final int LPT_MODE_ANY = 0;
+
+	/**
+	 * Define the lpt mode spp (int) constant.
+	 */
+	public static final int LPT_MODE_SPP = 1;
+
+	/**
+	 * Define the lpt mode ps2 (int) constant.
+	 */
+	public static final int LPT_MODE_PS2 = 2;
+
+	/**
+	 * Define the lpt mode epp (int) constant.
+	 */
+	public static final int LPT_MODE_EPP = 3;
+
+	/**
+	 * Define the lpt mode ecp (int) constant.
+	 */
+	public static final int LPT_MODE_ECP = 4;
+
+	/**
+	 * Define the lpt mode nibble (int) constant.
+	 */
+	public static final int LPT_MODE_NIBBLE = 5;
+
+	/**
+	 * Constructs an instance of this class.
+	 */
+	protected ParallelPort() {
+		super();
+	}
+
+	/**
+	 * Add event listener with the specified lsnr parameter.
+	 * @param lsnr	The lsnr (<code>ParallelPortEventListener</code>) parameter.
+	 * @throws TooManyListenersException Too Many Listeners Exception.
+	 * @see #removeEventListener()
+	 */
+	public abstract void addEventListener(final ParallelPortEventListener lsnr) throws TooManyListenersException;
+
+	/**
+	 * Gets the mode (int) value.
+	 * @return	The mode (<code>int</code>) value.
+	 * @see #setMode(int)
+	 */
+	public abstract int getMode();
+
+	/**
+	 * Gets the output buffer free (int) value.
+	 * @return	The output buffer free (<code>int</code>) value.
+	 */
+	public abstract int getOutputBufferFree();
+
+	/**
+	 * Gets the paper out (boolean) value.
+	 * @return	The paper out (<code>boolean</code>) value.
+	 */
+	public abstract boolean isPaperOut();
+
+	/**
+	 * Gets the printer busy (boolean) value.
+	 * @return	The printer busy (<code>boolean</code>) value.
+	 */
+	public abstract boolean isPrinterBusy();
+
+	/**
+	 * Gets the printer error (boolean) value.
+	 * @return	The printer error (<code>boolean</code>) value.
+	 */
+	public abstract boolean isPrinterError();
+
+	/**
+	 * Gets the printer selected (boolean) value.
+	 * @return	The printer selected (<code>boolean</code>) value.
+	 */
+	public abstract boolean isPrinterSelected();
+
+	/**
+	 * Gets the printer timed out (boolean) value.
+	 * @return	The printer timed out (<code>boolean</code>) value.
+	 */
+	public abstract boolean isPrinterTimedOut();
+
+	/**
+	 * Notify on buffer with the specified notify parameter.
+	 * @param notify	The notify (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnBuffer(final boolean notify);
+
+	/**
+	 * Notify on error with the specified notify parameter.
+	 * @param notify	The notify (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnError(final boolean notify);
+
+	/**
+	 * Remove event listener.
+	 * @see #addEventListener(ParallelPortEventListener)
+	 */
+	public abstract void removeEventListener();
+
+	/**
+	 * Restart.
+	 */
+	public abstract void restart();
+
+	/**
+	 * Sets the mode value.
+	 * @param mode	The mode (<code>int</code>) parameter.
+	 * @return	The mode (<code>int</code>) value.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #getMode()
+	 */
+	public abstract int setMode(final int mode) throws UnsupportedCommOperationException;
+
+	/**
+	 * Suspend.
+	 */
+	public abstract void suspend();
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPortEvent.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPortEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1187f6202a5cbb66c4d325ffb99730b9a0be418
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPortEvent.java
@@ -0,0 +1,88 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class ParallelPortEvent extends EventObject {
+	/**
+	 * Define the serial version uid (long) constant.
+	 */
+	private static final long serialVersionUID = 3956965758537808226L;
+
+	/**
+	 * Define the par ev error (int) constant.
+	 */
+	public static final int PAR_EV_ERROR = 1;
+
+	/**
+	 * Define the par ev buffer (int) constant.
+	 */
+	public static final int PAR_EV_BUFFER = 2;
+
+	/**
+	 * Define the event type (int) field.
+	 */
+	public int eventType;
+
+	/**
+	 * Define the new val (boolean) field.
+	 */
+	private boolean newVal;
+
+	/**
+	 * Define the old val (boolean) field.
+	 */
+	private boolean oldVal;
+
+	/**
+	 * Constructs an instance of this class from the specified srcport, eventtype, oldvalue and newvalue parameters.
+	 * @param srcport	The srcport (<code>ParallelPort</code>) parameter.
+	 * @param eventtype	The eventtype (<code>int</code>) parameter.
+	 * @param oldvalue	The oldvalue (<code>boolean</code>) parameter.
+	 * @param newvalue	The newvalue (<code>boolean</code>) parameter.
+	 */
+	public ParallelPortEvent(final ParallelPort srcport, final int eventtype, final boolean oldvalue, final boolean newvalue) {
+		super(srcport);
+		this.eventType = eventtype;
+		this.newVal = newvalue;
+		this.oldVal = oldvalue;
+	}
+
+	/**
+	 * Gets the event type (int) value.
+	 * @return	The event type (<code>int</code>) value.
+	 */
+	public int getEventType() {
+		return this.eventType;
+	}
+
+	/**
+	 * Gets the new value (boolean) value.
+	 * @return	The new value (<code>boolean</code>) value.
+	 */
+	public boolean getNewValue() {
+		return this.newVal;
+	}
+
+	/**
+	 * Gets the old value (boolean) value.
+	 * @return	The old value (<code>boolean</code>) value.
+	 */
+	public boolean getOldValue() {
+		return this.oldVal;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPortEventListener.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPortEventListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..a10ba645bc784ae0584e44fc45fb0357e66ce876
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/ParallelPortEventListener.java
@@ -0,0 +1,26 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public interface ParallelPortEventListener extends EventListener {
+	/**
+	 * Parallel event with the specified ev parameter.
+	 * @param ev	The ev (<code>ParallelPortEvent</code>) parameter.
+	 */
+	public abstract void parallelEvent(final ParallelPortEvent ev);
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/PortInUseException.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/PortInUseException.java
new file mode 100644
index 0000000000000000000000000000000000000000..287e14e8fafd747b0544d4a77ab09061efba5d80
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/PortInUseException.java
@@ -0,0 +1,36 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class PortInUseException extends Exception {
+	/**
+	 * Define the serial version uid (long) constant.
+	 */
+	private static final long serialVersionUID = -2619871379515236575L;
+
+	/**
+	 * Define the current owner (String) field.
+	 */
+	public String currentOwner;
+
+	/**
+	 * Constructs an instance of this class from the specified co parameter.
+	 * @param co	The co (<code>String</code>) parameter.
+	 */
+	public PortInUseException(final String co) {
+		this.currentOwner = co;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPort.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPort.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac2f35dafbb9bb78102ac50f936de288bcc89c28
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPort.java
@@ -0,0 +1,303 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public abstract class SerialPort extends CommPort {
+	/**
+	 * Define the databits5 (int) constant.
+	 */
+	public static final int DATABITS_5 = 5;
+
+	/**
+	 * Define the databits6 (int) constant.
+	 */
+	public static final int DATABITS_6 = 6;
+
+	/**
+	 * Define the databits7 (int) constant.
+	 */
+	public static final int DATABITS_7 = 7;
+
+	/**
+	 * Define the databits8 (int) constant.
+	 */
+	public static final int DATABITS_8 = 8;
+
+	/**
+	 * Define the stopbits1 (int) constant.
+	 */
+	public static final int STOPBITS_1 = 1;
+
+	/**
+	 * Define the stopbits2 (int) constant.
+	 */
+	public static final int STOPBITS_2 = 2;
+
+	/**
+	 * Define the stopbits15 (int) constant.
+	 */
+	public static final int STOPBITS_1_5 = 3;
+
+	/**
+	 * Define the parity none (int) constant.
+	 */
+	public static final int PARITY_NONE = 0;
+
+	/**
+	 * Define the parity odd (int) constant.
+	 */
+	public static final int PARITY_ODD = 1;
+
+	/**
+	 * Define the parity even (int) constant.
+	 */
+	public static final int PARITY_EVEN = 2;
+
+	/**
+	 * Define the parity mark (int) constant.
+	 */
+	public static final int PARITY_MARK = 3;
+
+	/**
+	 * Define the parity space (int) constant.
+	 */
+	public static final int PARITY_SPACE = 4;
+
+	/**
+	 * Define the flowcontrol none (int) constant.
+	 */
+	public static final int FLOWCONTROL_NONE = 0;
+
+	/**
+	 * Define the flowcontrol rtscts in (int) constant.
+	 */
+	public static final int FLOWCONTROL_RTSCTS_IN = 1;
+
+	/**
+	 * Define the flowcontrol rtscts out (int) constant.
+	 */
+	public static final int FLOWCONTROL_RTSCTS_OUT = 2;
+
+	/**
+	 * Define the flowcontrol xonxoff in (int) constant.
+	 */
+	public static final int FLOWCONTROL_XONXOFF_IN = 4;
+
+	/**
+	 * Define the flowcontrol xonxoff out (int) constant.
+	 */
+	public static final int FLOWCONTROL_XONXOFF_OUT = 8;
+
+	/**
+	 * Constructs an instance of this class.
+	 */
+	protected SerialPort() {
+		super();
+	}
+
+	/**
+	 * Add event listener with the specified lsnr parameter.
+	 * @param lsnr	The lsnr (<code>SerialPortEventListener</code>) parameter.
+	 * @throws TooManyListenersException Too Many Listeners Exception.
+	 * @see #removeEventListener()
+	 */
+	public abstract void addEventListener(final SerialPortEventListener lsnr) throws TooManyListenersException;
+
+	/**
+	 * Gets the baud rate (int) value.
+	 * @return	The baud rate (<code>int</code>) value.
+	 */
+	public abstract int getBaudRate();
+
+	/**
+	 * Gets the data bits (int) value.
+	 * @return	The data bits (<code>int</code>) value.
+	 */
+	public abstract int getDataBits();
+
+	/**
+	 * Gets the flow control mode (int) value.
+	 * @return	The flow control mode (<code>int</code>) value.
+	 * @see #setFlowControlMode(int)
+	 */
+	public abstract int getFlowControlMode();
+
+	/**
+	 * Gets the parity (int) value.
+	 * @return	The parity (<code>int</code>) value.
+	 */
+	public abstract int getParity();
+
+	/**
+	 * Gets the stop bits (int) value.
+	 * @return	The stop bits (<code>int</code>) value.
+	 */
+	public abstract int getStopBits();
+
+	/**
+	 * Gets the cd (boolean) value.
+	 * @return	The cd (<code>boolean</code>) value.
+	 */
+	public abstract boolean isCD();
+
+	/**
+	 * Gets the cts (boolean) value.
+	 * @return	The cts (<code>boolean</code>) value.
+	 * @see #notifyOnCTS(boolean)
+	 */
+	public abstract boolean isCTS();
+
+	/**
+	 * Gets the dsr (boolean) value.
+	 * @return	The dsr (<code>boolean</code>) value.
+	 * @see #notifyOnDSR(boolean)
+	 */
+	public abstract boolean isDSR();
+
+	/**
+	 * Gets the dtr (boolean) value.
+	 * @return	The dtr (<code>boolean</code>) value.
+	 * @see #setDTR(boolean)
+	 */
+	public abstract boolean isDTR();
+
+	/**
+	 * Gets the ri (boolean) value.
+	 * @return	The ri (<code>boolean</code>) value.
+	 */
+	public abstract boolean isRI();
+
+	/**
+	 * Gets the rts (boolean) value.
+	 * @return	The rts (<code>boolean</code>) value.
+	 * @see #setRTS(boolean)
+	 */
+	public abstract boolean isRTS();
+
+	/**
+	 * Notify on break interrupt with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnBreakInterrupt(final boolean enable);
+
+	/**
+	 * Notify on cts with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnCTS(final boolean enable);
+
+	/**
+	 * Notify on carrier detect with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnCarrierDetect(final boolean enable);
+
+	/**
+	 * Notify on dsr with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnDSR(final boolean enable);
+
+	/**
+	 * Notify on data available with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnDataAvailable(final boolean enable);
+
+	/**
+	 * Notify on framing error with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnFramingError(final boolean enable);
+
+	/**
+	 * Notify on output empty with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnOutputEmpty(final boolean enable);
+
+	/**
+	 * Notify on overrun error with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnOverrunError(final boolean enable);
+
+	/**
+	 * Notify on parity error with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnParityError(final boolean enable);
+
+	/**
+	 * Notify on ring indicator with the specified enable parameter.
+	 * @param enable	The enable (<code>boolean</code>) parameter.
+	 */
+	public abstract void notifyOnRingIndicator(final boolean enable);
+
+	/**
+	 * Remove event listener.
+	 * @see #addEventListener(SerialPortEventListener)
+	 */
+	public abstract void removeEventListener();
+
+	/**
+	 * Send break with the specified millis parameter.
+	 * @param millis	The millis (<code>int</code>) parameter.
+	 */
+	public abstract void sendBreak(final int millis);
+
+	/**
+	 * Sets the dtr value.
+	 * @param dtr	The dtr (<code>boolean</code>) parameter.
+	 * @see #isDTR()
+	 */
+	public abstract void setDTR(final boolean dtr);
+
+	/**
+	 * Sets the flow control mode value.
+	 * @param flowcontrol	The flowcontrol (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #getFlowControlMode()
+	 */
+	public abstract void setFlowControlMode(final int flowcontrol) throws UnsupportedCommOperationException;
+
+	/**
+	 * Sets the rts value.
+	 * @param rts	The rts (<code>boolean</code>) parameter.
+	 * @see #isRTS()
+	 */
+	public abstract void setRTS(final boolean rts);
+
+	/**
+	 * Sets the rcv fifo trigger value.
+	 * @param trigger	The trigger (<code>int</code>) parameter.
+	 */
+	public void setRcvFifoTrigger(final int trigger) {
+		/* do nothing */
+	}
+
+	/**
+	 * Set serial port params with the specified baudrate, data bits, stop bits and parity parameters.
+	 * @param baudrate	The baudrate (<code>int</code>) parameter.
+	 * @param dataBits	The data bits (<code>int</code>) parameter.
+	 * @param stopBits	The stop bits (<code>int</code>) parameter.
+	 * @param parity	The parity (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 */
+	public abstract void setSerialPortParams(final int baudrate, final int dataBits, final int stopBits, final int parity) throws UnsupportedCommOperationException;
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortEvent.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..d53dd0603a683ee7199b268d98a938fae53ff19a
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortEvent.java
@@ -0,0 +1,128 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class SerialPortEvent extends EventObject {
+	/**
+	 * Define the serial version uid (long) constant.
+	 */
+	private static final long serialVersionUID = 8913102891237934499L;
+
+	/**
+	 * Define the data available (int) constant.
+	 */
+	public static final int DATA_AVAILABLE = 1;
+
+	/**
+	 * Define the output buffer empty (int) constant.
+	 */
+	public static final int OUTPUT_BUFFER_EMPTY = 2;
+
+	/**
+	 * Define the cts (int) constant.
+	 */
+	public static final int CTS = 3;
+
+	/**
+	 * Define the dsr (int) constant.
+	 */
+	public static final int DSR = 4;
+
+	/**
+	 * Define the ri (int) constant.
+	 */
+	public static final int RI = 5;
+
+	/**
+	 * Define the cd (int) constant.
+	 */
+	public static final int CD = 6;
+
+	/**
+	 * Define the oe (int) constant.
+	 */
+	public static final int OE = 7;
+
+	/**
+	 * Define the pe (int) constant.
+	 */
+	public static final int PE = 8;
+
+	/**
+	 * Define the fe (int) constant.
+	 */
+	public static final int FE = 9;
+
+	/**
+	 * Define the bi (int) constant.
+	 */
+	public static final int BI = 10;
+
+	/**
+	 * Define the event type (int) field.
+	 */
+	public int eventType;
+
+	/**
+	 * Define the new val (boolean) field.
+	 */
+	private boolean newVal;
+
+	/**
+	 * Define the old val (boolean) field.
+	 */
+	private boolean oldVal;
+
+	/**
+	 * Constructs an instance of this class from the specified srcport, eventtype, oldvalue and newvalue parameters.
+	 * @param srcport	The srcport (<code>SerialPort</code>) parameter.
+	 * @param eventtype	The eventtype (<code>int</code>) parameter.
+	 * @param oldvalue	The oldvalue (<code>boolean</code>) parameter.
+	 * @param newvalue	The newvalue (<code>boolean</code>) parameter.
+	 */
+	public SerialPortEvent(final SerialPort srcport, final int eventtype, final boolean oldvalue, final boolean newvalue) {
+		super(srcport);
+		this.eventType = eventtype;
+		this.newVal = newvalue;
+		this.oldVal = oldvalue;
+	}
+
+	/**
+	 * Gets the event type (int) value.
+	 * @return	The event type (<code>int</code>) value.
+	 */
+	public int getEventType() {
+		return this.eventType;
+	}
+
+	/**
+	 * Gets the new value (boolean) value.
+	 * @return	The new value (<code>boolean</code>) value.
+	 */
+	public boolean getNewValue() {
+		return this.newVal;
+	}
+
+	/**
+	 * Gets the old value (boolean) value.
+	 * @return	The old value (<code>boolean</code>) value.
+	 */
+	public boolean getOldValue() {
+		return this.oldVal;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortEventListener.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortEventListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..02dfb400cd17d5afad32d80dd0c03c3a8a312a94
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortEventListener.java
@@ -0,0 +1,26 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public interface SerialPortEventListener extends EventListener {
+	/**
+	 * Serial event with the specified ev parameter.
+	 * @param ev	The ev (<code>SerialPortEvent</code>) parameter.
+	 */
+	public abstract void serialEvent(final SerialPortEvent ev);
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortException.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortException.java
new file mode 100644
index 0000000000000000000000000000000000000000..673aca7baa3e752d8a5003840837a2cdf275c211
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/SerialPortException.java
@@ -0,0 +1,31 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class SerialPortException extends Exception {
+	/**
+	 * Define the serial version uid (long) constant.
+	 */
+	private static final long serialVersionUID = 1409005327231826071L;
+
+	/**
+	 * Constructs an instance of this class from the specified msg parameter.
+	 * @param msg	The msg (<code>String</code>) parameter.
+	 */
+	public SerialPortException(final String msg) {
+		super(msg);
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/UnsupportedCommOperationException.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/UnsupportedCommOperationException.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9b5a4823795abb5dbc0b679e2e9c936b43e0cfd
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/UnsupportedCommOperationException.java
@@ -0,0 +1,40 @@
+package javax.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class UnsupportedCommOperationException extends Exception {
+	/**
+	 * Define the serial version uid (long) constant.
+	 */
+	private static final long serialVersionUID = -1653996043267525578L;
+
+	/**
+	 * Constructs an instance of this class.
+	 * @see #UnsupportedCommOperationException(String)
+	 */
+	public UnsupportedCommOperationException() {
+		super();
+	}
+
+	/**
+	 * Constructs an instance of this class from the specified str parameter.
+	 * @param str	The str (<code>String</code>) parameter.
+	 * @see #UnsupportedCommOperationException()
+	 */
+	public UnsupportedCommOperationException(final String str) {
+		super(str);
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/package.html b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ea4f6870e0685f948b99a71a1deae7e90d5c564
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/javax/comm/package.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "..//W3C/DTD XHTML 1.0 Strict/EN"  DTD/xhtml-strict.dtd">
+<!-- Copyright (c) 2008, 2009 IBM.                                         -->
+<!-- All rights reserved. This program and the accompanying materials      -->
+<!-- are made available under the terms of the Eclipse Public License v1.0 -->
+<!-- which accompanies this distribution, and is available at              -->
+<!-- http://www.eclipse.org/legal/epl-v10.html                             -->
+<!--                                                                       -->
+<!-- Contributors:                                                         -->
+<!--     IBM - initial API and implementation                              -->
+    
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+		<meta name="Security" content="public"/>
+		<meta name="Copyright" content="Copyright (c) 2009 IBM. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page."/>
+		<meta scheme="rfc1766" name="DC.Language" content="en-us"/>
+		<meta name="Keywords" content="javax.comm, org.eclipse.soda.dk.comm"/>
+		<link rel="STYLESHEET" href="stylesheet.css" charset="UTF-8" type="text/css"/>		
+		<title>javax.comm Package</title>
+	</head>
+	<body>
+		<p>This package is part of the org.eclipse.soda.dk.comm project.</p> 
+	</body>
+</html>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/DeviceList.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/DeviceList.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cd588011ec117d048a15d5c9604b2b8af59f493
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/DeviceList.java
@@ -0,0 +1,23 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class DeviceList {
+	/**
+	 * Define the head entry (DeviceListEntry) field.
+	 */
+	DeviceListEntry headEntry = null;
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/DeviceListEntry.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/DeviceListEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..42501c904d2f9934f626c52e85aa8b5403e389d6
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/DeviceListEntry.java
@@ -0,0 +1,48 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class DeviceListEntry {
+	/**
+	 * Define the logical name (String) field.
+	 */
+	String logicalName;
+
+	/**
+	 * Define the physical name (String) field.
+	 */
+	String physicalName;
+
+	/**
+	 * Define the port type (int) field.
+	 */
+	int portType;
+
+	/**
+	 * Define the sem id (int) field.
+	 */
+	int semID;
+
+	/**
+	 * Define the opened (boolean) field.
+	 */
+	boolean opened;
+
+	/**
+	 * Define the next (DeviceListEntry) field.
+	 */
+	DeviceListEntry next;
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSCommDriver.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSCommDriver.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5de04c4efc0f34f02f143f396eab7a674bc10ea
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSCommDriver.java
@@ -0,0 +1,136 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.io.IOException;
+import javax.comm.CommDriver;
+import javax.comm.CommPort;
+import javax.comm.CommPortIdentifier;
+import org.eclipse.soda.dk.comm.internal.Library;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class NSCommDriver implements CommDriver {
+	static {
+		try {
+			Library.load_dkcomm();
+		} catch (final UnsatisfiedLinkError exception) {
+			exception.printStackTrace();
+		}
+	}
+
+	/**
+	 * Define the device list (DeviceList) field.
+	 */
+	DeviceList devicelist = new DeviceList();
+
+	/**
+	 * Add device to list with the specified port name, port type, device name and sem id parameters.
+	 * @param portName
+	 *		The port name (<code>String</code>) parameter.
+	 * @param portType
+	 *		The port type (<code>int</code>) parameter.
+	 * @param deviceName
+	 *		The device name (<code>String</code>) parameter.
+	 * @param semID
+	 *		The sem ID (<code>int</code>) parameter.
+	 */
+	protected void addDeviceToList(final String portName, final int portType, final String deviceName, final int semID) {
+		DeviceListEntry cur = this.devicelist.headEntry;
+		DeviceListEntry prev = null;
+		while (cur != null) {
+			prev = cur;
+			cur = cur.next;
+		}
+		cur = new DeviceListEntry();
+		cur.logicalName = portName;
+		cur.physicalName = deviceName;
+		cur.portType = portType;
+		cur.semID = semID;
+		cur.next = null;
+		if (prev == null) {
+			this.devicelist.headEntry = cur;
+		} else {
+			prev.next = cur;
+		}
+	}
+
+	/**
+	 * Discover devices nc.
+	 */
+	private native void discoverDevicesNC();
+
+	/**
+	 * Get comm port with the specified port name and port type parameters and return the CommPort result.
+	 * @param portName
+	 *		The port name (<code>String</code>) parameter.
+	 * @param portType
+	 *		The port type (<code>int</code>) parameter.
+	 * @return Results of the get comm port (<code>CommPort</code>) value.
+	 */
+	public CommPort getCommPort(final String portName, final int portType) {
+		CommPort port = null;
+		try {
+			switch (portType) {
+			case CommPortIdentifier.PORT_SERIAL:
+				port = new NSSerialPort(portName, this);
+				break;
+			case CommPortIdentifier.PORT_PARALLEL:
+				port = new NSParallelPort(portName, this);
+				break;
+			}
+		} catch (final IOException exception) {
+			exception.printStackTrace();
+			/* port is being used by another app? */
+		}
+		return port;
+	}
+
+	/**
+	 * Gets the first dle (DeviceListEntry) value.
+	 * @return The first dle (<code>DeviceListEntry</code>) value.
+	 */
+	DeviceListEntry getFirstDLE() {
+		return this.devicelist.headEntry;
+	}
+
+	/**
+	 * Get next dle with the specified dle parameter and return the DeviceListEntry result.
+	 * @param dle
+	 *		The dle (<code>DeviceListEntry</code>) parameter.
+	 * @return Results of the get next dle (<code>DeviceListEntry</code>) value.
+	 */
+	DeviceListEntry getNextDLE(final DeviceListEntry dle) {
+		DeviceListEntry cur = this.devicelist.headEntry;
+		DeviceListEntry ndle = null;
+		while (cur != null) {
+			if (cur == dle) {
+				ndle = cur.next;
+				break;
+			}
+			cur = cur.next;
+		}
+		return ndle;
+	}
+
+	/**
+	 * Initialize.
+	 */
+	public void initialize() {
+		discoverDevicesNC();
+		for (DeviceListEntry cur = getFirstDLE(); cur != null; cur = getNextDLE(cur)) {
+			CommPortIdentifier.addPortName(cur.logicalName, cur.portType, this);
+		}
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSDeviceInputStream.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSDeviceInputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8e2c70e8e161cd6e719daa689e37ae132a53c7d
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSDeviceInputStream.java
@@ -0,0 +1,209 @@
+package org.eclipse.soda.dk.comm;
+
+/*******************************************************************************
+ * Copyright (c) 1999, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.comm.CommPort;
+import javax.comm.CommPortIdentifier;
+
+/**
+ * @author IBM
+ */
+public class NSDeviceInputStream extends InputStream {
+// -----------------------------------------------------------------------------
+// Variables
+// -----------------------------------------------------------------------------
+	int fd = -1;
+
+	private int bufsize = 0;
+
+	private int readCount = 0; // read by the app
+
+	private int bufferCount = 0; // read by this object from the device
+
+	private int thc = -1; // threshold value from serial/parallel ports
+
+	private int tmo = -1; // timeout value from serial/parallel ports
+
+	private boolean tmoDone = false; // timeout occurred?
+
+	private NSSerialPort sp = null;
+
+	private NSParallelPort pp = null;
+
+	private byte[] buffer = null; // size equivalent to insBufferSize
+
+	// of NSSerialPort or NSParallelPort
+// -----------------------------------------------------------------------------
+// Methods - constructors
+// -----------------------------------------------------------------------------
+	NSDeviceInputStream(final CommPort port, final int portType) {
+		if (portType == CommPortIdentifier.PORT_PARALLEL) {
+			this.pp = (NSParallelPort) port;
+			this.bufsize = this.pp.insBufferSize;
+			this.thc = this.pp.rcvThreshold;
+		} else {
+			this.sp = (NSSerialPort) port;
+			this.bufsize = this.sp.insBufferSize;
+			this.thc = this.sp.rcvThreshold;
+		}
+		this.buffer = new byte[this.bufsize];
+	}
+
+// -----------------------------------------------------------------------------
+// Methods - public
+// -----------------------------------------------------------------------------
+	public int available() throws IOException {
+		int rc;
+		int nbc = 0; // no of bytes that can be read without blocking
+		// Check to see if any data is in our internal buffer first.
+		if (this.bufferCount > this.readCount) {
+			nbc += this.bufferCount - this.readCount;
+		}
+		// Now query the device to see if any and how much data is pending
+		// to be read.
+		rc = getReadCountNC();
+		if (rc > 0) {
+			nbc += rc;
+		}
+		return nbc;
+	}
+
+	private native int getReadCountNC() throws IOException;
+
+	public int read() throws IOException {
+		int rc;
+		// If there is data already read from the device and buffered up,
+		// pick up one byte from it. If not, read it from the device.
+		if (this.bufferCount > this.readCount) {
+			rc = this.buffer[this.readCount++];
+			if (this.readCount == this.bufferCount) {
+				this.readCount = this.bufferCount = 0;
+			}
+		} else {
+			// Obtain the timeout trigger value.
+			if (this.pp != null) {
+				this.tmo = this.pp.rcvTimeout;
+			} else if (this.sp != null) {
+				this.tmo = this.sp.rcvTimeout;
+			}
+			rc = readDeviceOneByteNC(); // throws IOException
+		}
+		return rc;
+	}
+
+	public int read(final byte b[]) throws IOException {
+		return read(b, 0, b.length); // throws IOException
+	}
+
+// -----------------------------------------------------------------------------
+// Methods - private
+// -----------------------------------------------------------------------------
+	public int read(final byte b[], final int off, final int len) throws IOException {
+		int toff = off;
+		int tlen = len;
+		int rc;
+		boolean excflag = false;
+		int rdc = 0;
+		// Determine the minimum of length and threshold (if set).
+		if (this.pp != null) {
+			this.thc = this.pp.rcvThreshold;
+			this.tmo = this.pp.rcvTimeout;
+		} else if (this.sp != null) {
+			this.thc = this.sp.rcvThreshold;
+			this.tmo = this.sp.rcvTimeout;
+		}
+		if ((this.thc > 0) && (this.thc < tlen)) {
+			tlen = this.thc;
+		}
+		// If buffer size is 0, then no buffering is to be done.
+		if (this.bufsize == 0) {
+			this.readCount = this.bufferCount = 0;
+			while (tlen != 0) {
+				this.tmoDone = false;
+				rc = readDeviceNC(b, toff, tlen);
+				if (rc < 0) {
+					excflag = true;
+					break;
+				}
+				toff += rc;
+				tlen -= rc;
+				rdc += rc;
+				// If no data had been received this time, discontinue.
+				if (rc == 0) {
+					break;
+				}
+				// If threshold is never set, we're done with whatever
+				// we got so far.
+				if (this.thc < 0) {
+					break;
+				}
+				// If timeout is enabled and timeout occurred,
+				// discontinue.
+				if ((this.tmo > 0) && this.tmoDone) {
+					break;
+				}
+			} // end of while
+		} else {
+			while (tlen != 0) {
+				int cc;
+				this.tmoDone = false;
+				// if no data in the buffer, get some data.
+				if (this.bufferCount == 0) {
+					this.readCount = 0;
+					rc = readDeviceNC(this.buffer, 0, this.bufsize);
+					if (rc < 0) {
+						excflag = true;
+						break;
+					}
+					this.bufferCount = rc;
+					// If no data had been received this time,
+					// discontinue.
+					if (rc == 0) {
+						break;
+					}
+				}
+				// Copy the buffered up data.
+				cc = tlen <= this.bufferCount - this.readCount ? tlen : this.bufferCount - this.readCount;
+				System.arraycopy(this.buffer, this.readCount, b, toff, cc);
+				toff += cc;
+				tlen -= cc;
+				this.readCount += cc;
+				rdc += cc;
+				if (this.readCount == this.bufferCount) {
+					this.readCount = this.bufferCount = 0;
+				}
+				// If threshold is never set, we're done with whatever
+				// we got so far.
+				if (this.thc < 0) {
+					break;
+				}
+				// If timeout is enabled and timeout occurred,
+				// discontinue.
+				if ((this.tmo > 0) && this.tmoDone) {
+					break;
+				}
+			} // end of while
+		}
+		if (excflag) {
+			final IOException e = new IOException();
+			throw e;
+		}
+		return rdc;
+	}
+
+	private native int readDeviceNC(byte buf[], int offset, int nBytes);
+
+	// private native int setFDNC();
+	private native int readDeviceOneByteNC() throws IOException;
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSDeviceOutputStream.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSDeviceOutputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f5cacbae0c749e5a98008e00bb2ac7a9fc754e8
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSDeviceOutputStream.java
@@ -0,0 +1,203 @@
+package org.eclipse.soda.dk.comm;
+
+/*******************************************************************************
+ * Copyright (c) 1999, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.comm.CommPort;
+import javax.comm.CommPortIdentifier;
+import javax.comm.ParallelPortEvent;
+import javax.comm.SerialPortEvent;
+
+/**
+ * @author IBM
+ */
+public class NSDeviceOutputStream extends OutputStream {
+// -----------------------------------------------------------------------------
+// Variables
+// -----------------------------------------------------------------------------
+	int fd = -1;
+
+	private int pt; // determines whether to use sp or pp; 1 = p, 2 = s
+
+	private int bufsize;
+
+	private NSSerialPort sp = null;
+
+	private NSParallelPort pp = null;
+
+	private byte[] buffer = null; // size equivalent to insBufferSize
+
+	// of NSSerialPort or NSParallelPort
+// -----------------------------------------------------------------------------
+// Methods - constructors
+// -----------------------------------------------------------------------------
+	NSDeviceOutputStream(final CommPort port, final int portType) {
+		if (portType == CommPortIdentifier.PORT_PARALLEL) {
+			this.pt = 1;
+			this.pp = (NSParallelPort) port;
+			this.bufsize = this.pp.outsBufferSize;
+		} else {
+			this.pt = 2;
+			this.sp = (NSSerialPort) port;
+			this.bufsize = this.sp.outsBufferSize;
+		}
+		this.buffer = new byte[this.bufsize];
+	}
+
+// -----------------------------------------------------------------------------
+// Methods - public
+// -----------------------------------------------------------------------------
+	public void flush() throws IOException {
+		int rc;
+		int obc = 0;
+		if (this.pp != null) {
+			obc = this.pp.outsBufferCount;
+		} else if (this.sp != null) {
+			obc = this.sp.outsBufferCount;
+		}
+		rc = writeDeviceNC(this.buffer, 0, obc);
+		// If any errors were encountered during writes to the device, throw
+		// an exception.
+		if (rc != obc) {
+			final IOException e = new IOException();
+			throw e;
+		}
+	}
+
+	/**
+	 * @return pt
+	 */
+	public int getPt() {
+		return this.pt;
+	}
+
+	public void write(final byte b[]) throws IOException {
+		write(b, 0, b.length);
+	}
+
+	public void write(final byte b[], final int off, final int len) throws IOException {
+		// ???? How about if data is to be suspended for the parallel port ????
+		int toff = off;
+		int tlen = len;
+		int rc;
+		boolean excflag = false;
+		int obc = 0;
+		final int oldbufsize = this.bufsize;
+		boolean notify = false;
+		this.bufsize = 0;
+		// If buffer size has been changed since the last time, flush out the
+		// current data in the internal buffer.
+		if (this.pp != null) {
+			this.bufsize = this.pp.outsBufferSize;
+			obc = this.pp.outsBufferCount;
+		} else if (this.sp != null) {
+			this.bufsize = this.sp.outsBufferSize;
+			obc = this.sp.outsBufferCount;
+		}
+		if (this.bufsize != oldbufsize) {
+			if (obc != 0) {
+				rc = writeDeviceNC(this.buffer, 0, obc);
+				if (this.pp != null) {
+					this.pp.outsBufferCount = 0;
+				} else if (this.sp != null) {
+					this.sp.outsBufferCount = 0;
+				}
+				if (rc != obc) {
+					excflag = true;
+				}
+			}
+			this.buffer = null; // hopefully this is freed now
+			this.buffer = new byte[this.bufsize];
+		}
+		// If buffer size is 0, then no buffering is to be done.
+		if (this.bufsize == 0) {
+			if (this.pp != null) {
+				this.pp.outsBufferCount = 0;
+			} else if (this.sp != null) {
+				this.sp.outsBufferCount = 0;
+			}
+			rc = writeDeviceNC(b, toff, tlen);
+			if (rc != tlen) {
+				excflag = true;
+			}
+		} else { // save the data internally, and if full, write it out
+			while (tlen != 0) {
+				int wc;
+				if (this.pp != null) {
+					obc = this.pp.outsBufferCount;
+				} else if (this.sp != null) {
+					obc = this.sp.outsBufferCount;
+				}
+				if (obc + tlen >= this.bufsize) {
+					wc = this.bufsize - obc;
+					// save this in buffer and write buffer to dev
+					java.lang.System.arraycopy(b, toff, this.buffer, obc, wc);
+					rc = writeDeviceNC(this.buffer, 0, this.bufsize);
+					if (this.pp != null) {
+						this.pp.outsBufferCount = 0;
+					} else if (this.sp != null) {
+						this.sp.outsBufferCount = 0;
+					}
+					if (rc != this.bufsize) {
+						excflag = true;
+						break;
+					}
+				} else {
+					wc = tlen;
+					// save this in buffer
+					java.lang.System.arraycopy(b, toff, this.buffer, obc, wc);
+					if (this.pp != null) {
+						this.pp.outsBufferCount += wc;
+					} else if (this.sp != null) {
+						this.sp.outsBufferCount += wc;
+					}
+				}
+				toff += wc;
+				tlen -= wc;
+			}
+		}
+		// If any errors were encountered during writes to the device, throw
+		// an exception.
+		if (excflag) {
+			final IOException e = new IOException();
+			throw e;
+		}
+		// If the internal buffer has been drained out to the device, send
+		// a corresponding event, if notification is set.
+		if (this.pp != null) {
+			obc = this.pp.outsBufferCount;
+			notify = this.pp.notifyOnBufferFlag;
+		} else if (this.sp != null) {
+			obc = this.sp.outsBufferCount;
+			notify = this.sp.notifyOnBufferFlag;
+		}
+		if (notify && (obc == 0)) {
+			if (this.pp != null) {
+				this.pp.reportParallelEvent(ParallelPortEvent.PAR_EV_BUFFER, false, true);
+			} else if (this.sp != null) {
+				this.sp.reportSerialEvent(SerialPortEvent.OUTPUT_BUFFER_EMPTY, false, true);
+			}
+		}
+	}
+
+	public void write(final int i) throws IOException {
+		final byte b[] = new byte[1];
+		b[0] = (byte) (i & 0xff);
+		write(b, 0, 1);
+	}
+
+// -----------------------------------------------------------------------------
+// Methods - private
+// -----------------------------------------------------------------------------
+	private native int writeDeviceNC(byte buf[], int offset, int nBytes);
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSParallelPort.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSParallelPort.java
new file mode 100644
index 0000000000000000000000000000000000000000..04be6cc2d2c59f320b17c3962660841d68624e69
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSParallelPort.java
@@ -0,0 +1,631 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import javax.comm.*;
+import java.io.*;
+import java.util.*;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class NSParallelPort extends ParallelPort {
+	/**
+	 * Define the lpt mode any (int) constant.
+	 */
+	public static final int LPT_MODE_ANY = 0;
+
+	/**
+	 * Define the lpt mode spp (int) constant.
+	 */
+	public static final int LPT_MODE_SPP = 1;
+
+	/**
+	 * Define the lpt mode ps2 (int) constant.
+	 */
+	public static final int LPT_MODE_PS2 = 2;
+
+	/**
+	 * Define the lpt mode epp (int) constant.
+	 */
+	public static final int LPT_MODE_EPP = 3;
+
+	/**
+	 * Define the lpt mode ecp (int) constant.
+	 */
+	public static final int LPT_MODE_ECP = 4;
+
+	/**
+	 * Define the lpt mode nibble (int) constant.
+	 */
+	public static final int LPT_MODE_NIBBLE = 5;
+
+	/**
+	 * Define the mode (int) field.
+	 */
+	private int mode = LPT_MODE_SPP; // only SPP mode is supported at this time
+
+	/**
+	 * Define the fd (int) field.
+	 */
+	int fd = -1; // file descriptor for the open device
+
+	/**
+	 * Define the fd (FileDescriptor) field.
+	 */
+	FileDescriptor FD = null; // FileDescriptor for the open device
+
+	/**
+	 * Define the ins (NSDeviceInputStream) field.
+	 */
+	private NSDeviceInputStream ins = null;
+
+	/**
+	 * Define the outs (NSDeviceOutputStream) field.
+	 */
+	private NSDeviceOutputStream outs = null;
+
+	/**
+	 * Define the rcv threshold (int) field.
+	 */
+	int rcvThreshold = -1;
+
+	/**
+	 * Define the rcv timeout (int) field.
+	 */
+	int rcvTimeout = -1;
+
+	/**
+	 * Define the rcv framing (boolean) field.
+	 */
+	boolean rcvFraming = false;
+
+	/**
+	 * Define the rcv framing byte (int) field.
+	 */
+	int rcvFramingByte;
+
+	/**
+	 * Define the rcv framing byte received (boolean) field.
+	 */
+	boolean rcvFramingByteReceived;
+
+	/**
+	 * Disable read buffering for now
+	 */
+	int insBufferSize = 0;
+
+	/**
+	 * Define the ins buffer count (int) field.
+	 */
+	int insBufferCount = 0;
+
+	/**
+	 * Define the outs suspended (boolean) field.
+	 */
+	boolean outsSuspended = false;
+
+	/**
+	 * Disable write buffering for default
+	 */
+	int outsBufferSize = 0;
+
+	/**
+	 * Define the outs buffer count (int) field.
+	 */
+	int outsBufferCount = 0;
+
+	/**
+	 * Define the listener (ParallelPortEventListener) field.
+	 */
+	private ParallelPortEventListener listener = null;
+
+	/**
+	 * Define the notify on error flag (boolean) field.
+	 */
+	private boolean notifyOnErrorFlag = false;
+
+	/**
+	 * Define the notify on buffer flag (boolean) field.
+	 */
+	boolean notifyOnBufferFlag = false;
+
+	/**
+	 * Define the error thread (ParallelErrorEventThread) field.
+	 */
+	private ParallelErrorEventThread errorThread = null;
+
+	/**
+	 * Define the dle (DeviceListEntry) field.
+	 */
+	private DeviceListEntry dle = null;
+
+	/**
+	 * Define the cd (NSCommDriver) field.
+	 */
+	private NSCommDriver cd = null;
+
+	/**
+	 * Constructs an instance of this class from the specified port name and driver parameters.
+	 * @param portName The port name (<code>String</code>) parameter.
+	 * @param driver The driver (<code>NSCommDriver</code>) parameter.
+	 * @throws IOException IOException.
+	 */
+	NSParallelPort(final String portName, final NSCommDriver driver) throws IOException {
+		/* NSParallelPort-extends-ParallelPort-extends-CommPort->name */
+		this.name = portName;
+		// save CommDriver
+		this.cd = driver;
+		// look for portName in DeviceList
+		for (DeviceListEntry cur = this.cd.getFirstDLE(); cur != null; cur = this.cd.getNextDLE(cur)) {
+			if (cur.logicalName.equals(portName)) {
+				/* found the portName in list, attempt to open it using native method. */
+				if ((this.fd == -1) || !cur.opened) {
+					if ((this.fd = openDeviceNC(cur.physicalName, cur.semID)) == -1) {
+						// file descriptor is NOT valid, throw an Exception
+						throw new IOException();
+					}
+					/* Got a good file descriptor. */
+					/* keep a copy of the DeviceListEntry where you found the portName */
+					/* get a FileDescriptor object */
+					/* turn opened ON */
+					this.dle = cur;
+					this.dle.opened = true;
+				} else {
+					throw new IOException();
+				}
+				break; // found our port
+			}
+		}
+	}
+
+	/**
+	 * Add event listener with the specified lst parameter.
+	 * @param lst The lst (<code>ParallelPortEventListener</code>) parameter.
+	 * @throws TooManyListenersException Too Many Listeners Exception.
+	 * @see #removeEventListener()
+	 */
+	public synchronized void addEventListener(final ParallelPortEventListener lst) throws TooManyListenersException {
+		if (this.listener != null) {
+			throw new TooManyListenersException();
+		}
+		this.listener = lst;
+		if (this.notifyOnErrorFlag && (this.errorThread == null)) {
+			this.errorThread = new ParallelErrorEventThread(this.fd, this);
+			// errorThread.setDaemon( true ); // check it out
+			this.errorThread.start();
+		}
+	}
+
+	/**
+	 * Close.
+	 */
+	public void close() {
+		// check if either fd or opened is not valid
+		// nothing to be done
+		if (this.fd == -1) {
+			return;
+		}
+		// if the error thread is alive, kill it
+		if (this.errorThread != null) {
+			this.errorThread.setStopThreadFlag(1);
+			this.errorThread = null;
+			this.notifyOnErrorFlag = false;
+		}
+		// check ins and outs
+		if (this.outs != null) {
+			try {
+				this.outs.flush();
+			} catch (final IOException e) {
+				e.printStackTrace();
+			}
+			this.outs = null;
+		}
+		if (this.ins != null) {
+			this.ins = null;
+		}
+		/* close the device. */
+		closeDeviceNC(this.fd, this.dle.semID);
+		/* reset fd and opened. */
+		this.fd = -1;
+		this.dle.opened = false;
+		// close the commport
+		super.close();
+	}
+
+	/**
+	 * Close device nc with the specified fd and sem id parameters and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @param semID The sem id (<code>int</code>) parameter.
+	 * @return Results of the close device nc (<code>int</code>) value.
+	 */
+	private native int closeDeviceNC(final int fd, final int semID);
+
+	/**
+	 * Disable receive framing.
+	 * @see #enableReceiveFraming(int)
+	 */
+	public void disableReceiveFraming() {
+		this.rcvFraming = false;
+	}
+
+	/**
+	 * Disable receive threshold.
+	 * @see #enableReceiveThreshold(int)
+	 * @see #getReceiveThreshold()
+	 */
+	public void disableReceiveThreshold() {
+		this.rcvThreshold = -1;
+	}
+
+	/**
+	 * Disable receive timeout.
+	 * @see #enableReceiveTimeout(int)
+	 * @see #getReceiveTimeout()
+	 */
+	public void disableReceiveTimeout() {
+		this.rcvTimeout = -1;
+	}
+
+	/**
+	 * Enable receive framing with the specified rcv framing byte parameter.
+	 * @param rcvFramingByte The rcv framing byte (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveFraming()
+	 */
+	public void enableReceiveFraming(final int rcvFramingByte) throws UnsupportedCommOperationException {
+		throw new UnsupportedCommOperationException();
+	}
+
+	/**
+	 * Enable receive threshold with the specified thresh parameter.
+	 * @param thresh The thresh (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveThreshold()
+	 * @see #getReceiveThreshold()
+	 */
+	public void enableReceiveThreshold(final int thresh) throws UnsupportedCommOperationException {
+		if (thresh > 0) {
+			this.rcvThreshold = thresh;
+		}
+	}
+
+	/**
+	 * Enable receive timeout with the specified rt parameter.
+	 * @param rt The rt (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveTimeout()
+	 * @see #getReceiveTimeout()
+	 */
+	public void enableReceiveTimeout(final int rt) throws UnsupportedCommOperationException {
+		if (rt > 0) {
+			this.rcvTimeout = rt;
+		} else if (rt == 0) {
+			this.rcvTimeout = -1;
+		}
+	}
+
+	/**
+	 * Finalize.
+	 * @throws IOException IOException.
+	 */
+	protected void finalize() throws IOException {
+		close();
+	}
+
+	/**
+	 * Gets the input buffer size (int) value.
+	 * @return The input buffer size (<code>int</code>) value.
+	 * @see #setInputBufferSize(int)
+	 */
+	public int getInputBufferSize() {
+		return this.insBufferSize;
+	}
+
+	/**
+	 * Gets the input stream value.
+	 * @return The input stream (<code>InputStream</code>) value.
+	 * @throws IOException IOException.
+	 */
+	public InputStream getInputStream() throws IOException {
+		if (this.ins == null) {
+			if ((this.ins = new NSDeviceInputStream(this, this.dle.portType)) == null) {
+				throw new IOException();
+			}
+			this.ins.fd = this.fd;
+		}
+		return this.ins;
+	}
+
+	/**
+	 * Gets the mode (int) value.
+	 * @return The mode (<code>int</code>) value.
+	 * @see #setMode(int)
+	 */
+	public int getMode() {
+		return this.mode;
+	}
+
+	/**
+	 * Gets the output buffer free (int) value.
+	 * @return The output buffer free (<code>int</code>) value.
+	 */
+	public int getOutputBufferFree() {
+		return (this.outsBufferSize > this.outsBufferCount ? this.outsBufferSize - this.outsBufferCount : 0);
+	}
+
+	/**
+	 * Gets the output buffer size (int) value.
+	 * @return The output buffer size (<code>int</code>) value.
+	 * @see #setOutputBufferSize(int)
+	 */
+	public int getOutputBufferSize() {
+		return this.outsBufferSize;
+	}
+
+	/**
+	 * Gets the output stream value.
+	 * @return The output stream (<code>OutputStream</code>) value.
+	 * @throws IOException IOException.
+	 */
+	public OutputStream getOutputStream() throws IOException {
+		if (this.outs == null) {
+			if ((this.outs = new NSDeviceOutputStream(this, this.dle.portType)) == null) {
+				throw new IOException();
+			}
+			this.outs.fd = this.fd;
+		}
+		return this.outs;
+	}
+
+	/**
+	 * Gets the receive framing byte (int) value.
+	 * @return The receive framing byte (<code>int</code>) value.
+	 */
+	public int getReceiveFramingByte() {
+		return this.rcvFramingByte;
+	}
+
+	/**
+	 * Gets the receive threshold (int) value.
+	 * @return The receive threshold (<code>int</code>) value.
+	 * @see #disableReceiveThreshold()
+	 * @see #enableReceiveThreshold(int)
+	 */
+	public int getReceiveThreshold() {
+		return this.rcvThreshold;
+	}
+
+	/**
+	 * Gets the receive timeout (int) value.
+	 * @return The receive timeout (<code>int</code>) value.
+	 * @see #disableReceiveTimeout()
+	 * @see #enableReceiveTimeout(int)
+	 */
+	public int getReceiveTimeout() {
+		return this.rcvTimeout;
+	}
+
+	/**
+	 * Gets the paper out (boolean) value.
+	 * @return The paper out (<code>boolean</code>) value.
+	 */
+	public boolean isPaperOut() {
+		return isPaperOutNC(this.fd);
+	}
+
+	/**
+	 * Is paper out nc with the specified fd parameter and return the boolean result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the is paper out nc (<code>boolean</code>) value.
+	 */
+	private native boolean isPaperOutNC(final int fd);
+
+	/**
+	 * Gets the printer busy (boolean) value.
+	 * @return The printer busy (<code>boolean</code>) value.
+	 */
+	public boolean isPrinterBusy() {
+		return isPrinterBusyNC(this.fd);
+	}
+
+	/**
+	 * Is printer busy nc with the specified fd parameter and return the boolean result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the is printer busy nc (<code>boolean</code>) value.
+	 */
+	private native boolean isPrinterBusyNC(final int fd);
+
+	/**
+	 * Gets the printer error (boolean) value.
+	 * @return The printer error (<code>boolean</code>) value.
+	 */
+	public boolean isPrinterError() {
+		return isPrinterErrorNC(this.fd);
+	}
+
+	/**
+	 * Is printer error nc with the specified fd parameter and return the boolean result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the is printer error nc (<code>boolean</code>) value.
+	 */
+	private native boolean isPrinterErrorNC(final int fd);
+
+	/**
+	 * Gets the printer selected (boolean) value.
+	 * @return The printer selected (<code>boolean</code>) value.
+	 */
+	public boolean isPrinterSelected() {
+		return isPrinterSelectedNC(this.fd);
+	}
+
+	/**
+	 * Is printer selected nc with the specified fd parameter and return the boolean result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the is printer selected nc (<code>boolean</code>) value.
+	 */
+	private native boolean isPrinterSelectedNC(final int fd);
+
+	/**
+	 * Gets the printer timed out (boolean) value.
+	 * @return The printer timed out (<code>boolean</code>) value.
+	 */
+	public boolean isPrinterTimedOut() {
+		return isPrinterTimedOutNC(this.fd);
+	}
+
+	/**
+	 * Is printer timed out nc with the specified fd parameter and return the boolean result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the is printer timed out nc (<code>boolean</code>) value.
+	 */
+	private native boolean isPrinterTimedOutNC(final int fd);
+
+	/**
+	 * Gets the receive framing enabled (boolean) value.
+	 * @return The receive framing enabled (<code>boolean</code>) value.
+	 */
+	public boolean isReceiveFramingEnabled() {
+		return this.rcvFraming;
+	}
+
+	/**
+	 * Gets the receive threshold enabled (boolean) value.
+	 * @return The receive threshold enabled (<code>boolean</code>) value.
+	 */
+	public boolean isReceiveThresholdEnabled() {
+		return (this.rcvThreshold == -1 ? false : true);
+	}
+
+	/**
+	 * Gets the receive timeout enabled (boolean) value.
+	 * @return The receive timeout enabled (<code>boolean</code>) value.
+	 */
+	public boolean isReceiveTimeoutEnabled() {
+		return (this.rcvTimeout == -1 ? false : true);
+	}
+
+	/**
+	 * Notify on buffer with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnBuffer(final boolean notify) {
+		this.notifyOnBufferFlag = notify;
+	}
+
+	/**
+	 * Notify on error with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnError(final boolean notify) {
+		if (notify) {
+			if (!this.notifyOnErrorFlag) {
+				// instantiate ParallelErrorEventThread
+				if ((this.errorThread == null) && (this.listener != null)) {
+					this.errorThread = new ParallelErrorEventThread(this.fd, this);
+					this.errorThread.start();
+				}
+				this.notifyOnErrorFlag = true;
+			}
+		} else {
+			if (this.notifyOnErrorFlag) {
+				/* Stop ParallelErrorEventThread */
+				if (this.errorThread != null) {
+					this.errorThread.setStopThreadFlag(1);
+				}
+				this.notifyOnErrorFlag = false;
+				this.errorThread = null;
+			}
+		}
+	}
+
+	/**
+	 * Open device nc with the specified device name and sem id parameters and return the int result.
+	 * @param deviceName The device name (<code>String</code>) parameter.
+	 * @param semID The sem id (<code>int</code>) parameter.
+	 * @return Results of the open device nc (<code>int</code>) value.
+	 */
+	private native int openDeviceNC(final String deviceName, final int semID);
+
+	/**
+	 * Remove event listener.
+	 * @see #addEventListener(ParallelPortEventListener)
+	 */
+	public synchronized void removeEventListener() {
+		if (this.listener != null) {
+			if (this.errorThread != null) {
+				this.errorThread.setStopThreadFlag(1);
+			}
+			this.errorThread = null;
+			this.listener = null;
+		}
+	}
+
+	/**
+	 * Report parallel event with the specified event type, oldvalue and newvalue parameters.
+	 * @param eventType The event type (<code>int</code>) parameter.
+	 * @param oldvalue The oldvalue (<code>boolean</code>) parameter.
+	 * @param newvalue The newvalue (<code>boolean</code>) parameter.
+	 */
+	synchronized void reportParallelEvent(final int eventType, final boolean oldvalue, final boolean newvalue) {
+		if (this.listener != null) {
+			final ParallelPortEvent pe = new ParallelPortEvent(this, eventType, oldvalue, newvalue);
+			this.listener.parallelEvent(pe);
+		}
+	}
+
+	/**
+	 * Restart.
+	 */
+	public void restart() {
+		this.outsSuspended = false;
+	}
+
+	/**
+	 * Sets the input buffer size value.
+	 * @param size The size (<code>int</code>) parameter.
+	 * @see #getInputBufferSize()
+	 */
+	public void setInputBufferSize(final int size) {
+		/* do nothing */
+	}
+
+	/**
+	 * Sets the mode value.
+	 * @param md The md (<code>int</code>) parameter.
+	 * @return The mode (<code>int</code>) value.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #getMode()
+	 */
+	public int setMode(final int md) throws UnsupportedCommOperationException {
+		throw new UnsupportedCommOperationException();
+	}
+
+	/**
+	 * Sets the output buffer size value.
+	 * @param size The size (<code>int</code>) parameter.
+	 * @see #getOutputBufferSize()
+	 */
+	public void setOutputBufferSize(final int size) {
+		if (size >= 0) {
+			this.outsBufferSize = size;
+		}
+	}
+
+	/**
+	 * Suspend.
+	 */
+	public void suspend() {
+		this.outsSuspended = true;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSSerialPort.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSSerialPort.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5f4f95ffa24e71db8a1f296b49aa93c74260331
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/NSSerialPort.java
@@ -0,0 +1,1315 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 1999, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import javax.comm.*;
+import java.io.*;
+import java.util.*;
+
+/**
+ * An RS-232 serial communications port. SerialPort describes the
+ * low-level interface to a serial communications port made
+ * available by the underlying system. SerialPort defines the
+ * minimum required functionality for serial communications ports.
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+class NSSerialPort extends SerialPort {
+	/**
+	 * Define the databits5 (int) constant.
+	 */
+	public static final int DATABITS_5 = 5;
+
+	/**
+	 * Define the databits6 (int) constant.
+	 */
+	public static final int DATABITS_6 = 6;
+
+	/**
+	 * Define the databits7 (int) constant.
+	 */
+	public static final int DATABITS_7 = 7;
+
+	/**
+	 * Define the databits8 (int) constant.
+	 */
+	public static final int DATABITS_8 = 8;
+
+	/**
+	 * Define the stopbits1 (int) constant.
+	 */
+	public static final int STOPBITS_1 = 1;
+
+	/**
+	 * Define the stopbits2 (int) constant.
+	 */
+	public static final int STOPBITS_2 = 2;
+
+	/**
+	 * Define the stopbits15 (int) constant.
+	 */
+	public static final int STOPBITS_1_5 = 3;
+
+	/**
+	 * Define the parity none (int) constant.
+	 */
+	public static final int PARITY_NONE = 0;
+
+	/**
+	 * Define the parity odd (int) constant.
+	 */
+	public static final int PARITY_ODD = 1;
+
+	/**
+	 * Define the parity even (int) constant.
+	 */
+	public static final int PARITY_EVEN = 2;
+
+	/**
+	 * Define the parity mark (int) constant.
+	 */
+	public static final int PARITY_MARK = 3;
+
+	/**
+	 * Define the parity space (int) constant.
+	 */
+	public static final int PARITY_SPACE = 4;
+
+	/**
+	 * Define the flowcontrol none (int) constant.
+	 */
+	public static final int FLOWCONTROL_NONE = 0;
+
+	/**
+	 * Define the flowcontrol rtscts in (int) constant.
+	 */
+	public static final int FLOWCONTROL_RTSCTS_IN = 1;
+
+	/**
+	 * Define the flowcontrol rtscts out (int) constant.
+	 */
+	public static final int FLOWCONTROL_RTSCTS_OUT = 2;
+
+	/**
+	 * Define the flowcontrol xonxoff in (int) constant.
+	 */
+	public static final int FLOWCONTROL_XONXOFF_IN = 4;
+
+	/**
+	 * Define the flowcontrol xonxoff out (int) constant.
+	 */
+	public static final int FLOWCONTROL_XONXOFF_OUT = 8;
+
+	/**
+	 * Define the flowcontrol (int) field.
+	 */
+	private int flowcontrol = FLOWCONTROL_NONE;
+
+	/**
+	 * Define the baudrate (int) field.
+	 */
+	private int baudrate = 9600;
+
+	/**
+	 * Define the databits (int) field.
+	 */
+	private int databits = DATABITS_8;
+
+	/**
+	 * Define the stopbits (int) field.
+	 */
+	private int stopbits = STOPBITS_1;
+
+	/**
+	 * Define the parity (int) field.
+	 */
+	private int parity = PARITY_NONE;
+
+	/**
+	 * Define the dtr (boolean) field.
+	 */
+	private boolean dtr;
+
+	/**
+	 * Define the rts (boolean) field.
+	 */
+	private boolean rts;
+
+	/**
+	 * Define the dle (DeviceListEntry) field.
+	 */
+	private DeviceListEntry dle = null;
+
+	/**
+	 * Define the cd (NSCommDriver) field.
+	 */
+	private NSCommDriver cd = null;
+
+	/**
+	 * Define the fd (int) field.
+	 */
+	int fd = -1; // file descriptor for the open device
+
+	/**
+	 * Define the fd (FileDescriptor) field.
+	 */
+	FileDescriptor FD = null; // FileDescriptor for the open device for which buffers can be built upon
+
+	/**
+	 * Define the ins (NSDeviceInputStream) field.
+	 */
+	private NSDeviceInputStream ins = null;
+
+	/**
+	 * Define the outs (NSDeviceOutputStream) field.
+	 */
+	private NSDeviceOutputStream outs = null;
+
+	/**
+	 * Define the rcv threshold (int) field.
+	 */
+	int rcvThreshold = -1;
+
+	/**
+	 * Define the rcv timeout (int) field.
+	 */
+	int rcvTimeout = -1;
+
+	/**
+	 * Define the rcv framing (boolean) field.
+	 */
+	boolean rcvFraming = false;
+
+	/**
+	 * Define the rcv framing byte (int) field.
+	 */
+	int rcvFramingByte;
+
+	/**
+	 * Define the rcv framing byte received (boolean) field.
+	 */
+	boolean rcvFramingByteReceived;
+
+	/**
+	 * Disable read buffering for now
+	 */
+	int insBufferSize = 0;
+
+	/**
+	 * Define the ins buffer count (int) field.
+	 */
+	int insBufferCount = 0;
+
+	/**
+	 * Disable write buffering for default
+	 */
+	int outsBufferSize = 0;
+
+	/**
+	 * Define the outs buffer count (int) field.
+	 */
+	int outsBufferCount = 0;
+
+	/**
+	 * Define the listener (SerialPortEventListener) field.
+	 */
+	private SerialPortEventListener listener = null;
+
+	/**
+	 * Define the notify on ctsflag (boolean) field.
+	 */
+	private boolean notifyOnCTSFlag = false;
+
+	/**
+	 * Define the notify on dsrflag (boolean) field.
+	 */
+	private boolean notifyOnDSRFlag = false;
+
+	/**
+	 * Define the notify on riflag (boolean) field.
+	 */
+	private boolean notifyOnRIFlag = false;
+
+	/**
+	 * Define the notify on cdflag (boolean) field.
+	 */
+	private boolean notifyOnCDFlag = false;
+
+	/**
+	 * Define the notify on orflag (boolean) field.
+	 */
+	private boolean notifyOnORFlag = false;
+
+	/**
+	 * Define the notify on peflag (boolean) field.
+	 */
+	private boolean notifyOnPEFlag = false;
+
+	/**
+	 * Define the notify on feflag (boolean) field.
+	 */
+	private boolean notifyOnFEFlag = false;
+
+	/**
+	 * Define the notify on biflag (boolean) field.
+	 */
+	private boolean notifyOnBIFlag = false;
+
+	/**
+	 * Define the notify on buffer flag (boolean) field.
+	 */
+	boolean notifyOnBufferFlag = false;
+
+	/**
+	 * Define the notify on data flag (boolean) field.
+	 */
+	private boolean notifyOnDataFlag = false;
+
+	/**
+	 * Define the status thread (SerialStatusEventThread) field.
+	 */
+	private SerialStatusEventThread statusThread = null;
+
+	/**
+	 * Define the data thread (SerialDataEventThread) field.
+	 */
+	private SerialDataEventThread dataThread = null;
+
+	/**
+	 * Constructor
+	 * @param portName The port name (<code>String</code>) parameter.
+	 * @param driver The driver (<code>NSCommDriver</code>) parameter.
+	 * @throws IOException IOException.
+	 */
+	public NSSerialPort(final String portName, final NSCommDriver driver) throws IOException {
+		/* caller wants port portName */
+		/* NSSerialPort-extends-SerialPort-extends-CommPort->name */
+		this.name = portName;
+		// save CommDriver
+		this.cd = driver;
+		// look for portName in DeviceList
+		for (DeviceListEntry cur = this.cd.getFirstDLE(); cur != null; cur = this.cd.getNextDLE(cur)) {
+			if (cur.logicalName.equals(portName)) {
+				/* found the portName in list, attempt to open it using native method. */
+				if ((this.fd == -1) || !cur.opened) {
+					if ((this.fd = openDeviceNC(cur.physicalName, cur.semID)) == -1) {
+						// file descriptor is NOT valid, throw an Exception
+						throw new IOException();
+					}
+					/* Got a good file descriptor. */
+					/* keep a copy of the DeviceListEntry where you found the portName */
+					/* get a FileDescriptor object */
+					/* turn opened ON */
+					this.dle = cur;
+					this.dle.opened = true;
+				} else {
+					throw new IOException();
+				}
+				break; // found our port
+			}
+		}
+	}
+
+	/**
+	 * Add event listener with the specified lstnr parameter.
+	 * @param lstnr The lstnr (<code>SerialPortEventListener</code>) parameter.
+	 * @throws TooManyListenersException Too Many Listeners Exception.
+	 * @see #removeEventListener()
+	 */
+	public synchronized void addEventListener(final SerialPortEventListener lstnr) throws TooManyListenersException {
+		if (this.listener != null) {
+			throw new TooManyListenersException();
+		}
+		this.listener = lstnr;
+		// check all other related flags, all must be false
+		if ((this.notifyOnDSRFlag || this.notifyOnRIFlag || this.notifyOnCDFlag || this.notifyOnORFlag || this.notifyOnPEFlag || this.notifyOnFEFlag || this.notifyOnCTSFlag || this.notifyOnBIFlag) && (this.statusThread == null)) {
+			this.statusThread = new SerialStatusEventThread(this.fd, this);
+			// statusThread.setDaemon( true ); // check it out ???
+			this.statusThread.start();
+		}
+		if (this.notifyOnDataFlag && (this.dataThread == null)) {
+			this.dataThread = new SerialDataEventThread(this.fd, this);
+			// dataThread.setDaemon( true ); // check it out ???
+			this.dataThread.start();
+		}
+	}
+
+	/**
+	 * Close.
+	 */
+	public void close() {
+		if (this.fd == -1) {
+			return;
+		}
+		// if thread are alive, kill them
+		if (this.statusThread != null) {
+			this.statusThread.setStopThreadFlag(1);
+			this.notifyOnCTSFlag = false;
+			this.notifyOnDSRFlag = false;
+			this.notifyOnRIFlag = false;
+			this.notifyOnCDFlag = false;
+			this.notifyOnORFlag = false;
+			this.notifyOnPEFlag = false;
+			this.notifyOnFEFlag = false;
+			this.notifyOnBIFlag = false;
+		}
+		if (this.dataThread != null) {
+			this.dataThread.setStopThreadFlag(1);
+			this.notifyOnDataFlag = false;
+		}
+		// check ins and outs
+		if (this.outs != null) {
+			try {
+				this.outs.flush();
+			} catch (final IOException e) {
+				e.printStackTrace();
+			}
+			this.outs = null;
+		}
+		if (this.ins != null) {
+			this.ins = null;
+		}
+		/* close the device. */
+		closeDeviceNC(this.fd, this.dle.semID);
+		/* reset fd and opened. */
+		this.fd = -1;
+		this.dle.opened = false;
+		// close the commport
+		super.close();
+	}
+
+	/**
+	 * Close device nc with the specified fd and sem id parameters and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @param semID The sem id (<code>int</code>) parameter.
+	 * @return Results of the close device nc (<code>int</code>) value.
+	 */
+	private native int closeDeviceNC(final int fd, final int semID);
+
+	/**
+	 * Disable receive framing.
+	 * @see #enableReceiveFraming(int)
+	 */
+	public void disableReceiveFraming() {
+		this.rcvFraming = false;
+	}
+
+	/**
+	 * Disable receive threshold.
+	 * @see #enableReceiveThreshold(int)
+	 * @see #getReceiveThreshold()
+	 */
+	public void disableReceiveThreshold() {
+		this.rcvThreshold = -1;
+	}
+
+	/**
+	 * Disable receive timeout.
+	 * @see #enableReceiveTimeout(int)
+	 * @see #getReceiveTimeout()
+	 */
+	public void disableReceiveTimeout() {
+		this.rcvTimeout = -1;
+	}
+
+	/**
+	 * Enable receive framing with the specified rcv framing byte parameter.
+	 * @param rcvFramingByte The rcv framing byte (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveFraming()
+	 */
+	public void enableReceiveFraming(final int rcvFramingByte) throws UnsupportedCommOperationException {
+		throw new UnsupportedCommOperationException();
+	}
+
+	/**
+	 * Enable receive threshold with the specified thresh parameter.
+	 * @param thresh The thresh (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveThreshold()
+	 * @see #getReceiveThreshold()
+	 */
+	public void enableReceiveThreshold(final int thresh) throws UnsupportedCommOperationException {
+		if (thresh > 0) {
+			this.rcvThreshold = thresh;
+		}
+	}
+
+	/**
+	 * Enable receive timeout with the specified rt parameter.
+	 * @param rt The rt (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #disableReceiveTimeout()
+	 * @see #getReceiveTimeout()
+	 */
+	public void enableReceiveTimeout(final int rt) throws UnsupportedCommOperationException {
+		if (rt > 0) {
+			this.rcvTimeout = rt;
+		} else if (rt == 0) {
+			this.rcvTimeout = -1;
+		}
+	}
+
+	/**
+	 * Finalize.
+	 * @throws IOException IOException.
+	 */
+	protected void finalize() throws IOException {
+		close();
+	}
+
+	/**
+	 * Gets the baud rate (int) value.
+	 * @return The baud rate (<code>int</code>) value.
+	 */
+	public int getBaudRate() {
+		int bdrate = 0;
+		if (this.fd > -1) {
+			bdrate = getBaudRateNC(this.fd);
+			if (bdrate < 0) {
+				bdrate = 0;
+			} else {
+				this.baudrate = bdrate;
+				// no need to map native values to java values here
+			}
+		}
+		return bdrate;
+	}
+
+	/**
+	 * Get baud rate nc with the specified fd parameter and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the get baud rate nc (<code>int</code>) value.
+	 */
+	private native int getBaudRateNC(final int fd);
+
+	/**
+	 * Gets the baudrate (int) value.
+	 * @return The baudrate (<code>int</code>) value.
+	 */
+	public int getBaudrate() {
+		return this.baudrate;
+	}
+
+	/**
+	 * Gets the data bits (int) value.
+	 * @return The data bits (<code>int</code>) value.
+	 */
+	public int getDataBits() {
+		int db = 0;
+		if (this.fd > -1) {
+			db = getDataBitsNC(this.fd);
+			if (db != -1) {
+				switch (db) {
+				case 5:
+					this.databits = DATABITS_5;
+					break;
+				case 6:
+					this.databits = DATABITS_6;
+					break;
+				case 7:
+					this.databits = DATABITS_7;
+					break;
+				case 8:
+					this.databits = DATABITS_8;
+					break;
+				}
+			}
+		}
+		return this.databits;
+	}
+
+	/**
+	 * Get data bits nc with the specified fd parameter and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the get data bits nc (<code>int</code>) value.
+	 */
+	private native int getDataBitsNC(final int fd);
+
+	/**
+	 * Gets the currently configured flow control mode.
+	 * Returns:
+	 * an integer bitmask of the modes FLOWCONTROL_NONE,
+	 * FLOWCONTROL_RTSCTS_IN,
+	 * FLOWCONTROL_RTSCTS_OUT,
+	 * FLOWCONTROL_XONXOFF_IN, and
+	 * FLOWCONTROL_XONXOFF_OUT.
+	 * @return Results of the get flow control mode (<code>int</code>) value.
+	 * @see #setFlowControlMode(int)
+	 */
+	public int getFlowControlMode() {
+		if (this.fd > -1) {
+			final int retCode = getFlowControlModeNC(this.fd);
+			if (retCode == -1) {
+				return this.flowcontrol;
+			}
+			if (retCode == 0) {
+				this.flowcontrol = FLOWCONTROL_NONE;
+			} else {
+				int fl = 0;
+				if ((retCode & 1) != 0) {
+					fl |= FLOWCONTROL_RTSCTS_IN;
+				}
+				if ((retCode & 2) != 0) {
+					fl |= FLOWCONTROL_RTSCTS_OUT;
+				}
+				if ((retCode & 4) != 0) {
+					fl |= FLOWCONTROL_XONXOFF_IN;
+				}
+				if ((retCode & 8) != 0) {
+					fl |= FLOWCONTROL_XONXOFF_OUT;
+				}
+				this.flowcontrol = fl;
+			}
+		} else {
+			return this.flowcontrol;
+		}
+		return this.flowcontrol;
+	}
+
+	/**
+	 * Get flow control mode nc with the specified fd parameter and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the get flow control mode nc (<code>int</code>) value.
+	 */
+	private native int getFlowControlModeNC(final int fd);
+
+	/**
+	 * Gets the input buffer size (int) value.
+	 * @return The input buffer size (<code>int</code>) value.
+	 * @see #setInputBufferSize(int)
+	 */
+	public int getInputBufferSize() {
+		return this.insBufferSize;
+	}
+
+	/**
+	 * Gets the input stream value.
+	 * @return The input stream (<code>InputStream</code>) value.
+	 * @throws IOException IOException.
+	 */
+	public InputStream getInputStream() throws IOException {
+		if (this.ins != null) {
+			return this.ins;
+		}
+		if ((this.ins = new NSDeviceInputStream(this, this.dle.portType)) == null) {
+			throw new IOException();
+		}
+		this.ins.fd = this.fd;
+		return this.ins;
+	}
+
+	/**
+	 * Gets the output buffer size (int) value.
+	 * @return The output buffer size (<code>int</code>) value.
+	 * @see #setOutputBufferSize(int)
+	 */
+	public int getOutputBufferSize() {
+		return this.outsBufferSize;
+	}
+
+	/**
+	 * Gets the output stream value.
+	 * @return The output stream (<code>OutputStream</code>) value.
+	 * @throws IOException IOException.
+	 */
+	public OutputStream getOutputStream() throws IOException {
+		if (this.outs != null) {
+			return this.outs;
+		}
+		/* Y: get a new DeviceOutputStream */
+		if ((this.outs = new NSDeviceOutputStream(this, this.dle.portType)) == null) {
+			throw new IOException();
+		}
+		// what do I do here
+		this.outs.fd = this.fd;
+		return this.outs;
+	}
+
+	/**
+	 * Gets the parity (int) value.
+	 * @return The parity (<code>int</code>) value.
+	 */
+	public int getParity() {
+		int p = 0;
+		if (this.fd > -1) {
+			p = getParityNC(this.fd);
+			if (p != -1) {
+				switch (p) {
+				case 0:
+					this.parity = PARITY_NONE;
+					break;
+				case 1:
+					this.parity = PARITY_ODD;
+					break;
+				case 2:
+					this.parity = PARITY_EVEN;
+					break;
+				case 3:
+					this.parity = PARITY_MARK;
+					break;
+				case 4:
+					this.parity = PARITY_SPACE;
+					break;
+				}
+			}
+		}
+		return this.parity;
+	}
+
+	/**
+	 * Get parity nc with the specified fd parameter and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the get parity nc (<code>int</code>) value.
+	 */
+	private native int getParityNC(final int fd);
+
+	/**
+	 * Gets the receive framing byte (int) value.
+	 * @return The receive framing byte (<code>int</code>) value.
+	 */
+	public int getReceiveFramingByte() {
+		return this.rcvFramingByte;
+	}
+
+	/**
+	 * Gets the receive threshold (int) value.
+	 * @return The receive threshold (<code>int</code>) value.
+	 * @see #disableReceiveThreshold()
+	 * @see #enableReceiveThreshold(int)
+	 */
+	public int getReceiveThreshold() {
+		return this.rcvThreshold;
+	}
+
+	/**
+	 * Gets the receive timeout (int) value.
+	 * @return The receive timeout (<code>int</code>) value.
+	 * @see #disableReceiveTimeout()
+	 * @see #enableReceiveTimeout(int)
+	 */
+	public int getReceiveTimeout() {
+		return this.rcvTimeout;
+	}
+
+	/**
+	 * Gets the stop bits (int) value.
+	 * @return The stop bits (<code>int</code>) value.
+	 */
+	public int getStopBits() {
+		int sb = 0;
+		if (this.fd > -1) {
+			sb = getStopBitsNC(this.fd);
+			if (sb != -1) {
+				switch (sb) {
+				case 0:
+					this.stopbits = STOPBITS_1_5;
+					break;
+				case 1:
+					this.stopbits = STOPBITS_1;
+					break;
+				case 2:
+					this.stopbits = STOPBITS_2;
+					break;
+				}
+			}
+		}
+		return this.stopbits;
+	}
+
+	/**
+	 * Get stop bits nc with the specified fd parameter and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @return Results of the get stop bits nc (<code>int</code>) value.
+	 */
+	private native int getStopBitsNC(final int fd);
+
+	/**
+	 * Gets the cd (boolean) value.
+	 * @return The cd (<code>boolean</code>) value.
+	 */
+	public boolean isCD() {
+		return isCDNC();
+	}
+
+	/**
+	 * Gets the cdnc (boolean) value.
+	 * @return The cdnc (<code>boolean</code>) value.
+	 */
+	private native boolean isCDNC();
+
+	/**
+	 * Gets the cts (boolean) value.
+	 * @return The cts (<code>boolean</code>) value.
+	 * @see #notifyOnCTS(boolean)
+	 */
+	public boolean isCTS() {
+		return isCTSNC();
+	}
+
+	/**
+	 * Gets the ctsnc (boolean) value.
+	 * @return The ctsnc (<code>boolean</code>) value.
+	 */
+	private native boolean isCTSNC();
+
+	/**
+	 * Gets the dsr (boolean) value.
+	 * @return The dsr (<code>boolean</code>) value.
+	 * @see #notifyOnDSR(boolean)
+	 */
+	public boolean isDSR() {
+		return isDSRNC();
+	}
+
+	/**
+	 * Gets the dsrnc (boolean) value.
+	 * @return The dsrnc (<code>boolean</code>) value.
+	 */
+	private native boolean isDSRNC();
+
+	/**
+	 * Gets the dtr (boolean) value.
+	 * @return The dtr (<code>boolean</code>) value.
+	 * @see #setDTR(boolean)
+	 */
+	public boolean isDTR() {
+		return isDTRNC();
+	}
+
+	/**
+	 * Gets the dtrnc (boolean) value.
+	 * @return The dtrnc (<code>boolean</code>) value.
+	 */
+	private native boolean isDTRNC();
+
+	/**
+	 * Gets the dtr (boolean) value.
+	 * @return The dtr (<code>boolean</code>) value.
+	 */
+	public boolean isDtr() {
+		return this.dtr;
+	}
+
+	/**
+	 * Gets the ri (boolean) value.
+	 * @return The ri (<code>boolean</code>) value.
+	 */
+	public boolean isRI() {
+		return isRINC();
+	}
+
+	/**
+	 * Gets the rinc (boolean) value.
+	 * @return The rinc (<code>boolean</code>) value.
+	 */
+	private native boolean isRINC();
+
+	/**
+	 * Gets the rts (boolean) value.
+	 * @return The rts (<code>boolean</code>) value.
+	 * @see #setRTS(boolean)
+	 */
+	public boolean isRTS() {
+		return isRTSNC();
+	}
+
+	/**
+	 * Gets the rtsnc (boolean) value.
+	 * @return The rtsnc (<code>boolean</code>) value.
+	 */
+	private native boolean isRTSNC();
+
+	/**
+	 * Gets the receive framing enabled (boolean) value.
+	 * @return The receive framing enabled (<code>boolean</code>) value.
+	 */
+	public boolean isReceiveFramingEnabled() {
+		return this.rcvFraming;
+	}
+
+	/**
+	 * Gets the receive threshold enabled (boolean) value.
+	 * @return The receive threshold enabled (<code>boolean</code>) value.
+	 */
+	public boolean isReceiveThresholdEnabled() {
+		if (this.rcvThreshold == -1) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Gets the receive timeout enabled (boolean) value.
+	 * @return The receive timeout enabled (<code>boolean</code>) value.
+	 */
+	public boolean isReceiveTimeoutEnabled() {
+		if (this.rcvTimeout == -1) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Gets the rts (boolean) value.
+	 * @return The rts (<code>boolean</code>) value.
+	 */
+	public boolean isRts() {
+		return this.rts;
+	}
+
+	/**
+	 * Notify on break interrupt with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnBreakInterrupt(final boolean notify) {
+		if (notify && this.notifyOnBIFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnBIFlag) {
+			// instantiate SerialStatusEventThread
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnBIFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnDSRFlag && !this.notifyOnRIFlag && !this.notifyOnCDFlag && !this.notifyOnORFlag && !this.notifyOnPEFlag && !this.notifyOnFEFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnBIFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on cts with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnCTS(final boolean notify) {
+		if (notify && this.notifyOnCTSFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnCTSFlag) {
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnCTSFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnDSRFlag && !this.notifyOnRIFlag && !this.notifyOnCDFlag && !this.notifyOnORFlag && !this.notifyOnPEFlag && !this.notifyOnFEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnCTSFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on carrier detect with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnCarrierDetect(final boolean notify) {
+		if (notify && this.notifyOnCDFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnCDFlag) {
+			// instantiate SerialStatusEventThread
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnCDFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnDSRFlag && !this.notifyOnORFlag && !this.notifyOnRIFlag && !this.notifyOnPEFlag && !this.notifyOnFEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnCDFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on dsr with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnDSR(final boolean notify) {
+		if (notify && this.notifyOnDSRFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnDSRFlag) {
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				this.statusThread.start();
+			}
+			this.notifyOnDSRFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnRIFlag && !this.notifyOnCDFlag && !this.notifyOnORFlag && !this.notifyOnPEFlag && !this.notifyOnFEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnDSRFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on data available with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnDataAvailable(final boolean notify) {
+		if (notify) {
+			if (!this.notifyOnDataFlag) {
+				// instantiate SerialDataEventThread
+				if (this.dataThread == null) {
+					this.dataThread = new SerialDataEventThread(this.fd, this);
+					// dataThread.setDaemon( true ); // check it out
+					this.dataThread.start();
+				}
+				this.notifyOnDataFlag = true;
+			}
+		} else {
+			if (this.notifyOnDataFlag) {
+				/* Stop SerialDataEventThread */
+				if (this.dataThread != null) {
+					this.dataThread.setStopThreadFlag(1);
+				}
+				this.notifyOnDataFlag = false;
+				this.dataThread = null;
+			}
+		}
+	}
+
+	/**
+	 * Notify on framing error with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnFramingError(final boolean notify) {
+		if (notify && this.notifyOnFEFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnFEFlag) {
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnFEFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnDSRFlag && !this.notifyOnRIFlag && !this.notifyOnCDFlag && !this.notifyOnORFlag && !this.notifyOnPEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnFEFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on output empty with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnOutputEmpty(final boolean notify) {
+		this.notifyOnBufferFlag = notify;
+	}
+
+	/**
+	 * Notify on overrun error with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnOverrunError(final boolean notify) {
+		if (notify && this.notifyOnORFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnORFlag) {
+			// instantiate SerialStatusEventThread
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnORFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnDSRFlag && !this.notifyOnRIFlag && !this.notifyOnCDFlag && !this.notifyOnPEFlag && !this.notifyOnFEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnORFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on parity error with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnParityError(final boolean notify) {
+		if (notify && this.notifyOnPEFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnPEFlag) {
+			// instantiate SerialStatusEventThread
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnPEFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnDSRFlag && !this.notifyOnRIFlag && !this.notifyOnCDFlag && !this.notifyOnORFlag && !this.notifyOnFEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnPEFlag = false;
+		}
+	}
+
+	/**
+	 * Notify on ring indicator with the specified notify parameter.
+	 * @param notify The notify (<code>boolean</code>) parameter.
+	 */
+	public synchronized void notifyOnRingIndicator(final boolean notify) {
+		if (notify && this.notifyOnRIFlag) {
+			return; // already enabled
+		}
+		if (notify && !this.notifyOnRIFlag) {
+			if (this.statusThread == null) {
+				this.statusThread = new SerialStatusEventThread(this.fd, this);
+				// statusThread.setDaemon( true ); // check it out
+				this.statusThread.start();
+			}
+			this.notifyOnRIFlag = true;
+		} else {
+			// check all other related flags, all must be false
+			if (!this.notifyOnCTSFlag && !this.notifyOnDSRFlag && !this.notifyOnCDFlag && !this.notifyOnORFlag && !this.notifyOnPEFlag && !this.notifyOnFEFlag && !this.notifyOnBIFlag) {
+				if (this.statusThread != null) {
+					this.statusThread.setStopThreadFlag(1);
+					this.statusThread = null;
+				}
+			}
+			this.notifyOnRIFlag = false;
+		}
+	}
+
+	/**
+	 * Open device nc with the specified device name and sem id parameters and return the int result.
+	 * @param deviceName The device name (<code>String</code>) parameter.
+	 * @param semID The sem id (<code>int</code>) parameter.
+	 * @return Results of the open device nc (<code>int</code>) value.
+	 */
+	private native int openDeviceNC(final String deviceName, final int semID);
+
+	/**
+	 * Remove event listener.
+	 * @see #addEventListener(SerialPortEventListener)
+	 */
+	public synchronized void removeEventListener() {
+		if (this.listener != null) {
+			if (this.statusThread != null) {
+				this.statusThread.setStopThreadFlag(1);
+			}
+			this.statusThread = null;
+			if (this.dataThread != null) {
+				this.dataThread.setStopThreadFlag(1);
+			}
+			this.dataThread = null;
+			this.listener = null;
+		}
+	}
+
+	/**
+	 * Report serial event with the specified event type, oldvalue and newvalue parameters.
+	 * @param eventType The event type (<code>int</code>) parameter.
+	 * @param oldvalue The oldvalue (<code>boolean</code>) parameter.
+	 * @param newvalue The newvalue (<code>boolean</code>) parameter.
+	 */
+	synchronized void reportSerialEvent(final int eventType, final boolean oldvalue, final boolean newvalue) {
+		if (this.listener != null) {
+			final SerialPortEvent se = new SerialPortEvent(this, eventType, oldvalue, newvalue);
+			this.listener.serialEvent(se);
+		}
+	}
+
+	/**
+	 * Send break with the specified millis parameter.
+	 * @param millis The millis (<code>int</code>) parameter.
+	 */
+	public void sendBreak(final int millis) {
+		if (this.fd != -1) {
+			sendBreakNC(this.fd, millis);
+		}
+	}
+
+	/**
+	 * Send break nc with the specified fd and millis parameters and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @param millis The millis (<code>int</code>) parameter.
+	 * @return Results of the send break nc (<code>int</code>) value.
+	 */
+	private native int sendBreakNC(final int fd, final int millis);
+
+	/**
+	 * Sets the dtr value.
+	 * @param dtr The dtr (<code>boolean</code>) parameter.
+	 * @see #isDTR()
+	 */
+	public void setDTR(final boolean dtr) {
+		setDTRNC(dtr);
+	}
+
+	/**
+	 * Sets the dtrnc value.
+	 * @param dtr The dtr (<code>boolean</code>) parameter.
+	 */
+	private native void setDTRNC(final boolean dtr);
+
+	/**
+	 * Sets the flow control mode value.
+	 * @param flowctrl The flowctrl (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 * @see #getFlowControlMode()
+	 */
+	public void setFlowControlMode(final int flowctrl) throws UnsupportedCommOperationException {
+		/* Check for invalid combinations. */
+		if ((this.fd == -1) ||
+		/* Now FLOWCONTROL_NONE is 0 instead of 1, and hence no need for this
+		   check below!!! */
+		/**************************
+		   (((flowctrl & FLOWCONTROL_NONE) != 0) &&
+		(((flowctrl & FLOWCONTROL_RTSCTS_IN) != 0) ||
+		 ((flowctrl & FLOWCONTROL_RTSCTS_OUT) != 0) ||
+		 ((flowctrl & FLOWCONTROL_XONXOFF_IN) != 0) ||
+		 ((flowctrl & FLOWCONTROL_XONXOFF_OUT) != 0))) ||
+		 **************************/
+		(((flowctrl & FLOWCONTROL_RTSCTS_IN) != 0) && ((flowctrl & FLOWCONTROL_XONXOFF_OUT) != 0)) || (((flowctrl & FLOWCONTROL_XONXOFF_IN) != 0) && ((flowctrl & FLOWCONTROL_RTSCTS_OUT) != 0))
+				|| (((flowctrl & FLOWCONTROL_RTSCTS_IN) != 0) && ((flowctrl & FLOWCONTROL_XONXOFF_IN) != 0)) || (((flowctrl & FLOWCONTROL_RTSCTS_OUT) != 0) && ((flowctrl & FLOWCONTROL_XONXOFF_OUT) != 0))) {
+			throw new UnsupportedCommOperationException();
+		}
+		// retcode of -1 is a problem
+		if (setFlowControlModeNC(this.fd, flowctrl) != -1) {
+			this.flowcontrol = flowctrl;
+		} else {
+			throw new UnsupportedCommOperationException();
+		}
+	}
+
+	/**
+	 * Set flow control mode nc with the specified fd and flowctrl parameters and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @param flowctrl The flowctrl (<code>int</code>) parameter.
+	 * @return Results of the set flow control mode nc (<code>int</code>) value.
+	 */
+	private native int setFlowControlModeNC(final int fd, final int flowctrl);
+
+	/**
+	 * Sets the input buffer size value.
+	 * @param size The size (<code>int</code>) parameter.
+	 * @see #getInputBufferSize()
+	 */
+	public void setInputBufferSize(final int size) {
+		/* do nothing */
+	}
+
+	/**
+	 * Sets the output buffer size value.
+	 * @param size The size (<code>int</code>) parameter.
+	 * @see #getOutputBufferSize()
+	 */
+	public void setOutputBufferSize(final int size) {
+		if (size >= 0) {
+			this.outsBufferSize = size;
+		}
+	}
+
+	/**
+	 * Sets the rts value.
+	 * @param rts The rts (<code>boolean</code>) parameter.
+	 * @see #isRTS()
+	 */
+	public void setRTS(final boolean rts) {
+		setRTSNC(rts);
+	}
+
+	/**
+	 * Sets the rtsnc value.
+	 * @param rts The rts (<code>boolean</code>) parameter.
+	 */
+	private native void setRTSNC(final boolean rts);
+
+	/**
+	 * Sets the rcv fifo trigger value.
+	 * @param trigger The trigger (<code>int</code>) parameter.
+	 */
+	public void setRcvFifoTrigger(final int trigger) {
+		/* do nothing */
+	}
+
+	/**
+	 * Set serial port params with the specified bd, db, sb and par parameters.
+	 * @param bd The bd (<code>int</code>) parameter.
+	 * @param db The db (<code>int</code>) parameter.
+	 * @param sb The sb (<code>int</code>) parameter.
+	 * @param par The par (<code>int</code>) parameter.
+	 * @throws UnsupportedCommOperationException Unsupported Comm Operation Exception.
+	 */
+	public void setSerialPortParams(final int bd, final int db, final int sb, final int par) throws UnsupportedCommOperationException {
+		/* Validate the values. */
+		if (this.fd == -1) {
+			throw new UnsupportedCommOperationException();
+		}
+		if ((db != DATABITS_5) && (db != DATABITS_6) && (db != DATABITS_7) && (db != DATABITS_8)) {
+			throw new UnsupportedCommOperationException();
+		}
+		if ((sb != STOPBITS_1) && (sb != STOPBITS_2) && (sb != STOPBITS_1_5)) { // 1.5 not supported
+			throw new UnsupportedCommOperationException();
+		}
+		if ((par != PARITY_NONE) && (par != PARITY_ODD) && (par != PARITY_EVEN) && (par != PARITY_MARK) && (par != PARITY_SPACE)) {
+			throw new UnsupportedCommOperationException();
+		}
+		/* Now set the desired communication characteristics. */
+		if (setSerialPortParamsNC(this.fd, bd, db, sb, par) < 0) {
+			throw new UnsupportedCommOperationException();
+		}
+	}
+
+	/**
+	 * Set serial port params nc with the specified fd, bd, db, sb and par parameters and return the int result.
+	 * @param fd The fd (<code>int</code>) parameter.
+	 * @param bd The bd (<code>int</code>) parameter.
+	 * @param db The db (<code>int</code>) parameter.
+	 * @param sb The sb (<code>int</code>) parameter.
+	 * @param par The par (<code>int</code>) parameter.
+	 * @return Results of the set serial port params nc (<code>int</code>) value.
+	 */
+	private native int setSerialPortParamsNC(final int fd, final int bd, final int db, final int sb, final int par);
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/ParallelErrorEventThread.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/ParallelErrorEventThread.java
new file mode 100644
index 0000000000000000000000000000000000000000..35be36149f933efae9e05651f7bc88b05bc5fc9e
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/ParallelErrorEventThread.java
@@ -0,0 +1,88 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 2007, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+class ParallelErrorEventThread extends Thread {
+	/**
+	 * Define the pp (NSParallelPort) field.
+	 */
+	NSParallelPort pp = null;
+
+	/**
+	 * Define the polling time (int) field.
+	 */
+	private final int pollingTime = 5; //  ??
+
+	/**
+	 * Define the fd (int) field.
+	 */
+	private int fd = -1;
+
+	/**
+	 * Define the stop thread flag (int) field.
+	 */
+	private int stopThreadFlag = 0;
+
+	/**
+	 * Constructs an instance of this class from the specified ifd and port parameters.
+	 * @param ifd	The ifd (<code>int</code>) parameter.
+	 * @param port	The port (<code>NSParallelPort</code>) parameter.
+	 */
+	ParallelErrorEventThread(final int ifd, final NSParallelPort port) {
+		this.fd = ifd;
+		this.pp = port;
+	}
+
+	/**
+	 * Gets the polling time (int) value.
+	 * @return	The polling time (<code>int</code>) value.
+	 */
+	public int getPollingTime() {
+		return this.pollingTime;
+	}
+
+	/**
+	 * Gets the stop thread flag (int) value.
+	 * @return	The stop thread flag (<code>int</code>) value.
+	 * @see #setStopThreadFlag(int)
+	 */
+	public int getStopThreadFlag() {
+		return this.stopThreadFlag;
+	}
+
+	/**
+	 * Monitor parallel error nc with the specified fd parameter.
+	 * @param fd	The fd (<code>int</code>) parameter.
+	 */
+	private native void monitorParallelErrorNC(final int fd);
+
+	/**
+	 * Run.
+	 */
+	public void run() {
+		monitorParallelErrorNC(this.fd);
+	}
+
+	/**
+	 * Sets the stop thread flag value.
+	 * @param value	The value (<code>int</code>) parameter.
+	 * @see #getStopThreadFlag()
+	 */
+	public void setStopThreadFlag(final int value) {
+		this.stopThreadFlag = value;
+		return;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/SerialDataEventThread.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/SerialDataEventThread.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5eadb0dd975376985cbcabade1792c99c7fe5c2
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/SerialDataEventThread.java
@@ -0,0 +1,75 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 2007, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+class SerialDataEventThread extends Thread {
+	/**
+	 * Define the serial port (NSSerialPort) field.
+	 */
+	NSSerialPort serialPort = null;
+
+	/**
+	 * Define the file descriptor (int) field.
+	 */
+	private int fileDescriptor = -1;
+
+	/**
+	 * Define the stop thread flag (int) field.
+	 */
+	private int stopThreadFlag = 0;
+
+	/**
+	 * Constructs an instance of this class from the specified fd and sp parameters.
+	 * @param fd	The fd (<code>int</code>) parameter.
+	 * @param sp	The sp (<code>NSSerialPort</code>) parameter.
+	 */
+	SerialDataEventThread(final int fd, final NSSerialPort sp) {
+		this.serialPort = sp;
+		this.fileDescriptor = fd;
+	}
+
+	/**
+	 * Gets the stop thread flag (int) value.
+	 * @return	The stop thread flag (<code>int</code>) value.
+	 * @see #setStopThreadFlag(int)
+	 */
+	public int getStopThreadFlag() {
+		return this.stopThreadFlag;
+	}
+
+	/**
+	 * Monitor serial data nc with the specified fd parameter.
+	 * @param fd	The fd (<code>int</code>) parameter.
+	 */
+	private native void monitorSerialDataNC(final int fd);
+
+	/**
+	 * Run.
+	 */
+	public void run() {
+		monitorSerialDataNC(this.fileDescriptor);
+	}
+
+	/**
+	 * Sets the stop thread flag value.
+	 * @param value	The value (<code>int</code>) parameter.
+	 * @see #getStopThreadFlag()
+	 */
+	public void setStopThreadFlag(final int value) {
+		this.stopThreadFlag = value;
+		return;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/SerialStatusEventThread.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/SerialStatusEventThread.java
new file mode 100644
index 0000000000000000000000000000000000000000..18b79a8914f97d7411a23bb4ec22be996f6f7c86
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/SerialStatusEventThread.java
@@ -0,0 +1,88 @@
+package org.eclipse.soda.dk.comm;
+
+/*************************************************************************
+ * Copyright (c) 2007, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+class SerialStatusEventThread extends Thread {
+	/**
+	 * Define the serial port (NSSerialPort) field.
+	 */
+	NSSerialPort serialPort = null;
+
+	/**
+	 * Define the polling time (int) field.
+	 */
+	private final int pollingTime = 5; //  ??
+
+	/**
+	 * Define the file descriptor (int) field.
+	 */
+	private int fileDescriptor = -1;
+
+	/**
+	 * Define the stop thread flag (int) field.
+	 */
+	private int stopThreadFlag = 0;
+
+	/**
+	 * Constructs an instance of this class from the specified fd and sp parameters.
+	 * @param fd	The fd (<code>int</code>) parameter.
+	 * @param sp	The sp (<code>NSSerialPort</code>) parameter.
+	 */
+	SerialStatusEventThread(final int fd, final NSSerialPort sp) {
+		this.fileDescriptor = fd;
+		this.serialPort = sp;
+	}
+
+	/**
+	 * Gets the polling time (int) value.
+	 * @return	The polling time (<code>int</code>) value.
+	 */
+	public int getPollingTime() {
+		return this.pollingTime;
+	}
+
+	/**
+	 * Gets the stop thread flag (int) value.
+	 * @return	The stop thread flag (<code>int</code>) value.
+	 * @see #setStopThreadFlag(int)
+	 */
+	public int getStopThreadFlag() {
+		return this.stopThreadFlag;
+	}
+
+	/**
+	 * Monitor serial status nc with the specified fd parameter.
+	 * @param fd	The fd (<code>int</code>) parameter.
+	 */
+	private native void monitorSerialStatusNC(final int fd);
+
+	/**
+	 * Run.
+	 */
+	public void run() {
+		monitorSerialStatusNC(this.fileDescriptor);
+	}
+
+	/**
+	 * Sets the stop thread flag value.
+	 * @param value	The value (<code>int</code>) parameter.
+	 * @see #getStopThreadFlag()
+	 */
+	public void setStopThreadFlag(final int value) {
+		this.stopThreadFlag = value;
+		return;
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/bundle/Activator.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/bundle/Activator.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5c6c7b613a9dec8ae2d4ccf11ff204eb1c61117
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/bundle/Activator.java
@@ -0,0 +1,109 @@
+package org.eclipse.soda.dk.comm.bundle;
+
+/*************************************************************************
+ * Copyright (c) 2007, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import org.eclipse.soda.dk.comm.internal.Library;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class Activator implements BundleActivator {
+	/**
+	 * Parse bundle list with the specified raw list and bundle file parameters and return the String result.
+	 * @param rawList	The raw list (<code>String</code>) parameter.
+	 * @param bundleFile	The bundle file (<code>String</code>) parameter.
+	 * @return	Results of the parse bundle list (<code>String</code>) value.
+	 */
+	private String parseBundleList(final String rawList, final String bundleFile) {
+		String result = null;
+		int i = rawList.indexOf(bundleFile);
+		if (i != -1) {
+			int j = rawList.lastIndexOf(',', i);
+			int k = rawList.lastIndexOf("file:", i); //$NON-NLS-1$
+			if (k != -1) {
+				result = rawList.substring(k + 5, i + bundleFile.length());
+			} else {
+				result = rawList.substring(j + 1, i + bundleFile.length());
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Parse install with the specified raw install parameter and return the String result.
+	 * @param rawInstall	The raw install (<code>String</code>) parameter.
+	 * @return	Results of the parse install (<code>String</code>) value.
+	 */
+	private String parseInstall(final String rawInstall) {
+		String result;
+		int i = rawInstall.indexOf("file:"); //$NON-NLS-1$
+		result = rawInstall.substring(i + 5);
+		if (result.startsWith("/")) { //$NON-NLS-1$
+			result = result.substring(1);
+		}
+		return result;
+	}
+
+	/**
+	 * Parse loc with the specified raw loc parameter and return the String result.
+	 * @param rawLoc	The raw loc (<code>String</code>) parameter.
+	 * @return	Results of the parse loc (<code>String</code>) value.
+	 */
+	private String parseLoc(final String rawLoc) {
+		String result;
+		int i = rawLoc.indexOf("file:"); //$NON-NLS-1$
+		result = rawLoc.substring(i + 5);
+		if (rawLoc.endsWith("/")) { //$NON-NLS-1$
+			result = result.substring(0, result.length() - 1);
+		}
+		return result;
+	}
+
+	/**
+	 * Start with the specified arg0 parameter.
+	 * @param arg0	The arg0 (<code>BundleContext</code>) parameter.
+	 * @throws Exception Exception.
+	 */
+	public void start(final BundleContext arg0) throws Exception {
+		/*
+		String bundle_loc = arg0.getBundle().getLocation();
+		if (bundle_loc.startsWith(Library.HTTP)) {
+			Library.setBundlepath(Library.HTTP, bundle_loc);
+		} else {
+			String bundle_file_name = parseLoc(bundle_loc);
+			String bundle_install = parseInstall(System.getProperty("osgi.install.area")); //$NON-NLS-1$
+			String bundle_path = parseBundleList(System.getProperty("osgi.bundles"), bundle_file_name); //$NON-NLS-1$
+			if (bundle_path == null || bundle_path.length() == bundle_file_name.length()) {
+				bundle_path = bundle_install + bundle_file_name;
+			}
+			/*
+			 System.out.println("bundle=" + bundle_file_name);
+			 System.out.println("bundle_install=" + bundle_install);
+			 System.out.println("bundle_path=" + bundle_path);			
+			 
+			Library.setBundlepath(Library.FILE, bundle_path);
+		}
+	*/
+	}
+
+	/**
+	 * Stop with the specified arg0 parameter.
+	 * @param arg0	The arg0 (<code>BundleContext</code>) parameter.
+	 * @throws Exception Exception.
+	 */
+	public void stop(final BundleContext arg0) throws Exception {
+		/* do nothing */
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/bundle/package.html b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/bundle/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..8e42261c0938cf1f56dacfeb2561c4ba76e73800
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/bundle/package.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "..//W3C/DTD XHTML 1.0 Strict/EN"  DTD/xhtml-strict.dtd">
+<!-- Copyright (c) 2008, 2009 IBM.                                         -->
+<!-- All rights reserved. This program and the accompanying materials      -->
+<!-- are made available under the terms of the Eclipse Public License v1.0 -->
+<!-- which accompanies this distribution, and is available at              -->
+<!-- http://www.eclipse.org/legal/epl-v10.html                             -->
+<!--                                                                       -->
+<!-- Contributors:                                                         -->
+<!--     IBM - initial API and implementation                              -->
+    
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+		<meta name="Security" content="public"/>
+		<meta name="Copyright" content="Copyright (c) 2009 IBM. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page."/>
+		<meta scheme="rfc1766" name="DC.Language" content="en-us"/>
+		<meta name="Keywords" content="org.eclipse.soda.dk.comm.bundle, org.eclipse.soda.dk.comm"/>
+		<link rel="STYLESHEET" href="stylesheet.css" charset="UTF-8" type="text/css"/>		
+		<title>org.eclipse.soda.dk.comm.bundle Package</title>
+	</head>
+	<body>
+		<p>This package is part of the org.eclipse.soda.dk.comm project.</p> 
+	</body>
+</html>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/internal/Library.java b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/internal/Library.java
new file mode 100644
index 0000000000000000000000000000000000000000..625a94cbdd7d875811b646bd71de92828d7a4810
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/internal/Library.java
@@ -0,0 +1,184 @@
+package org.eclipse.soda.dk.comm.internal;
+
+/*************************************************************************
+ * Copyright (c) 2007, 2009 IBM.                                         *
+ * All rights reserved. This program and the accompanying materials      *
+ * are made available under the terms of the Eclipse Public License v1.0 *
+ * which accompanies this distribution, and is available at              *
+ * http://www.eclipse.org/legal/epl-v10.html                             *
+ *                                                                       *
+ * Contributors:                                                         *
+ *     IBM - initial API and implementation                              *
+ ************************************************************************/
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+/**
+ * @author IBM
+ * @version 1.2.0
+ * @since 1.0
+ */
+public class Library {
+	/**
+	 * Define the http (String) constant.
+	 */
+	public static final String HTTP = "http"; //$NON-NLS-1$
+
+	/**
+	 * Define the file (String) constant.
+	 */
+	public static final String FILE = "file"; //$NON-NLS-1$
+
+	/**
+	 * Define the pathtype (String) field.
+	 */
+	private static String pathtype = ""; //$NON-NLS-1$
+
+	/**
+	 * Define the bundlepath (String) field.
+	 */
+	private static String bundlepath = ""; //$NON-NLS-1$
+
+	/**
+	 * Load_dkcomm.
+	 */
+	public static void load_dkcomm() {
+		if (load_from_java_lib_path() == false) {
+			// To remain portable across OSGI implementations, Kura will only load from lib path
+			//load_from_bundle();
+		}
+	}
+
+	/**
+	 * Load_from_bundle.
+	 */
+	private static void load_from_bundle() {
+		String file_separator = System.getProperty("file.separator"); //$NON-NLS-1$
+		String javalibpath = System.getProperty("java.library.path"); //$NON-NLS-1$
+		String path_seperator = System.getProperty("path.separator"); //$NON-NLS-1$
+		int i = javalibpath.indexOf(path_seperator);
+		javalibpath = javalibpath.substring(0, i) + file_separator;
+		String os = System.getProperty("osgi.ws"); //$NON-NLS-1$
+		String processor = System.getProperty("org.osgi.framework.processor"); //$NON-NLS-1$
+		String libname = ""; //$NON-NLS-1$
+		if (os.equalsIgnoreCase("win32")) { //$NON-NLS-1$
+			libname = "dkcomm.dll"; //$NON-NLS-1$
+		} else if (os.equalsIgnoreCase("linux")) { //$NON-NLS-1$
+			libname = "dkcomm.so"; //$NON-NLS-1$
+		}
+		String libpath = "lib/" + os + '/' + processor + '/'; //$NON-NLS-1$
+		try {
+			if (pathtype.equals(FILE)) {
+				unzipLib_local(javalibpath, libpath, libname, bundlepath);
+			} else if (pathtype.equals(HTTP)) {
+				unzipLib_http(javalibpath, libpath, libname, bundlepath);
+			}
+		} catch (final IOException e) {
+			e.printStackTrace();
+		}
+		try {
+			System.load(javalibpath + libname);
+		} catch (java.lang.UnsatisfiedLinkError e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Load_from_java_lib_path and return the boolean result.
+	 * @return Results of the load_from_java_lib_path (<code>boolean</code>) value.
+	 */
+	private static boolean load_from_java_lib_path() {
+		try {
+			System.loadLibrary("dkcomm"); //$NON-NLS-1$
+		} catch (final UnsatisfiedLinkError e) {
+			e.printStackTrace();
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Perform unzip with the specified input and output parameters.
+	 * @param input
+	 *		The input (<code>BufferedInputStream</code>) parameter.
+	 * @param output
+	 *		The output (<code>BufferedOutputStream</code>) parameter.
+	 * @throws IOException IOException.
+	 */
+	private static void performUnzip(final BufferedInputStream input, final BufferedOutputStream output) throws IOException {
+		int block_size = 4000;
+		byte[] block = new byte[block_size];
+		int len = input.read(block, 0, block_size);
+		while (len != -1) {
+			output.write(block, 0, len);
+			len = input.read(block, 0, block_size);
+		}
+		output.flush();
+		input.close();
+		output.close();
+	}
+
+	/**
+	 * Set bundlepath with the specified type and path parameters.
+	 * @param type
+	 *		The type (<code>String</code>) parameter.
+	 * @param path
+	 *		The path (<code>String</code>) parameter.
+	 */
+	public static void setBundlepath(final String type, final String path) {
+		pathtype = type;
+		bundlepath = path;
+	}
+
+	/**
+	 * Unzip lib_http with the specified javalibpath, libpath, libname and url parameters.
+	 * @param javalibpath
+	 *		The javalibpath (<code>String</code>) parameter.
+	 * @param libpath
+	 *		The libpath (<code>String</code>) parameter.
+	 * @param libname
+	 *		The libname (<code>String</code>) parameter.
+	 * @param url
+	 *		The URL (<code>String</code>) parameter.
+	 * @throws IOException IOException.
+	 */
+	private static void unzipLib_http(final String javalibpath, final String libpath, final String libname, final String url) throws IOException {
+		ZipInputStream zipInput = new ZipInputStream(new URL(url).openStream());
+		while (zipInput.available() != 0) {
+			try {
+				if (zipInput.getNextEntry().getName().equals(libpath + libname)) {
+					BufferedInputStream input = new BufferedInputStream(zipInput);
+					BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(javalibpath + libname));
+					performUnzip(input, output);
+					break;
+				}
+			} catch (final Exception e) {
+				break;
+			}
+		}
+	}
+
+	/**
+	 * Unzip lib_local with the specified javalibpath, libpath, libname and jarname parameters.
+	 * @param javalibpath
+	 *		The javalibpath (<code>String</code>) parameter.
+	 * @param libpath
+	 *		The libpath (<code>String</code>) parameter.
+	 * @param libname
+	 *		The libname (<code>String</code>) parameter.
+	 * @param jarname
+	 *		The jarname (<code>String</code>) parameter.
+	 * @throws IOException IOException.
+	 */
+	private static void unzipLib_local(final String javalibpath, final String libpath, final String libname, final String jarname) throws IOException {
+		ZipFile bundleJar = new ZipFile(jarname);
+		BufferedInputStream input = new BufferedInputStream(bundleJar.getInputStream(bundleJar.getEntry(libpath + libname)));
+		BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(javalibpath + libname));
+		performUnzip(input, output);
+	}
+}
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/internal/package.html b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/internal/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..156b48be884ac4368a3fe124c3d23b4f6882dbaa
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/internal/package.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "..//W3C/DTD XHTML 1.0 Strict/EN"  DTD/xhtml-strict.dtd">
+<!-- Copyright (c) 2008, 2009 IBM.                                         -->
+<!-- All rights reserved. This program and the accompanying materials      -->
+<!-- are made available under the terms of the Eclipse Public License v1.0 -->
+<!-- which accompanies this distribution, and is available at              -->
+<!-- http://www.eclipse.org/legal/epl-v10.html                             -->
+<!--                                                                       -->
+<!-- Contributors:                                                         -->
+<!--     IBM - initial API and implementation                              -->
+    
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+		<meta name="Security" content="public"/>
+		<meta name="Copyright" content="Copyright (c) 2009 IBM. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page."/>
+		<meta scheme="rfc1766" name="DC.Language" content="en-us"/>
+		<meta name="Keywords" content="org.eclipse.soda.dk.comm.internal, org.eclipse.soda.dk.comm"/>
+		<link rel="STYLESHEET" href="stylesheet.css" charset="UTF-8" type="text/css"/>		
+		<title>org.eclipse.soda.dk.comm.internal Package</title>
+	</head>
+	<body>
+		<p>This package is part of the org.eclipse.soda.dk.comm project.</p> 
+	</body>
+</html>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/package.html b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..9fa48f2bee4aa90d576e3607bbc30f8fd28b957f
--- /dev/null
+++ b/target-platform/org.eclipse.soda.dk.comm/src/main/java/org/eclipse/soda/dk/package.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "..//W3C/DTD XHTML 1.0 Strict/EN"  DTD/xhtml-strict.dtd">
+<!-- Copyright (c) 2008, 2009 IBM.                                         -->
+<!-- All rights reserved. This program and the accompanying materials      -->
+<!-- are made available under the terms of the Eclipse Public License v1.0 -->
+<!-- which accompanies this distribution, and is available at              -->
+<!-- http://www.eclipse.org/legal/epl-v10.html                             -->
+<!--                                                                       -->
+<!-- Contributors:                                                         -->
+<!--     IBM - initial API and implementation                              -->
+    
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+		<meta name="Security" content="public"/>
+		<meta name="Copyright" content="Copyright (c) 2009 IBM. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page."/>
+		<meta scheme="rfc1766" name="DC.Language" content="en-us"/>
+		<meta name="Keywords" content="org.eclipse.soda.dk.comm, org.eclipse.soda.dk.comm"/>
+		<link rel="STYLESHEET" href="stylesheet.css" charset="UTF-8" type="text/css"/>		
+		<title>org.eclipse.soda.dk.comm Package</title>
+	</head>
+	<body>
+		<p>This package is part of the org.eclipse.soda.dk.comm project.</p> 
+	</body>
+</html>
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/armv5_sf/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/armv5_sf/libdkcomm.so
new file mode 100755
index 0000000000000000000000000000000000000000..ad8b9d2db6ede2a2a025cb27e998ac33eb332225
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/armv5_sf/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/armv6_hf/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/armv6_hf/libdkcomm.so
new file mode 100755
index 0000000000000000000000000000000000000000..c7165131e8dceb849c5fbba7acef245ffa6666ae
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/armv6_hf/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libdkcomm.so
new file mode 100644
index 0000000000000000000000000000000000000000..9d4804732026da556ce983cb557086f843d48afa
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/beaglebone/090538fcb81c38c1fa445cfb00755a94bc0131f2/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/linux32/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/linux32/libdkcomm.so
new file mode 100755
index 0000000000000000000000000000000000000000..1d075204f4e07cd9fe031e6ea9cde4a67c661559
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/linux32/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/raspberry-pi/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/raspberry-pi/libdkcomm.so
new file mode 100755
index 0000000000000000000000000000000000000000..5182688ff1ca0c8a98341ede8652bc3332a6a373
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/old/raspberry-pi/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/x86/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/x86/libdkcomm.so
new file mode 100755
index 0000000000000000000000000000000000000000..21cdecef9c8b9e691102c6e26d12d43b96c394fe
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/x86/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/x86_64/libdkcomm.so b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/x86_64/libdkcomm.so
new file mode 100755
index 0000000000000000000000000000000000000000..797a238a419ac7648c51f11c3b215f2fed8b5a77
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/linux/x86_64/libdkcomm.so differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/mac/x86/libdkcomm.jnilib b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/mac/x86/libdkcomm.jnilib
new file mode 100755
index 0000000000000000000000000000000000000000..55ce308a2336874a59f39cfeafae3045c29c0f1c
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/mac/x86/libdkcomm.jnilib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.dll b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.dll
new file mode 100644
index 0000000000000000000000000000000000000000..0e1570344545012b722ba334e7d6a20ee6e0358f
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.dll differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.exp b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.exp
new file mode 100644
index 0000000000000000000000000000000000000000..6432ccbd7c25b464f894d3ed5d537e219a15aef3
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.exp differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.lib b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.lib
new file mode 100644
index 0000000000000000000000000000000000000000..89f882870a41446da7ebb820e6c70b2a8e8949a6
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.lib differ
diff --git a/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.pdb b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..6231045b6cb346321d93cc26dc2fabf4c82d6978
Binary files /dev/null and b/target-platform/org.eclipse.soda.dk.comm/src/main/lib/win32/x86/dkcomm.pdb differ
diff --git a/target-platform/p2-repo-common/plugins/apache-log4j-extras-1.1.jar b/target-platform/p2-repo-common/plugins/apache-log4j-extras-1.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..9b2627f734651872a5d1393f4eaaab99bd57c62c
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/apache-log4j-extras-1.1.jar differ
diff --git a/target-platform/p2-repo-common/plugins/com.gwt.user_0.2.0.jar b/target-platform/p2-repo-common/plugins/com.gwt.user_0.2.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..56538e6c0fb083446ae92f41d31131bb2fc0bcac
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/com.gwt.user_0.2.0.jar differ
diff --git a/target-platform/p2-repo-common/plugins/iagent.rpc.jar b/target-platform/p2-repo-common/plugins/iagent.rpc.jar
new file mode 100644
index 0000000000000000000000000000000000000000..fb350545cf1a2d5801afe18263ecc740dced0456
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/iagent.rpc.jar differ
diff --git a/target-platform/p2-repo-common/plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar b/target-platform/p2-repo-common/plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar
new file mode 100644
index 0000000000000000000000000000000000000000..60bfd87347d9243f0d89c963a9599d24f77a1d8d
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar differ
diff --git a/target-platform/p2-repo-common/plugins/org.apache.commons.net_3.1.0.v201205071737.jar b/target-platform/p2-repo-common/plugins/org.apache.commons.net_3.1.0.v201205071737.jar
new file mode 100644
index 0000000000000000000000000000000000000000..3a798a48487ac55e07b708c2d60d5d10016e7651
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/org.apache.commons.net_3.1.0.v201205071737.jar differ
diff --git a/target-platform/p2-repo-common/plugins/org.hamcrest.core-1.1.0.v20090501071000.jar b/target-platform/p2-repo-common/plugins/org.hamcrest.core-1.1.0.v20090501071000.jar
new file mode 100644
index 0000000000000000000000000000000000000000..dea61dec184202c5b4ca651ba5d23f79795eb5d8
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/org.hamcrest.core-1.1.0.v20090501071000.jar differ
diff --git a/target-platform/p2-repo-common/plugins/org.json_1.0.0.v201011060100.jar b/target-platform/p2-repo-common/plugins/org.json_1.0.0.v201011060100.jar
new file mode 100644
index 0000000000000000000000000000000000000000..980958afa529598ae407da8c14c6212a4e9f32d7
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/org.json_1.0.0.v201011060100.jar differ
diff --git a/target-platform/p2-repo-common/plugins/org.junit-4.10.0.v4_10_0_v20120426-0900.jar b/target-platform/p2-repo-common/plugins/org.junit-4.10.0.v4_10_0_v20120426-0900.jar
new file mode 100644
index 0000000000000000000000000000000000000000..28d6045d8df24bc049dd4eb03c76f3063b551a46
Binary files /dev/null and b/target-platform/p2-repo-common/plugins/org.junit-4.10.0.v4_10_0_v20120426-0900.jar differ
diff --git a/target-platform/p2-repo-common/pom.xml b/target-platform/p2-repo-common/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2ae532fd9981e7b409e27f5cf16eb322508858aa
--- /dev/null
+++ b/target-platform/p2-repo-common/pom.xml
@@ -0,0 +1,168 @@
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>target-platform</artifactId>
+		<version>0.7.0</version>
+	</parent>
+
+	<groupId>org.eclipse.kura</groupId>
+	<artifactId>p2-repo-common</artifactId>
+	<version>0.7.0</version>
+	<packaging>pom</packaging>
+
+	<build>
+		<plugins>
+			<!-- Copying common artifacts across all platforms into a known location 
+				${project.build.directory}/plugins/common is only one way how to create content 
+				to be published. Any other source of bundles and/or features can be used 
+				to be published as long as it end up in ${project.basedir}/target/source/plugins 
+				and or ~/features The publisher will use every content that is located in 
+				this directory -->
+			<plugin>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-bundles-for-publishing</id>
+						<phase>process-resources</phase>
+						<goals>
+							<goal>copy</goal>
+						</goals>
+						<configuration>
+							<artifactItems>
+								<!-- copied from local repository -->
+								<artifactItem>
+									<groupId>org.eclipse.kura</groupId>
+									<artifactId>com.codeminders.hidapi</artifactId>
+									<version>1.1</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.eclipse.kura</groupId>
+									<artifactId>javax.usb.api</artifactId>
+									<version>1.0.2</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.eclipse.kura</groupId>
+									<artifactId>javax.usb.common</artifactId>
+									<version>1.0.2</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.eclipse.kura</groupId>
+									<artifactId>mqtt-client</artifactId>
+									<version>0.4.0</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.eclipse.kura</groupId>
+									<artifactId>org.eclipse.soda.dk.comm</artifactId>
+									<version>1.2.0</version>
+								</artifactItem>
+								<!-- copied from Maven central repository -->
+								<!--
+								This jar requires an altered manifest to declare it as a fragment bundle. It
+								cannot be brought in from Maven repository.
+								<artifactItem>
+									<groupId>log4j</groupId>
+									<artifactId>apache-log4j-extras</artifactId>
+									<version>1.1</version>
+								</artifactItem>
+								-->
+								<artifactItem>
+									<groupId>commons-io</groupId>
+									<artifactId>commons-io</artifactId>
+									<version>2.4</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.hsqldb</groupId>
+									<artifactId>hsqldb</artifactId>
+									<version>2.3.0</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>log4j</groupId>
+									<artifactId>log4j</artifactId>
+									<version>1.2.17</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.apache.servicemix.bundles</groupId>
+									<artifactId>org.apache.servicemix.bundles.protobuf-java</artifactId>
+									<version>2.4.1_1</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.slf4j</groupId>
+									<artifactId>slf4j-api</artifactId>
+									<version>1.6.4</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.slf4j</groupId>
+									<artifactId>slf4j-log4j12</artifactId>
+									<version>1.6.0</version>
+								</artifactItem>
+							</artifactItems>
+							<outputDirectory>${project.basedir}/target/source/plugins</outputDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>setup</id>
+						<phase>process-resources</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<mkdir dir="target/source/plugins/" />
+								<copy todir="target/source/plugins/">
+									<fileset dir="plugins" />
+								</copy>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.sonatype.tycho</groupId>
+				<artifactId>tycho-p2-extras-plugin</artifactId>
+				<version>0.11.0</version>
+				<executions>
+					<execution>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>publish-features-and-bundles</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<compress>false</compress>
+					<!-- additional arguments example <additionalArgs>-configs win32.win32.x86</additionalArgs> -->
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>install-equinox</id>
+						<phase>install</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<delete dir="../../kura/target-definition/common/" />
+								<mkdir dir="../../kura/target-definition/common/repository" />
+								<copy todir="../../kura/target-definition/common/repository">
+									<fileset dir="${project.build.directory}/repository" />
+								</copy>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/javax.servlet_3.0.0.v201112011016.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/javax.servlet_3.0.0.v201112011016.jar
new file mode 100644
index 0000000000000000000000000000000000000000..49043432460e5a520d1ae20580b2ea41f3b0677b
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/javax.servlet_3.0.0.v201112011016.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.command_0.8.0.v201108120515.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.command_0.8.0.v201108120515.jar
new file mode 100644
index 0000000000000000000000000000000000000000..19b11e52c3089c00d7fe60cfb639ae46cdd3399c
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.command_0.8.0.v201108120515.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.runtime_0.8.0.v201108120515.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.runtime_0.8.0.v201108120515.jar
new file mode 100644
index 0000000000000000000000000000000000000000..5e5b5f0d4ae8be34cb72df1bed24a63390e645a3
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.runtime_0.8.0.v201108120515.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.shell_0.8.0.v201110170705.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.shell_0.8.0.v201110170705.jar
new file mode 100644
index 0000000000000000000000000000000000000000..da6f33879cd7daa473b2bfc70070426b227b5f2f
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.apache.felix.gogo.shell_0.8.0.v201110170705.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar
new file mode 100644
index 0000000000000000000000000000000000000000..dfe4c2a1b8ceb338676421e5deb46b629037eee9
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.jobs_3.5.300.v20120622-204750.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.jobs_3.5.300.v20120622-204750.jar
new file mode 100644
index 0000000000000000000000000000000000000000..56ae1fb2e42edac9021de50af685c68e6b9736c1
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.jobs_3.5.300.v20120622-204750.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.runtime_3.8.0.v20120521-2346.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.runtime_3.8.0.v20120521-2346.jar
new file mode 100644
index 0000000000000000000000000000000000000000..9427f77544e52d55d56d11a9304f9fd206da08a9
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.core.runtime_3.8.0.v20120521-2346.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.app_1.3.100.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.app_1.3.100.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..7e4c8dd605437d5dcf449ab4d5640ddbe54b7a74
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.app_1.3.100.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.cm_1.0.400.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.cm_1.0.400.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..45f4aa20d324a444dd59824dd112208f15c4d9e2
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.cm_1.0.400.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.common_3.6.100.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.common_3.6.100.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..695acfe5c2588bc88e2c68f87749b1deeaf90dcc
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.common_3.6.100.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.console_1.0.0.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.console_1.0.0.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..773a83ede49a13c36dbfd9494b2f08f5acb8b589
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.console_1.0.0.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.ds_1.4.0.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.ds_1.4.0.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..44686f8c96c12754de0eb4a0a01bba7723fbc23b
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.ds_1.4.0.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.event_1.2.200.v20120522-2049.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.event_1.2.200.v20120522-2049.jar
new file mode 100644
index 0000000000000000000000000000000000000000..6582098f33b68239552bae7fda5809bccce04afa
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.event_1.2.200.v20120522-2049.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.jetty_3.0.0.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.jetty_3.0.0.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..1810c4a1653cd0f1d5b0e2d5c6e2775f5b091d35
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.jetty_3.0.0.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.registry_1.1.200.v20120522-2049.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.registry_1.1.200.v20120522-2049.jar
new file mode 100644
index 0000000000000000000000000000000000000000..84c104731031305931fd6bf01638b22076297c6c
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.registry_1.1.200.v20120522-2049.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..b5772ab45b7df67ccf1ab78b4680dc6f72ef5870
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.http.servlet_1.1.300.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.io_1.0.400.v20120522-2049.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.io_1.0.400.v20120522-2049.jar
new file mode 100644
index 0000000000000000000000000000000000000000..6d41cdc8f6b5f23a7ea24d10b55b9915ed5bfecf
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.io_1.0.400.v20120522-2049.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
new file mode 100644
index 0000000000000000000000000000000000000000..606f3e2ed718e0d89aba0e446037da150fa91a62
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.metatype_1.2.0.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.metatype_1.2.0.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..98bf408a8f64eb8e64afba03ddda07eede250982
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.metatype_1.2.0.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.preferences_3.5.0.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.preferences_3.5.0.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..55b03a56e90894d35c498a44d2b275b06c6ef1d7
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.preferences_3.5.0.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.registry_3.5.200.v20120522-1841.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.registry_3.5.200.v20120522-1841.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e532fc10ae72d103c91a6cf6f2f76f226598e354
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.registry_3.5.200.v20120522-1841.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.util_1.0.400.v20120522-2049.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.util_1.0.400.v20120522-2049.jar
new file mode 100644
index 0000000000000000000000000000000000000000..cc5b0e772305125ceb1e4ded2704ddcbee34834b
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.equinox.util_1.0.400.v20120522-2049.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.continuation_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.continuation_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..393dcf37be33b7a36926cfc24a7ca4bd141a464a
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.continuation_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.http_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.http_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..b57c753386f09abc0dd1fedc3be92c213cc75219
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.http_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.io_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.io_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..9081be5316138a2e354364d51280e00fccc1ae08
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.io_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.security_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.security_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..0c592c8446da0bcf58e534276983496599870107
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.security_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.server_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.server_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..fa31c392218f877197450d5677007138833ff421
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.server_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.servlet_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.servlet_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..63eefd4a116878e6b67916d9ce51bc498399f5f2
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.servlet_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.util_8.1.3.v20120522.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.util_8.1.3.v20120522.jar
new file mode 100644
index 0000000000000000000000000000000000000000..1bb38911246f50f6d20ed013879fc54dfd38a072
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.jetty.util_8.1.3.v20120522.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi.services_3.3.100.v20120522-1822.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi.services_3.3.100.v20120522-1822.jar
new file mode 100644
index 0000000000000000000000000000000000000000..eacd590975378de385113b9a0fcd3b79abeccdaf
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi.services_3.3.100.v20120522-1822.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi.util_3.2.300.v20120522-1822.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi.util_3.2.300.v20120522-1822.jar
new file mode 100644
index 0000000000000000000000000000000000000000..5ddbb8110ce08b71ba390c9f9b4f938bc7fd47b8
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi.util_3.2.300.v20120522-1822.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar
new file mode 100644
index 0000000000000000000000000000000000000000..c152830e863a51f06f25d4abfcc77181d8eeeab4
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/plugins/osgi.cmpn_4.3.0.201111022214.jar b/target-platform/p2-repo-equinox_3.8.1/plugins/osgi.cmpn_4.3.0.201111022214.jar
new file mode 100644
index 0000000000000000000000000000000000000000..7017558c638dea2c251a876980baddcf0731cdd2
Binary files /dev/null and b/target-platform/p2-repo-equinox_3.8.1/plugins/osgi.cmpn_4.3.0.201111022214.jar differ
diff --git a/target-platform/p2-repo-equinox_3.8.1/pom.xml b/target-platform/p2-repo-equinox_3.8.1/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2a3574e3ca703aa263e8b6be4c581dd1103f45c2
--- /dev/null
+++ b/target-platform/p2-repo-equinox_3.8.1/pom.xml
@@ -0,0 +1,118 @@
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.kura</groupId>
+		<artifactId>target-platform</artifactId>
+		<version>0.7.0</version>
+	</parent>
+
+	<groupId>org.eclipse.kura</groupId>
+	<artifactId>p2-repo-equinox_3.8.1</artifactId>
+	<version>0.7.0</version>
+	<packaging>pom</packaging>
+
+	<build>
+		<plugins>
+			<!-- Copying common artifacts across all platforms into a known location 
+				${project.build.directory}/plugins/common is only one way how to create content 
+				to be published. Any other source of bundles and/or features can be used 
+				to be published as long as it end up in ${project.basedir}/target/source/plugins 
+				and or ~/features The publisher will use every content that is located in 
+				this directory -->
+
+			<plugin>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-bundles-for-publishing</id>
+						<phase>process-resources</phase>
+						<goals>
+							<goal>copy</goal>
+						</goals>
+						<configuration>
+							<artifactItems>
+								<artifactItem>
+									<groupId>org.apache.felix</groupId>
+									<artifactId>org.apache.felix.dependencymanager</artifactId>
+									<version>3.0.0</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.apache.felix</groupId>
+									<artifactId>org.apache.felix.deploymentadmin</artifactId>
+									<version>0.9.5</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.knowhowlab.osgi</groupId>
+									<artifactId>monitoradmin</artifactId>
+									<version>1.0.2</version>
+								</artifactItem>
+							</artifactItems>
+							<outputDirectory>${project.basedir}/target/source/plugins</outputDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>setup</id>
+						<phase>process-resources</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<mkdir dir="target/source/plugins/" />
+								<copy todir="target/source/plugins/">
+									<fileset dir="plugins" />
+								</copy>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.sonatype.tycho</groupId>
+				<artifactId>tycho-p2-extras-plugin</artifactId>
+				<version>0.11.0</version>
+				<executions>
+					<execution>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>publish-features-and-bundles</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<compress>false</compress>
+					<!-- additional arguments example <additionalArgs>-configs win32.win32.x86</additionalArgs> -->
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>install-equinox</id>
+						<phase>install</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks>
+								<delete dir="../../kura/target-definition/equinox_3.8.1/" />
+								<mkdir dir="../../kura/target-definition/equinox_3.8.1/repository" />
+								<copy todir="../../kura/target-definition/equinox_3.8.1/repository">
+									<fileset dir="${project.build.directory}/repository" />
+								</copy>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/target-platform/pom.xml b/target-platform/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e0b4933c8fa180c178cd49432ce098afd21470db
--- /dev/null
+++ b/target-platform/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.eclipse.kura</groupId>
+	<artifactId>target-platform</artifactId>
+	<version>0.7.0</version>
+
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>com.codeminders.hidapi</module>
+		<module>javax.usb.api</module>
+		<module>javax.usb.common</module>
+		<module>javax.usb.linux</module>
+		<module>org.eclipse.paho</module>
+		<module>org.eclipse.soda.dk.comm</module>
+		<module>p2-repo-common</module>
+		<module>p2-repo-equinox_3.8.1</module>
+	</modules>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-site-plugin</artifactId>
+				<version>3.3</version>
+			</plugin>
+		</plugins>
+	</build>
+</project>